Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cb90c260 authored by Dichen Zhang's avatar Dichen Zhang
Browse files

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
parent f66699ae
Loading
Loading
Loading
Loading
+17 −1
Original line number Diff line number Diff line
@@ -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;
        }
    }
}