Loading services/audioflinger/AudioFlinger.cpp +27 −12 Original line number Diff line number Diff line Loading @@ -7028,11 +7028,17 @@ void AudioFlinger::EffectHandle::dump(char* buffer, size_t size) AudioFlinger::EffectChain::EffectChain(const wp<ThreadBase>& wThread, int sessionId) : mThread(wThread), mSessionId(sessionId), mActiveTrackCnt(0), mTrackCnt(0), : mThread(wThread), mSessionId(sessionId), mActiveTrackCnt(0), mTrackCnt(0), mTailBufferCount(0), mOwnInBuffer(false), mVolumeCtrlIdx(-1), mLeftVolume(UINT_MAX), mRightVolume(UINT_MAX), mNewLeftVolume(UINT_MAX), mNewRightVolume(UINT_MAX) { mStrategy = AudioSystem::getStrategyForStream(AUDIO_STREAM_MUSIC); sp<ThreadBase> thread = mThread.promote(); if (thread == 0) { return; } mMaxTailBuffers = ((kProcessTailDurationMs * thread->sampleRate()) / 1000) / thread->frameCount(); } AudioFlinger::EffectChain::~EffectChain() Loading Loading @@ -7100,22 +7106,31 @@ void AudioFlinger::EffectChain::process_l() } bool isGlobalSession = (mSessionId == AUDIO_SESSION_OUTPUT_MIX) || (mSessionId == AUDIO_SESSION_OUTPUT_STAGE); bool tracksOnSession = false; // always process effects unless no more tracks are on the session and the effect tail // has been rendered bool doProcess = true; if (!isGlobalSession) { tracksOnSession = (trackCnt() != 0); bool tracksOnSession = (trackCnt() != 0); if (!tracksOnSession && mTailBufferCount == 0) { doProcess = false; } // if no track is active, input buffer must be cleared here as the mixer process // will not do it if (tracksOnSession && activeTrackCnt() == 0) { if (activeTrackCnt() == 0) { // if no track is active and the effect tail has not been rendered, // the input buffer must be cleared here as the mixer process will not do it if (tracksOnSession || mTailBufferCount > 0) { size_t numSamples = thread->frameCount() * thread->channelCount(); memset(mInBuffer, 0, numSamples * sizeof(int16_t)); if (mTailBufferCount > 0) { mTailBufferCount--; } } } } size_t size = mEffects.size(); // do not process effect if no track is present in same audio session if (isGlobalSession || tracksOnSession) { if (doProcess) { for (size_t i = 0; i < size; i++) { mEffects[i]->process(); } Loading services/audioflinger/AudioFlinger.h +8 −1 Original line number Diff line number Diff line Loading @@ -1247,6 +1247,10 @@ private: // corresponding to a suspend all request. static const int kKeyForSuspendAll = 0; // minimum duration during which we force calling effect process when last track on // a session is stopped or removed to allow effect tail to be rendered static const int kProcessTailDurationMs = 1000; void process_l(); void lock() { Loading Loading @@ -1287,7 +1291,8 @@ private: void decTrackCnt() { android_atomic_dec(&mTrackCnt); } int32_t trackCnt() { return mTrackCnt;} void incActiveTrackCnt() { android_atomic_inc(&mActiveTrackCnt); } void incActiveTrackCnt() { android_atomic_inc(&mActiveTrackCnt); mTailBufferCount = mMaxTailBuffers; } void decActiveTrackCnt() { android_atomic_dec(&mActiveTrackCnt); } int32_t activeTrackCnt() { return mActiveTrackCnt;} Loading Loading @@ -1338,6 +1343,8 @@ private: int16_t *mOutBuffer; // chain output buffer volatile int32_t mActiveTrackCnt; // number of active tracks connected volatile int32_t mTrackCnt; // number of tracks connected int32_t mTailBufferCount; // current effect tail buffer count int32_t mMaxTailBuffers; // maximum effect tail buffers bool mOwnInBuffer; // true if the chain owns its input buffer int mVolumeCtrlIdx; // index of insert effect having control over volume uint32_t mLeftVolume; // previous volume on left channel Loading Loading
services/audioflinger/AudioFlinger.cpp +27 −12 Original line number Diff line number Diff line Loading @@ -7028,11 +7028,17 @@ void AudioFlinger::EffectHandle::dump(char* buffer, size_t size) AudioFlinger::EffectChain::EffectChain(const wp<ThreadBase>& wThread, int sessionId) : mThread(wThread), mSessionId(sessionId), mActiveTrackCnt(0), mTrackCnt(0), : mThread(wThread), mSessionId(sessionId), mActiveTrackCnt(0), mTrackCnt(0), mTailBufferCount(0), mOwnInBuffer(false), mVolumeCtrlIdx(-1), mLeftVolume(UINT_MAX), mRightVolume(UINT_MAX), mNewLeftVolume(UINT_MAX), mNewRightVolume(UINT_MAX) { mStrategy = AudioSystem::getStrategyForStream(AUDIO_STREAM_MUSIC); sp<ThreadBase> thread = mThread.promote(); if (thread == 0) { return; } mMaxTailBuffers = ((kProcessTailDurationMs * thread->sampleRate()) / 1000) / thread->frameCount(); } AudioFlinger::EffectChain::~EffectChain() Loading Loading @@ -7100,22 +7106,31 @@ void AudioFlinger::EffectChain::process_l() } bool isGlobalSession = (mSessionId == AUDIO_SESSION_OUTPUT_MIX) || (mSessionId == AUDIO_SESSION_OUTPUT_STAGE); bool tracksOnSession = false; // always process effects unless no more tracks are on the session and the effect tail // has been rendered bool doProcess = true; if (!isGlobalSession) { tracksOnSession = (trackCnt() != 0); bool tracksOnSession = (trackCnt() != 0); if (!tracksOnSession && mTailBufferCount == 0) { doProcess = false; } // if no track is active, input buffer must be cleared here as the mixer process // will not do it if (tracksOnSession && activeTrackCnt() == 0) { if (activeTrackCnt() == 0) { // if no track is active and the effect tail has not been rendered, // the input buffer must be cleared here as the mixer process will not do it if (tracksOnSession || mTailBufferCount > 0) { size_t numSamples = thread->frameCount() * thread->channelCount(); memset(mInBuffer, 0, numSamples * sizeof(int16_t)); if (mTailBufferCount > 0) { mTailBufferCount--; } } } } size_t size = mEffects.size(); // do not process effect if no track is present in same audio session if (isGlobalSession || tracksOnSession) { if (doProcess) { for (size_t i = 0; i < size; i++) { mEffects[i]->process(); } Loading
services/audioflinger/AudioFlinger.h +8 −1 Original line number Diff line number Diff line Loading @@ -1247,6 +1247,10 @@ private: // corresponding to a suspend all request. static const int kKeyForSuspendAll = 0; // minimum duration during which we force calling effect process when last track on // a session is stopped or removed to allow effect tail to be rendered static const int kProcessTailDurationMs = 1000; void process_l(); void lock() { Loading Loading @@ -1287,7 +1291,8 @@ private: void decTrackCnt() { android_atomic_dec(&mTrackCnt); } int32_t trackCnt() { return mTrackCnt;} void incActiveTrackCnt() { android_atomic_inc(&mActiveTrackCnt); } void incActiveTrackCnt() { android_atomic_inc(&mActiveTrackCnt); mTailBufferCount = mMaxTailBuffers; } void decActiveTrackCnt() { android_atomic_dec(&mActiveTrackCnt); } int32_t activeTrackCnt() { return mActiveTrackCnt;} Loading Loading @@ -1338,6 +1343,8 @@ private: int16_t *mOutBuffer; // chain output buffer volatile int32_t mActiveTrackCnt; // number of active tracks connected volatile int32_t mTrackCnt; // number of tracks connected int32_t mTailBufferCount; // current effect tail buffer count int32_t mMaxTailBuffers; // maximum effect tail buffers bool mOwnInBuffer; // true if the chain owns its input buffer int mVolumeCtrlIdx; // index of insert effect having control over volume uint32_t mLeftVolume; // previous volume on left channel Loading