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: François Gaffie <francois.gaffie@renault.com>
diff --git a/services/audioflinger/PatchCommandThread.h b/services/audioflinger/PatchCommandThread.h
index b52e0a9..ea87c0f 100644
--- a/services/audioflinger/PatchCommandThread.h
+++ b/services/audioflinger/PatchCommandThread.h
@@ -30,6 +30,7 @@
enum {
CREATE_AUDIO_PATCH,
RELEASE_AUDIO_PATCH,
+ UPDATE_AUDIO_PATCH,
};
class PatchCommandListener : public virtual RefBase {
@@ -37,6 +38,9 @@
virtual void onCreateAudioPatch(audio_patch_handle_t handle,
const PatchPanel::Patch& patch) = 0;
virtual void onReleaseAudioPatch(audio_patch_handle_t handle) = 0;
+ virtual void onUpdateAudioPatch(audio_patch_handle_t oldHandle,
+ audio_patch_handle_t newHandle,
+ const PatchPanel::Patch& patch) = 0;
};
PatchCommandThread() : Thread(false /* canCallJava */) {}
@@ -46,6 +50,9 @@
void createAudioPatch(audio_patch_handle_t handle, const PatchPanel::Patch& patch);
void releaseAudioPatch(audio_patch_handle_t handle);
+ void updateAudioPatch(audio_patch_handle_t oldHandle,
+ audio_patch_handle_t newHandle,
+ const PatchPanel::Patch& patch);
// Thread virtuals
void onFirstRef() override;
@@ -56,7 +63,9 @@
void createAudioPatchCommand(audio_patch_handle_t handle,
const PatchPanel::Patch& patch);
void releaseAudioPatchCommand(audio_patch_handle_t handle);
-
+ void updateAudioPatchCommand(audio_patch_handle_t oldHandle,
+ audio_patch_handle_t newHandle,
+ const PatchPanel::Patch& patch);
private:
class CommandData;
@@ -90,6 +99,18 @@
audio_patch_handle_t mHandle;
};
+ class UpdateAudioPatchData : public CommandData {
+ public:
+ UpdateAudioPatchData(audio_patch_handle_t oldHandle,
+ audio_patch_handle_t newHandle,
+ const PatchPanel::Patch& patch)
+ : mOldHandle(oldHandle), mNewHandle(newHandle), mPatch(patch) {}
+
+ const audio_patch_handle_t mOldHandle;
+ const audio_patch_handle_t mNewHandle;
+ const PatchPanel::Patch mPatch;
+ };
+
void sendCommand(const sp<Command>& command);
std::string mThreadName;