diff options
| author | 2018-11-20 11:34:34 -0800 | |
|---|---|---|
| committer | 2018-11-21 00:28:09 +0000 | |
| commit | cb90c260fc84e6f2b5660b2d48be49859351ae3d (patch) | |
| tree | 62c9bf749e02a637fc1331fa7db52f1940fc2b05 | |
| parent | f66699ae165ce30f1cda1cfd704027a75bf457d2 (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.java | 18 |
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; + } + } } |