am 030bb998
: Merge "audioflinger: fix noise when skipping to next song" into ics-mr1
* commit '030bb99814157b6424c0bf290bd2ede217b5ba77': audioflinger: fix noise when skipping to next song
This commit is contained in:
@ -7028,11 +7028,17 @@ void AudioFlinger::EffectHandle::dump(char* buffer, size_t size)
|
|||||||
|
|
||||||
AudioFlinger::EffectChain::EffectChain(const wp<ThreadBase>& wThread,
|
AudioFlinger::EffectChain::EffectChain(const wp<ThreadBase>& wThread,
|
||||||
int sessionId)
|
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),
|
mOwnInBuffer(false), mVolumeCtrlIdx(-1), mLeftVolume(UINT_MAX), mRightVolume(UINT_MAX),
|
||||||
mNewLeftVolume(UINT_MAX), mNewRightVolume(UINT_MAX)
|
mNewLeftVolume(UINT_MAX), mNewRightVolume(UINT_MAX)
|
||||||
{
|
{
|
||||||
mStrategy = AudioSystem::getStrategyForStream(AUDIO_STREAM_MUSIC);
|
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()
|
AudioFlinger::EffectChain::~EffectChain()
|
||||||
@ -7100,22 +7106,31 @@ void AudioFlinger::EffectChain::process_l()
|
|||||||
}
|
}
|
||||||
bool isGlobalSession = (mSessionId == AUDIO_SESSION_OUTPUT_MIX) ||
|
bool isGlobalSession = (mSessionId == AUDIO_SESSION_OUTPUT_MIX) ||
|
||||||
(mSessionId == AUDIO_SESSION_OUTPUT_STAGE);
|
(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) {
|
if (!isGlobalSession) {
|
||||||
tracksOnSession = (trackCnt() != 0);
|
bool tracksOnSession = (trackCnt() != 0);
|
||||||
}
|
|
||||||
|
|
||||||
// if no track is active, input buffer must be cleared here as the mixer process
|
if (!tracksOnSession && mTailBufferCount == 0) {
|
||||||
// will not do it
|
doProcess = false;
|
||||||
if (tracksOnSession &&
|
}
|
||||||
activeTrackCnt() == 0) {
|
|
||||||
size_t numSamples = thread->frameCount() * thread->channelCount();
|
if (activeTrackCnt() == 0) {
|
||||||
memset(mInBuffer, 0, numSamples * sizeof(int16_t));
|
// 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();
|
size_t size = mEffects.size();
|
||||||
// do not process effect if no track is present in same audio session
|
if (doProcess) {
|
||||||
if (isGlobalSession || tracksOnSession) {
|
|
||||||
for (size_t i = 0; i < size; i++) {
|
for (size_t i = 0; i < size; i++) {
|
||||||
mEffects[i]->process();
|
mEffects[i]->process();
|
||||||
}
|
}
|
||||||
|
@ -1247,6 +1247,10 @@ private:
|
|||||||
// corresponding to a suspend all request.
|
// corresponding to a suspend all request.
|
||||||
static const int kKeyForSuspendAll = 0;
|
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 process_l();
|
||||||
|
|
||||||
void lock() {
|
void lock() {
|
||||||
@ -1287,7 +1291,8 @@ private:
|
|||||||
void decTrackCnt() { android_atomic_dec(&mTrackCnt); }
|
void decTrackCnt() { android_atomic_dec(&mTrackCnt); }
|
||||||
int32_t trackCnt() { return 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); }
|
void decActiveTrackCnt() { android_atomic_dec(&mActiveTrackCnt); }
|
||||||
int32_t activeTrackCnt() { return mActiveTrackCnt;}
|
int32_t activeTrackCnt() { return mActiveTrackCnt;}
|
||||||
|
|
||||||
@ -1338,6 +1343,8 @@ private:
|
|||||||
int16_t *mOutBuffer; // chain output buffer
|
int16_t *mOutBuffer; // chain output buffer
|
||||||
volatile int32_t mActiveTrackCnt; // number of active tracks connected
|
volatile int32_t mActiveTrackCnt; // number of active tracks connected
|
||||||
volatile int32_t mTrackCnt; // number of 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
|
bool mOwnInBuffer; // true if the chain owns its input buffer
|
||||||
int mVolumeCtrlIdx; // index of insert effect having control over volume
|
int mVolumeCtrlIdx; // index of insert effect having control over volume
|
||||||
uint32_t mLeftVolume; // previous volume on left channel
|
uint32_t mLeftVolume; // previous volume on left channel
|
||||||
|
Reference in New Issue
Block a user