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
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 @@
                    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::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 @@
 
 status_t AudioFlinger::EffectModule::configure()
 {
+    status_t status;
+    sp<ThreadBase> thread;
+    uint32_t size;
+    audio_channel_mask_t channelMask;
+
     if (mEffectInterface == NULL) {
-        return NO_INIT;
+        status = NO_INIT;
+        goto exit;
     }
 
-    sp<ThreadBase> 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 @@
             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 @@
     mMaxDisableWaitCnt = (MAX_DISABLE_TIME_MS * mConfig.outputCfg.samplingRate) /
             (1000 * mConfig.outputCfg.buffer.frameCount);
 
+exit:
+    mStatus = status;
     return status;
 }
 
@@ -430,6 +445,9 @@
     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 @@
     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 @@
     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::isProcessEnabled() const
 {
+    if (mStatus != NO_ERROR) {
+        return false;
+    }
+
     switch (mState) {
     case RESTART:
     case ACTIVE:
@@ -609,8 +637,10 @@
 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 @@
     }
 
     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::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::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;