From cb90c260fc84e6f2b5660b2d48be49859351ae3d Mon Sep 17 00:00:00 2001 From: Dichen Zhang Date: Tue, 20 Nov 2018 11:34:34 -0800 Subject: 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 --- media/java/android/media/MediaPlayer2.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) 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; + } + } } -- cgit v1.2.3-59-g8ed1b