Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit eecd7659 authored by Eric Laurent's avatar Eric Laurent
Browse files

Use only strong references to AudioEffect

Do not refer to an AudioEffect instance by a raw pointer from the
child AudioEffectClient.

Also align destructor cleanup sequence on those of AudioTrack
and AudioRecord.

Bug: 21629892.

Change-Id: I970307aedbc38db2e41a2cc652fd6df9112f712c
parent d16a8ef2
Loading
Loading
Loading
Loading
+22 −6
Original line number Diff line number Diff line
@@ -429,7 +429,8 @@ protected:
private:

     // Implements the IEffectClient interface
    class EffectClient : public android::BnEffectClient,  public android::IBinder::DeathRecipient
    class EffectClient :
        public android::BnEffectClient, public android::IBinder::DeathRecipient
    {
    public:

@@ -437,24 +438,39 @@ private:

        // IEffectClient
        virtual void controlStatusChanged(bool controlGranted) {
            mEffect->controlStatusChanged(controlGranted);
            sp<AudioEffect> effect = mEffect.promote();
            if (effect != 0) {
                effect->controlStatusChanged(controlGranted);
            }
        }
        virtual void enableStatusChanged(bool enabled) {
            mEffect->enableStatusChanged(enabled);
            sp<AudioEffect> effect = mEffect.promote();
            if (effect != 0) {
                effect->enableStatusChanged(enabled);
            }
        }
        virtual void commandExecuted(uint32_t cmdCode,
                                     uint32_t cmdSize,
                                     void *pCmdData,
                                     uint32_t replySize,
                                     void *pReplyData) {
            mEffect->commandExecuted(cmdCode, cmdSize, pCmdData, replySize, pReplyData);
            sp<AudioEffect> effect = mEffect.promote();
            if (effect != 0) {
                effect->commandExecuted(
                    cmdCode, cmdSize, pCmdData, replySize, pReplyData);
            }
        }

        // IBinder::DeathRecipient
        virtual void binderDied(const wp<IBinder>& who) {mEffect->binderDied();}
        virtual void binderDied(const wp<IBinder>& who) {
            sp<AudioEffect> effect = mEffect.promote();
            if (effect != 0) {
                effect->binderDied();
            }
        }

    private:
        AudioEffect *mEffect;
        wp<AudioEffect> mEffect;
    };

    void binderDied();
+7 −4
Original line number Diff line number Diff line
@@ -134,12 +134,14 @@ status_t AudioEffect::set(const effect_uuid_t *type,

    if (iEffect == 0 || (mStatus != NO_ERROR && mStatus != ALREADY_EXISTS)) {
        ALOGE("set(): AudioFlinger could not create effect, status: %d", mStatus);
        if (iEffect == 0) {
            mStatus = NO_INIT;
        }
        return mStatus;
    }

    mEnabled = (volatile int32_t)enabled;

    mIEffect = iEffect;
    cblk = iEffect->getCblk();
    if (cblk == 0) {
        mStatus = NO_INIT;
@@ -147,6 +149,7 @@ status_t AudioEffect::set(const effect_uuid_t *type,
        return mStatus;
    }

    mIEffect = iEffect;
    mCblkMemory = cblk;
    mCblk = static_cast<effect_param_cblk_t*>(cblk->pointer());
    int bufOffset = ((sizeof(effect_param_cblk_t) - 1) / sizeof(int) + 1) * sizeof(int);
@@ -177,11 +180,11 @@ AudioEffect::~AudioEffect()
            mIEffect->disconnect();
            IInterface::asBinder(mIEffect)->unlinkToDeath(mIEffectClient);
        }
        IPCThreadState::self()->flushCommands();
    }
        mIEffect.clear();
    mIEffectClient.clear();
        mCblkMemory.clear();
        mIEffectClient.clear();
        IPCThreadState::self()->flushCommands();
    }
}