summaryrefslogtreecommitdiff
path: root/core/java/android/webkit/HTML5Audio.java
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2011-10-14 15:12:41 +0100
committerBen Murdoch <benm@google.com>2011-10-14 22:11:26 +0100
commit817d6d5e8efa30082ce4b31d7da73cee20fc664a (patch)
tree69052292f7f073b0fbb6726f89901bdef0eaa00c /core/java/android/webkit/HTML5Audio.java
parent9ad680ca2be19679c355de9526d79ded2887ea97 (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.java33
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;
}