Send effect device/mode/source update if indicator was set in descriptor
Bug: 271500140
Test: Enable AIDL and test with YTM
Test: atest EffectsFactoryHalInterfaceTest
Change-Id: Ie85c2101eb37f2835d6e9e91a0ecc9273a250a0e
diff --git a/media/libaudiohal/impl/EffectConversionHelperAidl.cpp b/media/libaudiohal/impl/EffectConversionHelperAidl.cpp
index 9cf0cb8..4e34fca 100644
--- a/media/libaudiohal/impl/EffectConversionHelperAidl.cpp
+++ b/media/libaudiohal/impl/EffectConversionHelperAidl.cpp
@@ -25,6 +25,7 @@
#include <media/AidlConversionCppNdk.h>
#include <media/AidlConversionNdk.h>
#include <media/AidlConversionEffect.h>
+#include <media/AudioContainers.h>
#include <system/audio_effects/effect_visualizer.h>
#include <utils/Log.h>
@@ -61,6 +62,7 @@
{EFFECT_CMD_RESET, &EffectConversionHelperAidl::handleReset},
{EFFECT_CMD_ENABLE, &EffectConversionHelperAidl::handleEnable},
{EFFECT_CMD_DISABLE, &EffectConversionHelperAidl::handleDisable},
+ {EFFECT_CMD_SET_AUDIO_MODE, &EffectConversionHelperAidl::handleSetAudioMode},
{EFFECT_CMD_SET_AUDIO_SOURCE, &EffectConversionHelperAidl::handleSetAudioSource},
{EFFECT_CMD_SET_DEVICE, &EffectConversionHelperAidl::handleSetDevice},
{EFFECT_CMD_SET_INPUT_DEVICE, &EffectConversionHelperAidl::handleSetDevice},
@@ -279,6 +281,10 @@
pReplyData);
return BAD_VALUE;
}
+ if (!getDescriptor().common.flags.audioSourceIndication) {
+ ALOGW("%s parameter no audioSourceIndication, skipping", __func__);
+ return OK;
+ }
audio_source_t source = *(audio_source_t*)pCmdData;
AudioSource aidlSource =
@@ -295,6 +301,10 @@
pReplyData);
return BAD_VALUE;
}
+ if (!getDescriptor().common.flags.audioModeIndication) {
+ ALOGW("%s parameter no audioModeIndication, skipping", __func__);
+ return OK;
+ }
audio_mode_t mode = *(audio_mode_t *)pCmdData;
AudioMode aidlMode =
VALUE_OR_RETURN_STATUS(::aidl::android::legacy2aidl_audio_mode_t_AudioMode(mode));
@@ -310,9 +320,26 @@
pReplyData);
return BAD_VALUE;
}
- // TODO: convert from audio_devices_t to std::vector<AudioDeviceDescription>
- // const auto& legacyDevice = *(uint32_t*)(pCmdData);
+ if (!getDescriptor().common.flags.deviceIndication) {
+ ALOGW("%s parameter no deviceIndication, skipping", __func__);
+ return OK;
+ }
+ // convert from bitmask of audio_devices_t to std::vector<AudioDeviceDescription>
+ auto legacyDevices = *(uint32_t*)(pCmdData);
+ // extract the input bit and remove it from bitmasks
+ const auto inputBit = legacyDevices & AUDIO_DEVICE_BIT_IN;
+ legacyDevices &= ~AUDIO_DEVICE_BIT_IN;
std::vector<AudioDeviceDescription> aidlDevices;
+ while (legacyDevices) {
+ // get audio_devices_t represented by the last true bit and convert to AIDL
+ const auto lowestBitDevice = legacyDevices & -legacyDevices;
+ AudioDeviceDescription deviceDesc = VALUE_OR_RETURN_STATUS(
+ ::aidl::android::legacy2aidl_audio_devices_t_AudioDeviceDescription(
+ static_cast<audio_devices_t>(lowestBitDevice | inputBit)));
+ aidlDevices.emplace_back(deviceDesc);
+ legacyDevices -= lowestBitDevice;
+ }
+
RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
mEffect->setParameter(Parameter::make<Parameter::deviceDescription>(aidlDevices))));
return *static_cast<int32_t*>(pReplyData) = OK;
@@ -435,5 +462,19 @@
(mIsProxyEffect && std::static_pointer_cast<EffectProxy>(mEffect)->isBypassing()));
}
+Descriptor EffectConversionHelperAidl::getDescriptor() const {
+ if (!mIsProxyEffect) {
+ return mDesc;
+ }
+
+ Descriptor desc;
+ if (const auto status = mEffect->getDescriptor(&desc); !status.isOk()) {
+ ALOGE("%s failed to get proxy descriptor (%d:%s), using default", __func__,
+ status.getStatus(), status.getMessage());
+ return mDesc;
+ }
+ return desc;
+}
+
} // namespace effect
} // namespace android