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

Commit 76c89f3d authored by Eric Laurent's avatar Eric Laurent
Browse files

audioflinger: several device effects fixes

Add missing configuration and enabling of the device
effect engine when the effect is not attached to an input or output
stream (HW effects).
Prevent deadlock when releasing a patch associated to an effect:
do not call EffectHandle destructor under effect proxy lock.

Test: atest DeviceEffectTest
Change-Id: Iae44aa5802e9f0450aa402add4eb9e3f3522bcfd
parent f1bde882
Loading
Loading
Loading
Loading
+30 −3
Original line number Diff line number Diff line
@@ -3258,6 +3258,8 @@ status_t AudioFlinger::DeviceEffectProxy::checkPort(const PatchPanel::Patch& pat
        } else {
            mHalEffect->setDevices({mDevice});
        }
        mHalEffect->configure();

        *handle = new EffectHandle(mHalEffect, nullptr, nullptr, 0 /*priority*/,
                                   mNotifyFramesProcessed);
        status = (*handle)->initCheck();
@@ -3306,15 +3308,22 @@ status_t AudioFlinger::DeviceEffectProxy::checkPort(const PatchPanel::Patch& pat
}

void AudioFlinger::DeviceEffectProxy::onReleasePatch(audio_patch_handle_t patchHandle) {
    sp<EffectHandle> effect;
    {
        Mutex::Autolock _l(mProxyLock);
        if (mEffectHandles.find(patchHandle) != mEffectHandles.end()) {
            effect = mEffectHandles.at(patchHandle);
            mEffectHandles.erase(patchHandle);
        }
    }
}


size_t AudioFlinger::DeviceEffectProxy::removeEffect(const sp<EffectModule>& effect)
{
    Mutex::Autolock _l(mProxyLock);
    if (effect == mHalEffect) {
        mHalEffect->release_l();
        mHalEffect.clear();
        mDevicePort.id = AUDIO_PORT_HANDLE_NONE;
    }
@@ -3462,7 +3471,7 @@ status_t AudioFlinger::DeviceEffectProxy::ProxyCallback::removeEffectFromHal(
    if (proxy == nullptr) {
        return NO_INIT;
    }
    return proxy->addEffectToHal(effect);
    return proxy->removeEffectFromHal(effect);
}

bool AudioFlinger::DeviceEffectProxy::ProxyCallback::isOutput() const {
@@ -3514,4 +3523,22 @@ uint32_t AudioFlinger::DeviceEffectProxy::ProxyCallback::outChannelCount() const
    return proxy->channelCount();
}

void AudioFlinger::DeviceEffectProxy::ProxyCallback::onEffectEnable(
        const sp<EffectBase>& effectBase) {
    sp<EffectModule> effect = effectBase->asEffectModule();
    if (effect == nullptr) {
        return;
    }
    effect->start();
}

void AudioFlinger::DeviceEffectProxy::ProxyCallback::onEffectDisable(
        const sp<EffectBase>& effectBase) {
    sp<EffectModule> effect = effectBase->asEffectModule();
    if (effect == nullptr) {
        return;
    }
    effect->stop();
}

} // namespace android
+2 −2
Original line number Diff line number Diff line
@@ -766,8 +766,8 @@ private:
        void resetVolume() override {}
        product_strategy_t strategy() const override  { return static_cast<product_strategy_t>(0); }
        int32_t activeTrackCnt() const override { return 0; }
        void onEffectEnable(const sp<EffectBase>& effect __unused) override {}
        void onEffectDisable(const sp<EffectBase>& effect __unused) override {}
        void onEffectEnable(const sp<EffectBase>& effect __unused) override;
        void onEffectDisable(const sp<EffectBase>& effect __unused) override;

        wp<EffectChain> chain() const override { return nullptr; }