diff options
-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; } |