Merge "audioflinger: add effect config status check" into jb-mr2-dev
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;