diff options
| author | Ben Murdoch <benm@google.com> | 2011-10-14 15:12:41 +0100 |
|---|---|---|
| committer | Ben Murdoch <benm@google.com> | 2011-10-14 22:11:26 +0100 |
| commit | 817d6d5e8efa30082ce4b31d7da73cee20fc664a (patch) | |
| tree | 69052292f7f073b0fbb6726f89901bdef0eaa00c /core/java/android/webkit/HTML5Audio.java | |
| parent | 9ad680ca2be19679c355de9526d79ded2887ea97 (diff) | |
Check MediaPlayer state, do not teardown() from UI thread.
The teardown() function should only be called from the native
thread when WebCore is happy for us to release the media player.
When we lose audio focus, simply stop playback. Also be careful
not to check the playing state of the MediaPlayer if we are in
the error state.
Bug: 5461143
Change-Id: Iba03bdad5c39b104b3071129430d7ef2177e9358
Diffstat (limited to 'core/java/android/webkit/HTML5Audio.java')
| -rw-r--r-- | core/java/android/webkit/HTML5Audio.java | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/core/java/android/webkit/HTML5Audio.java b/core/java/android/webkit/HTML5Audio.java index 9fc48a1a2320..97d61ba73d55 100644 --- a/core/java/android/webkit/HTML5Audio.java +++ b/core/java/android/webkit/HTML5Audio.java @@ -238,24 +238,27 @@ class HTML5Audio extends Handler switch (focusChange) { case AudioManager.AUDIOFOCUS_GAIN: // resume playback - if (mMediaPlayer == null) resetMediaPlayer(); - else if (!mMediaPlayer.isPlaying()) mMediaPlayer.start(); - mState = STARTED; + if (mMediaPlayer == null) { + resetMediaPlayer(); + } else if (mState != ERROR && !mMediaPlayer.isPlaying()) { + mMediaPlayer.start(); + mState = STARTED; + } break; case AudioManager.AUDIOFOCUS_LOSS: - // Lost focus for an unbounded amount of time: stop playback and release media player - if (mMediaPlayer.isPlaying()) mMediaPlayer.stop(); - mMediaPlayer.release(); - mMediaPlayer = null; + // Lost focus for an unbounded amount of time: stop playback. + if (mState != ERROR && mMediaPlayer.isPlaying()) { + mMediaPlayer.stop(); + mState = STOPPED; + } break; case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: // Lost focus for a short time, but we have to stop - // playback. We don't release the media player because playback - // is likely to resume - if (mMediaPlayer.isPlaying()) mMediaPlayer.pause(); + // playback. + if (mState != ERROR && mMediaPlayer.isPlaying()) pause(); break; } } @@ -273,10 +276,7 @@ class HTML5Audio extends Handler int result = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); - if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { - // could not get audio focus. - teardown(); - } else { + if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { mMediaPlayer.start(); mState = STARTED; } @@ -299,8 +299,13 @@ class HTML5Audio extends Handler } } + /** + * Called only over JNI when WebKit is happy to + * destroy the media player. + */ private void teardown() { mMediaPlayer.release(); + mMediaPlayer = null; mState = ERROR; mNativePointer = 0; } |
