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;
