AudioFlinger: fix createEffect() for second client attached
The refactoring of AudioFlinger::createEffect() with AIDL (commit ce182940)
introduced a regression for the case where a second client
connects to an already existing effect.
In this case, the conventional return status of ALREADY_EXISTS is
interpreted as an error by the AIDL infrastructure and the response
data is dropped during the transaction causing the effect creation
to fail.
Test: atest audioeffect_tests:DefaultEffectTest#ManageSourceDefaultEffects
Change-Id: I858dd0ee2a200901ec229d4a5cabdf4a458ee88c
diff --git a/media/libaudioclient/AudioEffect.cpp b/media/libaudioclient/AudioEffect.cpp
index 62f863d..eee7f7e 100644
--- a/media/libaudioclient/AudioEffect.cpp
+++ b/media/libaudioclient/AudioEffect.cpp
@@ -128,6 +128,9 @@
mStatus = audioFlinger->createEffect(request, &response);
if (mStatus == OK) {
+ if (response.alreadyExists) {
+ mStatus = ALREADY_EXISTS;
+ }
mId = response.id;
enabled = response.enabled;
iEffect = response.effect;
diff --git a/media/libaudioclient/aidl/android/media/CreateEffectResponse.aidl b/media/libaudioclient/aidl/android/media/CreateEffectResponse.aidl
index 0aa640a..e2755dd 100644
--- a/media/libaudioclient/aidl/android/media/CreateEffectResponse.aidl
+++ b/media/libaudioclient/aidl/android/media/CreateEffectResponse.aidl
@@ -29,4 +29,5 @@
boolean enabled;
@nullable IEffect effect;
EffectDescriptor desc;
+ boolean alreadyExists;
}
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 733fea4..defb8c1 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -3990,6 +3990,12 @@
Register:
if (!probe && (lStatus == NO_ERROR || lStatus == ALREADY_EXISTS)) {
+ if (lStatus == ALREADY_EXISTS) {
+ response->alreadyExists = true;
+ lStatus = NO_ERROR;
+ } else {
+ response->alreadyExists = false;
+ }
// Check CPU and memory usage
sp<EffectBase> effect = handle->effect().promote();
if (effect != nullptr) {