From 248e950798b83dfdce8b5cd36070ec2eac1aaf4b Mon Sep 17 00:00:00 2001 From: Mikhail Naganov Date: Tue, 21 Feb 2023 16:32:40 -0800 Subject: [PATCH] audio: Accept I/O handle for mix ports from the client The client can pass the I/O handle to the HAL as part of the requested audio port config. The HAL can store that handle and use it as a cookie to match the port config with other HALs (for example, SoundTrigger). Updated behavior of IModule.setAudioPortConfig to copy the handle for mix ports, and pass it back with the applied config. Enforced this behavior in VTS. Bug: 269551518 Test: atest VtsHalAudioCoreTargetTest Change-Id: Ibc3f9eea4169610f1680937c764de42b4fe5194a --- audio/aidl/default/Module.cpp | 15 +++++++++++++++ .../aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp | 15 +++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/audio/aidl/default/Module.cpp b/audio/aidl/default/Module.cpp index 10aead2726..5440b8d640 100644 --- a/audio/aidl/default/Module.cpp +++ b/audio/aidl/default/Module.cpp @@ -895,6 +895,21 @@ ndk::ScopedAStatus Module::setAudioPortConfig(const AudioPortConfig& in_requeste out_suggested->gain = in_requested.gain.value(); } + if (in_requested.ext.getTag() != AudioPortExt::Tag::unspecified) { + if (in_requested.ext.getTag() == out_suggested->ext.getTag()) { + if (out_suggested->ext.getTag() == AudioPortExt::Tag::mix) { + // 'AudioMixPortExt.handle' is set by the client, copy from in_requested + out_suggested->ext.get().handle = + in_requested.ext.get().handle; + } + } else { + LOG(WARNING) << __func__ << ": requested ext tag " + << toString(in_requested.ext.getTag()) << " do not match port's tag " + << toString(out_suggested->ext.getTag()); + requestedIsValid = false; + } + } + if (existing == configs.end() && requestedIsValid && requestedIsFullySpecified) { out_suggested->id = getConfig().nextPortId++; configs.push_back(*out_suggested); diff --git a/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp b/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp index 1222fd5d5a..b6015ffca5 100644 --- a/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp +++ b/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp @@ -88,6 +88,7 @@ using aidl::android::media::audio::common::AudioPort; using aidl::android::media::audio::common::AudioPortConfig; using aidl::android::media::audio::common::AudioPortDeviceExt; using aidl::android::media::audio::common::AudioPortExt; +using aidl::android::media::audio::common::AudioPortMixExt; using aidl::android::media::audio::common::AudioSource; using aidl::android::media::audio::common::AudioUsage; using aidl::android::media::audio::common::Boolean; @@ -1524,6 +1525,8 @@ TEST_P(AudioCoreModule, SetAudioPortConfigSuggestedConfig) { AudioPortConfig portConfig; AudioPortConfig suggestedConfig; portConfig.portId = srcMixPort.value().id; + const int32_t kIoHandle = 42; + portConfig.ext = AudioPortMixExt{.handle = kIoHandle}; { bool applied = true; ASSERT_IS_OK(module->setAudioPortConfig(portConfig, &suggestedConfig, &applied)) @@ -1535,18 +1538,22 @@ TEST_P(AudioCoreModule, SetAudioPortConfigSuggestedConfig) { EXPECT_TRUE(suggestedConfig.channelMask.has_value()); EXPECT_TRUE(suggestedConfig.format.has_value()); EXPECT_TRUE(suggestedConfig.flags.has_value()); + ASSERT_EQ(AudioPortExt::Tag::mix, suggestedConfig.ext.getTag()); + EXPECT_EQ(kIoHandle, suggestedConfig.ext.get().handle); WithAudioPortConfig applied(suggestedConfig); ASSERT_NO_FATAL_FAILURE(applied.SetUp(module.get())); const AudioPortConfig& appliedConfig = applied.get(); EXPECT_NE(0, appliedConfig.id); - EXPECT_TRUE(appliedConfig.sampleRate.has_value()); + ASSERT_TRUE(appliedConfig.sampleRate.has_value()); EXPECT_EQ(suggestedConfig.sampleRate.value(), appliedConfig.sampleRate.value()); - EXPECT_TRUE(appliedConfig.channelMask.has_value()); + ASSERT_TRUE(appliedConfig.channelMask.has_value()); EXPECT_EQ(suggestedConfig.channelMask.value(), appliedConfig.channelMask.value()); - EXPECT_TRUE(appliedConfig.format.has_value()); + ASSERT_TRUE(appliedConfig.format.has_value()); EXPECT_EQ(suggestedConfig.format.value(), appliedConfig.format.value()); - EXPECT_TRUE(appliedConfig.flags.has_value()); + ASSERT_TRUE(appliedConfig.flags.has_value()); EXPECT_EQ(suggestedConfig.flags.value(), appliedConfig.flags.value()); + ASSERT_EQ(AudioPortExt::Tag::mix, appliedConfig.ext.getTag()); + EXPECT_EQ(kIoHandle, appliedConfig.ext.get().handle); } TEST_P(AudioCoreModule, SetAllAttachedDevicePortConfigs) {