From 45e306536ff236af59676e7fc213d5ad20be45e2 Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Tue, 11 Jun 2013 14:38:48 -0700 Subject: [PATCH] audioflinger: fix effects on direct output threads PlaybackThread::addTrack_l() uses the assumption that effects are attached to a track only if the track accumulation buffer is different from the mixer thread output buffer. This is not true for direct output threads where only one track is active an only one buffer is needed. This assumption is an optimization to avoid checking for effect chains with the same session ID each time a track is processed. The optimization is not key if only one track is attached to the thread which is the case for direct outputs. Current code fails to increment the active track count in the effect chain on direct output threads when a track is started thus making the effect framework clear the mix buffer and produce silence each time the mixer runs. The fix consists in removing the optimization described above. Bug: 9324989. Change-Id: Id7a6337450ed90d326299c2ce9fc02f4b9e2fa6f --- services/audioflinger/Threads.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp index 539bb4fb70..6b3ded9357 100644 --- a/services/audioflinger/Threads.cpp +++ b/services/audioflinger/Threads.cpp @@ -1330,13 +1330,11 @@ status_t AudioFlinger::PlaybackThread::addTrack_l(const sp& track) track->mResetDone = false; track->mPresentationCompleteFrames = 0; mActiveTracks.add(track); - if (track->mainBuffer() != mMixBuffer) { - sp chain = getEffectChain_l(track->sessionId()); - if (chain != 0) { - ALOGV("addTrack_l() starting track on chain %p for session %d", chain.get(), - track->sessionId()); - chain->incActiveTrackCnt(); - } + sp chain = getEffectChain_l(track->sessionId()); + if (chain != 0) { + ALOGV("addTrack_l() starting track on chain %p for session %d", chain.get(), + track->sessionId()); + chain->incActiveTrackCnt(); } status = NO_ERROR; -- 2.11.0