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/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();
}