Implement audio devices and streams HAL delegating to legacy HAL
Changes made to the .hal definition:
- introduce Effect ID returned by the IEffectsFactory that
needs to be passed to IStream.{add|remove}Effect; otherwise
it's impossible to retrieve the underlying HAL effect handle;
- change "bus address" in DeviceAddress to "string" type;
- fix signature of some methods w.r.t. returning Result;
- remove unused "struct AudioPatch".
Bug: 30222631
Test: make
Change-Id: Icb51729ef57bb2a5b0b78609735e7481bc04f95c
diff --git a/audio/effect/2.0/IEffectsFactory.hal b/audio/effect/2.0/IEffectsFactory.hal
index 6763825..c82b4a2 100644
--- a/audio/effect/2.0/IEffectsFactory.hal
+++ b/audio/effect/2.0/IEffectsFactory.hal
@@ -50,9 +50,11 @@
* directed to in audio HAL.
* @return retval operation completion status.
* @return result the interface for the created effect.
+ * @return effectId the unique ID of the effect to be used with
+ * IStream::addEffect and IStream::removeEffect methods.
*/
createEffect(Uuid uid, AudioSession session, AudioIoHandle ioHandle)
- generates (Result retval, IEffect result);
+ generates (Result retval, IEffect result, uint64_t effectId);
/*
* Dumps information about effects into the provided file descriptor.
diff --git a/audio/effect/2.0/default/Android.mk b/audio/effect/2.0/default/Android.mk
index 13106f3..50c4bd6 100644
--- a/audio/effect/2.0/default/Android.mk
+++ b/audio/effect/2.0/default/Android.mk
@@ -26,6 +26,7 @@
libeffects \
liblog \
android.hardware.audio.common@2.0 \
+ android.hardware.audio.common@2.0-util \
android.hardware.audio.effect@2.0 \
include $(BUILD_SHARED_LIBRARY)
diff --git a/audio/effect/2.0/default/Effect.cpp b/audio/effect/2.0/default/Effect.cpp
index 8ab0749..82d0292 100644
--- a/audio/effect/2.0/default/Effect.cpp
+++ b/audio/effect/2.0/default/Effect.cpp
@@ -23,6 +23,7 @@
#include "Conversions.h"
#include "Effect.h"
+#include "EffectMap.h"
namespace android {
namespace hardware {
@@ -45,6 +46,7 @@
Effect::~Effect() {
int status = EffectRelease(mHandle);
ALOGW_IF(status, "Error releasing effect %p: %s", mHandle, strerror(-status));
+ EffectMap::getInstance().remove(mHandle);
mHandle = 0;
}
diff --git a/audio/effect/2.0/default/EffectsFactory.cpp b/audio/effect/2.0/default/EffectsFactory.cpp
index f7c5d62..30fcb26 100644
--- a/audio/effect/2.0/default/EffectsFactory.cpp
+++ b/audio/effect/2.0/default/EffectsFactory.cpp
@@ -36,6 +36,7 @@
#include "EffectsFactory.h"
#include "DownmixEffect.h"
#include "Effect.h"
+#include "EffectMap.h"
#include "EnvironmentalReverbEffect.h"
#include "EqualizerEffect.h"
#include "LoudnessEnhancerEffect.h"
@@ -157,12 +158,16 @@
Result retval(Result::OK);
status_t status = EffectCreate(&halUuid, session, ioHandle, &handle);
sp<IEffect> effect;
+ uint64_t effectId = EffectMap::INVALID_ID;
if (status == OK) {
effect_descriptor_t halDescriptor;
memset(&halDescriptor, 0, sizeof(effect_descriptor_t));
status = (*handle)->get_descriptor(handle, &halDescriptor);
if (status == OK) {
effect = dispatchEffectInstanceCreation(halDescriptor, handle);
+ effectId = EffectMap::getInstance().add(handle);
+ } else {
+ EffectRelease(handle);
}
}
if (status != OK) {
@@ -173,7 +178,7 @@
retval = Result::NOT_INITIALIZED;
}
}
- _hidl_cb(retval, effect);
+ _hidl_cb(retval, effect, effectId);
return Void();
}
diff --git a/audio/effect/2.0/vts/functional/audio_effect_hidl_hal_test.cpp b/audio/effect/2.0/vts/functional/audio_effect_hidl_hal_test.cpp
index ddd5eac..c7878d5 100644
--- a/audio/effect/2.0/vts/functional/audio_effect_hidl_hal_test.cpp
+++ b/audio/effect/2.0/vts/functional/audio_effect_hidl_hal_test.cpp
@@ -84,13 +84,14 @@
ASSERT_TRUE(gotEffect);
Result retval = Result::NOT_INITIALIZED;
sp<IEffect> effect;
- ret = effectsFactory->createEffect(effectUuid, 1, 1,
- [&](Result r, const sp<IEffect>& result) {
- retval = r;
- if (r == Result::OK) {
- effect = result;
- }
- });
+ ret = effectsFactory->createEffect(
+ effectUuid, 1 /* session */, 1 /* ioHandle */,
+ [&](Result r, const sp<IEffect>& result, uint64_t /*effectId*/) {
+ retval = r;
+ if (r == Result::OK) {
+ effect = result;
+ }
+ });
EXPECT_EQ(ret.getStatus().exceptionCode(), Status::EX_NONE);
EXPECT_EQ(retval, Result::OK);
EXPECT_NE(effect, nullptr);