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

Commit 58e73afe authored by François Gaffie's avatar François Gaffie Committed by Eric Laurent
Browse files

audio: effect: prevents spurious call to remove/add device effects



Bug: 268441977
Test: make

When multiple clients are using a same input, each time a client is
added/removed, the audio path will be recreated, thus leading to
removing/adding the device effect on audio hal if a device effect is
used.
This CL prevents from removing/adding a device effect when a patch handle
is reused, by checking if it involves same sink device/source mix or sink mix
/source device.

Change-Id: I9545f701835a4269a870b66e4f68351aca384683
Signed-off-by: default avatarFrançois Gaffie <francois.gaffie@renault.com>
parent af8be3f5
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -55,6 +55,19 @@ void AudioFlinger::DeviceEffectManager::onReleaseAudioPatch(audio_patch_handle_t
    }
}

void AudioFlinger::DeviceEffectManager::onUpdateAudioPatch(audio_patch_handle_t oldHandle,
        audio_patch_handle_t newHandle, const PatchPanel::Patch& patch) {
    ALOGV("%s oldhandle %d newHandle %d mHalHandle %d device sink %08x",
            __func__, oldHandle, newHandle, patch.mHalHandle,
            patch.mAudioPatch.num_sinks > 0 ? patch.mAudioPatch.sinks[0].ext.device.type : 0);
    Mutex::Autolock _l(mLock);
    for (auto& effect : mDeviceEffects) {
        // TODO(b/288339104) void*
        status_t status = effect.second->onUpdatePatch(oldHandle, newHandle, &patch);
        ALOGW_IF(status != NO_ERROR, "%s onUpdatePatch error %d", __func__, status);
    }
}

// DeviceEffectManager::createEffect_l() must be called with AudioFlinger::mLock held
sp<IAfEffectHandle> AudioFlinger::DeviceEffectManager::createEffect_l(
        effect_descriptor_t *descriptor,
+3 −0
Original line number Diff line number Diff line
@@ -62,6 +62,9 @@ public:
    void onCreateAudioPatch(audio_patch_handle_t handle,
                            const PatchPanel::Patch& patch) override;
    void onReleaseAudioPatch(audio_patch_handle_t handle) override;
    void onUpdateAudioPatch(audio_patch_handle_t oldHandle,
                            audio_patch_handle_t newHandle,
                            const PatchPanel::Patch& patch) override;

private:
    status_t checkEffectCompatibility(const effect_descriptor_t *desc);
+17 −0
Original line number Diff line number Diff line
@@ -3311,6 +3311,23 @@ status_t DeviceEffectProxy::init(
    return status;
}

status_t DeviceEffectProxy::onUpdatePatch(audio_patch_handle_t oldPatchHandle,
        audio_patch_handle_t newPatchHandle,
        const AudioFlinger::PatchPanel::Patch& patch __unused) {
    status_t status = NAME_NOT_FOUND;
    ALOGV("%s", __func__);
    Mutex::Autolock _l(mProxyLock);
    if (mEffectHandles.find(oldPatchHandle) != mEffectHandles.end()) {
        ALOGV("%s replacing effect from handle %d to handle %d", __func__, oldPatchHandle,
                newPatchHandle);
        sp<IAfEffectHandle> effect = mEffectHandles.at(oldPatchHandle);
        mEffectHandles.erase(oldPatchHandle);
        mEffectHandles.emplace(newPatchHandle, effect);
        status = NO_ERROR;
    }
    return status;
}

status_t DeviceEffectProxy::onCreatePatch(
        audio_patch_handle_t patchHandle, const AudioFlinger::PatchPanel::Patch& patch) {
    status_t status = NAME_NOT_FOUND;
+9 −0
Original line number Diff line number Diff line
@@ -680,11 +680,20 @@ public:
        return onCreatePatch(patchHandle,
                *reinterpret_cast<const AudioFlinger::PatchPanel::Patch *>(patch));
    }
    // TODO(b/288339104) type
    status_t onUpdatePatch(audio_patch_handle_t oldPatchHandle, audio_patch_handle_t newPatchHandle,
            /* const PatchPanel::Patch& */ const void * patch) final {
        return onUpdatePatch(oldPatchHandle, newPatchHandle,
                *reinterpret_cast<const AudioFlinger::PatchPanel::Patch *>(patch));
    }

    status_t init(const std::map<audio_patch_handle_t, AudioFlinger::PatchPanel::Patch>& patches);
    status_t onCreatePatch(
            audio_patch_handle_t patchHandle, const AudioFlinger::PatchPanel::Patch& patch);

    status_t onUpdatePatch(audio_patch_handle_t oldPatchHandle, audio_patch_handle_t newPatchHandle,
            const AudioFlinger::PatchPanel::Patch& patch);

    void onReleasePatch(audio_patch_handle_t patchHandle) final;

    size_t removeEffect(const sp<IAfEffectModule>& effect) final;
+3 −0
Original line number Diff line number Diff line
@@ -349,6 +349,9 @@ public:
    virtual status_t onCreatePatch(
            audio_patch_handle_t patchHandle,
            /* const PatchPanel::Patch& */ const void * patch) = 0;
    virtual status_t onUpdatePatch(audio_patch_handle_t oldPatchHandle,
            audio_patch_handle_t newPatchHandle,
            /* const PatchPanel::Patch& */ const void * patch) = 0;
    virtual void onReleasePatch(audio_patch_handle_t patchHandle) = 0;

    virtual void dump2(int fd, int spaces) const = 0; // TODO(b/288339104) naming?
Loading