summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Dichen Zhang <dichenzhang@google.com> 2018-11-20 11:34:34 -0800
committer Dichen Zhang <dichenzhang@google.com> 2018-11-21 00:28:09 +0000
commitcb90c260fc84e6f2b5660b2d48be49859351ae3d (patch)
tree62c9bf749e02a637fc1331fa7db52f1940fc2b05
parentf66699ae165ce30f1cda1cfd704027a75bf457d2 (diff)
Fix setAudioSessionId() Racing Issue
Pointed out by Wei: a later setAudioSessionId() could override the previous one whose task has not completed. Bug: 112549970 Test: MediaPlayer2Test Change-Id: Ib5862d6dfd1ea4ddcbccb421906510ab4a3bae87
-rw-r--r--media/java/android/media/MediaPlayer2.java18
1 files changed, 17 insertions, 1 deletions
diff --git a/media/java/android/media/MediaPlayer2.java b/media/java/android/media/MediaPlayer2.java
index 548dc881d733..82889761b592 100644
--- a/media/java/android/media/MediaPlayer2.java
+++ b/media/java/android/media/MediaPlayer2.java
@@ -1763,10 +1763,13 @@ public class MediaPlayer2 implements AutoCloseable
*/
// This is an asynchronous call.
public Object setAudioSessionId(int sessionId) {
- keepAudioSessionIdAlive(sessionId);
+ final AudioTrack dummyAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,
+ AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, 2,
+ AudioTrack.MODE_STATIC, sessionId);
return addTask(new Task(CALL_COMPLETED_SET_AUDIO_SESSION_ID, false) {
@Override
void process() {
+ keepAudioSessionIdAlive(dummyAudioTrack);
native_setAudioSessionId(sessionId);
}
});
@@ -4621,4 +4624,17 @@ public class MediaPlayer2 implements AutoCloseable
AudioTrack.MODE_STATIC, sessionId);
}
}
+
+ private void keepAudioSessionIdAlive(AudioTrack at) {
+ synchronized (mSessionIdLock) {
+ if (mDummyAudioTrack != null) {
+ if (mDummyAudioTrack.getAudioSessionId() == at.getAudioSessionId()) {
+ at.release();
+ return;
+ }
+ mDummyAudioTrack.release();
+ }
+ mDummyAudioTrack = at;
+ }
+ }
}