From d0ebb538599cc25726b856e0f5deeb8215db8c92 Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Tue, 2 Apr 2013 16:41:41 -0700 Subject: audioflinger: add effect config status check Check the result of the effect engine configuration command and do not attempt to send parameters to, enable, or process the effect if configuration fails. Bug 8512027 Change-Id: I8c78a05d79fba36b1a387aa5cf2700612301ac91 --- services/audioflinger/Effects.cpp | 63 +++++++++++++++++++++++++++++++-------- 1 file changed, 51 insertions(+), 12 deletions(-) (limited to 'services/audioflinger') diff --git a/services/audioflinger/Effects.cpp b/services/audioflinger/Effects.cpp index 74ba59e..d66294c 100644 --- a/services/audioflinger/Effects.cpp +++ b/services/audioflinger/Effects.cpp @@ -225,12 +225,18 @@ void AudioFlinger::EffectModule::updateState() { 0, mConfig.inputCfg.buffer.frameCount*sizeof(int32_t)); } - start_l(); - mState = ACTIVE; + if (start_l() == NO_ERROR) { + mState = ACTIVE; + } else { + mState = IDLE; + } break; case STOPPING: - stop_l(); - mDisableWaitCnt = mMaxDisableWaitCnt; + if (stop_l() == NO_ERROR) { + mDisableWaitCnt = mMaxDisableWaitCnt; + } else { + mDisableWaitCnt = 1; // will cause immediate transition to IDLE + } mState = STOPPED; break; case STOPPED: @@ -297,7 +303,7 @@ void AudioFlinger::EffectModule::process() void AudioFlinger::EffectModule::reset_l() { - if (mEffectInterface == NULL) { + if (mStatus != NO_ERROR || mEffectInterface == NULL) { return; } (*mEffectInterface)->command(mEffectInterface, EFFECT_CMD_RESET, 0, NULL, 0, NULL); @@ -305,17 +311,24 @@ void AudioFlinger::EffectModule::reset_l() status_t AudioFlinger::EffectModule::configure() { + status_t status; + sp thread; + uint32_t size; + audio_channel_mask_t channelMask; + if (mEffectInterface == NULL) { - return NO_INIT; + status = NO_INIT; + goto exit; } - sp thread = mThread.promote(); + thread = mThread.promote(); if (thread == 0) { - return DEAD_OBJECT; + status = DEAD_OBJECT; + goto exit; } // TODO: handle configuration of effects replacing track process - audio_channel_mask_t channelMask = thread->channelMask(); + channelMask = thread->channelMask(); if ((mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) { mConfig.inputCfg.channels = AUDIO_CHANNEL_OUT_MONO; @@ -357,8 +370,8 @@ status_t AudioFlinger::EffectModule::configure() this, thread.get(), mConfig.inputCfg.buffer.raw, mConfig.inputCfg.buffer.frameCount); status_t cmdStatus; - uint32_t size = sizeof(int); - status_t status = (*mEffectInterface)->command(mEffectInterface, + size = sizeof(int); + status = (*mEffectInterface)->command(mEffectInterface, EFFECT_CMD_SET_CONFIG, sizeof(effect_config_t), &mConfig, @@ -396,6 +409,8 @@ status_t AudioFlinger::EffectModule::configure() mMaxDisableWaitCnt = (MAX_DISABLE_TIME_MS * mConfig.outputCfg.samplingRate) / (1000 * mConfig.outputCfg.buffer.frameCount); +exit: + mStatus = status; return status; } @@ -430,6 +445,9 @@ status_t AudioFlinger::EffectModule::start_l() if (mEffectInterface == NULL) { return NO_INIT; } + if (mStatus != NO_ERROR) { + return mStatus; + } status_t cmdStatus; uint32_t size = sizeof(status_t); status_t status = (*mEffectInterface)->command(mEffectInterface, @@ -466,6 +484,9 @@ status_t AudioFlinger::EffectModule::stop_l() if (mEffectInterface == NULL) { return NO_INIT; } + if (mStatus != NO_ERROR) { + return mStatus; + } status_t cmdStatus; uint32_t size = sizeof(status_t); status_t status = (*mEffectInterface)->command(mEffectInterface, @@ -503,6 +524,9 @@ status_t AudioFlinger::EffectModule::command(uint32_t cmdCode, if (mState == DESTROYED || mEffectInterface == NULL) { return NO_INIT; } + if (mStatus != NO_ERROR) { + return mStatus; + } status_t status = (*mEffectInterface)->command(mEffectInterface, cmdCode, cmdSize, @@ -592,6 +616,10 @@ bool AudioFlinger::EffectModule::isEnabled() const bool AudioFlinger::EffectModule::isProcessEnabled() const { + if (mStatus != NO_ERROR) { + return false; + } + switch (mState) { case RESTART: case ACTIVE: @@ -609,8 +637,10 @@ bool AudioFlinger::EffectModule::isProcessEnabled() const status_t AudioFlinger::EffectModule::setVolume(uint32_t *left, uint32_t *right, bool controller) { Mutex::Autolock _l(mLock); + if (mStatus != NO_ERROR) { + return mStatus; + } status_t status = NO_ERROR; - // Send volume indication if EFFECT_FLAG_VOLUME_IND is set and read back altered volume // if controller flag is set (Note that controller == TRUE => EFFECT_FLAG_VOLUME_CTRL set) if (isProcessEnabled() && @@ -646,6 +676,9 @@ status_t AudioFlinger::EffectModule::setDevice(audio_devices_t device) } Mutex::Autolock _l(mLock); + if (mStatus != NO_ERROR) { + return mStatus; + } status_t status = NO_ERROR; if (device && (mDescriptor.flags & EFFECT_FLAG_DEVICE_MASK) == EFFECT_FLAG_DEVICE_IND) { status_t cmdStatus; @@ -665,6 +698,9 @@ status_t AudioFlinger::EffectModule::setDevice(audio_devices_t device) status_t AudioFlinger::EffectModule::setMode(audio_mode_t mode) { Mutex::Autolock _l(mLock); + if (mStatus != NO_ERROR) { + return mStatus; + } status_t status = NO_ERROR; if ((mDescriptor.flags & EFFECT_FLAG_AUDIO_MODE_MASK) == EFFECT_FLAG_AUDIO_MODE_IND) { status_t cmdStatus; @@ -685,6 +721,9 @@ status_t AudioFlinger::EffectModule::setMode(audio_mode_t mode) status_t AudioFlinger::EffectModule::setAudioSource(audio_source_t source) { Mutex::Autolock _l(mLock); + if (mStatus != NO_ERROR) { + return mStatus; + } status_t status = NO_ERROR; if ((mDescriptor.flags & EFFECT_FLAG_AUDIO_SOURCE_MASK) == EFFECT_FLAG_AUDIO_SOURCE_IND) { uint32_t size = 0; -- cgit v1.1