From 620f9a1effe8cfb6b30d8a7f5247397259a618dc Mon Sep 17 00:00:00 2001 From: Weiyin Jiang Date: Fri, 27 Apr 2018 00:39:29 +0800 Subject: [PATCH] audio: ensure effect chain with specific session id is unique It's possible that tracks with the same session id running on various playback outputs, which causes effect chain being created on the same session twice. As a result, the same effect engine will be released twice as the same context is reused. Output that has effect chain with same session id is more preferable. Test: No regression with Play Music and Effects Bug: 123082420 Bug: 123237974 Merged-In: I690ea3cb942d1fdc96b46048e271557d48000f43 Change-Id: I690ea3cb942d1fdc96b46048e271557d48000f43 (cherry picked from commit 9aeb1770d49bab13ea5c6454c969a713641fe686) (cherry picked from commit 5945746bcabff8d833229a6c230cbe873474087f) --- services/audioflinger/AudioFlinger.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index b5ec45884d..ecad12b867 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -2739,9 +2739,13 @@ sp AudioFlinger::createEffect( } // look for the thread where the specified audio session is present for (size_t i = 0; i < mPlaybackThreads.size(); i++) { - if (mPlaybackThreads.valueAt(i)->hasAudioSession(sessionId) != 0) { + uint32_t sessionType = mPlaybackThreads.valueAt(i)->hasAudioSession(sessionId); + if (sessionType != 0) { io = mPlaybackThreads.keyAt(i); - break; + // thread with same effect session is preferable + if ((sessionType & ThreadBase::EFFECT_SESSION) != 0) { + break; + } } } if (io == 0) {