blob: fe9937fa933c21a796ab41220016a1549c538964 [file] [log] [blame]
Mikhail Naganovad3f8a12017-12-12 13:24:23 -08001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +020017#include <cstring>
Mikhail Naganov04a86632017-12-15 18:01:42 -080018#include <memory>
jiabinf4eb15a2019-08-28 15:31:47 -070019#include <string>
Mikhail Naganov21b43362018-06-04 10:37:09 -070020#include <sys/wait.h>
21#include <unistd.h>
Mikhail Naganov04a86632017-12-15 18:01:42 -080022
Mikhail Naganovad3f8a12017-12-12 13:24:23 -080023#include <gtest/gtest.h>
Jiabin Huang3b98d322020-09-03 17:54:16 +000024#include <gmock/gmock.h>
Mikhail Naganovad3f8a12017-12-12 13:24:23 -080025
Mikhail Naganov21b43362018-06-04 10:37:09 -070026#define LOG_TAG "APM_Test"
jiabinf4eb15a2019-08-28 15:31:47 -070027#include <Serializer.h>
28#include <android-base/file.h>
François Gaffie6ebbce02023-07-19 13:27:53 +020029#include <android-base/properties.h>
Svet Ganov3e5f14f2021-05-13 22:51:08 +000030#include <android/content/AttributionSourceState.h>
Marvin Raminbdefaf02023-11-01 09:10:32 +010031#include <android_media_audiopolicy.h>
jiabin220eea12024-05-17 17:55:20 +000032#include <com_android_media_audioserver.h>
Marvin Raminbdefaf02023-11-01 09:10:32 +010033#include <flag_macros.h>
François Gaffie6ebbce02023-07-19 13:27:53 +020034#include <hardware/audio_effect.h>
jiabinf4eb15a2019-08-28 15:31:47 -070035#include <media/AudioPolicy.h>
Mikhail Naganovdc769682018-05-04 15:34:08 -070036#include <media/PatchBuilder.h>
jiabinf4eb15a2019-08-28 15:31:47 -070037#include <media/RecordingActivityTracker.h>
38#include <utils/Log.h>
39#include <utils/Vector.h>
Oscar Azucena4f49ef62023-01-25 23:32:13 -080040#include <cutils/multiuser.h>
Mikhail Naganovdc769682018-05-04 15:34:08 -070041
jiabinf4eb15a2019-08-28 15:31:47 -070042#include "AudioPolicyInterface.h"
jiabinb3f98042019-09-26 17:56:44 -070043#include "AudioPolicyManagerTestClient.h"
Mikhail Naganovad3f8a12017-12-12 13:24:23 -080044#include "AudioPolicyTestClient.h"
45#include "AudioPolicyTestManager.h"
Mikhail Naganov70b52652024-09-06 10:23:24 -070046#include "test_execution_tracer.h"
Mikhail Naganovad3f8a12017-12-12 13:24:23 -080047
48using namespace android;
Jiabin Huang3b98d322020-09-03 17:54:16 +000049using testing::UnorderedElementsAre;
Marvin Raminbdefaf02023-11-01 09:10:32 +010050using testing::IsEmpty;
Svet Ganov3e5f14f2021-05-13 22:51:08 +000051using android::content::AttributionSourceState;
Mikhail Naganovad3f8a12017-12-12 13:24:23 -080052
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +020053namespace {
54
55AudioMixMatchCriterion createUidCriterion(uint32_t uid, bool exclude = false) {
56 AudioMixMatchCriterion criterion;
57 criterion.mValue.mUid = uid;
58 criterion.mRule = exclude ? RULE_EXCLUDE_UID : RULE_MATCH_UID;
59 return criterion;
60}
61
Oscar Azucena873d10f2023-01-12 18:34:42 -080062AudioMixMatchCriterion createUserIdCriterion(int userId, bool exclude = false) {
63 AudioMixMatchCriterion criterion;
64 criterion.mValue.mUserId = userId;
65 criterion.mRule = exclude ? RULE_EXCLUDE_USERID : RULE_MATCH_USERID;
66 return criterion;
67}
68
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +020069AudioMixMatchCriterion createUsageCriterion(audio_usage_t usage, bool exclude = false) {
70 AudioMixMatchCriterion criterion;
71 criterion.mValue.mUsage = usage;
72 criterion.mRule = exclude ? RULE_EXCLUDE_ATTRIBUTE_USAGE : RULE_MATCH_ATTRIBUTE_USAGE;
73 return criterion;
74}
75
76AudioMixMatchCriterion createCapturePresetCriterion(audio_source_t source, bool exclude = false) {
77 AudioMixMatchCriterion criterion;
78 criterion.mValue.mSource = source;
79 criterion.mRule = exclude ?
80 RULE_EXCLUDE_ATTRIBUTE_CAPTURE_PRESET : RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET;
81 return criterion;
82}
83
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +020084AudioMixMatchCriterion createSessionIdCriterion(audio_session_t session, bool exclude = false) {
85 AudioMixMatchCriterion criterion;
86 criterion.mValue.mAudioSessionId = session;
87 criterion.mRule = exclude ?
88 RULE_EXCLUDE_AUDIO_SESSION_ID : RULE_MATCH_AUDIO_SESSION_ID;
89 return criterion;
90}
91
Jan Sebechlebsky8e10cea2023-03-29 11:43:31 +020092// TODO b/182392769: use attribution source util
93AttributionSourceState createAttributionSourceState(uid_t uid) {
94 AttributionSourceState attributionSourceState;
95 attributionSourceState.uid = uid;
96 attributionSourceState.token = sp<BBinder>::make();
97 return attributionSourceState;
98}
99
jiabin66acc432024-02-06 00:57:36 +0000100bool equals(const audio_config_base_t& config1, const audio_config_base_t& config2) {
101 return config1.format == config2.format
102 && config1.sample_rate == config2.sample_rate
103 && config1.channel_mask == config2.channel_mask;
104}
105
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +0200106} // namespace
107
Mikhail Naganov68e3f642023-04-28 13:06:32 -0700108TEST(AudioPolicyConfigTest, DefaultConfigForTestsIsEmpty) {
109 auto config = AudioPolicyConfig::createWritableForTests();
110 EXPECT_TRUE(config->getSource().empty());
111 EXPECT_TRUE(config->getHwModules().isEmpty());
112 EXPECT_TRUE(config->getInputDevices().isEmpty());
113 EXPECT_TRUE(config->getOutputDevices().isEmpty());
114}
115
116TEST(AudioPolicyConfigTest, FallbackToDefault) {
117 auto config = AudioPolicyConfig::loadFromApmXmlConfigWithFallback(
118 base::GetExecutableDirectory() + "/test_invalid_audio_policy_configuration.xml");
119 EXPECT_EQ(AudioPolicyConfig::kDefaultConfigSource, config->getSource());
120}
121
122TEST(AudioPolicyConfigTest, LoadForTests) {
123 {
124 auto result = AudioPolicyConfig::loadFromCustomXmlConfigForTests(
125 base::GetExecutableDirectory() + "/test_invalid_audio_policy_configuration.xml");
126 EXPECT_FALSE(result.ok());
127 }
128 {
129 const std::string source =
130 base::GetExecutableDirectory() + "/test_audio_policy_configuration.xml";
131 auto result = AudioPolicyConfig::loadFromCustomXmlConfigForTests(source);
132 ASSERT_TRUE(result.ok());
133 EXPECT_EQ(source, result.value()->getSource());
134 EXPECT_FALSE(result.value()->getHwModules().isEmpty());
135 EXPECT_FALSE(result.value()->getInputDevices().isEmpty());
136 EXPECT_FALSE(result.value()->getOutputDevices().isEmpty());
137 }
138}
139
Mikhail Naganov47835552019-05-14 10:32:51 -0700140TEST(AudioPolicyManagerTestInit, EngineFailure) {
141 AudioPolicyTestClient client;
Mikhail Naganov68e3f642023-04-28 13:06:32 -0700142 auto config = AudioPolicyConfig::createWritableForTests();
143 config->setDefault();
144 config->setEngineLibraryNameSuffix("non-existent");
145 AudioPolicyTestManager manager(config, &client);
Mikhail Naganov47835552019-05-14 10:32:51 -0700146 ASSERT_EQ(NO_INIT, manager.initialize());
147 ASSERT_EQ(NO_INIT, manager.initCheck());
148}
149
150TEST(AudioPolicyManagerTestInit, ClientFailure) {
Mikhail Naganovad3f8a12017-12-12 13:24:23 -0800151 AudioPolicyTestClient client;
152 AudioPolicyTestManager manager(&client);
Mikhail Naganovbcbcb1b2017-12-13 13:03:35 -0800153 // Since the default client fails to open anything,
154 // APM should indicate that the initialization didn't succeed.
Mikhail Naganovad3f8a12017-12-12 13:24:23 -0800155 ASSERT_EQ(NO_INIT, manager.initialize());
Mikhail Naganovbcbcb1b2017-12-13 13:03:35 -0800156 ASSERT_EQ(NO_INIT, manager.initCheck());
157}
158
159
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800160class PatchCountCheck {
161 public:
162 explicit PatchCountCheck(AudioPolicyManagerTestClient *client)
163 : mClient{client},
164 mInitialCount{mClient->getActivePatchesCount()} {}
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800165 int deltaFromSnapshot() const {
166 size_t currentCount = mClient->getActivePatchesCount();
167 if (mInitialCount <= currentCount) {
168 return currentCount - mInitialCount;
169 } else {
170 return -(static_cast<int>(mInitialCount - currentCount));
171 }
172 }
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800173 private:
174 const AudioPolicyManagerTestClient *mClient;
175 const size_t mInitialCount;
176};
177
Mikhail Naganov04a86632017-12-15 18:01:42 -0800178class AudioPolicyManagerTest : public testing::Test {
179 protected:
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800180 void SetUp() override;
181 void TearDown() override;
jiabin7c0205e2019-09-05 10:26:04 -0700182 virtual void SetUpManagerConfig();
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800183
184 void dumpToLog();
Mikhail Naganov0756bbf2019-09-06 13:53:26 -0700185 // When explicit routing is needed, selectedDeviceId needs to be set as the wanted port
186 // id. Otherwise, selectedDeviceId needs to be initialized as AUDIO_PORT_HANDLE_NONE.
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800187 void getOutputForAttr(
188 audio_port_handle_t *selectedDeviceId,
189 audio_format_t format,
Mikhail Naganov55773032020-10-01 15:08:13 -0700190 audio_channel_mask_t channelMask,
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800191 int sampleRate,
192 audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE,
Mikhail Naganov0756bbf2019-09-06 13:53:26 -0700193 audio_io_handle_t *output = nullptr,
jiabinf4eb15a2019-08-28 15:31:47 -0700194 audio_port_handle_t *portId = nullptr,
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +0200195 audio_attributes_t attr = {},
jiabin3ff8d7d2022-12-13 06:27:44 +0000196 audio_session_t session = AUDIO_SESSION_NONE,
jiabin5eaf0962022-12-20 20:11:38 +0000197 int uid = 0,
198 bool* isBitPerfect = nullptr);
jiabinf4eb15a2019-08-28 15:31:47 -0700199 void getInputForAttr(
200 const audio_attributes_t &attr,
François Gaffie6ebbce02023-07-19 13:27:53 +0200201 audio_io_handle_t *input,
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +0200202 audio_session_t session,
jiabinf4eb15a2019-08-28 15:31:47 -0700203 audio_unique_id_t riid,
204 audio_port_handle_t *selectedDeviceId,
205 audio_format_t format,
Mikhail Naganov55773032020-10-01 15:08:13 -0700206 audio_channel_mask_t channelMask,
jiabinf4eb15a2019-08-28 15:31:47 -0700207 int sampleRate,
208 audio_input_flags_t flags = AUDIO_INPUT_FLAG_NONE,
Marvin Ramine5a122d2023-12-07 13:57:59 +0100209 audio_port_handle_t *portId = nullptr,
210 uint32_t *virtualDeviceId = nullptr);
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800211 PatchCountCheck snapshotPatchCount() { return PatchCountCheck(mClient.get()); }
Mikhail Naganov04a86632017-12-15 18:01:42 -0800212
Mikhail Naganov0805de12022-02-15 23:00:07 +0000213 void getAudioPorts(audio_port_type_t type, audio_port_role_t role,
214 std::vector<audio_port_v7>* ports);
Mikhail Naganovd0e2c742020-03-25 15:59:59 -0700215 // Tries to find a device port. If 'foundPort' isn't nullptr,
216 // will generate a failure if the port hasn't been found.
217 bool findDevicePort(audio_port_role_t role, audio_devices_t deviceType,
jiabin19cdba52020-11-24 11:28:58 -0800218 const std::string &address, audio_port_v7 *foundPort);
jiabin7c0205e2019-09-05 10:26:04 -0700219 static audio_port_handle_t getDeviceIdFromPatch(const struct audio_patch* patch);
Kriti Dangef6be8f2020-11-05 11:58:19 +0100220 virtual AudioPolicyManagerTestClient* getClient() { return new AudioPolicyManagerTestClient; }
jiabinf4eb15a2019-08-28 15:31:47 -0700221
Mikhail Naganov68e3f642023-04-28 13:06:32 -0700222 sp<AudioPolicyConfig> mConfig;
Mikhail Naganov04a86632017-12-15 18:01:42 -0800223 std::unique_ptr<AudioPolicyManagerTestClient> mClient;
224 std::unique_ptr<AudioPolicyTestManager> mManager;
Dean Wheatleyd082f472022-02-04 11:10:48 +1100225
jiabin24ff57a2023-11-27 21:06:51 +0000226 constexpr static const uint32_t k48000SamplingRate = 48000;
jiabin274fed92024-09-09 23:59:35 +0000227
228 static const std::string sTestEngineConfig;
Mikhail Naganov04a86632017-12-15 18:01:42 -0800229};
230
jiabin274fed92024-09-09 23:59:35 +0000231const std::string AudioPolicyManagerTest::sTestEngineConfig =
232 base::GetExecutableDirectory() + "/engine/test_audio_policy_engine_configuration.xml";
233
Mikhail Naganov04a86632017-12-15 18:01:42 -0800234void AudioPolicyManagerTest::SetUp() {
Kriti Dangef6be8f2020-11-05 11:58:19 +0100235 mClient.reset(getClient());
Mikhail Naganovd4c21aa2021-10-05 15:10:16 -0700236 ASSERT_NO_FATAL_FAILURE(SetUpManagerConfig()); // Subclasses may want to customize the config.
jiabin274fed92024-09-09 23:59:35 +0000237 mManager.reset(new AudioPolicyTestManager(mConfig, mClient.get(), sTestEngineConfig));
Mikhail Naganov04a86632017-12-15 18:01:42 -0800238 ASSERT_EQ(NO_ERROR, mManager->initialize());
239 ASSERT_EQ(NO_ERROR, mManager->initCheck());
Mikhail Naganovad3f8a12017-12-12 13:24:23 -0800240}
Mikhail Naganov04a86632017-12-15 18:01:42 -0800241
242void AudioPolicyManagerTest::TearDown() {
243 mManager.reset();
244 mClient.reset();
245}
246
jiabin7c0205e2019-09-05 10:26:04 -0700247void AudioPolicyManagerTest::SetUpManagerConfig() {
Mikhail Naganov68e3f642023-04-28 13:06:32 -0700248 mConfig = AudioPolicyConfig::createWritableForTests();
249 mConfig->setDefault();
jiabin7c0205e2019-09-05 10:26:04 -0700250}
251
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800252void AudioPolicyManagerTest::dumpToLog() {
Mikhail Naganov21b43362018-06-04 10:37:09 -0700253 int pipefd[2];
254 ASSERT_NE(-1, pipe(pipefd));
255 pid_t cpid = fork();
256 ASSERT_NE(-1, cpid);
257 if (cpid == 0) {
258 // Child process reads from the pipe and logs.
259 close(pipefd[1]);
260 std::string line;
261 char buf;
262 while (read(pipefd[0], &buf, sizeof(buf)) > 0) {
263 if (buf != '\n') {
264 line += buf;
265 } else {
266 ALOGI("%s", line.c_str());
267 line = "";
268 }
269 }
270 if (!line.empty()) ALOGI("%s", line.c_str());
271 close(pipefd[0]);
272 _exit(EXIT_SUCCESS);
273 } else {
274 // Parent does the dump and checks the status code.
275 close(pipefd[0]);
276 ASSERT_EQ(NO_ERROR, mManager->dump(pipefd[1]));
277 close(pipefd[1]);
278 wait(NULL); // Wait for the child to exit.
279 }
280}
281
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800282void AudioPolicyManagerTest::getOutputForAttr(
283 audio_port_handle_t *selectedDeviceId,
284 audio_format_t format,
Mikhail Naganov55773032020-10-01 15:08:13 -0700285 audio_channel_mask_t channelMask,
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800286 int sampleRate,
287 audio_output_flags_t flags,
Mikhail Naganov0756bbf2019-09-06 13:53:26 -0700288 audio_io_handle_t *output,
jiabinf4eb15a2019-08-28 15:31:47 -0700289 audio_port_handle_t *portId,
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +0200290 audio_attributes_t attr,
jiabin3ff8d7d2022-12-13 06:27:44 +0000291 audio_session_t session,
jiabin5eaf0962022-12-20 20:11:38 +0000292 int uid,
293 bool* isBitPerfect) {
Mikhail Naganov0756bbf2019-09-06 13:53:26 -0700294 audio_io_handle_t localOutput;
295 if (!output) output = &localOutput;
296 *output = AUDIO_IO_HANDLE_NONE;
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800297 audio_stream_type_t stream = AUDIO_STREAM_DEFAULT;
298 audio_config_t config = AUDIO_CONFIG_INITIALIZER;
299 config.sample_rate = sampleRate;
300 config.channel_mask = channelMask;
301 config.format = format;
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800302 audio_port_handle_t localPortId;
303 if (!portId) portId = &localPortId;
304 *portId = AUDIO_PORT_HANDLE_NONE;
Eric Laurent8a1095a2019-11-08 14:44:16 -0800305 AudioPolicyInterface::output_type_t outputType;
Eric Laurentb0a7bc92022-04-05 15:06:08 +0200306 bool isSpatialized;
jiabin5eaf0962022-12-20 20:11:38 +0000307 bool isBitPerfectInternal;
Andy Hung6b137d12024-08-27 22:35:17 +0000308 float volume;
Jan Sebechlebsky8e10cea2023-03-29 11:43:31 +0200309 AttributionSourceState attributionSource = createAttributionSourceState(uid);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800310 ASSERT_EQ(OK, mManager->getOutputForAttr(
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +0200311 &attr, output, session, &stream, attributionSource, &config, &flags,
jiabin5eaf0962022-12-20 20:11:38 +0000312 selectedDeviceId, portId, {}, &outputType, &isSpatialized,
Andy Hung6b137d12024-08-27 22:35:17 +0000313 isBitPerfect == nullptr ? &isBitPerfectInternal : isBitPerfect, &volume));
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800314 ASSERT_NE(AUDIO_PORT_HANDLE_NONE, *portId);
Mikhail Naganov0756bbf2019-09-06 13:53:26 -0700315 ASSERT_NE(AUDIO_IO_HANDLE_NONE, *output);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800316}
317
jiabinf4eb15a2019-08-28 15:31:47 -0700318void AudioPolicyManagerTest::getInputForAttr(
319 const audio_attributes_t &attr,
François Gaffie6ebbce02023-07-19 13:27:53 +0200320 audio_io_handle_t *input,
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +0200321 const audio_session_t session,
jiabinf4eb15a2019-08-28 15:31:47 -0700322 audio_unique_id_t riid,
323 audio_port_handle_t *selectedDeviceId,
324 audio_format_t format,
Mikhail Naganov55773032020-10-01 15:08:13 -0700325 audio_channel_mask_t channelMask,
jiabinf4eb15a2019-08-28 15:31:47 -0700326 int sampleRate,
327 audio_input_flags_t flags,
Marvin Ramine5a122d2023-12-07 13:57:59 +0100328 audio_port_handle_t *portId,
329 uint32_t *virtualDeviceId) {
jiabinf4eb15a2019-08-28 15:31:47 -0700330 audio_config_base_t config = AUDIO_CONFIG_BASE_INITIALIZER;
331 config.sample_rate = sampleRate;
332 config.channel_mask = channelMask;
333 config.format = format;
jiabinf4eb15a2019-08-28 15:31:47 -0700334 audio_port_handle_t localPortId;
335 if (!portId) portId = &localPortId;
336 *portId = AUDIO_PORT_HANDLE_NONE;
Marvin Ramine5a122d2023-12-07 13:57:59 +0100337 if (!virtualDeviceId) virtualDeviceId = 0;
jiabinf4eb15a2019-08-28 15:31:47 -0700338 AudioPolicyInterface::input_type_t inputType;
Jan Sebechlebsky8e10cea2023-03-29 11:43:31 +0200339 AttributionSourceState attributionSource = createAttributionSourceState(/*uid=*/ 0);
jiabinf4eb15a2019-08-28 15:31:47 -0700340 ASSERT_EQ(OK, mManager->getInputForAttr(
François Gaffie6ebbce02023-07-19 13:27:53 +0200341 &attr, input, riid, session, attributionSource, &config, flags,
Marvin Ramine5a122d2023-12-07 13:57:59 +0100342 selectedDeviceId, &inputType, portId, virtualDeviceId));
jiabinf4eb15a2019-08-28 15:31:47 -0700343 ASSERT_NE(AUDIO_PORT_HANDLE_NONE, *portId);
344}
345
Mikhail Naganov0805de12022-02-15 23:00:07 +0000346void AudioPolicyManagerTest::getAudioPorts(audio_port_type_t type, audio_port_role_t role,
347 std::vector<audio_port_v7>* ports) {
jiabinf4eb15a2019-08-28 15:31:47 -0700348 uint32_t numPorts = 0;
349 uint32_t generation1;
350 status_t ret;
351
Mikhail Naganov0805de12022-02-15 23:00:07 +0000352 ret = mManager->listAudioPorts(role, type, &numPorts, nullptr, &generation1);
353 ASSERT_EQ(NO_ERROR, ret) << "mManager->listAudioPorts returned error";
jiabinf4eb15a2019-08-28 15:31:47 -0700354
355 uint32_t generation2;
Mikhail Naganov0805de12022-02-15 23:00:07 +0000356 ports->resize(numPorts);
357 ret = mManager->listAudioPorts(role, type, &numPorts, ports->data(), &generation2);
358 ASSERT_EQ(NO_ERROR, ret) << "mManager->listAudioPorts returned error";
359 ASSERT_EQ(generation1, generation2) << "Generations changed during ports retrieval";
360}
361
362bool AudioPolicyManagerTest::findDevicePort(audio_port_role_t role,
363 audio_devices_t deviceType, const std::string &address, audio_port_v7 *foundPort) {
364 std::vector<audio_port_v7> ports;
365 getAudioPorts(AUDIO_PORT_TYPE_DEVICE, role, &ports);
Mikhail Naganovd0e2c742020-03-25 15:59:59 -0700366 if (HasFailure()) return false;
jiabinf4eb15a2019-08-28 15:31:47 -0700367
368 for (const auto &port : ports) {
369 if (port.role == role && port.ext.device.type == deviceType &&
370 (strncmp(port.ext.device.address, address.c_str(),
371 AUDIO_DEVICE_MAX_ADDRESS_LEN) == 0)) {
Mikhail Naganovd0e2c742020-03-25 15:59:59 -0700372 if (foundPort) *foundPort = port;
373 return true;
jiabinf4eb15a2019-08-28 15:31:47 -0700374 }
375 }
Mikhail Naganovd0e2c742020-03-25 15:59:59 -0700376 if (foundPort) {
377 ADD_FAILURE() << "Device port with role " << role << " and address "
378 << address << " not found";
379 }
380 return false;
jiabinf4eb15a2019-08-28 15:31:47 -0700381}
382
jiabin7c0205e2019-09-05 10:26:04 -0700383audio_port_handle_t AudioPolicyManagerTest::getDeviceIdFromPatch(
384 const struct audio_patch* patch) {
385 // The logic here is the same as the one in AudioIoDescriptor.
386 // Note this function is aim to get routed device id for test.
387 // In that case, device to device patch is not expected here.
388 if (patch->num_sources != 0 && patch->num_sinks != 0) {
389 if (patch->sources[0].type == AUDIO_PORT_TYPE_MIX) {
390 return patch->sinks[0].id;
391 } else {
392 return patch->sources[0].id;
393 }
394 }
395 return AUDIO_PORT_HANDLE_NONE;
396}
397
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800398
399TEST_F(AudioPolicyManagerTest, InitSuccess) {
400 // SetUp must finish with no assertions.
401}
402
403TEST_F(AudioPolicyManagerTest, Dump) {
404 dumpToLog();
405}
406
Mikhail Naganov04a86632017-12-15 18:01:42 -0800407TEST_F(AudioPolicyManagerTest, CreateAudioPatchFailure) {
408 audio_patch patch{};
409 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800410 const PatchCountCheck patchCount = snapshotPatchCount();
Mikhail Naganov04a86632017-12-15 18:01:42 -0800411 ASSERT_EQ(BAD_VALUE, mManager->createAudioPatch(nullptr, &handle, 0));
412 ASSERT_EQ(BAD_VALUE, mManager->createAudioPatch(&patch, nullptr, 0));
413 ASSERT_EQ(BAD_VALUE, mManager->createAudioPatch(&patch, &handle, 0));
414 patch.num_sources = AUDIO_PATCH_PORTS_MAX + 1;
415 patch.num_sinks = 1;
416 ASSERT_EQ(BAD_VALUE, mManager->createAudioPatch(&patch, &handle, 0));
417 patch.num_sources = 1;
418 patch.num_sinks = AUDIO_PATCH_PORTS_MAX + 1;
419 ASSERT_EQ(BAD_VALUE, mManager->createAudioPatch(&patch, &handle, 0));
420 patch.num_sources = 2;
421 patch.num_sinks = 1;
422 ASSERT_EQ(INVALID_OPERATION, mManager->createAudioPatch(&patch, &handle, 0));
423 patch = {};
424 patch.num_sources = 1;
425 patch.sources[0].role = AUDIO_PORT_ROLE_SINK;
426 patch.num_sinks = 1;
427 patch.sinks[0].role = AUDIO_PORT_ROLE_SINK;
428 ASSERT_EQ(INVALID_OPERATION, mManager->createAudioPatch(&patch, &handle, 0));
429 patch = {};
430 patch.num_sources = 1;
431 patch.sources[0].role = AUDIO_PORT_ROLE_SOURCE;
432 patch.num_sinks = 1;
433 patch.sinks[0].role = AUDIO_PORT_ROLE_SOURCE;
434 ASSERT_EQ(INVALID_OPERATION, mManager->createAudioPatch(&patch, &handle, 0));
435 // Verify that the handle is left unchanged.
436 ASSERT_EQ(AUDIO_PATCH_HANDLE_NONE, handle);
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800437 ASSERT_EQ(0, patchCount.deltaFromSnapshot());
Mikhail Naganov04a86632017-12-15 18:01:42 -0800438}
439
440TEST_F(AudioPolicyManagerTest, CreateAudioPatchFromMix) {
Mikhail Naganov04a86632017-12-15 18:01:42 -0800441 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
442 uid_t uid = 42;
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800443 const PatchCountCheck patchCount = snapshotPatchCount();
Mikhail Naganovc0d04982020-03-02 21:02:28 +0000444 ASSERT_FALSE(mManager->getAvailableInputDevices().isEmpty());
Mikhail Naganovdc769682018-05-04 15:34:08 -0700445 PatchBuilder patchBuilder;
Mikhail Naganovc0d04982020-03-02 21:02:28 +0000446 patchBuilder.addSource(mManager->getAvailableInputDevices()[0]).
Mikhail Naganovdc769682018-05-04 15:34:08 -0700447 addSink(mManager->getConfig().getDefaultOutputDevice());
448 ASSERT_EQ(NO_ERROR, mManager->createAudioPatch(patchBuilder.patch(), &handle, uid));
Mikhail Naganov04a86632017-12-15 18:01:42 -0800449 ASSERT_NE(AUDIO_PATCH_HANDLE_NONE, handle);
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800450 ASSERT_EQ(1, patchCount.deltaFromSnapshot());
Mikhail Naganov04a86632017-12-15 18:01:42 -0800451}
452
453// TODO: Add patch creation tests that involve already existing patch
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800454
Michael Chan6fb34492020-12-08 15:44:49 +1100455enum
456{
457 MSD_AUDIO_PATCH_COUNT_NUM_AUDIO_PATCHES_INDEX = 0,
458 MSD_AUDIO_PATCH_COUNT_NAME_INDEX = 1
459};
460using MsdAudioPatchCountSpecification = std::tuple<size_t, std::string>;
461
462class AudioPolicyManagerTestMsd : public AudioPolicyManagerTest,
463 public ::testing::WithParamInterface<MsdAudioPatchCountSpecification> {
464 public:
465 AudioPolicyManagerTestMsd();
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800466 protected:
jiabin7c0205e2019-09-05 10:26:04 -0700467 void SetUpManagerConfig() override;
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800468 void TearDown() override;
Dorin Drimus94d94412022-02-02 09:05:02 +0100469 AudioProfileVector getDirectProfilesForAttributes(const audio_attributes_t& attr);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800470
471 sp<DeviceDescriptor> mMsdOutputDevice;
472 sp<DeviceDescriptor> mMsdInputDevice;
Eric Laurent74c38dc2020-12-23 18:19:44 +0100473 sp<DeviceDescriptor> mDefaultOutputDevice;
Michael Chan6fb34492020-12-08 15:44:49 +1100474
475 const size_t mExpectedAudioPatchCount;
476 sp<DeviceDescriptor> mSpdifDevice;
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100477
478 sp<DeviceDescriptor> mHdmiInputDevice;
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800479};
480
Michael Chan6fb34492020-12-08 15:44:49 +1100481AudioPolicyManagerTestMsd::AudioPolicyManagerTestMsd()
482 : mExpectedAudioPatchCount(std::get<MSD_AUDIO_PATCH_COUNT_NUM_AUDIO_PATCHES_INDEX>(
483 GetParam())) {}
484
485INSTANTIATE_TEST_CASE_P(
486 MsdAudioPatchCount,
487 AudioPolicyManagerTestMsd,
488 ::testing::Values(
Eric Laurent0ca09402024-05-16 17:48:59 +0000489 MsdAudioPatchCountSpecification(2u, "single"),
490 MsdAudioPatchCountSpecification(3u, "dual")
Michael Chan6fb34492020-12-08 15:44:49 +1100491 ),
492 [](const ::testing::TestParamInfo<MsdAudioPatchCountSpecification> &info) {
493 return std::get<MSD_AUDIO_PATCH_COUNT_NAME_INDEX>(info.param); }
494);
495
jiabin7c0205e2019-09-05 10:26:04 -0700496void AudioPolicyManagerTestMsd::SetUpManagerConfig() {
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800497 // TODO: Consider using Serializer to load part of the config from a string.
Mikhail Naganovd4c21aa2021-10-05 15:10:16 -0700498 ASSERT_NO_FATAL_FAILURE(AudioPolicyManagerTest::SetUpManagerConfig());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800499 mMsdOutputDevice = new DeviceDescriptor(AUDIO_DEVICE_OUT_BUS);
500 sp<AudioProfile> pcmOutputProfile = new AudioProfile(
Dean Wheatleyd082f472022-02-04 11:10:48 +1100501 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO, k48000SamplingRate);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800502 sp<AudioProfile> ac3OutputProfile = new AudioProfile(
Dean Wheatleyd082f472022-02-04 11:10:48 +1100503 AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1, k48000SamplingRate);
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100504 sp<AudioProfile> iec958OutputProfile = new AudioProfile(
Dean Wheatley16809da2022-12-09 14:55:46 +1100505 AUDIO_FORMAT_IEC60958, AUDIO_CHANNEL_INDEX_MASK_24, k48000SamplingRate);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800506 mMsdOutputDevice->addAudioProfile(pcmOutputProfile);
507 mMsdOutputDevice->addAudioProfile(ac3OutputProfile);
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100508 mMsdOutputDevice->addAudioProfile(iec958OutputProfile);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800509 mMsdInputDevice = new DeviceDescriptor(AUDIO_DEVICE_IN_BUS);
510 // Match output profile from AudioPolicyConfig::setDefault.
511 sp<AudioProfile> pcmInputProfile = new AudioProfile(
512 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO, 44100);
513 mMsdInputDevice->addAudioProfile(pcmInputProfile);
Mikhail Naganov68e3f642023-04-28 13:06:32 -0700514 mConfig->addDevice(mMsdOutputDevice);
515 mConfig->addDevice(mMsdInputDevice);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800516
Eric Laurent0ca09402024-05-16 17:48:59 +0000517 if (mExpectedAudioPatchCount == 3) {
Michael Chan6fb34492020-12-08 15:44:49 +1100518 // Add SPDIF device with PCM output profile as a second device for dual MSD audio patching.
519 mSpdifDevice = new DeviceDescriptor(AUDIO_DEVICE_OUT_SPDIF);
520 mSpdifDevice->addAudioProfile(pcmOutputProfile);
Mikhail Naganov68e3f642023-04-28 13:06:32 -0700521 mConfig->addDevice(mSpdifDevice);
Michael Chan6fb34492020-12-08 15:44:49 +1100522
523 sp<OutputProfile> spdifOutputProfile = new OutputProfile("spdif output");
524 spdifOutputProfile->addAudioProfile(pcmOutputProfile);
525 spdifOutputProfile->addSupportedDevice(mSpdifDevice);
Mikhail Naganov68e3f642023-04-28 13:06:32 -0700526 mConfig->getHwModules().getModuleFromName(AUDIO_HARDWARE_MODULE_ID_PRIMARY)->
Michael Chan6fb34492020-12-08 15:44:49 +1100527 addOutputProfile(spdifOutputProfile);
528 }
529
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800530 sp<HwModule> msdModule = new HwModule(AUDIO_HARDWARE_MODULE_ID_MSD, 2 /*halVersionMajor*/);
Mikhail Naganov68e3f642023-04-28 13:06:32 -0700531 HwModuleCollection modules = mConfig->getHwModules();
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800532 modules.add(msdModule);
Mikhail Naganov68e3f642023-04-28 13:06:32 -0700533 mConfig->setHwModules(modules);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800534
jiabin5740f082019-08-19 15:08:30 -0700535 sp<OutputProfile> msdOutputProfile = new OutputProfile("msd input");
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800536 msdOutputProfile->addAudioProfile(pcmOutputProfile);
537 msdOutputProfile->addSupportedDevice(mMsdOutputDevice);
538 msdModule->addOutputProfile(msdOutputProfile);
jiabin5740f082019-08-19 15:08:30 -0700539 sp<OutputProfile> msdCompressedOutputProfile = new OutputProfile("msd compressed input");
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800540 msdCompressedOutputProfile->addAudioProfile(ac3OutputProfile);
541 msdCompressedOutputProfile->setFlags(
542 AUDIO_OUTPUT_FLAG_DIRECT | AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD |
543 AUDIO_OUTPUT_FLAG_NON_BLOCKING);
544 msdCompressedOutputProfile->addSupportedDevice(mMsdOutputDevice);
545 msdModule->addOutputProfile(msdCompressedOutputProfile);
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100546 sp<OutputProfile> msdIec958OutputProfile = new OutputProfile("msd iec958 input");
547 msdIec958OutputProfile->addAudioProfile(iec958OutputProfile);
548 msdIec958OutputProfile->setFlags(AUDIO_OUTPUT_FLAG_DIRECT);
549 msdIec958OutputProfile->addSupportedDevice(mMsdOutputDevice);
550 msdModule->addOutputProfile(msdIec958OutputProfile);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800551
jiabin5740f082019-08-19 15:08:30 -0700552 sp<InputProfile> msdInputProfile = new InputProfile("msd output");
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800553 msdInputProfile->addAudioProfile(pcmInputProfile);
554 msdInputProfile->addSupportedDevice(mMsdInputDevice);
555 msdModule->addInputProfile(msdInputProfile);
556
557 // Add a profile with another encoding to the default device to test routing
558 // of streams that are not supported by MSD.
559 sp<AudioProfile> dtsOutputProfile = new AudioProfile(
Dean Wheatleyd082f472022-02-04 11:10:48 +1100560 AUDIO_FORMAT_DTS, AUDIO_CHANNEL_OUT_5POINT1, k48000SamplingRate);
Mikhail Naganov68e3f642023-04-28 13:06:32 -0700561 mConfig->getDefaultOutputDevice()->addAudioProfile(dtsOutputProfile);
jiabin5740f082019-08-19 15:08:30 -0700562 sp<OutputProfile> primaryEncodedOutputProfile = new OutputProfile("encoded");
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800563 primaryEncodedOutputProfile->addAudioProfile(dtsOutputProfile);
564 primaryEncodedOutputProfile->setFlags(AUDIO_OUTPUT_FLAG_DIRECT);
Mikhail Naganov68e3f642023-04-28 13:06:32 -0700565 primaryEncodedOutputProfile->addSupportedDevice(mConfig->getDefaultOutputDevice());
566 mConfig->getHwModules().getModuleFromName(AUDIO_HARDWARE_MODULE_ID_PRIMARY)->
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800567 addOutputProfile(primaryEncodedOutputProfile);
Eric Laurent74c38dc2020-12-23 18:19:44 +0100568
Mikhail Naganov68e3f642023-04-28 13:06:32 -0700569 mDefaultOutputDevice = mConfig->getDefaultOutputDevice();
Eric Laurent0ca09402024-05-16 17:48:59 +0000570 if (mExpectedAudioPatchCount == 3) {
Michael Chan6fb34492020-12-08 15:44:49 +1100571 mSpdifDevice->addAudioProfile(dtsOutputProfile);
572 primaryEncodedOutputProfile->addSupportedDevice(mSpdifDevice);
573 }
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100574
575 // Add HDMI input device with IEC60958 profile for HDMI in -> MSD patching.
576 mHdmiInputDevice = new DeviceDescriptor(AUDIO_DEVICE_IN_HDMI);
577 sp<AudioProfile> iec958InputProfile = new AudioProfile(
Dean Wheatley16809da2022-12-09 14:55:46 +1100578 AUDIO_FORMAT_IEC60958, AUDIO_CHANNEL_INDEX_MASK_24, k48000SamplingRate);
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100579 mHdmiInputDevice->addAudioProfile(iec958InputProfile);
Mikhail Naganov68e3f642023-04-28 13:06:32 -0700580 mConfig->addDevice(mHdmiInputDevice);
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100581 sp<InputProfile> hdmiInputProfile = new InputProfile("hdmi input");
582 hdmiInputProfile->addAudioProfile(iec958InputProfile);
583 hdmiInputProfile->setFlags(AUDIO_INPUT_FLAG_DIRECT);
584 hdmiInputProfile->addSupportedDevice(mHdmiInputDevice);
Mikhail Naganov68e3f642023-04-28 13:06:32 -0700585 mConfig->getHwModules().getModuleFromName(AUDIO_HARDWARE_MODULE_ID_PRIMARY)->
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100586 addInputProfile(hdmiInputProfile);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800587}
588
589void AudioPolicyManagerTestMsd::TearDown() {
590 mMsdOutputDevice.clear();
591 mMsdInputDevice.clear();
Eric Laurent74c38dc2020-12-23 18:19:44 +0100592 mDefaultOutputDevice.clear();
Michael Chan6fb34492020-12-08 15:44:49 +1100593 mSpdifDevice.clear();
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100594 mHdmiInputDevice.clear();
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800595 AudioPolicyManagerTest::TearDown();
596}
597
Dorin Drimus94d94412022-02-02 09:05:02 +0100598AudioProfileVector AudioPolicyManagerTestMsd::getDirectProfilesForAttributes(
599 const audio_attributes_t& attr) {
600 AudioProfileVector audioProfilesVector;
601 mManager->getDirectProfilesForAttributes(&attr, audioProfilesVector);
602 return audioProfilesVector;
603}
604
Michael Chan6fb34492020-12-08 15:44:49 +1100605TEST_P(AudioPolicyManagerTestMsd, InitSuccess) {
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800606 ASSERT_TRUE(mMsdOutputDevice);
607 ASSERT_TRUE(mMsdInputDevice);
Eric Laurent74c38dc2020-12-23 18:19:44 +0100608 ASSERT_TRUE(mDefaultOutputDevice);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800609}
610
Michael Chan6fb34492020-12-08 15:44:49 +1100611TEST_P(AudioPolicyManagerTestMsd, Dump) {
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800612 dumpToLog();
613}
614
Michael Chan6fb34492020-12-08 15:44:49 +1100615TEST_P(AudioPolicyManagerTestMsd, PatchCreationOnSetForceUse) {
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800616 const PatchCountCheck patchCount = snapshotPatchCount();
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800617 mManager->setForceUse(AUDIO_POLICY_FORCE_FOR_ENCODED_SURROUND,
618 AUDIO_POLICY_FORCE_ENCODED_SURROUND_ALWAYS);
Eric Laurent0ca09402024-05-16 17:48:59 +0000619 ASSERT_EQ(mExpectedAudioPatchCount -1 , patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800620}
621
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100622TEST_P(AudioPolicyManagerTestMsd, PatchCreationSetReleaseMsdOutputPatches) {
Michael Chan6fb34492020-12-08 15:44:49 +1100623 const PatchCountCheck patchCount = snapshotPatchCount();
624 DeviceVector devices = mManager->getAvailableOutputDevices();
625 // Remove MSD output device to avoid patching to itself
626 devices.remove(mMsdOutputDevice);
Eric Laurent0ca09402024-05-16 17:48:59 +0000627 ASSERT_EQ(mExpectedAudioPatchCount -1 , devices.size());
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100628 mManager->setMsdOutputPatches(&devices);
Eric Laurent0ca09402024-05-16 17:48:59 +0000629 ASSERT_EQ(mExpectedAudioPatchCount - 1, patchCount.deltaFromSnapshot());
Michael Chan6fb34492020-12-08 15:44:49 +1100630 // Dual patch: exercise creating one new audio patch and reusing another existing audio patch.
631 DeviceVector singleDevice(devices[0]);
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100632 mManager->releaseMsdOutputPatches(singleDevice);
Eric Laurent0ca09402024-05-16 17:48:59 +0000633 ASSERT_EQ(mExpectedAudioPatchCount - 2, patchCount.deltaFromSnapshot());
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100634 mManager->setMsdOutputPatches(&devices);
Eric Laurent0ca09402024-05-16 17:48:59 +0000635 ASSERT_EQ(mExpectedAudioPatchCount - 1, patchCount.deltaFromSnapshot());
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100636 mManager->releaseMsdOutputPatches(devices);
Michael Chan6fb34492020-12-08 15:44:49 +1100637 ASSERT_EQ(0, patchCount.deltaFromSnapshot());
638}
639
640TEST_P(AudioPolicyManagerTestMsd, GetOutputForAttrEncodedRoutesToMsd) {
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800641 const PatchCountCheck patchCount = snapshotPatchCount();
jiabin7c0205e2019-09-05 10:26:04 -0700642 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
Dean Wheatleyd082f472022-02-04 11:10:48 +1100643 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1,
644 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT);
Eric Laurent74c38dc2020-12-23 18:19:44 +0100645 ASSERT_EQ(selectedDeviceId, mDefaultOutputDevice->getId());
Michael Chan6fb34492020-12-08 15:44:49 +1100646 ASSERT_EQ(mExpectedAudioPatchCount, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800647}
648
Michael Chan6fb34492020-12-08 15:44:49 +1100649TEST_P(AudioPolicyManagerTestMsd, GetOutputForAttrPcmRoutesToMsd) {
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800650 const PatchCountCheck patchCount = snapshotPatchCount();
jiabin7c0205e2019-09-05 10:26:04 -0700651 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800652 getOutputForAttr(&selectedDeviceId,
Dean Wheatleyd082f472022-02-04 11:10:48 +1100653 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO, k48000SamplingRate);
Eric Laurent74c38dc2020-12-23 18:19:44 +0100654 ASSERT_EQ(selectedDeviceId, mDefaultOutputDevice->getId());
Eric Laurent0ca09402024-05-16 17:48:59 +0000655 ASSERT_EQ(mExpectedAudioPatchCount - 1, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800656}
657
Michael Chan6fb34492020-12-08 15:44:49 +1100658TEST_P(AudioPolicyManagerTestMsd, GetOutputForAttrEncodedPlusPcmRoutesToMsd) {
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800659 const PatchCountCheck patchCount = snapshotPatchCount();
jiabin7c0205e2019-09-05 10:26:04 -0700660 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
Dean Wheatleyd082f472022-02-04 11:10:48 +1100661 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1,
662 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT);
Eric Laurent74c38dc2020-12-23 18:19:44 +0100663 ASSERT_EQ(selectedDeviceId, mDefaultOutputDevice->getId());
Michael Chan6fb34492020-12-08 15:44:49 +1100664 ASSERT_EQ(mExpectedAudioPatchCount, patchCount.deltaFromSnapshot());
665 selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800666 getOutputForAttr(&selectedDeviceId,
Dean Wheatleyd082f472022-02-04 11:10:48 +1100667 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO, k48000SamplingRate);
Eric Laurent74c38dc2020-12-23 18:19:44 +0100668 ASSERT_EQ(selectedDeviceId, mDefaultOutputDevice->getId());
Michael Chan6fb34492020-12-08 15:44:49 +1100669 ASSERT_EQ(mExpectedAudioPatchCount, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800670}
671
Michael Chan6fb34492020-12-08 15:44:49 +1100672TEST_P(AudioPolicyManagerTestMsd, GetOutputForAttrUnsupportedFormatBypassesMsd) {
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800673 const PatchCountCheck patchCount = snapshotPatchCount();
jiabin7c0205e2019-09-05 10:26:04 -0700674 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
Dean Wheatleyd082f472022-02-04 11:10:48 +1100675 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_DTS, AUDIO_CHANNEL_OUT_5POINT1,
676 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800677 ASSERT_NE(selectedDeviceId, mMsdOutputDevice->getId());
Eric Laurent0ca09402024-05-16 17:48:59 +0000678 ASSERT_EQ(1, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800679}
680
Michael Chan6fb34492020-12-08 15:44:49 +1100681TEST_P(AudioPolicyManagerTestMsd, GetOutputForAttrFormatSwitching) {
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800682 // Switch between formats that are supported and not supported by MSD.
683 {
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800684 const PatchCountCheck patchCount = snapshotPatchCount();
jiabin7c0205e2019-09-05 10:26:04 -0700685 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
686 audio_port_handle_t portId;
Dean Wheatleyd082f472022-02-04 11:10:48 +1100687 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1,
688 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, nullptr /*output*/, &portId);
Eric Laurent74c38dc2020-12-23 18:19:44 +0100689 ASSERT_EQ(selectedDeviceId, mDefaultOutputDevice->getId());
Michael Chan6fb34492020-12-08 15:44:49 +1100690 ASSERT_EQ(mExpectedAudioPatchCount, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800691 mManager->releaseOutput(portId);
Eric Laurent0ca09402024-05-16 17:48:59 +0000692 ASSERT_EQ(mExpectedAudioPatchCount - 1, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800693 }
694 {
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800695 const PatchCountCheck patchCount = snapshotPatchCount();
jiabin7c0205e2019-09-05 10:26:04 -0700696 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
697 audio_port_handle_t portId;
Dean Wheatleyd082f472022-02-04 11:10:48 +1100698 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_DTS, AUDIO_CHANNEL_OUT_5POINT1,
699 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, nullptr /*output*/, &portId);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800700 ASSERT_NE(selectedDeviceId, mMsdOutputDevice->getId());
Eric Laurent0ca09402024-05-16 17:48:59 +0000701 ASSERT_EQ(-static_cast<int>(mExpectedAudioPatchCount) + 2, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800702 mManager->releaseOutput(portId);
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800703 ASSERT_EQ(0, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800704 }
705 {
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800706 const PatchCountCheck patchCount = snapshotPatchCount();
jiabin7c0205e2019-09-05 10:26:04 -0700707 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
Dean Wheatleyd082f472022-02-04 11:10:48 +1100708 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1,
709 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT);
Eric Laurent74c38dc2020-12-23 18:19:44 +0100710 ASSERT_EQ(selectedDeviceId, mDefaultOutputDevice->getId());
Eric Laurent0ca09402024-05-16 17:48:59 +0000711 ASSERT_EQ(1, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800712 }
713}
jiabinf4eb15a2019-08-28 15:31:47 -0700714
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100715TEST_P(AudioPolicyManagerTestMsd, PatchCreationFromHdmiInToMsd) {
716 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
717 uid_t uid = 42;
718 const PatchCountCheck patchCount = snapshotPatchCount();
719 ASSERT_FALSE(mManager->getAvailableInputDevices().isEmpty());
720 PatchBuilder patchBuilder;
721 patchBuilder.
722 addSource(mManager->getAvailableInputDevices().
723 getDevice(AUDIO_DEVICE_IN_HDMI, String8(""), AUDIO_FORMAT_DEFAULT)).
724 addSink(mManager->getAvailableOutputDevices().
725 getDevice(AUDIO_DEVICE_OUT_BUS, String8(""), AUDIO_FORMAT_DEFAULT));
726 ASSERT_EQ(NO_ERROR, mManager->createAudioPatch(patchBuilder.patch(), &handle, uid));
727 ASSERT_NE(AUDIO_PATCH_HANDLE_NONE, handle);
728 AudioPatchCollection patches = mManager->getAudioPatches();
729 sp<AudioPatch> patch = patches.valueFor(handle);
730 ASSERT_EQ(1, patch->mPatch.num_sources);
731 ASSERT_EQ(1, patch->mPatch.num_sinks);
732 ASSERT_EQ(AUDIO_PORT_ROLE_SOURCE, patch->mPatch.sources[0].role);
733 ASSERT_EQ(AUDIO_PORT_ROLE_SINK, patch->mPatch.sinks[0].role);
734 ASSERT_EQ(AUDIO_FORMAT_IEC60958, patch->mPatch.sources[0].format);
735 ASSERT_EQ(AUDIO_FORMAT_IEC60958, patch->mPatch.sinks[0].format);
Dean Wheatley16809da2022-12-09 14:55:46 +1100736 ASSERT_EQ(AUDIO_CHANNEL_INDEX_MASK_24, patch->mPatch.sources[0].channel_mask);
737 ASSERT_EQ(AUDIO_CHANNEL_INDEX_MASK_24, patch->mPatch.sinks[0].channel_mask);
Dean Wheatleyd082f472022-02-04 11:10:48 +1100738 ASSERT_EQ(k48000SamplingRate, patch->mPatch.sources[0].sample_rate);
739 ASSERT_EQ(k48000SamplingRate, patch->mPatch.sinks[0].sample_rate);
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100740 ASSERT_EQ(1, patchCount.deltaFromSnapshot());
741}
742
Dorin Drimus94d94412022-02-02 09:05:02 +0100743TEST_P(AudioPolicyManagerTestMsd, GetDirectProfilesForAttributesWithMsd) {
744 const audio_attributes_t attr = {
745 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_UNKNOWN,
746 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
747
748 // count expected direct profiles for the default device
749 int countDirectProfilesPrimary = 0;
750 const auto& primary = mManager->getConfig().getHwModules()
751 .getModuleFromName(AUDIO_HARDWARE_MODULE_ID_PRIMARY);
Mikhail Naganov68e3f642023-04-28 13:06:32 -0700752 for (const auto& outputProfile : primary->getOutputProfiles()) {
Dorin Drimus94d94412022-02-02 09:05:02 +0100753 if (outputProfile->asAudioPort()->isDirectOutput()) {
754 countDirectProfilesPrimary += outputProfile->asAudioPort()->getAudioProfiles().size();
755 }
756 }
757
758 // count expected direct profiles for the msd device
759 int countDirectProfilesMsd = 0;
760 const auto& msd = mManager->getConfig().getHwModules()
761 .getModuleFromName(AUDIO_HARDWARE_MODULE_ID_MSD);
Mikhail Naganov68e3f642023-04-28 13:06:32 -0700762 for (const auto& outputProfile : msd->getOutputProfiles()) {
Dorin Drimus94d94412022-02-02 09:05:02 +0100763 if (outputProfile->asAudioPort()->isDirectOutput()) {
764 countDirectProfilesMsd += outputProfile->asAudioPort()->getAudioProfiles().size();
765 }
766 }
767
768 // before setting up MSD audio patches we only have the primary hal direct profiles
769 ASSERT_EQ(countDirectProfilesPrimary, getDirectProfilesForAttributes(attr).size());
770
771 DeviceVector outputDevices = mManager->getAvailableOutputDevices();
772 // Remove MSD output device to avoid patching to itself
773 outputDevices.remove(mMsdOutputDevice);
774 mManager->setMsdOutputPatches(&outputDevices);
775
776 // after setting up MSD audio patches the MSD direct profiles are added
777 ASSERT_EQ(countDirectProfilesPrimary + countDirectProfilesMsd,
778 getDirectProfilesForAttributes(attr).size());
779
780 mManager->releaseMsdOutputPatches(outputDevices);
781 // releasing the MSD audio patches gets us back to the primary hal direct profiles only
782 ASSERT_EQ(countDirectProfilesPrimary, getDirectProfilesForAttributes(attr).size());
783}
784
Dorin Drimusecc9f422022-03-09 17:57:40 +0100785TEST_P(AudioPolicyManagerTestMsd, IsDirectPlaybackSupportedWithMsd) {
786 const audio_attributes_t attr = {
787 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_UNKNOWN,
788 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
789
790 audio_config_base_t directConfig = AUDIO_CONFIG_BASE_INITIALIZER;
791 directConfig.format = AUDIO_FORMAT_DTS;
792 directConfig.sample_rate = 48000;
793 directConfig.channel_mask = AUDIO_CHANNEL_OUT_5POINT1;
794
795 audio_config_base_t nonDirectConfig = AUDIO_CONFIG_BASE_INITIALIZER;
796 nonDirectConfig.format = AUDIO_FORMAT_PCM_16_BIT;
797 nonDirectConfig.sample_rate = 48000;
798 nonDirectConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
799
800 audio_config_base_t nonExistentConfig = AUDIO_CONFIG_BASE_INITIALIZER;
801 nonExistentConfig.format = AUDIO_FORMAT_E_AC3;
802 nonExistentConfig.sample_rate = 48000;
803 nonExistentConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
804
805 audio_config_base_t msdDirectConfig1 = AUDIO_CONFIG_BASE_INITIALIZER;
806 msdDirectConfig1.format = AUDIO_FORMAT_AC3;
807 msdDirectConfig1.sample_rate = 48000;
808 msdDirectConfig1.channel_mask = AUDIO_CHANNEL_OUT_5POINT1;
809
810 audio_config_base_t msdDirectConfig2 = AUDIO_CONFIG_BASE_INITIALIZER;
811 msdDirectConfig2.format = AUDIO_FORMAT_IEC60958;
812 msdDirectConfig2.sample_rate = 48000;
Dean Wheatley16809da2022-12-09 14:55:46 +1100813 msdDirectConfig2.channel_mask = AUDIO_CHANNEL_INDEX_MASK_24;
Dorin Drimusecc9f422022-03-09 17:57:40 +0100814
815 audio_config_base_t msdNonDirectConfig = AUDIO_CONFIG_BASE_INITIALIZER;
816 msdNonDirectConfig.format = AUDIO_FORMAT_PCM_16_BIT;
817 msdNonDirectConfig.sample_rate = 96000;
818 msdNonDirectConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
819
820 ASSERT_TRUE(mManager->isDirectOutputSupported(directConfig, attr));
821 ASSERT_FALSE(mManager->isDirectOutputSupported(nonDirectConfig, attr));
822 ASSERT_FALSE(mManager->isDirectOutputSupported(nonExistentConfig, attr));
823 // before setting MSD patches the direct MSD configs return false
824 ASSERT_FALSE(mManager->isDirectOutputSupported(msdDirectConfig1, attr));
825 ASSERT_FALSE(mManager->isDirectOutputSupported(msdDirectConfig2, attr));
826 ASSERT_FALSE(mManager->isDirectOutputSupported(msdNonDirectConfig, attr));
827
828 DeviceVector outputDevices = mManager->getAvailableOutputDevices();
829 // Remove MSD output device to avoid patching to itself
830 outputDevices.remove(mMsdOutputDevice);
831 mManager->setMsdOutputPatches(&outputDevices);
832
833 ASSERT_TRUE(mManager->isDirectOutputSupported(directConfig, attr));
834 ASSERT_FALSE(mManager->isDirectOutputSupported(nonDirectConfig, attr));
835 ASSERT_FALSE(mManager->isDirectOutputSupported(nonExistentConfig, attr));
836 // after setting MSD patches the direct MSD configs return true
837 ASSERT_TRUE(mManager->isDirectOutputSupported(msdDirectConfig1, attr));
838 ASSERT_TRUE(mManager->isDirectOutputSupported(msdDirectConfig2, attr));
839 ASSERT_FALSE(mManager->isDirectOutputSupported(msdNonDirectConfig, attr));
840
841 mManager->releaseMsdOutputPatches(outputDevices);
842
843 ASSERT_TRUE(mManager->isDirectOutputSupported(directConfig, attr));
844 ASSERT_FALSE(mManager->isDirectOutputSupported(nonDirectConfig, attr));
845 ASSERT_FALSE(mManager->isDirectOutputSupported(nonExistentConfig, attr));
846 // AFTER releasing MSD patches the direct MSD configs return false
847 ASSERT_FALSE(mManager->isDirectOutputSupported(msdDirectConfig1, attr));
848 ASSERT_FALSE(mManager->isDirectOutputSupported(msdDirectConfig2, attr));
849 ASSERT_FALSE(mManager->isDirectOutputSupported(msdNonDirectConfig, attr));
850}
851
Dorin Drimusfae3c642022-03-17 18:36:30 +0100852TEST_P(AudioPolicyManagerTestMsd, GetDirectPlaybackSupportWithMsd) {
853 const audio_attributes_t attr = {
854 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_UNKNOWN,
855 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
856
857 audio_config_t directConfig = AUDIO_CONFIG_INITIALIZER;
858 directConfig.format = AUDIO_FORMAT_DTS;
859 directConfig.sample_rate = 48000;
860 directConfig.channel_mask = AUDIO_CHANNEL_OUT_5POINT1;
861
862 audio_config_t nonDirectConfig = AUDIO_CONFIG_INITIALIZER;
863 nonDirectConfig.format = AUDIO_FORMAT_PCM_16_BIT;
864 nonDirectConfig.sample_rate = 48000;
865 nonDirectConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
866
867 audio_config_t nonExistentConfig = AUDIO_CONFIG_INITIALIZER;
868 nonExistentConfig.format = AUDIO_FORMAT_E_AC3;
869 nonExistentConfig.sample_rate = 48000;
870 nonExistentConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
871
872 audio_config_t msdDirectConfig1 = AUDIO_CONFIG_INITIALIZER;
873 msdDirectConfig1.format = AUDIO_FORMAT_AC3;
874 msdDirectConfig1.sample_rate = 48000;
875 msdDirectConfig1.channel_mask = AUDIO_CHANNEL_OUT_5POINT1;
876
877 audio_config_t msdDirectConfig2 = AUDIO_CONFIG_INITIALIZER;
878 msdDirectConfig2.format = AUDIO_FORMAT_IEC60958;
879 msdDirectConfig2.sample_rate = 48000;
Dean Wheatley16809da2022-12-09 14:55:46 +1100880 msdDirectConfig2.channel_mask = AUDIO_CHANNEL_INDEX_MASK_24;
Dorin Drimusfae3c642022-03-17 18:36:30 +0100881
882 audio_config_t msdNonDirectConfig = AUDIO_CONFIG_INITIALIZER;
883 msdNonDirectConfig.format = AUDIO_FORMAT_PCM_16_BIT;
884 msdNonDirectConfig.sample_rate = 96000;
885 msdNonDirectConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
886
887 ASSERT_EQ(AUDIO_DIRECT_BITSTREAM_SUPPORTED,
888 mManager->getDirectPlaybackSupport(&attr, &directConfig));
889 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
890 mManager->getDirectPlaybackSupport(&attr, &nonDirectConfig));
891 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
892 mManager->getDirectPlaybackSupport(&attr, &nonExistentConfig));
893 // before setting MSD patches the direct MSD configs return AUDIO_DIRECT_NOT_SUPPORTED
894 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
895 mManager->getDirectPlaybackSupport(&attr, &msdDirectConfig1));
896 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
897 mManager->getDirectPlaybackSupport(&attr, &msdDirectConfig2));
898 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
899 mManager->getDirectPlaybackSupport(&attr, &msdNonDirectConfig));
900
901 DeviceVector outputDevices = mManager->getAvailableOutputDevices();
902 // Remove MSD output device to avoid patching to itself
903 outputDevices.remove(mMsdOutputDevice);
904 mManager->setMsdOutputPatches(&outputDevices);
905
906 ASSERT_EQ(AUDIO_DIRECT_BITSTREAM_SUPPORTED,
907 mManager->getDirectPlaybackSupport(&attr, &directConfig));
908 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
909 mManager->getDirectPlaybackSupport(&attr, &nonDirectConfig));
910 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
911 mManager->getDirectPlaybackSupport(&attr, &nonExistentConfig));
912 // after setting MSD patches the direct MSD configs return values according to their flags
913 ASSERT_EQ(AUDIO_DIRECT_OFFLOAD_SUPPORTED,
914 mManager->getDirectPlaybackSupport(&attr, &msdDirectConfig1));
915 ASSERT_EQ(AUDIO_DIRECT_BITSTREAM_SUPPORTED,
916 mManager->getDirectPlaybackSupport(&attr, &msdDirectConfig2));
917 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
918 mManager->getDirectPlaybackSupport(&attr, &msdNonDirectConfig));
919
920 mManager->releaseMsdOutputPatches(outputDevices);
921
922 ASSERT_EQ(AUDIO_DIRECT_BITSTREAM_SUPPORTED,
923 mManager->getDirectPlaybackSupport(&attr, &directConfig));
924 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
925 mManager->getDirectPlaybackSupport(&attr, &nonDirectConfig));
926 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
927 mManager->getDirectPlaybackSupport(&attr, &nonExistentConfig));
928 // after releasing MSD patches the direct MSD configs return AUDIO_DIRECT_NOT_SUPPORTED
929 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
930 mManager->getDirectPlaybackSupport(&attr, &msdDirectConfig1));
931 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
932 mManager->getDirectPlaybackSupport(&attr, &msdDirectConfig2));
933 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
934 mManager->getDirectPlaybackSupport(&attr, &msdNonDirectConfig));
935}
936
jiabin7c0205e2019-09-05 10:26:04 -0700937class AudioPolicyManagerTestWithConfigurationFile : public AudioPolicyManagerTest {
938protected:
939 void SetUpManagerConfig() override;
940 virtual std::string getConfigFile() { return sDefaultConfig; }
941
942 static const std::string sExecutableDir;
943 static const std::string sDefaultConfig;
944};
945
946const std::string AudioPolicyManagerTestWithConfigurationFile::sExecutableDir =
947 base::GetExecutableDirectory() + "/";
948
949const std::string AudioPolicyManagerTestWithConfigurationFile::sDefaultConfig =
950 sExecutableDir + "test_audio_policy_configuration.xml";
951
952void AudioPolicyManagerTestWithConfigurationFile::SetUpManagerConfig() {
Mikhail Naganov68e3f642023-04-28 13:06:32 -0700953 auto result = AudioPolicyConfig::loadFromCustomXmlConfigForTests(getConfigFile());
954 ASSERT_TRUE(result.ok());
955 mConfig = result.value();
jiabin7c0205e2019-09-05 10:26:04 -0700956}
957
958TEST_F(AudioPolicyManagerTestWithConfigurationFile, InitSuccess) {
959 // SetUp must finish with no assertions.
960}
961
962TEST_F(AudioPolicyManagerTestWithConfigurationFile, Dump) {
963 dumpToLog();
964}
965
Mikhail Naganov0805de12022-02-15 23:00:07 +0000966TEST_F(AudioPolicyManagerTestWithConfigurationFile, ListAudioPortsHasFlags) {
967 // Create an input for VOIP TX because it's not opened automatically like outputs are.
968 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
969 audio_port_handle_t mixPortId = AUDIO_PORT_HANDLE_NONE;
970 audio_source_t source = AUDIO_SOURCE_VOICE_COMMUNICATION;
François Gaffie6ebbce02023-07-19 13:27:53 +0200971 audio_attributes_t attr = {AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_UNKNOWN, source,
972 AUDIO_FLAG_NONE, ""};
973 audio_io_handle_t input = AUDIO_PORT_HANDLE_NONE;
974 ASSERT_NO_FATAL_FAILURE(getInputForAttr(attr, &input, AUDIO_SESSION_NONE, 1,
975 &selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT,
976 AUDIO_CHANNEL_IN_MONO, 8000, AUDIO_INPUT_FLAG_VOIP_TX,
977 &mixPortId));
Mikhail Naganov0805de12022-02-15 23:00:07 +0000978
979 std::vector<audio_port_v7> ports;
980 ASSERT_NO_FATAL_FAILURE(
981 getAudioPorts(AUDIO_PORT_TYPE_MIX, AUDIO_PORT_ROLE_NONE, &ports));
982 EXPECT_NE(0, ports.size());
983 bool hasFlags = false, foundPrimary = false, foundVoipRx = false, foundVoipTx = false;
984 for (const auto& port : ports) {
985 if ((port.active_config.config_mask & AUDIO_PORT_CONFIG_FLAGS) != 0) {
986 hasFlags = true;
987 if (port.role == AUDIO_PORT_ROLE_SOURCE) {
988 if ((port.active_config.flags.output & AUDIO_OUTPUT_FLAG_PRIMARY) != 0) {
989 foundPrimary = true;
990 }
991 if ((port.active_config.flags.output & AUDIO_OUTPUT_FLAG_VOIP_RX) != 0) {
992 foundVoipRx = true;
993 }
994 } else if (port.role == AUDIO_PORT_ROLE_SINK) {
995 if ((port.active_config.flags.input & AUDIO_INPUT_FLAG_VOIP_TX) != 0) {
996 foundVoipTx = true;
997 }
998 }
999 }
1000 }
1001 EXPECT_TRUE(hasFlags);
1002 EXPECT_TRUE(foundPrimary);
1003 EXPECT_TRUE(foundVoipRx);
1004 EXPECT_TRUE(foundVoipTx);
1005}
1006
Ram Mohan M594558d2022-06-14 14:42:44 +05301007TEST_F(AudioPolicyManagerTestWithConfigurationFile, HandleDeviceConfigChange) {
1008 {
1009 const auto prevCounter = mClient->getRoutingUpdatedCounter();
1010
1011 EXPECT_EQ(NO_ERROR, mManager->setDeviceConnectionState(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP,
1012 AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
1013 "", "", AUDIO_FORMAT_LDAC));
1014 const auto currCounter = mClient->getRoutingUpdatedCounter();
1015 EXPECT_GT(currCounter, prevCounter);
1016 }
1017 {
1018 const auto prevCounter = mClient->getRoutingUpdatedCounter();
1019 // Update device configuration
1020 EXPECT_EQ(NO_ERROR, mManager->handleDeviceConfigChange(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP,
1021 "" /*address*/, "" /*name*/,
1022 AUDIO_FORMAT_AAC));
1023
1024 // As mClient marks isReconfigA2dpSupported to false, device state needs to be toggled for
1025 // config changes to take effect
1026 const auto currCounter = mClient->getRoutingUpdatedCounter();
1027 EXPECT_GT(currCounter, prevCounter);
1028 }
1029}
1030
jiabina84c3d32022-12-02 18:59:55 +00001031TEST_F(AudioPolicyManagerTestWithConfigurationFile, PreferredMixerAttributes) {
1032 mClient->addSupportedFormat(AUDIO_FORMAT_PCM_16_BIT);
1033 mClient->addSupportedChannelMask(AUDIO_CHANNEL_OUT_STEREO);
1034 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(AUDIO_DEVICE_OUT_USB_DEVICE,
1035 AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
1036 "", "", AUDIO_FORMAT_DEFAULT));
1037 auto devices = mManager->getAvailableOutputDevices();
1038 audio_port_handle_t maxPortId = 0;
1039 audio_port_handle_t speakerPortId;
1040 audio_port_handle_t usbPortId;
1041 for (auto device : devices) {
1042 maxPortId = std::max(maxPortId, device->getId());
1043 if (device->type() == AUDIO_DEVICE_OUT_SPEAKER) {
1044 speakerPortId = device->getId();
1045 } else if (device->type() == AUDIO_DEVICE_OUT_USB_DEVICE) {
1046 usbPortId = device->getId();
1047 }
1048 }
1049
1050 const uid_t uid = 1234;
1051 const uid_t otherUid = 4321;
1052 const audio_attributes_t mediaAttr = {
1053 .content_type = AUDIO_CONTENT_TYPE_MUSIC,
1054 .usage = AUDIO_USAGE_MEDIA,
1055 };
1056 const audio_attributes_t alarmAttr = {
1057 .content_type = AUDIO_CONTENT_TYPE_SONIFICATION,
1058 .usage = AUDIO_USAGE_ALARM,
1059 };
1060
1061 std::vector<audio_mixer_attributes_t> mixerAttributes;
1062 EXPECT_EQ(NO_ERROR, mManager->getSupportedMixerAttributes(usbPortId, mixerAttributes));
1063 for (const auto attrToSet : mixerAttributes) {
1064 audio_mixer_attributes_t attrFromQuery = AUDIO_MIXER_ATTRIBUTES_INITIALIZER;
1065
1066 // The given device is not available
1067 EXPECT_EQ(BAD_VALUE,
1068 mManager->setPreferredMixerAttributes(
1069 &mediaAttr, maxPortId + 1, uid, &attrToSet));
1070 // The only allowed device is USB
1071 EXPECT_EQ(BAD_VALUE,
1072 mManager->setPreferredMixerAttributes(
1073 &mediaAttr, speakerPortId, uid, &attrToSet));
1074 // The only allowed usage is media
1075 EXPECT_EQ(BAD_VALUE,
1076 mManager->setPreferredMixerAttributes(&alarmAttr, usbPortId, uid, &attrToSet));
1077 // Nothing set yet, must get null when query
1078 EXPECT_EQ(NAME_NOT_FOUND,
1079 mManager->getPreferredMixerAttributes(&mediaAttr, usbPortId, &attrFromQuery));
1080 EXPECT_EQ(NO_ERROR,
1081 mManager->setPreferredMixerAttributes(
1082 &mediaAttr, usbPortId, uid, &attrToSet));
1083 EXPECT_EQ(NO_ERROR,
1084 mManager->getPreferredMixerAttributes(&mediaAttr, usbPortId, &attrFromQuery));
1085 EXPECT_EQ(attrToSet.config.format, attrFromQuery.config.format);
1086 EXPECT_EQ(attrToSet.config.sample_rate, attrFromQuery.config.sample_rate);
1087 EXPECT_EQ(attrToSet.config.channel_mask, attrFromQuery.config.channel_mask);
1088 EXPECT_EQ(attrToSet.mixer_behavior, attrFromQuery.mixer_behavior);
1089 EXPECT_EQ(NAME_NOT_FOUND,
1090 mManager->clearPreferredMixerAttributes(&mediaAttr, speakerPortId, uid));
1091 EXPECT_EQ(PERMISSION_DENIED,
1092 mManager->clearPreferredMixerAttributes(&mediaAttr, usbPortId, otherUid));
1093 EXPECT_EQ(NO_ERROR,
1094 mManager->clearPreferredMixerAttributes(&mediaAttr, usbPortId, uid));
1095 }
1096
1097 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(AUDIO_DEVICE_OUT_USB_DEVICE,
1098 AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
1099 "", "", AUDIO_FORMAT_LDAC));
1100}
1101
jiabin3ff8d7d2022-12-13 06:27:44 +00001102TEST_F(AudioPolicyManagerTestWithConfigurationFile, RoutingChangedWithPreferredMixerAttributes) {
1103 mClient->addSupportedFormat(AUDIO_FORMAT_PCM_16_BIT);
1104 mClient->addSupportedChannelMask(AUDIO_CHANNEL_OUT_STEREO);
1105 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(AUDIO_DEVICE_OUT_USB_DEVICE,
1106 AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
1107 "", "", AUDIO_FORMAT_DEFAULT));
1108 auto devices = mManager->getAvailableOutputDevices();
1109 audio_port_handle_t usbPortId = AUDIO_PORT_HANDLE_NONE;
1110 for (auto device : devices) {
1111 if (device->type() == AUDIO_DEVICE_OUT_USB_DEVICE) {
1112 usbPortId = device->getId();
1113 break;
1114 }
1115 }
1116 EXPECT_NE(AUDIO_PORT_HANDLE_NONE, usbPortId);
1117
1118 const uid_t uid = 1234;
1119 const audio_attributes_t mediaAttr = {
1120 .content_type = AUDIO_CONTENT_TYPE_MUSIC,
1121 .usage = AUDIO_USAGE_MEDIA,
1122 };
1123
1124 std::vector<audio_mixer_attributes_t> mixerAttributes;
1125 EXPECT_EQ(NO_ERROR, mManager->getSupportedMixerAttributes(usbPortId, mixerAttributes));
1126 EXPECT_GT(mixerAttributes.size(), 0);
1127 EXPECT_EQ(NO_ERROR,
1128 mManager->setPreferredMixerAttributes(
1129 &mediaAttr, usbPortId, uid, &mixerAttributes[0]));
1130
1131 audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
1132 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
1133 audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
1134 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
1135 48000, AUDIO_OUTPUT_FLAG_NONE, &output, &portId, mediaAttr,
1136 AUDIO_SESSION_NONE, uid);
1137 status_t status = mManager->startOutput(portId);
1138 if (status == DEAD_OBJECT) {
1139 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
1140 48000, AUDIO_OUTPUT_FLAG_NONE, &output, &portId, mediaAttr,
1141 AUDIO_SESSION_NONE, uid);
1142 status = mManager->startOutput(portId);
1143 }
1144 EXPECT_EQ(NO_ERROR, status);
1145 EXPECT_NE(AUDIO_IO_HANDLE_NONE, output);
1146 EXPECT_NE(nullptr, mManager->getOutputs().valueFor(output));
1147 EXPECT_EQ(NO_ERROR, mManager->setDeviceConnectionState(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP,
1148 AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
1149 "", "", AUDIO_FORMAT_LDAC));
1150 // When BT device is connected, it will be selected as media device and trigger routing changed.
1151 // When this happens, existing output that is opened with preferred mixer attributes will be
1152 // closed and reopened with default config.
1153 EXPECT_EQ(nullptr, mManager->getOutputs().valueFor(output));
1154
1155 EXPECT_EQ(NO_ERROR,
1156 mManager->clearPreferredMixerAttributes(&mediaAttr, usbPortId, uid));
1157
1158 EXPECT_EQ(NO_ERROR, mManager->setDeviceConnectionState(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP,
1159 AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
1160 "", "", AUDIO_FORMAT_LDAC));
1161 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(AUDIO_DEVICE_OUT_USB_DEVICE,
1162 AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
1163 "", "", AUDIO_FORMAT_LDAC));
1164}
1165
jiabin66acc432024-02-06 00:57:36 +00001166TEST_F(AudioPolicyManagerTestWithConfigurationFile, PreferExactConfigForInput) {
1167 const audio_channel_mask_t deviceChannelMask = AUDIO_CHANNEL_IN_3POINT1;
1168 mClient->addSupportedFormat(AUDIO_FORMAT_PCM_16_BIT);
1169 mClient->addSupportedChannelMask(deviceChannelMask);
1170 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(AUDIO_DEVICE_IN_USB_DEVICE,
1171 AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
1172 "", "", AUDIO_FORMAT_DEFAULT));
1173
1174 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
1175 audio_attributes_t attr = {AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_UNKNOWN,
1176 AUDIO_SOURCE_VOICE_COMMUNICATION,AUDIO_FLAG_NONE, ""};
1177 AudioPolicyInterface::input_type_t inputType;
1178 audio_io_handle_t input = AUDIO_PORT_HANDLE_NONE;
1179 AttributionSourceState attributionSource = createAttributionSourceState(/*uid=*/ 0);
1180 audio_config_base_t requestedConfig = {
1181 .channel_mask = AUDIO_CHANNEL_IN_STEREO,
1182 .format = AUDIO_FORMAT_PCM_16_BIT,
1183 .sample_rate = 48000
1184 };
1185 audio_config_base_t config = requestedConfig;
1186 audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
Marvin Ramine5a122d2023-12-07 13:57:59 +01001187 uint32_t *virtualDeviceId = 0;
jiabin66acc432024-02-06 00:57:36 +00001188 ASSERT_EQ(OK, mManager->getInputForAttr(
1189 &attr, &input, 1 /*riid*/, AUDIO_SESSION_NONE, attributionSource, &config,
1190 AUDIO_INPUT_FLAG_NONE,
Marvin Ramine5a122d2023-12-07 13:57:59 +01001191 &selectedDeviceId, &inputType, &portId, virtualDeviceId));
jiabin66acc432024-02-06 00:57:36 +00001192 ASSERT_NE(AUDIO_PORT_HANDLE_NONE, portId);
1193 ASSERT_TRUE(equals(requestedConfig, config));
1194
1195 attr = {AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_UNKNOWN,
1196 AUDIO_SOURCE_VOICE_COMMUNICATION, AUDIO_FLAG_NONE, ""};
1197 requestedConfig.channel_mask = deviceChannelMask;
1198 config = requestedConfig;
1199 selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
1200 input = AUDIO_PORT_HANDLE_NONE;
1201 portId = AUDIO_PORT_HANDLE_NONE;
1202 ASSERT_EQ(OK, mManager->getInputForAttr(
1203 &attr, &input, 1 /*riid*/, AUDIO_SESSION_NONE, attributionSource, &config,
1204 AUDIO_INPUT_FLAG_NONE,
Marvin Ramine5a122d2023-12-07 13:57:59 +01001205 &selectedDeviceId, &inputType, &portId, virtualDeviceId));
jiabin66acc432024-02-06 00:57:36 +00001206 ASSERT_NE(AUDIO_PORT_HANDLE_NONE, portId);
1207 ASSERT_TRUE(equals(requestedConfig, config));
1208
1209 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(AUDIO_DEVICE_IN_USB_DEVICE,
1210 AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
1211 "", "", AUDIO_FORMAT_DEFAULT));
1212}
1213
Mikhail Naganovc66ffc12024-05-30 16:56:25 -07001214TEST_F(AudioPolicyManagerTestWithConfigurationFile, CheckInputsForDeviceClosesStreams) {
1215 mClient->addSupportedFormat(AUDIO_FORMAT_PCM_16_BIT);
1216 mClient->addSupportedFormat(AUDIO_FORMAT_PCM_24_BIT_PACKED);
1217 mClient->addSupportedChannelMask(AUDIO_CHANNEL_IN_MONO);
1218 mClient->addSupportedChannelMask(AUDIO_CHANNEL_IN_STEREO);
1219 // Since 'checkInputsForDevice' is called as part of the 'setDeviceConnectionState',
1220 // call it directly here, as we need to ensure that it does not keep all intermediate
1221 // streams opened, as it may cause a rejection from the HAL based on the cap.
1222 const size_t streamCountBefore = mClient->getOpenedInputsCount();
1223 sp<DeviceDescriptor> device = mManager->getHwModules().getDeviceDescriptor(
1224 AUDIO_DEVICE_IN_USB_DEVICE, "", "", AUDIO_FORMAT_DEFAULT, true /*allowToCreate*/);
1225 ASSERT_NE(nullptr, device.get());
1226 EXPECT_EQ(NO_ERROR,
1227 mManager->checkInputsForDevice(device, AUDIO_POLICY_DEVICE_STATE_AVAILABLE));
1228 EXPECT_EQ(streamCountBefore, mClient->getOpenedInputsCount());
1229}
1230
1231TEST_F(AudioPolicyManagerTestWithConfigurationFile, SetDeviceConnectionStateClosesStreams) {
1232 mClient->addSupportedFormat(AUDIO_FORMAT_PCM_16_BIT);
1233 mClient->addSupportedFormat(AUDIO_FORMAT_PCM_24_BIT_PACKED);
1234 mClient->addSupportedChannelMask(AUDIO_CHANNEL_IN_MONO);
1235 mClient->addSupportedChannelMask(AUDIO_CHANNEL_IN_STEREO);
1236 const size_t streamCountBefore = mClient->getOpenedInputsCount();
1237 EXPECT_EQ(NO_ERROR, mManager->setDeviceConnectionState(AUDIO_DEVICE_IN_USB_DEVICE,
1238 AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
1239 "", "", AUDIO_FORMAT_DEFAULT));
1240 EXPECT_EQ(streamCountBefore, mClient->getOpenedInputsCount());
1241}
1242
jiabin7c0205e2019-09-05 10:26:04 -07001243class AudioPolicyManagerTestDynamicPolicy : public AudioPolicyManagerTestWithConfigurationFile {
jiabinf4eb15a2019-08-28 15:31:47 -07001244protected:
jiabinf4eb15a2019-08-28 15:31:47 -07001245 void TearDown() override;
1246
1247 status_t addPolicyMix(int mixType, int mixFlag, audio_devices_t deviceType,
1248 std::string mixAddress, const audio_config_t& audioConfig,
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +02001249 const std::vector<AudioMixMatchCriterion>& matchCriteria);
Marvin Raminbdefaf02023-11-01 09:10:32 +01001250
Marvin Raminabd9b892023-11-17 16:36:27 +01001251 status_t addPolicyMix(const AudioMix& mix);
1252
1253 status_t removePolicyMixes(const Vector<AudioMix>& mixes);
1254
Marvin Raminbdefaf02023-11-01 09:10:32 +01001255 std::vector<AudioMix> getRegisteredPolicyMixes();
jiabinf4eb15a2019-08-28 15:31:47 -07001256 void clearPolicyMix();
jiabin24ff57a2023-11-27 21:06:51 +00001257 void addPolicyMixAndStartInputForLoopback(
1258 int mixType, int mixFlag, audio_devices_t deviceType, std::string mixAddress,
1259 const audio_config_t& audioConfig,
1260 const std::vector<AudioMixMatchCriterion>& matchCriteria,
1261 audio_session_t session=AUDIO_SESSION_NONE,
1262 audio_config_base_t config=DEFAULT_INPUT_CONFIG,
1263 audio_input_flags_t inputFlags=AUDIO_INPUT_FLAG_NONE);
jiabinf4eb15a2019-08-28 15:31:47 -07001264
1265 Vector<AudioMix> mAudioMixes;
jiabinf4eb15a2019-08-28 15:31:47 -07001266 const std::string mMixAddress = "remote_submix_media";
jiabin24ff57a2023-11-27 21:06:51 +00001267
1268 audio_port_handle_t mLoopbackInputPortId = AUDIO_PORT_HANDLE_NONE;
1269 std::unique_ptr<RecordingActivityTracker> mTracker;
1270 struct audio_port_v7 mInjectionPort;
1271
1272 constexpr static const audio_config_base_t DEFAULT_INPUT_CONFIG = {
1273 .sample_rate = k48000SamplingRate,
1274 .channel_mask = AUDIO_CHANNEL_IN_STEREO,
1275 .format = AUDIO_FORMAT_PCM_16_BIT
1276 };
jiabinf4eb15a2019-08-28 15:31:47 -07001277};
1278
jiabinf4eb15a2019-08-28 15:31:47 -07001279void AudioPolicyManagerTestDynamicPolicy::TearDown() {
jiabin24ff57a2023-11-27 21:06:51 +00001280 clearPolicyMix();
jiabin7c0205e2019-09-05 10:26:04 -07001281 AudioPolicyManagerTestWithConfigurationFile::TearDown();
jiabinf4eb15a2019-08-28 15:31:47 -07001282}
1283
1284status_t AudioPolicyManagerTestDynamicPolicy::addPolicyMix(int mixType, int mixFlag,
1285 audio_devices_t deviceType, std::string mixAddress, const audio_config_t& audioConfig,
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +02001286 const std::vector<AudioMixMatchCriterion>& matchCriteria = {}) {
1287 AudioMix myAudioMix(matchCriteria, mixType, audioConfig, mixFlag,
jiabinf4eb15a2019-08-28 15:31:47 -07001288 String8(mixAddress.c_str()), 0);
1289 myAudioMix.mDeviceType = deviceType;
Marvin Ramin0783e202024-03-05 12:45:50 +01001290 myAudioMix.mToken = sp<BBinder>::make();
jiabinf4eb15a2019-08-28 15:31:47 -07001291 // Clear mAudioMix before add new one to make sure we don't add already exist mixes.
1292 mAudioMixes.clear();
Marvin Raminabd9b892023-11-17 16:36:27 +01001293 return addPolicyMix(myAudioMix);
1294}
1295
1296status_t AudioPolicyManagerTestDynamicPolicy::addPolicyMix(const AudioMix& mix) {
1297 mAudioMixes.add(mix);
jiabinf4eb15a2019-08-28 15:31:47 -07001298
1299 // As the policy mixes registration may fail at some case,
1300 // caller need to check the returned status.
1301 status_t ret = mManager->registerPolicyMixes(mAudioMixes);
1302 return ret;
1303}
1304
Marvin Raminabd9b892023-11-17 16:36:27 +01001305status_t AudioPolicyManagerTestDynamicPolicy::removePolicyMixes(const Vector<AudioMix>& mixes) {
1306 status_t ret = mManager->unregisterPolicyMixes(mixes);
1307 return ret;
1308}
1309
Marvin Raminbdefaf02023-11-01 09:10:32 +01001310std::vector<AudioMix> AudioPolicyManagerTestDynamicPolicy::getRegisteredPolicyMixes() {
1311 std::vector<AudioMix> audioMixes;
1312 if (mManager != nullptr) {
1313 status_t ret = mManager->getRegisteredPolicyMixes(audioMixes);
1314 EXPECT_EQ(NO_ERROR, ret);
1315 }
1316 return audioMixes;
1317}
1318
jiabinf4eb15a2019-08-28 15:31:47 -07001319void AudioPolicyManagerTestDynamicPolicy::clearPolicyMix() {
1320 if (mManager != nullptr) {
jiabin24ff57a2023-11-27 21:06:51 +00001321 mManager->stopInput(mLoopbackInputPortId);
jiabinf4eb15a2019-08-28 15:31:47 -07001322 mManager->unregisterPolicyMixes(mAudioMixes);
1323 }
1324 mAudioMixes.clear();
1325}
1326
jiabin24ff57a2023-11-27 21:06:51 +00001327void AudioPolicyManagerTestDynamicPolicy::addPolicyMixAndStartInputForLoopback(
1328 int mixType, int mixFlag, audio_devices_t deviceType, std::string mixAddress,
1329 const audio_config_t& audioConfig,
1330 const std::vector<AudioMixMatchCriterion>& matchCriteria, audio_session_t session,
1331 audio_config_base_t config, audio_input_flags_t inputFlags) {
1332 ASSERT_EQ(NO_ERROR,
1333 addPolicyMix(mixType, mixFlag, deviceType, mixAddress, audioConfig, matchCriteria));
1334 if ((mixFlag & MIX_ROUTE_FLAG_LOOP_BACK) != MIX_ROUTE_FLAG_LOOP_BACK) {
1335 return;
1336 }
1337
1338 mTracker.reset(new RecordingActivityTracker());
1339 struct audio_port_v7 extractionPort;
1340 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SOURCE, AUDIO_DEVICE_IN_REMOTE_SUBMIX,
1341 mixAddress, &extractionPort));
1342 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
1343 audio_source_t source = AUDIO_SOURCE_REMOTE_SUBMIX;
1344 audio_attributes_t attr = {
1345 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_UNKNOWN, source, AUDIO_FLAG_NONE, ""};
1346 std::string tags = "addr=" + mMixAddress;
1347 audio_io_handle_t input = AUDIO_PORT_HANDLE_NONE;
1348 strncpy(attr.tags, tags.c_str(), AUDIO_ATTRIBUTES_TAGS_MAX_SIZE - 1);
1349 ASSERT_NO_FATAL_FAILURE(
1350 getInputForAttr(attr, &input, session, mTracker->getRiid(),
1351 &selectedDeviceId, config.format, config.channel_mask,
1352 config.sample_rate, inputFlags, &mLoopbackInputPortId));
1353 ASSERT_EQ(NO_ERROR, mManager->startInput(mLoopbackInputPortId));
1354 ASSERT_EQ(extractionPort.id, selectedDeviceId);
1355
1356 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_REMOTE_SUBMIX,
1357 mMixAddress, &mInjectionPort));
1358}
1359
jiabinf4eb15a2019-08-28 15:31:47 -07001360TEST_F(AudioPolicyManagerTestDynamicPolicy, InitSuccess) {
jiabin7c0205e2019-09-05 10:26:04 -07001361 // SetUp must finish with no assertions
jiabinf4eb15a2019-08-28 15:31:47 -07001362}
1363
1364TEST_F(AudioPolicyManagerTestDynamicPolicy, Dump) {
1365 dumpToLog();
1366}
1367
1368TEST_F(AudioPolicyManagerTestDynamicPolicy, RegisterPolicyMixes) {
1369 status_t ret;
1370 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
1371
1372 // Only capture of playback is allowed in LOOP_BACK &RENDER mode
1373 ret = addPolicyMix(MIX_TYPE_RECORDERS, MIX_ROUTE_FLAG_LOOP_BACK_AND_RENDER,
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +02001374 AUDIO_DEVICE_OUT_REMOTE_SUBMIX, "", audioConfig);
jiabinf4eb15a2019-08-28 15:31:47 -07001375 ASSERT_EQ(INVALID_OPERATION, ret);
1376
1377 // Fail due to the device is already connected.
1378 clearPolicyMix();
1379 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_LOOP_BACK,
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +02001380 AUDIO_DEVICE_OUT_REMOTE_SUBMIX, "", audioConfig);
jiabinf4eb15a2019-08-28 15:31:47 -07001381 ASSERT_EQ(INVALID_OPERATION, ret);
1382
1383 // The first time to register policy mixes with valid parameter should succeed.
1384 clearPolicyMix();
1385 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
1386 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
Dean Wheatleyd082f472022-02-04 11:10:48 +11001387 audioConfig.sample_rate = k48000SamplingRate;
jiabinf4eb15a2019-08-28 15:31:47 -07001388 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_LOOP_BACK,
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +02001389 AUDIO_DEVICE_OUT_REMOTE_SUBMIX, mMixAddress, audioConfig);
jiabinf4eb15a2019-08-28 15:31:47 -07001390 ASSERT_EQ(NO_ERROR, ret);
1391 // Registering the same policy mixes should fail.
1392 ret = mManager->registerPolicyMixes(mAudioMixes);
1393 ASSERT_EQ(INVALID_OPERATION, ret);
1394
jiabinf4eb15a2019-08-28 15:31:47 -07001395 // Registration should fail due to device not found.
1396 // Note that earpiece is not present in the test configuration file.
1397 // This will need to be updated if earpiece is added in the test configuration file.
jiabin7c0205e2019-09-05 10:26:04 -07001398 clearPolicyMix();
jiabinf4eb15a2019-08-28 15:31:47 -07001399 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +02001400 AUDIO_DEVICE_OUT_EARPIECE, "", audioConfig);
jiabinf4eb15a2019-08-28 15:31:47 -07001401 ASSERT_EQ(INVALID_OPERATION, ret);
1402
1403 // Registration should fail due to output not found.
1404 clearPolicyMix();
1405 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +02001406 AUDIO_DEVICE_OUT_REMOTE_SUBMIX, "", audioConfig);
jiabinf4eb15a2019-08-28 15:31:47 -07001407 ASSERT_EQ(INVALID_OPERATION, ret);
1408
Jan Sebechlebskycd33d8d2023-06-07 10:45:50 +02001409 // The first time to register valid loopback policy mix should succeed.
jiabinf4eb15a2019-08-28 15:31:47 -07001410 clearPolicyMix();
Jan Sebechlebskycd33d8d2023-06-07 10:45:50 +02001411 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_LOOP_BACK,
1412 AUDIO_DEVICE_OUT_REMOTE_SUBMIX, "addr", audioConfig);
jiabinf4eb15a2019-08-28 15:31:47 -07001413 ASSERT_EQ(NO_ERROR, ret);
Jan Sebechlebskycd33d8d2023-06-07 10:45:50 +02001414 // Registering the render policy for the loopback address should succeed.
1415 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
1416 AUDIO_DEVICE_OUT_REMOTE_SUBMIX, "addr", audioConfig);
jiabinf4eb15a2019-08-28 15:31:47 -07001417 ASSERT_EQ(INVALID_OPERATION, ret);
1418}
1419
1420TEST_F(AudioPolicyManagerTestDynamicPolicy, UnregisterPolicyMixes) {
1421 status_t ret;
1422 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
1423
1424 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
1425 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
Dean Wheatleyd082f472022-02-04 11:10:48 +11001426 audioConfig.sample_rate = k48000SamplingRate;
jiabinf4eb15a2019-08-28 15:31:47 -07001427 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_LOOP_BACK,
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +02001428 AUDIO_DEVICE_OUT_REMOTE_SUBMIX, mMixAddress, audioConfig);
jiabinf4eb15a2019-08-28 15:31:47 -07001429 ASSERT_EQ(NO_ERROR, ret);
1430
1431 // After successfully registering policy mixes, it should be able to unregister.
1432 ret = mManager->unregisterPolicyMixes(mAudioMixes);
1433 ASSERT_EQ(NO_ERROR, ret);
1434
1435 // After unregistering policy mixes successfully, it should fail unregistering
1436 // the same policy mixes as they are not registered.
1437 ret = mManager->unregisterPolicyMixes(mAudioMixes);
1438 ASSERT_EQ(INVALID_OPERATION, ret);
jiabin7c0205e2019-09-05 10:26:04 -07001439}
jiabinf4eb15a2019-08-28 15:31:47 -07001440
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +02001441TEST_F(AudioPolicyManagerTestDynamicPolicy, RegisterPolicyWithConsistentMixSucceeds) {
1442 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
1443 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
1444 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
1445 audioConfig.sample_rate = k48000SamplingRate;
1446
1447 std::vector<AudioMixMatchCriterion> mixMatchCriteria = {
1448 createUidCriterion(/*uid=*/42),
1449 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/true)};
1450 status_t ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_LOOP_BACK,
1451 AUDIO_DEVICE_OUT_REMOTE_SUBMIX, mMixAddress, audioConfig,
1452 mixMatchCriteria);
1453 ASSERT_EQ(NO_ERROR, ret);
1454}
1455
1456TEST_F(AudioPolicyManagerTestDynamicPolicy, RegisterPolicyWithInconsistentMixFails) {
1457 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
1458 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
1459 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
1460 audioConfig.sample_rate = k48000SamplingRate;
1461
1462 std::vector<AudioMixMatchCriterion> mixMatchCriteria = {
1463 createUidCriterion(/*uid=*/42),
1464 createUidCriterion(/*uid=*/1235, /*exclude=*/true),
1465 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/true)};
1466 status_t ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_LOOP_BACK,
1467 AUDIO_DEVICE_OUT_REMOTE_SUBMIX, mMixAddress, audioConfig,
1468 mixMatchCriteria);
1469 ASSERT_EQ(INVALID_OPERATION, ret);
1470}
1471
Marvin Raminbdefaf02023-11-01 09:10:32 +01001472TEST_F_WITH_FLAGS(
1473 AudioPolicyManagerTestDynamicPolicy,
Marvin Raminabd9b892023-11-17 16:36:27 +01001474 RegisterInvalidMixesDoesNotImpactPriorMixes,
1475 REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(android::media::audiopolicy, audio_mix_test_api),
1476 ACONFIG_FLAG(android::media::audiopolicy, audio_mix_ownership))
1477) {
1478 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
1479 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
1480 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
1481 audioConfig.sample_rate = k48000SamplingRate;
1482
1483 std::vector<AudioMixMatchCriterion> validMixMatchCriteria = {
1484 createUidCriterion(/*uid=*/42),
1485 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/true)};
1486 AudioMix validAudioMix(validMixMatchCriteria, MIX_TYPE_PLAYERS, audioConfig,
1487 MIX_ROUTE_FLAG_LOOP_BACK, String8(mMixAddress.c_str()), 0);
1488 validAudioMix.mDeviceType = AUDIO_DEVICE_OUT_REMOTE_SUBMIX;
1489
1490 mAudioMixes.clear();
Marvin Ramin0783e202024-03-05 12:45:50 +01001491 status_t ret = addPolicyMix(validAudioMix);
Marvin Raminabd9b892023-11-17 16:36:27 +01001492
1493 ASSERT_EQ(NO_ERROR, ret);
1494
1495 std::vector<AudioMix> registeredMixes = getRegisteredPolicyMixes();
1496 ASSERT_EQ(1, registeredMixes.size());
1497
1498 std::vector<AudioMixMatchCriterion> invalidMixMatchCriteria = {
1499 createUidCriterion(/*uid=*/42),
1500 createUidCriterion(/*uid=*/1235, /*exclude=*/true),
1501 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/true)};
1502
1503 AudioMix invalidAudioMix(invalidMixMatchCriteria, MIX_TYPE_PLAYERS, audioConfig,
1504 MIX_ROUTE_FLAG_LOOP_BACK, String8(mMixAddress.c_str()), 0);
1505 validAudioMix.mDeviceType = AUDIO_DEVICE_OUT_REMOTE_SUBMIX;
1506
Marvin Ramin0783e202024-03-05 12:45:50 +01001507 ret = addPolicyMix(invalidAudioMix);
Marvin Raminabd9b892023-11-17 16:36:27 +01001508
1509 ASSERT_EQ(INVALID_OPERATION, ret);
1510
1511 std::vector<AudioMix> remainingMixes = getRegisteredPolicyMixes();
1512 ASSERT_EQ(registeredMixes.size(), remainingMixes.size());
1513}
1514
1515TEST_F_WITH_FLAGS(
1516 AudioPolicyManagerTestDynamicPolicy,
1517 UnregisterInvalidMixesReturnsError,
1518 REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(android::media::audiopolicy, audio_mix_test_api),
1519 ACONFIG_FLAG(android::media::audiopolicy, audio_mix_ownership))
1520) {
1521 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
1522 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
1523 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
1524 audioConfig.sample_rate = k48000SamplingRate;
1525
1526 std::vector<AudioMixMatchCriterion> validMixMatchCriteria = {
1527 createUidCriterion(/*uid=*/42),
1528 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/true)};
1529 AudioMix validAudioMix(validMixMatchCriteria, MIX_TYPE_PLAYERS, audioConfig,
1530 MIX_ROUTE_FLAG_LOOP_BACK, String8(mMixAddress.c_str()), 0);
1531 validAudioMix.mDeviceType = AUDIO_DEVICE_OUT_REMOTE_SUBMIX;
1532
1533 mAudioMixes.clear();
Marvin Ramin0783e202024-03-05 12:45:50 +01001534 status_t ret = addPolicyMix(validAudioMix);
Marvin Raminabd9b892023-11-17 16:36:27 +01001535
1536 ASSERT_EQ(NO_ERROR, ret);
1537
1538 std::vector<AudioMix> registeredMixes = getRegisteredPolicyMixes();
1539 ASSERT_EQ(1, registeredMixes.size());
1540
1541 std::vector<AudioMixMatchCriterion> invalidMixMatchCriteria = {
1542 createUidCriterion(/*uid=*/42),
1543 createUidCriterion(/*uid=*/1235, /*exclude=*/true),
1544 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/true)};
1545
1546 AudioMix invalidAudioMix(invalidMixMatchCriteria, MIX_TYPE_PLAYERS, audioConfig,
1547 MIX_ROUTE_FLAG_LOOP_BACK, String8(mMixAddress.c_str()), 0);
Marvin Ramin0783e202024-03-05 12:45:50 +01001548 invalidAudioMix.mDeviceType = AUDIO_DEVICE_OUT_REMOTE_SUBMIX;
Marvin Raminabd9b892023-11-17 16:36:27 +01001549
1550 Vector<AudioMix> mixes;
1551 mixes.add(invalidAudioMix);
1552 mixes.add(validAudioMix);
1553 ret = removePolicyMixes(mixes);
1554
1555 ASSERT_EQ(INVALID_OPERATION, ret);
1556
1557 std::vector<AudioMix> remainingMixes = getRegisteredPolicyMixes();
1558 EXPECT_THAT(remainingMixes, IsEmpty());
1559}
1560
1561TEST_F_WITH_FLAGS(
1562 AudioPolicyManagerTestDynamicPolicy,
Marvin Raminbdefaf02023-11-01 09:10:32 +01001563 GetRegisteredPolicyMixes,
1564 REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(android::media::audiopolicy, audio_mix_test_api))
1565) {
1566 std::vector<AudioMix> mixes = getRegisteredPolicyMixes();
1567 EXPECT_THAT(mixes, IsEmpty());
1568}
1569
1570TEST_F_WITH_FLAGS(AudioPolicyManagerTestDynamicPolicy,
1571 AddPolicyMixAndVerifyGetRegisteredPolicyMixes,
1572 REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(android::media::audiopolicy, audio_mix_test_api))
1573) {
1574 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
1575 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
1576 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
1577 audioConfig.sample_rate = k48000SamplingRate;
1578
1579 std::vector<AudioMixMatchCriterion> mixMatchCriteria = {
1580 createUidCriterion(/*uid=*/42),
1581 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/true)};
1582 status_t ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_LOOP_BACK,
1583 AUDIO_DEVICE_OUT_REMOTE_SUBMIX, mMixAddress, audioConfig,
1584 mixMatchCriteria);
1585 ASSERT_EQ(NO_ERROR, ret);
1586
1587 std::vector<AudioMix> mixes = getRegisteredPolicyMixes();
1588 ASSERT_EQ(mixes.size(), 1);
1589
1590 const AudioMix& mix = mixes[0];
1591 ASSERT_EQ(mix.mCriteria.size(), mixMatchCriteria.size());
1592 for (uint32_t i = 0; i < mixMatchCriteria.size(); i++) {
1593 EXPECT_EQ(mix.mCriteria[i].mRule, mixMatchCriteria[i].mRule);
1594 EXPECT_EQ(mix.mCriteria[i].mValue.mUsage, mixMatchCriteria[i].mValue.mUsage);
1595 }
1596 EXPECT_EQ(mix.mDeviceType, AUDIO_DEVICE_OUT_REMOTE_SUBMIX);
1597 EXPECT_EQ(mix.mRouteFlags, MIX_ROUTE_FLAG_LOOP_BACK);
1598 EXPECT_EQ(mix.mMixType, MIX_TYPE_PLAYERS);
1599 EXPECT_EQ(mix.mFormat.channel_mask, audioConfig.channel_mask);
1600 EXPECT_EQ(mix.mFormat.format, audioConfig.format);
1601 EXPECT_EQ(mix.mFormat.sample_rate, audioConfig.sample_rate);
1602 EXPECT_EQ(mix.mFormat.frame_count, audioConfig.frame_count);
1603}
1604
Kriti Dangef6be8f2020-11-05 11:58:19 +01001605class AudioPolicyManagerTestForHdmi
Mikhail Naganov18885d32021-10-01 13:03:09 -07001606 : public AudioPolicyManagerTestWithConfigurationFile,
1607 public testing::WithParamInterface<audio_format_t> {
Kriti Dangef6be8f2020-11-05 11:58:19 +01001608protected:
1609 void SetUp() override;
1610 std::string getConfigFile() override { return sTvConfig; }
Kriti Dang6537def2021-03-02 13:46:59 +01001611 std::map<audio_format_t, bool> getSurroundFormatsHelper();
1612 std::vector<audio_format_t> getReportedSurroundFormatsHelper();
Kriti Dangef6be8f2020-11-05 11:58:19 +01001613 std::unordered_set<audio_format_t> getFormatsFromPorts();
Kriti Dangef6be8f2020-11-05 11:58:19 +01001614 void TearDown() override;
1615
1616 static const std::string sTvConfig;
1617
1618};
1619
1620const std::string AudioPolicyManagerTestForHdmi::sTvConfig =
1621 AudioPolicyManagerTestForHdmi::sExecutableDir +
1622 "test_settop_box_surround_configuration.xml";
1623
1624void AudioPolicyManagerTestForHdmi::SetUp() {
Mikhail Naganovd4c21aa2021-10-05 15:10:16 -07001625 ASSERT_NO_FATAL_FAILURE(AudioPolicyManagerTest::SetUp());
Mikhail Naganov83caee02021-10-05 15:52:01 -07001626 mClient->addSupportedFormat(AUDIO_FORMAT_AC3);
Kriti Dangef6be8f2020-11-05 11:58:19 +01001627 mClient->addSupportedFormat(AUDIO_FORMAT_E_AC3);
jiabin12537fc2023-10-12 17:56:08 +00001628 mClient->addSupportedChannelMask(AUDIO_CHANNEL_OUT_STEREO);
Kriti Dangef6be8f2020-11-05 11:58:19 +01001629 mManager->setDeviceConnectionState(
1630 AUDIO_DEVICE_OUT_HDMI, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
1631 "" /*address*/, "" /*name*/, AUDIO_FORMAT_DEFAULT);
1632}
1633
1634void AudioPolicyManagerTestForHdmi::TearDown() {
1635 mManager->setDeviceConnectionState(
1636 AUDIO_DEVICE_OUT_HDMI, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
1637 "" /*address*/, "" /*name*/, AUDIO_FORMAT_DEFAULT);
1638 AudioPolicyManagerTest::TearDown();
1639}
1640
1641std::map<audio_format_t, bool>
Kriti Dang6537def2021-03-02 13:46:59 +01001642 AudioPolicyManagerTestForHdmi::getSurroundFormatsHelper() {
Kriti Dangef6be8f2020-11-05 11:58:19 +01001643 unsigned int numSurroundFormats = 0;
1644 std::map<audio_format_t, bool> surroundFormatsMap;
1645 status_t ret = mManager->getSurroundFormats(
1646 &numSurroundFormats, nullptr /* surroundFormats */,
Kriti Dang6537def2021-03-02 13:46:59 +01001647 nullptr /* surroundFormatsEnabled */);
Kriti Dangef6be8f2020-11-05 11:58:19 +01001648 EXPECT_EQ(NO_ERROR, ret);
1649 if (ret != NO_ERROR) {
1650 return surroundFormatsMap;
1651 }
1652 audio_format_t surroundFormats[numSurroundFormats];
1653 memset(surroundFormats, 0, sizeof(audio_format_t) * numSurroundFormats);
1654 bool surroundFormatsEnabled[numSurroundFormats];
1655 memset(surroundFormatsEnabled, 0, sizeof(bool) * numSurroundFormats);
1656 ret = mManager->getSurroundFormats(
Kriti Dang6537def2021-03-02 13:46:59 +01001657 &numSurroundFormats, surroundFormats, surroundFormatsEnabled);
Kriti Dangef6be8f2020-11-05 11:58:19 +01001658 EXPECT_EQ(NO_ERROR, ret);
1659 if (ret != NO_ERROR) {
1660 return surroundFormatsMap;
1661 }
1662 for (int i = 0; i< numSurroundFormats; i++) {
1663 surroundFormatsMap[surroundFormats[i]] = surroundFormatsEnabled[i];
1664 }
1665 return surroundFormatsMap;
1666}
1667
Kriti Dang6537def2021-03-02 13:46:59 +01001668std::vector<audio_format_t> AudioPolicyManagerTestForHdmi::getReportedSurroundFormatsHelper() {
1669 unsigned int numSurroundFormats = 0;
1670 std::vector<audio_format_t> surroundFormatsVector;
1671 status_t ret = mManager->getReportedSurroundFormats(
1672 &numSurroundFormats, nullptr /* surroundFormats */);
1673 EXPECT_EQ(NO_ERROR, ret);
1674 if (ret != NO_ERROR) {
1675 return surroundFormatsVector;
1676 }
1677 audio_format_t surroundFormats[numSurroundFormats];
1678 memset(surroundFormats, 0, sizeof(audio_format_t) * numSurroundFormats);
1679 ret = mManager->getReportedSurroundFormats(&numSurroundFormats, surroundFormats);
1680 EXPECT_EQ(NO_ERROR, ret);
1681 if (ret != NO_ERROR) {
1682 return surroundFormatsVector;
1683 }
1684 for (const auto &surroundFormat : surroundFormats) {
1685 surroundFormatsVector.push_back(surroundFormat);
1686 }
1687 return surroundFormatsVector;
1688}
1689
Kriti Dangef6be8f2020-11-05 11:58:19 +01001690std::unordered_set<audio_format_t>
1691 AudioPolicyManagerTestForHdmi::getFormatsFromPorts() {
1692 uint32_t numPorts = 0;
1693 uint32_t generation1;
1694 status_t ret;
1695 std::unordered_set<audio_format_t> formats;
1696 ret = mManager->listAudioPorts(
1697 AUDIO_PORT_ROLE_SINK, AUDIO_PORT_TYPE_DEVICE, &numPorts, nullptr, &generation1);
1698 EXPECT_EQ(NO_ERROR, ret) << "mManager->listAudioPorts returned error";
1699 if (ret != NO_ERROR) {
1700 return formats;
1701 }
jiabin19cdba52020-11-24 11:28:58 -08001702 struct audio_port_v7 ports[numPorts];
Kriti Dangef6be8f2020-11-05 11:58:19 +01001703 ret = mManager->listAudioPorts(
1704 AUDIO_PORT_ROLE_SINK, AUDIO_PORT_TYPE_DEVICE, &numPorts, ports, &generation1);
1705 EXPECT_EQ(NO_ERROR, ret) << "mManager->listAudioPorts returned error";
1706 if (ret != NO_ERROR) {
1707 return formats;
1708 }
1709 for (const auto &port : ports) {
jiabin19cdba52020-11-24 11:28:58 -08001710 for (size_t i = 0; i < port.num_audio_profiles; ++i) {
1711 formats.insert(port.audio_profiles[i].format);
1712 }
Kriti Dangef6be8f2020-11-05 11:58:19 +01001713 }
1714 return formats;
1715}
1716
Mikhail Naganov18885d32021-10-01 13:03:09 -07001717TEST_P(AudioPolicyManagerTestForHdmi, GetSurroundFormatsReturnsSupportedFormats) {
Kriti Dangef6be8f2020-11-05 11:58:19 +01001718 mManager->setForceUse(
1719 AUDIO_POLICY_FORCE_FOR_ENCODED_SURROUND, AUDIO_POLICY_FORCE_ENCODED_SURROUND_ALWAYS);
Kriti Dang6537def2021-03-02 13:46:59 +01001720 auto surroundFormats = getSurroundFormatsHelper();
Mikhail Naganov18885d32021-10-01 13:03:09 -07001721 ASSERT_EQ(1, surroundFormats.count(GetParam()));
Kriti Dangef6be8f2020-11-05 11:58:19 +01001722}
1723
Mikhail Naganov18885d32021-10-01 13:03:09 -07001724TEST_P(AudioPolicyManagerTestForHdmi,
Kriti Dangef6be8f2020-11-05 11:58:19 +01001725 GetSurroundFormatsReturnsManipulatedFormats) {
1726 mManager->setForceUse(
1727 AUDIO_POLICY_FORCE_FOR_ENCODED_SURROUND, AUDIO_POLICY_FORCE_ENCODED_SURROUND_MANUAL);
1728
1729 status_t ret =
Mikhail Naganov18885d32021-10-01 13:03:09 -07001730 mManager->setSurroundFormatEnabled(GetParam(), false /*enabled*/);
Kriti Dangef6be8f2020-11-05 11:58:19 +01001731 ASSERT_EQ(NO_ERROR, ret);
Kriti Dang6537def2021-03-02 13:46:59 +01001732 auto surroundFormats = getSurroundFormatsHelper();
Mikhail Naganov18885d32021-10-01 13:03:09 -07001733 ASSERT_EQ(1, surroundFormats.count(GetParam()));
1734 ASSERT_FALSE(surroundFormats[GetParam()]);
Kriti Dangef6be8f2020-11-05 11:58:19 +01001735
Mikhail Naganov18885d32021-10-01 13:03:09 -07001736 ret = mManager->setSurroundFormatEnabled(GetParam(), true /*enabled*/);
Kriti Dangef6be8f2020-11-05 11:58:19 +01001737 ASSERT_EQ(NO_ERROR, ret);
Kriti Dang6537def2021-03-02 13:46:59 +01001738 surroundFormats = getSurroundFormatsHelper();
Mikhail Naganov18885d32021-10-01 13:03:09 -07001739 ASSERT_EQ(1, surroundFormats.count(GetParam()));
1740 ASSERT_TRUE(surroundFormats[GetParam()]);
Kriti Dangef6be8f2020-11-05 11:58:19 +01001741
Mikhail Naganov18885d32021-10-01 13:03:09 -07001742 ret = mManager->setSurroundFormatEnabled(GetParam(), false /*enabled*/);
Kriti Dangef6be8f2020-11-05 11:58:19 +01001743 ASSERT_EQ(NO_ERROR, ret);
Kriti Dang6537def2021-03-02 13:46:59 +01001744 surroundFormats = getSurroundFormatsHelper();
Mikhail Naganov18885d32021-10-01 13:03:09 -07001745 ASSERT_EQ(1, surroundFormats.count(GetParam()));
1746 ASSERT_FALSE(surroundFormats[GetParam()]);
Kriti Dangef6be8f2020-11-05 11:58:19 +01001747}
1748
Mikhail Naganov18885d32021-10-01 13:03:09 -07001749TEST_P(AudioPolicyManagerTestForHdmi,
Kriti Dangef6be8f2020-11-05 11:58:19 +01001750 ListAudioPortsReturnManipulatedHdmiFormats) {
1751 mManager->setForceUse(
1752 AUDIO_POLICY_FORCE_FOR_ENCODED_SURROUND, AUDIO_POLICY_FORCE_ENCODED_SURROUND_MANUAL);
1753
Mikhail Naganov18885d32021-10-01 13:03:09 -07001754 ASSERT_EQ(NO_ERROR, mManager->setSurroundFormatEnabled(GetParam(), true /*enabled*/));
jiabin12537fc2023-10-12 17:56:08 +00001755 auto formats = getFormatsFromPorts();
Mikhail Naganov18885d32021-10-01 13:03:09 -07001756 ASSERT_EQ(1, formats.count(GetParam()));
jiabin12537fc2023-10-12 17:56:08 +00001757
1758 ASSERT_EQ(NO_ERROR, mManager->setSurroundFormatEnabled(GetParam(), false /*enabled*/));
1759 formats = getFormatsFromPorts();
1760 ASSERT_EQ(0, formats.count(GetParam()));
Kriti Dangef6be8f2020-11-05 11:58:19 +01001761}
1762
Mikhail Naganov18885d32021-10-01 13:03:09 -07001763TEST_P(AudioPolicyManagerTestForHdmi,
Kriti Dangef6be8f2020-11-05 11:58:19 +01001764 GetReportedSurroundFormatsReturnsHdmiReportedFormats) {
1765 mManager->setForceUse(
1766 AUDIO_POLICY_FORCE_FOR_ENCODED_SURROUND, AUDIO_POLICY_FORCE_ENCODED_SURROUND_ALWAYS);
Kriti Dang6537def2021-03-02 13:46:59 +01001767 auto surroundFormats = getReportedSurroundFormatsHelper();
Mikhail Naganov18885d32021-10-01 13:03:09 -07001768 ASSERT_EQ(1, std::count(surroundFormats.begin(), surroundFormats.end(), GetParam()));
Kriti Dangef6be8f2020-11-05 11:58:19 +01001769}
1770
Mikhail Naganov18885d32021-10-01 13:03:09 -07001771TEST_P(AudioPolicyManagerTestForHdmi,
Kriti Dangef6be8f2020-11-05 11:58:19 +01001772 GetReportedSurroundFormatsReturnsNonManipulatedHdmiReportedFormats) {
1773 mManager->setForceUse(
1774 AUDIO_POLICY_FORCE_FOR_ENCODED_SURROUND, AUDIO_POLICY_FORCE_ENCODED_SURROUND_MANUAL);
1775
Mikhail Naganov18885d32021-10-01 13:03:09 -07001776 status_t ret = mManager->setSurroundFormatEnabled(GetParam(), false /*enabled*/);
Kriti Dangef6be8f2020-11-05 11:58:19 +01001777 ASSERT_EQ(NO_ERROR, ret);
Kriti Dang6537def2021-03-02 13:46:59 +01001778 auto surroundFormats = getReportedSurroundFormatsHelper();
Mikhail Naganov18885d32021-10-01 13:03:09 -07001779 ASSERT_EQ(1, std::count(surroundFormats.begin(), surroundFormats.end(), GetParam()));
Kriti Dangef6be8f2020-11-05 11:58:19 +01001780
Mikhail Naganov18885d32021-10-01 13:03:09 -07001781 ret = mManager->setSurroundFormatEnabled(GetParam(), true /*enabled*/);
Kriti Dangef6be8f2020-11-05 11:58:19 +01001782 ASSERT_EQ(NO_ERROR, ret);
Kriti Dang6537def2021-03-02 13:46:59 +01001783 surroundFormats = getReportedSurroundFormatsHelper();
Mikhail Naganov18885d32021-10-01 13:03:09 -07001784 ASSERT_EQ(1, std::count(surroundFormats.begin(), surroundFormats.end(), GetParam()));
Kriti Dangef6be8f2020-11-05 11:58:19 +01001785}
1786
Mikhail Naganov18885d32021-10-01 13:03:09 -07001787TEST_P(AudioPolicyManagerTestForHdmi, GetSurroundFormatsIgnoresSupportedFormats) {
1788 mManager->setForceUse(
1789 AUDIO_POLICY_FORCE_FOR_ENCODED_SURROUND, AUDIO_POLICY_FORCE_ENCODED_SURROUND_NEVER);
1790 auto surroundFormats = getSurroundFormatsHelper();
1791 ASSERT_EQ(1, surroundFormats.count(GetParam()));
1792 ASSERT_FALSE(surroundFormats[GetParam()]);
1793}
1794
1795INSTANTIATE_TEST_SUITE_P(SurroundFormatSupport, AudioPolicyManagerTestForHdmi,
1796 testing::Values(AUDIO_FORMAT_AC3, AUDIO_FORMAT_E_AC3),
1797 [](const ::testing::TestParamInfo<AudioPolicyManagerTestForHdmi::ParamType>& info) {
1798 return audio_format_to_string(info.param);
1799 });
1800
jiabin7c0205e2019-09-05 10:26:04 -07001801class AudioPolicyManagerTestDPNoRemoteSubmixModule : public AudioPolicyManagerTestDynamicPolicy {
1802protected:
1803 std::string getConfigFile() override { return sPrimaryOnlyConfig; }
1804
1805 static const std::string sPrimaryOnlyConfig;
1806};
1807
1808const std::string AudioPolicyManagerTestDPNoRemoteSubmixModule::sPrimaryOnlyConfig =
1809 sExecutableDir + "test_audio_policy_primary_only_configuration.xml";
1810
1811TEST_F(AudioPolicyManagerTestDPNoRemoteSubmixModule, InitSuccess) {
1812 // SetUp must finish with no assertions.
1813}
1814
1815TEST_F(AudioPolicyManagerTestDPNoRemoteSubmixModule, Dump) {
1816 dumpToLog();
1817}
1818
1819TEST_F(AudioPolicyManagerTestDPNoRemoteSubmixModule, RegistrationFailure) {
1820 // Registration/Unregistration should fail due to module for remote submix not found.
1821 status_t ret;
1822 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
1823 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
1824 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
Dean Wheatleyd082f472022-02-04 11:10:48 +11001825 audioConfig.sample_rate = k48000SamplingRate;
jiabin7c0205e2019-09-05 10:26:04 -07001826 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_LOOP_BACK,
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +02001827 AUDIO_DEVICE_OUT_REMOTE_SUBMIX, "", audioConfig);
jiabin7c0205e2019-09-05 10:26:04 -07001828 ASSERT_EQ(INVALID_OPERATION, ret);
1829
jiabinf4eb15a2019-08-28 15:31:47 -07001830 ret = mManager->unregisterPolicyMixes(mAudioMixes);
1831 ASSERT_EQ(INVALID_OPERATION, ret);
1832}
1833
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001834struct DPTestParam {
1835 DPTestParam(const std::vector<AudioMixMatchCriterion>& mixCriteria,
1836 bool expected_match = false)
1837 : mixCriteria(mixCriteria), attributes(defaultAttr), session(AUDIO_SESSION_NONE),
1838 expected_match(expected_match) {}
1839
1840 DPTestParam& withUsage(audio_usage_t usage) {
1841 attributes.usage = usage;
1842 return *this;
1843 }
1844
1845 DPTestParam& withTags(const char *tags) {
1846 std::strncpy(attributes.tags, tags, sizeof(attributes.tags));
1847 return *this;
1848 }
1849
1850 DPTestParam& withSource(audio_source_t source) {
1851 attributes.source = source;
1852 return *this;
1853 }
1854
1855 DPTestParam& withSessionId(audio_session_t sessionId) {
1856 session = sessionId;
1857 return *this;
1858 }
1859
1860 std::vector<AudioMixMatchCriterion> mixCriteria;
1861 audio_attributes_t attributes;
1862 audio_session_t session;
1863 bool expected_match;
1864};
1865
jiabinf4eb15a2019-08-28 15:31:47 -07001866class AudioPolicyManagerTestDPPlaybackReRouting : public AudioPolicyManagerTestDynamicPolicy,
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001867 public testing::WithParamInterface<DPTestParam> {
jiabinf4eb15a2019-08-28 15:31:47 -07001868protected:
1869 void SetUp() override;
jiabinf4eb15a2019-08-28 15:31:47 -07001870};
1871
1872void AudioPolicyManagerTestDPPlaybackReRouting::SetUp() {
Mikhail Naganovd4c21aa2021-10-05 15:10:16 -07001873 ASSERT_NO_FATAL_FAILURE(AudioPolicyManagerTestDynamicPolicy::SetUp());
jiabinf4eb15a2019-08-28 15:31:47 -07001874
1875 mTracker.reset(new RecordingActivityTracker());
1876
1877 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
1878 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
1879 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
Dean Wheatleyd082f472022-02-04 11:10:48 +11001880 audioConfig.sample_rate = k48000SamplingRate;
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001881
1882 DPTestParam param = GetParam();
jiabin24ff57a2023-11-27 21:06:51 +00001883 ASSERT_NO_FATAL_FAILURE(
1884 addPolicyMixAndStartInputForLoopback(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_LOOP_BACK,
1885 AUDIO_DEVICE_OUT_REMOTE_SUBMIX, mMixAddress, audioConfig, param.mixCriteria,
1886 param.session));
jiabinf4eb15a2019-08-28 15:31:47 -07001887}
1888
jiabinf4eb15a2019-08-28 15:31:47 -07001889TEST_P(AudioPolicyManagerTestDPPlaybackReRouting, PlaybackReRouting) {
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001890 const DPTestParam param = GetParam();
1891 const audio_attributes_t& attr = param.attributes;
jiabinf4eb15a2019-08-28 15:31:47 -07001892
jiabin7c0205e2019-09-05 10:26:04 -07001893 audio_port_handle_t playbackRoutedPortId = AUDIO_PORT_HANDLE_NONE;
jiabinf4eb15a2019-08-28 15:31:47 -07001894 getOutputForAttr(&playbackRoutedPortId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
Dean Wheatleyd082f472022-02-04 11:10:48 +11001895 k48000SamplingRate, AUDIO_OUTPUT_FLAG_NONE, nullptr /*output*/, nullptr /*portId*/,
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001896 attr, param.session);
1897 if (param.expected_match) {
jiabinf4eb15a2019-08-28 15:31:47 -07001898 EXPECT_EQ(mInjectionPort.id, playbackRoutedPortId);
1899 } else {
1900 EXPECT_NE(mInjectionPort.id, playbackRoutedPortId);
1901 }
1902}
1903
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001904const std::vector<AudioMixMatchCriterion> USAGE_MEDIA_ALARM_CRITERIA = {
1905 createUsageCriterion(AUDIO_USAGE_MEDIA),
1906 createUsageCriterion(AUDIO_USAGE_ALARM)
1907};
jiabinf4eb15a2019-08-28 15:31:47 -07001908
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001909INSTANTIATE_TEST_SUITE_P(
1910 PlaybackReroutingUsageMatch,
1911 AudioPolicyManagerTestDPPlaybackReRouting,
1912 testing::Values(
1913 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1914 .withUsage(AUDIO_USAGE_MEDIA),
1915 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1916 .withUsage(AUDIO_USAGE_MEDIA).withTags("addr=other"),
1917 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1918 .withUsage(AUDIO_USAGE_ALARM),
1919 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1920 .withUsage(AUDIO_USAGE_VOICE_COMMUNICATION),
1921 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1922 .withUsage(AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING),
1923 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1924 .withUsage(AUDIO_USAGE_NOTIFICATION),
1925 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1926 .withUsage(AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE),
1927 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1928 .withUsage(AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST),
1929 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1930 .withUsage(AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT),
1931 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1932 .withUsage(AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED),
1933 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1934 .withUsage(AUDIO_USAGE_NOTIFICATION_EVENT),
1935 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1936 .withUsage(AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY),
1937 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1938 .withUsage(AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE),
1939 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1940 .withUsage(AUDIO_USAGE_ASSISTANCE_SONIFICATION),
1941 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1942 .withUsage(AUDIO_USAGE_GAME),
1943 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1944 .withUsage(AUDIO_USAGE_ASSISTANT)));
jiabinf4eb15a2019-08-28 15:31:47 -07001945
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001946INSTANTIATE_TEST_SUITE_P(
1947 PlaybackReroutingAddressPriorityMatch,
1948 AudioPolicyManagerTestDPPlaybackReRouting,
1949 testing::Values(
1950 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1951 .withUsage(AUDIO_USAGE_MEDIA).withTags("addr=remote_submix_media"),
1952 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1953 .withUsage(AUDIO_USAGE_VOICE_COMMUNICATION).withTags("addr=remote_submix_media"),
1954 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1955 .withUsage(AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING)
1956 .withTags("addr=remote_submix_media"),
1957 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1958 .withUsage(AUDIO_USAGE_ALARM)
1959 .withTags("addr=remote_submix_media"),
1960 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1961 .withUsage(AUDIO_USAGE_NOTIFICATION)
1962 .withTags("addr=remote_submix_media"),
1963 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1964 .withUsage(AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE)
1965 .withTags("addr=remote_submix_media"),
1966 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1967 .withUsage(AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST)
1968 .withTags("addr=remote_submix_media"),
1969 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1970 .withUsage(AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT)
1971 .withTags("addr=remote_submix_media"),
1972 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1973 .withUsage(AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED)
1974 .withTags("addr=remote_submix_media"),
1975 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1976 .withUsage(AUDIO_USAGE_NOTIFICATION_EVENT)
1977 .withTags("addr=remote_submix_media"),
1978 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1979 .withUsage(AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY)
1980 .withTags("addr=remote_submix_media"),
1981 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1982 .withUsage(AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE)
1983 .withTags("addr=remote_submix_media"),
1984 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1985 .withUsage(AUDIO_USAGE_ASSISTANCE_SONIFICATION)
1986 .withTags("addr=remote_submix_media"),
1987 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1988 .withUsage(AUDIO_USAGE_GAME)
1989 .withTags("addr=remote_submix_media"),
1990 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1991 .withUsage(AUDIO_USAGE_VIRTUAL_SOURCE)
1992 .withTags("addr=remote_submix_media"),
1993 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1994 .withUsage(AUDIO_USAGE_ASSISTANT)
Jan Sebechlebskybc56bcd2022-09-26 13:15:19 +02001995 .withTags("addr=remote_submix_media"),
1996 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1997 .withUsage(AUDIO_USAGE_ASSISTANT)
1998 .withTags("sometag;addr=remote_submix_media;othertag=somevalue"),
1999 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
2000 .withUsage(AUDIO_USAGE_ASSISTANT)
2001 .withTags("addr=remote_submix_media;othertag"),
2002 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
2003 .withUsage(AUDIO_USAGE_ASSISTANT)
2004 .withTags("sometag;othertag;addr=remote_submix_media")));
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02002005
2006static constexpr audio_session_t TEST_SESSION_ID = static_cast<audio_session_t>(42);
2007static constexpr audio_session_t OTHER_SESSION_ID = static_cast<audio_session_t>(77);
2008
2009INSTANTIATE_TEST_SUITE_P(
2010 PlaybackReRoutingWithSessionId,
2011 AudioPolicyManagerTestDPPlaybackReRouting,
2012 testing::Values(
2013 // Mix is matched because the session id matches the one specified by the mix rule.
2014 DPTestParam(/*mixCriteria=*/ {createSessionIdCriterion(TEST_SESSION_ID)},
2015 /*expected_match=*/ true)
2016 .withSessionId(TEST_SESSION_ID),
2017 // Mix is not matched because the session id doesn't match the one specified
2018 // by the mix rule.
2019 DPTestParam(/*mixCriteria=*/ {createSessionIdCriterion(TEST_SESSION_ID)},
2020 /*expected_match=*/ false)
2021 .withSessionId(OTHER_SESSION_ID),
2022 // Mix is matched, the session id doesn't match the one specified by rule,
2023 // but there's address specified in the tags which takes precedence.
2024 DPTestParam(/*mixCriteria=*/ {createSessionIdCriterion(TEST_SESSION_ID)},
2025 /*expected_match=*/ true)
2026 .withSessionId(OTHER_SESSION_ID).withTags("addr=remote_submix_media"),
2027 // Mix is matched, both the session id and the usage match ones specified by mix rule.
2028 DPTestParam(/*mixCriteria=*/ {createSessionIdCriterion(TEST_SESSION_ID),
2029 createUsageCriterion(AUDIO_USAGE_MEDIA)},
2030 /*expected_match=*/ true)
2031 .withSessionId(TEST_SESSION_ID).withUsage(AUDIO_USAGE_MEDIA),
2032 // Mix is not matched, the session id matches the one specified by mix rule,
2033 // but usage does not.
2034 DPTestParam(/*mixCriteria=*/ {createSessionIdCriterion(TEST_SESSION_ID),
2035 createUsageCriterion(AUDIO_USAGE_MEDIA)},
2036 /*expected_match=*/ false)
2037 .withSessionId(TEST_SESSION_ID).withUsage(AUDIO_USAGE_GAME),
2038 // Mix is not matched, the usage matches the one specified by mix rule,
2039 // but the session id is excluded.
2040 DPTestParam(/*mixCriteria=*/ {createSessionIdCriterion(TEST_SESSION_ID, /*exclude=*/ true),
2041 createUsageCriterion(AUDIO_USAGE_MEDIA)},
2042 /*expected_match=*/ false)
2043 .withSessionId(TEST_SESSION_ID).withUsage(AUDIO_USAGE_MEDIA)));
jiabinf4eb15a2019-08-28 15:31:47 -07002044
Jan Sebechlebsky8e10cea2023-03-29 11:43:31 +02002045struct DPMmapTestParam {
2046 DPMmapTestParam(int mixRouteFlags, audio_devices_t deviceType, const std::string& deviceAddress)
2047 : mixRouteFlags(mixRouteFlags), deviceType(deviceType), deviceAddress(deviceAddress) {}
2048
2049 int mixRouteFlags;
2050 audio_devices_t deviceType;
2051 std::string deviceAddress;
2052};
2053
2054class AudioPolicyManagerTestMMapPlaybackRerouting
2055 : public AudioPolicyManagerTestDynamicPolicy,
2056 public ::testing::WithParamInterface<DPMmapTestParam> {
2057 protected:
2058 void SetUp() override {
2059 AudioPolicyManagerTestDynamicPolicy::SetUp();
2060 audioConfig = AUDIO_CONFIG_INITIALIZER;
2061 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
2062 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
2063 audioConfig.sample_rate = k48000SamplingRate;
2064 }
2065
2066 audio_config_t audioConfig;
2067 audio_io_handle_t mOutput;
2068 audio_stream_type_t mStream = AUDIO_STREAM_DEFAULT;
2069 audio_port_handle_t mSelectedDeviceId = AUDIO_PORT_HANDLE_NONE;
Jan Sebechlebskyb3d3f622023-07-13 11:09:15 +02002070 audio_port_handle_t mPortId = AUDIO_PORT_HANDLE_NONE;
Jan Sebechlebsky8e10cea2023-03-29 11:43:31 +02002071 AudioPolicyInterface::output_type_t mOutputType;
2072 audio_attributes_t attr = AUDIO_ATTRIBUTES_INITIALIZER;
2073 bool mIsSpatialized;
2074 bool mIsBitPerfect;
Andy Hung6b137d12024-08-27 22:35:17 +00002075 float mVolume;
Jan Sebechlebsky8e10cea2023-03-29 11:43:31 +02002076};
2077
Jan Sebechlebsky370abec2023-06-15 10:18:30 +02002078TEST_P(AudioPolicyManagerTestMMapPlaybackRerouting, MmapPlaybackStreamMatchingLoopbackDapMixFails) {
Jan Sebechlebsky8e10cea2023-03-29 11:43:31 +02002079 // Add mix matching the test uid.
2080 const int testUid = 12345;
2081 const auto param = GetParam();
jiabin24ff57a2023-11-27 21:06:51 +00002082 ASSERT_NO_FATAL_FAILURE(
2083 addPolicyMixAndStartInputForLoopback(MIX_TYPE_PLAYERS, param.mixRouteFlags,
2084 param.deviceType, param.deviceAddress, audioConfig,
2085 {createUidCriterion(testUid)}));
Jan Sebechlebsky8e10cea2023-03-29 11:43:31 +02002086
jiabin24ff57a2023-11-27 21:06:51 +00002087 // Getting output for matching uid and mmap-ed stream should fail.
2088 audio_output_flags_t outputFlags =
2089 (audio_output_flags_t) (AUDIO_OUTPUT_FLAG_MMAP_NOIRQ | AUDIO_OUTPUT_FLAG_DIRECT);
Jan Sebechlebsky8e10cea2023-03-29 11:43:31 +02002090 ASSERT_EQ(INVALID_OPERATION,
2091 mManager->getOutputForAttr(&attr, &mOutput, AUDIO_SESSION_NONE, &mStream,
2092 createAttributionSourceState(testUid), &audioConfig,
2093 &outputFlags, &mSelectedDeviceId, &mPortId, {},
Andy Hung6b137d12024-08-27 22:35:17 +00002094 &mOutputType, &mIsSpatialized, &mIsBitPerfect, &mVolume));
Jan Sebechlebsky8e10cea2023-03-29 11:43:31 +02002095}
2096
Jan Sebechlebsky370abec2023-06-15 10:18:30 +02002097TEST_P(AudioPolicyManagerTestMMapPlaybackRerouting,
2098 NonMmapPlaybackStreamMatchingLoopbackDapMixSucceeds) {
Jan Sebechlebsky8e10cea2023-03-29 11:43:31 +02002099 // Add mix matching the test uid.
2100 const int testUid = 12345;
2101 const auto param = GetParam();
jiabin24ff57a2023-11-27 21:06:51 +00002102 ASSERT_NO_FATAL_FAILURE(
2103 addPolicyMixAndStartInputForLoopback(MIX_TYPE_PLAYERS, param.mixRouteFlags,
2104 param.deviceType,param.deviceAddress, audioConfig,
2105 {createUidCriterion(testUid)}));
Jan Sebechlebsky8e10cea2023-03-29 11:43:31 +02002106
jiabin24ff57a2023-11-27 21:06:51 +00002107 // Getting output for matching uid should succeed for non-mmaped stream.
Jan Sebechlebsky8e10cea2023-03-29 11:43:31 +02002108 audio_output_flags_t outputFlags = AUDIO_OUTPUT_FLAG_NONE;
2109 ASSERT_EQ(NO_ERROR,
2110 mManager->getOutputForAttr(&attr, &mOutput, AUDIO_SESSION_NONE, &mStream,
2111 createAttributionSourceState(testUid), &audioConfig,
2112 &outputFlags, &mSelectedDeviceId, &mPortId, {},
Andy Hung6b137d12024-08-27 22:35:17 +00002113 &mOutputType, &mIsSpatialized, &mIsBitPerfect, &mVolume));
Jan Sebechlebsky8e10cea2023-03-29 11:43:31 +02002114}
2115
Jan Sebechlebsky370abec2023-06-15 10:18:30 +02002116TEST_F(AudioPolicyManagerTestMMapPlaybackRerouting,
Jan Sebechlebsky697f5d92023-08-04 11:15:00 +02002117 MmapPlaybackStreamMatchingRenderDapMixSupportingMmapSucceeds) {
jiabin24ff57a2023-11-27 21:06:51 +00002118 const std::string usbAddress = "card=1;device=0";
2119 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
2120 AUDIO_DEVICE_OUT_USB_DEVICE, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
2121 usbAddress.c_str(), "", AUDIO_FORMAT_DEFAULT));
2122 audio_port_v7 usbDevicePort;
2123 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_USB_DEVICE,
2124 usbAddress, &usbDevicePort));
2125
Jan Sebechlebsky697f5d92023-08-04 11:15:00 +02002126 // Add render-only mix matching the test uid.
Jan Sebechlebsky370abec2023-06-15 10:18:30 +02002127 const int testUid = 12345;
Jan Sebechlebsky697f5d92023-08-04 11:15:00 +02002128 // test_audio_policy_configuration.xml declares mmap-capable mix port
2129 // for AUDIO_DEVICE_OUT_USB_DEVICE.
jiabin24ff57a2023-11-27 21:06:51 +00002130 ASSERT_EQ(NO_ERROR,
2131 addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2132 AUDIO_DEVICE_OUT_USB_DEVICE, /*mixAddress=*/"",
2133 audioConfig, {createUidCriterion(testUid)}));
Jan Sebechlebsky370abec2023-06-15 10:18:30 +02002134
jiabin24ff57a2023-11-27 21:06:51 +00002135 static const audio_output_flags_t mmapDirectFlags =
2136 (audio_output_flags_t) (AUDIO_OUTPUT_FLAG_MMAP_NOIRQ | AUDIO_OUTPUT_FLAG_DIRECT);
2137 // Getting output for matching uid should succeed for mmaped stream, because matched mix
Jan Sebechlebsky697f5d92023-08-04 11:15:00 +02002138 // redirects to mmap capable device.
jiabin24ff57a2023-11-27 21:06:51 +00002139 audio_output_flags_t outputFlags = mmapDirectFlags;
Jan Sebechlebsky370abec2023-06-15 10:18:30 +02002140 ASSERT_EQ(NO_ERROR,
2141 mManager->getOutputForAttr(&attr, &mOutput, AUDIO_SESSION_NONE, &mStream,
2142 createAttributionSourceState(testUid), &audioConfig,
2143 &outputFlags, &mSelectedDeviceId, &mPortId, {},
Andy Hung6b137d12024-08-27 22:35:17 +00002144 &mOutputType, &mIsSpatialized, &mIsBitPerfect, &mVolume));
jiabin24ff57a2023-11-27 21:06:51 +00002145 ASSERT_EQ(usbDevicePort.id, mSelectedDeviceId);
2146 auto outputDesc = mManager->getOutputs().valueFor(mOutput);
2147 ASSERT_NE(nullptr, outputDesc);
2148 ASSERT_EQ(mmapDirectFlags, outputDesc->getFlags().output);
2149
2150 // After releasing the client, the output is closed. APM should reselect output for the policy
2151 // mix.
2152 mManager->releaseOutput(mPortId);
2153 ASSERT_EQ(nullptr, mManager->getOutputs().valueFor(mOutput));
2154 outputFlags = AUDIO_OUTPUT_FLAG_NONE;
2155 mPortId = AUDIO_PORT_HANDLE_NONE;
2156 ASSERT_EQ(NO_ERROR,
2157 mManager->getOutputForAttr(&attr, &mOutput, AUDIO_SESSION_NONE, &mStream,
2158 createAttributionSourceState(testUid), &audioConfig,
2159 &outputFlags, &mSelectedDeviceId, &mPortId, {},
Andy Hung6b137d12024-08-27 22:35:17 +00002160 &mOutputType, &mIsSpatialized, &mIsBitPerfect, &mVolume));
jiabin24ff57a2023-11-27 21:06:51 +00002161 ASSERT_EQ(usbDevicePort.id, mSelectedDeviceId);
2162 outputDesc = mManager->getOutputs().valueFor(mOutput);
2163 ASSERT_NE(nullptr, outputDesc);
2164 ASSERT_NE(mmapDirectFlags, outputDesc->getFlags().output);
2165
2166 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
2167 AUDIO_DEVICE_OUT_USB_DEVICE, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
2168 usbAddress.c_str(), "", AUDIO_FORMAT_DEFAULT));
Jan Sebechlebsky370abec2023-06-15 10:18:30 +02002169}
2170
Jan Sebechlebsky697f5d92023-08-04 11:15:00 +02002171TEST_F(AudioPolicyManagerTestMMapPlaybackRerouting,
2172 MmapPlaybackStreamMatchingRenderDapMixNotSupportingMmapFails) {
2173 // Add render-only mix matching the test uid.
2174 const int testUid = 12345;
2175 // Per test_audio_policy_configuration.xml AUDIO_DEVICE_OUT_SPEAKER doesn't support mmap.
jiabin24ff57a2023-11-27 21:06:51 +00002176 ASSERT_EQ(NO_ERROR,
2177 addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2178 AUDIO_DEVICE_OUT_SPEAKER, /*mixAddress=*/"", audioConfig,
2179 {createUidCriterion(testUid)}));
Jan Sebechlebsky697f5d92023-08-04 11:15:00 +02002180
jiabin24ff57a2023-11-27 21:06:51 +00002181 // Getting output for matching uid should fail for mmaped stream, because
Jan Sebechlebsky697f5d92023-08-04 11:15:00 +02002182 // matched mix redirects to device which doesn't support mmap.
jiabin24ff57a2023-11-27 21:06:51 +00002183 audio_output_flags_t outputFlags =
2184 (audio_output_flags_t) (AUDIO_OUTPUT_FLAG_MMAP_NOIRQ | AUDIO_OUTPUT_FLAG_DIRECT);
Jan Sebechlebsky697f5d92023-08-04 11:15:00 +02002185 ASSERT_EQ(INVALID_OPERATION,
2186 mManager->getOutputForAttr(&attr, &mOutput, AUDIO_SESSION_NONE, &mStream,
2187 createAttributionSourceState(testUid), &audioConfig,
2188 &outputFlags, &mSelectedDeviceId, &mPortId, {},
Andy Hung6b137d12024-08-27 22:35:17 +00002189 &mOutputType, &mIsSpatialized, &mIsBitPerfect, &mVolume));
Jan Sebechlebsky697f5d92023-08-04 11:15:00 +02002190}
2191
Jan Sebechlebsky8e10cea2023-03-29 11:43:31 +02002192INSTANTIATE_TEST_SUITE_P(
2193 MmapPlaybackRerouting, AudioPolicyManagerTestMMapPlaybackRerouting,
2194 testing::Values(DPMmapTestParam(MIX_ROUTE_FLAG_LOOP_BACK, AUDIO_DEVICE_OUT_REMOTE_SUBMIX,
2195 /*deviceAddress=*/"remote_submix_media"),
2196 DPMmapTestParam(MIX_ROUTE_FLAG_LOOP_BACK_AND_RENDER,
2197 AUDIO_DEVICE_OUT_REMOTE_SUBMIX,
jiabin1ca6c6f2023-09-22 17:25:59 +00002198 /*deviceAddress=*/"remote_submix_media"),
2199 DPMmapTestParam(MIX_ROUTE_FLAG_RENDER, AUDIO_DEVICE_OUT_SPEAKER,
2200 /*deviceAddress=*/"")));
Jan Sebechlebsky8e10cea2023-03-29 11:43:31 +02002201
jiabinf4eb15a2019-08-28 15:31:47 -07002202class AudioPolicyManagerTestDPMixRecordInjection : public AudioPolicyManagerTestDynamicPolicy,
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02002203 public testing::WithParamInterface<DPTestParam> {
jiabinf4eb15a2019-08-28 15:31:47 -07002204protected:
2205 void SetUp() override;
2206 void TearDown() override;
2207
2208 std::unique_ptr<RecordingActivityTracker> mTracker;
jiabin19cdba52020-11-24 11:28:58 -08002209 struct audio_port_v7 mExtractionPort;
jiabinf4eb15a2019-08-28 15:31:47 -07002210 audio_port_handle_t mPortId = AUDIO_PORT_HANDLE_NONE;
2211};
2212
2213void AudioPolicyManagerTestDPMixRecordInjection::SetUp() {
Mikhail Naganovd4c21aa2021-10-05 15:10:16 -07002214 ASSERT_NO_FATAL_FAILURE(AudioPolicyManagerTestDynamicPolicy::SetUp());
jiabinf4eb15a2019-08-28 15:31:47 -07002215
2216 mTracker.reset(new RecordingActivityTracker());
2217
2218 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
2219 audioConfig.channel_mask = AUDIO_CHANNEL_IN_STEREO;
2220 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
Dean Wheatleyd082f472022-02-04 11:10:48 +11002221 audioConfig.sample_rate = k48000SamplingRate;
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02002222
2223 DPTestParam param = GetParam();
jiabinf4eb15a2019-08-28 15:31:47 -07002224 status_t ret = addPolicyMix(MIX_TYPE_RECORDERS, MIX_ROUTE_FLAG_LOOP_BACK,
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02002225 AUDIO_DEVICE_IN_REMOTE_SUBMIX, mMixAddress, audioConfig, param.mixCriteria);
jiabinf4eb15a2019-08-28 15:31:47 -07002226 ASSERT_EQ(NO_ERROR, ret);
2227
jiabin19cdba52020-11-24 11:28:58 -08002228 struct audio_port_v7 injectionPort;
Mikhail Naganovd0e2c742020-03-25 15:59:59 -07002229 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_REMOTE_SUBMIX,
2230 mMixAddress, &injectionPort));
jiabinf4eb15a2019-08-28 15:31:47 -07002231
2232 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
2233 audio_usage_t usage = AUDIO_USAGE_VIRTUAL_SOURCE;
Mikhail Naganov55773032020-10-01 15:08:13 -07002234 audio_attributes_t attr =
2235 {AUDIO_CONTENT_TYPE_UNKNOWN, usage, AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
jiabinf4eb15a2019-08-28 15:31:47 -07002236 std::string tags = std::string("addr=") + mMixAddress;
2237 strncpy(attr.tags, tags.c_str(), AUDIO_ATTRIBUTES_TAGS_MAX_SIZE - 1);
2238 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
Dean Wheatleyd082f472022-02-04 11:10:48 +11002239 k48000SamplingRate, AUDIO_OUTPUT_FLAG_NONE, nullptr /*output*/, &mPortId, attr);
jiabinf4eb15a2019-08-28 15:31:47 -07002240 ASSERT_EQ(NO_ERROR, mManager->startOutput(mPortId));
2241 ASSERT_EQ(injectionPort.id, getDeviceIdFromPatch(mClient->getLastAddedPatch()));
2242
Mikhail Naganovd0e2c742020-03-25 15:59:59 -07002243 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SOURCE, AUDIO_DEVICE_IN_REMOTE_SUBMIX,
2244 mMixAddress, &mExtractionPort));
jiabinf4eb15a2019-08-28 15:31:47 -07002245}
2246
2247void AudioPolicyManagerTestDPMixRecordInjection::TearDown() {
2248 mManager->stopOutput(mPortId);
2249 AudioPolicyManagerTestDynamicPolicy::TearDown();
2250}
2251
jiabinf4eb15a2019-08-28 15:31:47 -07002252TEST_P(AudioPolicyManagerTestDPMixRecordInjection, RecordingInjection) {
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02002253 const DPTestParam param = GetParam();
jiabinf4eb15a2019-08-28 15:31:47 -07002254
jiabin7c0205e2019-09-05 10:26:04 -07002255 audio_port_handle_t captureRoutedPortId = AUDIO_PORT_HANDLE_NONE;
jiabinf4eb15a2019-08-28 15:31:47 -07002256 audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
François Gaffie6ebbce02023-07-19 13:27:53 +02002257 audio_io_handle_t input = AUDIO_PORT_HANDLE_NONE;
2258 getInputForAttr(param.attributes, &input, param.session, mTracker->getRiid(),
2259 &captureRoutedPortId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO,
2260 k48000SamplingRate, AUDIO_INPUT_FLAG_NONE, &portId);
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02002261 if (param.expected_match) {
jiabinf4eb15a2019-08-28 15:31:47 -07002262 EXPECT_EQ(mExtractionPort.id, captureRoutedPortId);
2263 } else {
2264 EXPECT_NE(mExtractionPort.id, captureRoutedPortId);
2265 }
2266}
2267
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02002268const std::vector<AudioMixMatchCriterion> SOURCE_CAM_MIC_VOICE_CRITERIA = {
2269 createCapturePresetCriterion(AUDIO_SOURCE_CAMCORDER),
2270 createCapturePresetCriterion(AUDIO_SOURCE_MIC),
2271 createCapturePresetCriterion(AUDIO_SOURCE_VOICE_COMMUNICATION)
2272};
2273
jiabinf4eb15a2019-08-28 15:31:47 -07002274// No address priority rule for remote recording, address is a "don't care"
2275INSTANTIATE_TEST_CASE_P(
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02002276 RecordInjectionSource,
jiabinf4eb15a2019-08-28 15:31:47 -07002277 AudioPolicyManagerTestDPMixRecordInjection,
2278 testing::Values(
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02002279 DPTestParam(SOURCE_CAM_MIC_VOICE_CRITERIA, /*expected_match=*/ true)
2280 .withSource(AUDIO_SOURCE_CAMCORDER),
2281 DPTestParam(SOURCE_CAM_MIC_VOICE_CRITERIA, /*expected_match=*/ true)
2282 .withSource(AUDIO_SOURCE_CAMCORDER)
2283 .withTags("addr=remote_submix_media"),
2284 DPTestParam(SOURCE_CAM_MIC_VOICE_CRITERIA, /*expected_match=*/ true)
2285 .withSource(AUDIO_SOURCE_MIC),
2286 DPTestParam(SOURCE_CAM_MIC_VOICE_CRITERIA, /*expected_match=*/ true)
2287 .withSource(AUDIO_SOURCE_MIC)
2288 .withTags("addr=remote_submix_media"),
2289 DPTestParam(SOURCE_CAM_MIC_VOICE_CRITERIA, /*expected_match=*/ true)
2290 .withSource(AUDIO_SOURCE_VOICE_COMMUNICATION),
2291 DPTestParam(SOURCE_CAM_MIC_VOICE_CRITERIA, /*expected_match=*/ true)
2292 .withSource(AUDIO_SOURCE_VOICE_COMMUNICATION)
2293 .withTags("addr=remote_submix_media"),
2294 DPTestParam(SOURCE_CAM_MIC_VOICE_CRITERIA, /*expected_match=*/ false)
2295 .withSource(AUDIO_SOURCE_VOICE_RECOGNITION),
2296 DPTestParam(SOURCE_CAM_MIC_VOICE_CRITERIA, /*expected_match=*/ false)
2297 .withSource(AUDIO_SOURCE_VOICE_RECOGNITION)
2298 .withTags("addr=remote_submix_media"),
2299 DPTestParam(SOURCE_CAM_MIC_VOICE_CRITERIA, /*expected_match=*/ false)
2300 .withSource(AUDIO_SOURCE_HOTWORD),
2301 DPTestParam(SOURCE_CAM_MIC_VOICE_CRITERIA, /*expected_match=*/ false)
2302 .withSource(AUDIO_SOURCE_HOTWORD)
2303 .withTags("addr=remote_submix_media")));
jiabinf4eb15a2019-08-28 15:31:47 -07002304
jiabinf4eb15a2019-08-28 15:31:47 -07002305INSTANTIATE_TEST_CASE_P(
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02002306 RecordInjectionWithSessionId,
jiabinf4eb15a2019-08-28 15:31:47 -07002307 AudioPolicyManagerTestDPMixRecordInjection,
2308 testing::Values(
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02002309 // Mix is matched because the session id matches the one specified by the mix rule.
2310 DPTestParam(/*mixCriteria=*/ {createSessionIdCriterion(TEST_SESSION_ID)},
2311 /*expected_match=*/ true)
2312 .withSessionId(TEST_SESSION_ID),
2313 // Mix is not matched because the session id doesn't match the one specified
2314 // by the mix rule.
2315 DPTestParam(/*mixCriteria=*/ {createSessionIdCriterion(TEST_SESSION_ID)},
2316 /*expected_match=*/ false)
2317 .withSessionId(OTHER_SESSION_ID),
2318 // Mix is not matched, the session id doesn't match the one specified by rule,
2319 // but tand address specified in the tags is ignored for recorder mix.
2320 DPTestParam(/*mixCriteria=*/ {createSessionIdCriterion(TEST_SESSION_ID)},
2321 /*expected_match=*/ false)
2322 .withSessionId(OTHER_SESSION_ID).withTags("addr=remote_submix_media"),
2323 // Mix is matched, both the session id and the source match ones specified by mix rule
2324 DPTestParam(/*mixCriteria=*/ {createSessionIdCriterion(TEST_SESSION_ID),
2325 createCapturePresetCriterion(AUDIO_SOURCE_CAMCORDER)},
2326 /*expected_match=*/ true)
2327 .withSessionId(TEST_SESSION_ID).withSource(AUDIO_SOURCE_CAMCORDER),
2328 // Mix is not matched, the session id matches the one specified by mix rule,
2329 // but source does not.
2330 DPTestParam(/*mixCriteria=*/ {createSessionIdCriterion(TEST_SESSION_ID),
2331 createCapturePresetCriterion(AUDIO_SOURCE_CAMCORDER)},
2332 /*expected_match=*/ false)
2333 .withSessionId(TEST_SESSION_ID).withSource(AUDIO_SOURCE_MIC),
2334 // Mix is not matched, the source matches the one specified by mix rule,
2335 // but the session id is excluded.
2336 DPTestParam(/*mixCriteria=*/ {createSessionIdCriterion(TEST_SESSION_ID,
2337 /*exclude=*/ true),
2338 createCapturePresetCriterion(AUDIO_SOURCE_MIC)},
2339 /*expected_match=*/ false)
2340 .withSessionId(TEST_SESSION_ID).withSource(AUDIO_SOURCE_MIC)));
jiabin43848a52019-09-05 14:07:25 -07002341
2342using DeviceConnectionTestParams =
2343 std::tuple<audio_devices_t /*type*/, std::string /*name*/, std::string /*address*/>;
2344
2345class AudioPolicyManagerTestDeviceConnection : public AudioPolicyManagerTestWithConfigurationFile,
2346 public testing::WithParamInterface<DeviceConnectionTestParams> {
2347};
2348
2349TEST_F(AudioPolicyManagerTestDeviceConnection, InitSuccess) {
2350 // SetUp must finish with no assertions.
2351}
2352
2353TEST_F(AudioPolicyManagerTestDeviceConnection, Dump) {
2354 dumpToLog();
2355}
2356
Jean-Michel Trivi9a6b9ad2020-10-22 16:46:43 -07002357TEST_F(AudioPolicyManagerTestDeviceConnection, RoutingUpdate) {
2358 mClient->resetRoutingUpdatedCounter();
2359 // Connecting a valid output device with valid parameters should trigger a routing update
2360 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
2361 AUDIO_DEVICE_OUT_BLUETOOTH_SCO, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
Mikhail Naganovb1ddbb02023-03-15 17:06:59 -07002362 "00:11:22:33:44:55", "b", AUDIO_FORMAT_DEFAULT));
Jean-Michel Trivi9a6b9ad2020-10-22 16:46:43 -07002363 ASSERT_EQ(1, mClient->getRoutingUpdatedCounter());
2364
2365 // Disconnecting a connected device should succeed and trigger a routing update
2366 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
2367 AUDIO_DEVICE_OUT_BLUETOOTH_SCO, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
Mikhail Naganovb1ddbb02023-03-15 17:06:59 -07002368 "00:11:22:33:44:55", "b", AUDIO_FORMAT_DEFAULT));
Jean-Michel Trivi9a6b9ad2020-10-22 16:46:43 -07002369 ASSERT_EQ(2, mClient->getRoutingUpdatedCounter());
2370
2371 // Disconnecting a disconnected device should fail and not trigger a routing update
2372 ASSERT_EQ(INVALID_OPERATION, mManager->setDeviceConnectionState(
2373 AUDIO_DEVICE_OUT_BLUETOOTH_SCO, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
Mikhail Naganovb1ddbb02023-03-15 17:06:59 -07002374 "00:11:22:33:44:55", "b", AUDIO_FORMAT_DEFAULT));
Jean-Michel Trivi9a6b9ad2020-10-22 16:46:43 -07002375 ASSERT_EQ(2, mClient->getRoutingUpdatedCounter());
2376
2377 // Changing force use should trigger an update
2378 auto config = mManager->getForceUse(AUDIO_POLICY_FORCE_FOR_MEDIA);
2379 auto newConfig = config == AUDIO_POLICY_FORCE_BT_A2DP ?
2380 AUDIO_POLICY_FORCE_NONE : AUDIO_POLICY_FORCE_BT_A2DP;
2381 mManager->setForceUse(AUDIO_POLICY_FORCE_FOR_MEDIA, newConfig);
2382 ASSERT_EQ(3, mClient->getRoutingUpdatedCounter());
2383}
2384
jiabin43848a52019-09-05 14:07:25 -07002385TEST_P(AudioPolicyManagerTestDeviceConnection, SetDeviceConnectionState) {
2386 const audio_devices_t type = std::get<0>(GetParam());
2387 const std::string name = std::get<1>(GetParam());
2388 const std::string address = std::get<2>(GetParam());
2389
2390 if (type == AUDIO_DEVICE_OUT_HDMI) {
2391 // Set device connection state failed due to no device descriptor found
2392 // For HDMI case, it is easier to simulate device descriptor not found error
Mikhail Naganov83caee02021-10-05 15:52:01 -07002393 // by using an encoded format which isn't listed in the 'encodedFormats'
2394 // attribute for this devicePort.
jiabin43848a52019-09-05 14:07:25 -07002395 ASSERT_EQ(INVALID_OPERATION, mManager->setDeviceConnectionState(
2396 type, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
2397 address.c_str(), name.c_str(), AUDIO_FORMAT_MAT_2_1));
2398 }
2399 // Connect with valid parameters should succeed
2400 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
2401 type, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
2402 address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT));
2403 // Try to connect with the same device again should fail
2404 ASSERT_EQ(INVALID_OPERATION, mManager->setDeviceConnectionState(
2405 type, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
2406 address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT));
2407 // Disconnect the connected device should succeed
2408 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
2409 type, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
2410 address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT));
2411 // Disconnect device that is not connected should fail
2412 ASSERT_EQ(INVALID_OPERATION, mManager->setDeviceConnectionState(
2413 type, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
2414 address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT));
2415 // Try to set device connection state with a invalid connection state should fail
2416 ASSERT_EQ(BAD_VALUE, mManager->setDeviceConnectionState(
2417 type, AUDIO_POLICY_DEVICE_STATE_CNT,
2418 "", "", AUDIO_FORMAT_DEFAULT));
2419}
2420
2421TEST_P(AudioPolicyManagerTestDeviceConnection, ExplicitlyRoutingAfterConnection) {
2422 const audio_devices_t type = std::get<0>(GetParam());
2423 const std::string name = std::get<1>(GetParam());
2424 const std::string address = std::get<2>(GetParam());
2425
2426 // Connect device to do explicitly routing test
2427 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
2428 type, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
2429 address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT));
2430
jiabin19cdba52020-11-24 11:28:58 -08002431 audio_port_v7 devicePort;
jiabin43848a52019-09-05 14:07:25 -07002432 const audio_port_role_t role = audio_is_output_device(type)
2433 ? AUDIO_PORT_ROLE_SINK : AUDIO_PORT_ROLE_SOURCE;
Mikhail Naganovd0e2c742020-03-25 15:59:59 -07002434 ASSERT_TRUE(findDevicePort(role, type, address, &devicePort));
jiabin43848a52019-09-05 14:07:25 -07002435
2436 audio_port_handle_t routedPortId = devicePort.id;
jiabin43848a52019-09-05 14:07:25 -07002437 // Try start input or output according to the device type
2438 if (audio_is_output_devices(type)) {
2439 getOutputForAttr(&routedPortId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
Dean Wheatleyd082f472022-02-04 11:10:48 +11002440 k48000SamplingRate, AUDIO_OUTPUT_FLAG_NONE);
jiabin43848a52019-09-05 14:07:25 -07002441 } else if (audio_is_input_device(type)) {
2442 RecordingActivityTracker tracker;
François Gaffie6ebbce02023-07-19 13:27:53 +02002443 audio_io_handle_t input = AUDIO_PORT_HANDLE_NONE;
2444 getInputForAttr({}, &input, AUDIO_SESSION_NONE, tracker.getRiid(), &routedPortId,
2445 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO, k48000SamplingRate,
2446 AUDIO_INPUT_FLAG_NONE);
jiabin43848a52019-09-05 14:07:25 -07002447 }
2448 ASSERT_EQ(devicePort.id, routedPortId);
2449
2450 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
2451 type, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
2452 address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT));
2453}
2454
Mikhail Naganovddc5f312022-06-11 00:47:52 +00002455android::media::audio::common::ExtraAudioDescriptor make_ExtraAudioDescriptor(
2456 android::media::audio::common::AudioStandard audioStandard,
2457 android::media::audio::common::AudioEncapsulationType audioEncapsulationType) {
2458 android::media::audio::common::ExtraAudioDescriptor result;
2459 result.standard = audioStandard;
2460 result.audioDescriptor = {0xb4, 0xaf, 0x98, 0x1a};
2461 result.encapsulationType = audioEncapsulationType;
2462 return result;
2463}
2464
2465TEST_P(AudioPolicyManagerTestDeviceConnection, PassingExtraAudioDescriptors) {
2466 const audio_devices_t type = std::get<0>(GetParam());
2467 if (!audio_device_is_digital(type)) {
2468 // EADs are used only for HDMI devices.
2469 GTEST_SKIP() << "Not a digital device type: " << audio_device_to_string(type);
2470 }
2471 const std::string name = std::get<1>(GetParam());
2472 const std::string address = std::get<2>(GetParam());
Atneya Nair638a6e42022-12-18 16:45:15 -08002473 android::media::AudioPortFw audioPort;
Mikhail Naganovddc5f312022-06-11 00:47:52 +00002474 ASSERT_EQ(NO_ERROR,
2475 mManager->deviceToAudioPort(type, address.c_str(), name.c_str(), &audioPort));
2476 android::media::audio::common::AudioPort& port = audioPort.hal;
2477 port.extraAudioDescriptors.push_back(make_ExtraAudioDescriptor(
2478 android::media::audio::common::AudioStandard::EDID,
2479 android::media::audio::common::AudioEncapsulationType::IEC61937));
2480 const size_t lastConnectedDevicePortCount = mClient->getConnectedDevicePortCount();
2481 const size_t lastDisconnectedDevicePortCount = mClient->getDisconnectedDevicePortCount();
2482 EXPECT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
2483 AUDIO_POLICY_DEVICE_STATE_AVAILABLE, port, AUDIO_FORMAT_DEFAULT));
2484 EXPECT_EQ(lastConnectedDevicePortCount + 1, mClient->getConnectedDevicePortCount());
2485 EXPECT_EQ(lastDisconnectedDevicePortCount, mClient->getDisconnectedDevicePortCount());
2486 const audio_port_v7* devicePort = mClient->getLastConnectedDevicePort();
2487 EXPECT_EQ(port.extraAudioDescriptors.size(), devicePort->num_extra_audio_descriptors);
2488 EXPECT_EQ(AUDIO_STANDARD_EDID, devicePort->extra_audio_descriptors[0].standard);
2489 EXPECT_EQ(AUDIO_ENCAPSULATION_TYPE_IEC61937,
2490 devicePort->extra_audio_descriptors[0].encapsulation_type);
2491 EXPECT_NE(0, devicePort->extra_audio_descriptors[0].descriptor[0]);
2492}
2493
jiabin43848a52019-09-05 14:07:25 -07002494INSTANTIATE_TEST_CASE_P(
2495 DeviceConnectionState,
2496 AudioPolicyManagerTestDeviceConnection,
2497 testing::Values(
2498 DeviceConnectionTestParams({AUDIO_DEVICE_IN_HDMI, "test_in_hdmi",
2499 "audio_policy_test_in_hdmi"}),
2500 DeviceConnectionTestParams({AUDIO_DEVICE_OUT_HDMI, "test_out_hdmi",
2501 "audio_policy_test_out_hdmi"}),
2502 DeviceConnectionTestParams({AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, "bt_hfp_in",
Mikhail Naganovb1ddbb02023-03-15 17:06:59 -07002503 "00:11:22:33:44:55"}),
jiabin43848a52019-09-05 14:07:25 -07002504 DeviceConnectionTestParams({AUDIO_DEVICE_OUT_BLUETOOTH_SCO, "bt_hfp_out",
Mikhail Naganovb1ddbb02023-03-15 17:06:59 -07002505 "00:11:22:33:44:55"})
jiabin43848a52019-09-05 14:07:25 -07002506 )
2507 );
Mikhail Naganov0756bbf2019-09-06 13:53:26 -07002508
Mikhail Naganovf88c2f32024-04-16 15:01:13 -07002509namespace {
2510
2511class AudioPolicyManagerTestClientOpenFails : public AudioPolicyManagerTestClient {
2512 public:
2513 status_t openOutput(audio_module_handle_t module,
2514 audio_io_handle_t *output,
2515 audio_config_t * halConfig,
2516 audio_config_base_t * mixerConfig,
2517 const sp<DeviceDescriptorBase>& device,
2518 uint32_t * latencyMs,
Haofan Wangf6e304f2024-07-09 23:06:58 -07002519 audio_output_flags_t flags,
2520 audio_attributes_t attributes) override {
Mikhail Naganovf88c2f32024-04-16 15:01:13 -07002521 return mSimulateFailure ? BAD_VALUE :
2522 AudioPolicyManagerTestClient::openOutput(
Haofan Wangf6e304f2024-07-09 23:06:58 -07002523 module, output, halConfig, mixerConfig, device, latencyMs, flags,
2524 attributes);
Mikhail Naganovf88c2f32024-04-16 15:01:13 -07002525 }
2526
2527 status_t openInput(audio_module_handle_t module,
2528 audio_io_handle_t *input,
2529 audio_config_t * config,
2530 audio_devices_t * device,
2531 const String8 & address,
2532 audio_source_t source,
2533 audio_input_flags_t flags) override {
2534 return mSimulateFailure ? BAD_VALUE :
2535 AudioPolicyManagerTestClient::openInput(
2536 module, input, config, device, address, source, flags);
2537 }
2538
2539 void setSimulateFailure(bool simulateFailure) { mSimulateFailure = simulateFailure; }
2540
2541 private:
2542 bool mSimulateFailure = false;
2543};
2544
2545} // namespace
2546
2547using DeviceConnectionWithFormatTestParams =
2548 std::tuple<audio_devices_t /*type*/, std::string /*name*/, std::string /*address*/,
2549 audio_format_t /*format*/>;
2550
2551class AudioPolicyManagerTestDeviceConnectionFailed :
2552 public AudioPolicyManagerTestWithConfigurationFile,
2553 public testing::WithParamInterface<DeviceConnectionWithFormatTestParams> {
2554 protected:
2555 std::string getConfigFile() override { return sBluetoothConfig; }
2556 AudioPolicyManagerTestClient* getClient() override {
2557 mFullClient = new AudioPolicyManagerTestClientOpenFails;
2558 return mFullClient;
2559 }
2560 void setSimulateOpenFailure(bool simulateFailure) {
2561 mFullClient->setSimulateFailure(simulateFailure); }
2562
2563 static const std::string sBluetoothConfig;
2564
2565 private:
2566 AudioPolicyManagerTestClientOpenFails* mFullClient;
2567};
2568
2569const std::string AudioPolicyManagerTestDeviceConnectionFailed::sBluetoothConfig =
2570 AudioPolicyManagerTestDeviceConnectionFailed::sExecutableDir +
2571 "test_audio_policy_configuration_bluetooth.xml";
2572
2573TEST_P(AudioPolicyManagerTestDeviceConnectionFailed, SetDeviceConnectedStateHasAddress) {
2574 const audio_devices_t type = std::get<0>(GetParam());
2575 const std::string name = std::get<1>(GetParam());
2576 const std::string address = std::get<2>(GetParam());
2577 const audio_format_t format = std::get<3>(GetParam());
2578
2579 EXPECT_EQ(0, mClient->getConnectedDevicePortCount());
2580 EXPECT_EQ(0, mClient->getDisconnectedDevicePortCount());
2581
2582 setSimulateOpenFailure(true);
2583 ASSERT_EQ(INVALID_OPERATION, mManager->setDeviceConnectionState(
2584 type, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
2585 address.c_str(), name.c_str(), format));
2586
2587 // Since the failure happens when opening input/output, the device must be connected
2588 // first and then disconnected.
2589 EXPECT_EQ(1, mClient->getConnectedDevicePortCount());
2590 EXPECT_EQ(1, mClient->getDisconnectedDevicePortCount());
2591
2592 if (mClient->getConnectedDevicePortCount() > 0) {
2593 auto port = mClient->getLastConnectedDevicePort();
2594 EXPECT_EQ(type, port->ext.device.type);
2595 EXPECT_EQ(0, strncmp(port->ext.device.address, address.c_str(),
2596 AUDIO_DEVICE_MAX_ADDRESS_LEN)) << "\"" << port->ext.device.address << "\"";
2597 }
2598 if (mClient->getDisconnectedDevicePortCount() > 0) {
2599 auto port = mClient->getLastDisconnectedDevicePort();
2600 EXPECT_EQ(type, port->ext.device.type);
2601 EXPECT_EQ(0, strncmp(port->ext.device.address, address.c_str(),
2602 AUDIO_DEVICE_MAX_ADDRESS_LEN)) << "\"" << port->ext.device.address << "\"";
2603 }
2604}
2605
2606INSTANTIATE_TEST_CASE_P(
2607 DeviceConnectionFailure,
2608 AudioPolicyManagerTestDeviceConnectionFailed,
2609 testing::Values(
2610 DeviceConnectionWithFormatTestParams({AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET,
2611 "bt_hfp_in", "00:11:22:33:44:55", AUDIO_FORMAT_DEFAULT}),
2612 DeviceConnectionWithFormatTestParams({AUDIO_DEVICE_OUT_BLUETOOTH_SCO,
2613 "bt_hfp_out", "00:11:22:33:44:55", AUDIO_FORMAT_DEFAULT}),
2614 DeviceConnectionWithFormatTestParams({AUDIO_DEVICE_OUT_BLUETOOTH_A2DP,
2615 "bt_a2dp_out", "00:11:22:33:44:55", AUDIO_FORMAT_DEFAULT}),
2616 DeviceConnectionWithFormatTestParams({AUDIO_DEVICE_OUT_BLUETOOTH_A2DP,
2617 "bt_a2dp_out", "00:11:22:33:44:66", AUDIO_FORMAT_LDAC})
2618 )
2619 );
2620
Dean Wheatleyd082f472022-02-04 11:10:48 +11002621class AudioPolicyManagerCarTest : public AudioPolicyManagerTestDynamicPolicy {
2622protected:
2623 std::string getConfigFile() override { return sCarConfig; }
2624
2625 static const std::string sCarConfig;
Oscar Azucena873d10f2023-01-12 18:34:42 -08002626 static const std::string sCarBusMediaOutput;
2627 static const std::string sCarBusNavigationOutput;
Oscar Azucena4f49ef62023-01-25 23:32:13 -08002628 static const std::string sCarRearZoneOneOutput;
2629 static const std::string sCarRearZoneTwoOutput;
jiabin24ff57a2023-11-27 21:06:51 +00002630 static const std::string sCarBusMmapOutput;
Dean Wheatleyd082f472022-02-04 11:10:48 +11002631};
2632
2633const std::string AudioPolicyManagerCarTest::sCarConfig =
2634 AudioPolicyManagerCarTest::sExecutableDir + "test_car_ap_atmos_offload_configuration.xml";
2635
Oscar Azucena873d10f2023-01-12 18:34:42 -08002636const std::string AudioPolicyManagerCarTest::sCarBusMediaOutput = "bus0_media_out";
2637
2638const std::string AudioPolicyManagerCarTest::sCarBusNavigationOutput = "bus1_navigation_out";
2639
Oscar Azucena4f49ef62023-01-25 23:32:13 -08002640const std::string AudioPolicyManagerCarTest::sCarRearZoneOneOutput = "bus100_audio_zone_1";
2641
2642const std::string AudioPolicyManagerCarTest::sCarRearZoneTwoOutput = "bus200_audio_zone_2";
2643
jiabin24ff57a2023-11-27 21:06:51 +00002644const std::string AudioPolicyManagerCarTest::sCarBusMmapOutput = "bus8_mmap_out";
2645
Dean Wheatleyd082f472022-02-04 11:10:48 +11002646TEST_F(AudioPolicyManagerCarTest, InitSuccess) {
2647 // SetUp must finish with no assertions.
2648}
2649
2650TEST_F(AudioPolicyManagerCarTest, Dump) {
2651 dumpToLog();
2652}
2653
Dean Wheatleyecbf2ee2022-03-04 10:51:36 +11002654TEST_F(AudioPolicyManagerCarTest, GetOutputForAttrAtmosOutputAfterRegisteringPolicyMix) {
Dean Wheatleyd082f472022-02-04 11:10:48 +11002655 status_t ret;
2656 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
Dean Wheatleyd082f472022-02-04 11:10:48 +11002657 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
Oscar Azucena873d10f2023-01-12 18:34:42 -08002658 AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput, audioConfig);
Dean Wheatleyd082f472022-02-04 11:10:48 +11002659 ASSERT_EQ(NO_ERROR, ret);
2660
2661 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
2662 audio_io_handle_t output;
2663 audio_port_handle_t portId;
2664 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_E_AC3_JOC, AUDIO_CHANNEL_OUT_5POINT1,
2665 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, &output, &portId);
2666 ASSERT_NE(AUDIO_PORT_HANDLE_NONE, selectedDeviceId);
2667 sp<SwAudioOutputDescriptor> outDesc = mManager->getOutputs().valueFor(output);
2668 ASSERT_NE(nullptr, outDesc.get());
2669 ASSERT_EQ(AUDIO_FORMAT_E_AC3_JOC, outDesc->getFormat());
2670 ASSERT_EQ(AUDIO_CHANNEL_OUT_5POINT1, outDesc->getChannelMask());
2671 ASSERT_EQ(k48000SamplingRate, outDesc->getSamplingRate());
Dean Wheatleyecbf2ee2022-03-04 10:51:36 +11002672
2673 selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
2674 output = AUDIO_IO_HANDLE_NONE;
2675 portId = AUDIO_PORT_HANDLE_NONE;
2676 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_7POINT1POINT4,
2677 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, &output, &portId);
2678 ASSERT_NE(AUDIO_PORT_HANDLE_NONE, selectedDeviceId);
2679 outDesc = mManager->getOutputs().valueFor(output);
2680 ASSERT_NE(nullptr, outDesc.get());
2681 ASSERT_EQ(AUDIO_FORMAT_PCM_16_BIT, outDesc->getFormat());
2682 ASSERT_EQ(AUDIO_CHANNEL_OUT_7POINT1POINT4, outDesc->getChannelMask());
2683 ASSERT_EQ(k48000SamplingRate, outDesc->getSamplingRate());
Dean Wheatleyd082f472022-02-04 11:10:48 +11002684}
2685
Oscar Azucena873d10f2023-01-12 18:34:42 -08002686TEST_F(AudioPolicyManagerCarTest, GetOutputForAttrAfterRegisteringPolicyMix) {
2687 status_t ret;
2688 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
2689 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
2690 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
2691 audioConfig.sample_rate = k48000SamplingRate;
2692 std::vector<AudioMixMatchCriterion> mediaMatchCriteria = {
2693 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/ false)};
2694 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2695 AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput, audioConfig, mediaMatchCriteria);
2696 ASSERT_EQ(NO_ERROR, ret);
2697 std::vector<AudioMixMatchCriterion> navMatchCriteria = {
2698 createUsageCriterion(AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
2699 /*exclude=*/ false)};
2700 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2701 AUDIO_DEVICE_OUT_BUS, sCarBusNavigationOutput, audioConfig, navMatchCriteria);
2702 ASSERT_EQ(NO_ERROR, ret);
2703 audio_port_v7 mediaDevicePort;
2704 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_BUS,
2705 sCarBusMediaOutput, &mediaDevicePort));
2706 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
2707 audio_io_handle_t output;
2708 audio_port_handle_t portId;
2709 const audio_attributes_t mediaAttribute = {
2710 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_MEDIA,
2711 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
2712
2713 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
2714 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, &output, &portId, mediaAttribute);
2715
2716 ASSERT_EQ(mediaDevicePort.id, selectedDeviceId);
2717}
2718
2719TEST_F(AudioPolicyManagerCarTest, GetOutputForAttrWithSelectedOutputAfterRegisteringPolicyMix) {
2720 status_t ret;
2721 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
2722 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
2723 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
2724 audioConfig.sample_rate = k48000SamplingRate;
2725 std::vector<AudioMixMatchCriterion> mediaMatchCriteria = {
2726 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/ false)};
2727 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2728 AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput, audioConfig, mediaMatchCriteria);
2729 ASSERT_EQ(NO_ERROR, ret);
2730 std::vector<AudioMixMatchCriterion> navMatchCriteria = {
2731 createUsageCriterion(AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
2732 /*exclude=*/ false)};
2733 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2734 AUDIO_DEVICE_OUT_BUS, sCarBusNavigationOutput, audioConfig, navMatchCriteria);
2735 ASSERT_EQ(NO_ERROR, ret);
2736 audio_port_v7 navDevicePort;
2737 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_BUS,
2738 sCarBusNavigationOutput, &navDevicePort));
2739 audio_port_handle_t selectedDeviceId = navDevicePort.id;
2740 audio_io_handle_t output;
2741 audio_port_handle_t portId;
2742 const audio_attributes_t mediaAttribute = {
2743 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_MEDIA,
2744 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
2745
2746 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
2747 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, &output, &portId, mediaAttribute);
2748
2749 ASSERT_EQ(navDevicePort.id, selectedDeviceId);
2750}
2751
2752TEST_F(AudioPolicyManagerCarTest, GetOutputForAttrWithSelectedOutputAfterUserAffinities) {
2753 status_t ret;
2754 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
2755 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
2756 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
2757 audioConfig.sample_rate = k48000SamplingRate;
2758 std::vector<AudioMixMatchCriterion> mediaMatchCriteria = {
2759 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/ false)};
2760 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2761 AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput, audioConfig, mediaMatchCriteria);
2762 ASSERT_EQ(NO_ERROR, ret);
2763 std::vector<AudioMixMatchCriterion> navMatchCriteria = {
2764 createUsageCriterion(AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
2765 /*exclude=*/ false)};
2766 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2767 AUDIO_DEVICE_OUT_BUS, sCarBusNavigationOutput, audioConfig, navMatchCriteria);
2768 ASSERT_EQ(NO_ERROR, ret);
2769 const AudioDeviceTypeAddr mediaOutputDevice(AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput);
2770 const AudioDeviceTypeAddrVector outputDevices = {mediaOutputDevice};
Oscar Azucena4f49ef62023-01-25 23:32:13 -08002771 mManager->setUserIdDeviceAffinities(/* userId */ 0, outputDevices);
Oscar Azucena873d10f2023-01-12 18:34:42 -08002772 audio_port_v7 navDevicePort;
2773 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_BUS,
2774 sCarBusNavigationOutput, &navDevicePort));
2775 audio_port_handle_t selectedDeviceId = navDevicePort.id;
2776 audio_io_handle_t output;
2777 audio_port_handle_t portId;
2778 const audio_attributes_t mediaAttribute = {
2779 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_MEDIA,
2780 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
2781
2782 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
2783 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, &output, &portId, mediaAttribute);
2784
2785 ASSERT_NE(navDevicePort.id, selectedDeviceId);
2786}
2787
2788TEST_F(AudioPolicyManagerCarTest, GetOutputForAttrWithExcludeUserIdCriteria) {
2789 status_t ret;
2790 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
2791 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
2792 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
2793 audioConfig.sample_rate = k48000SamplingRate;
2794 std::vector<AudioMixMatchCriterion> mediaMatchCriteria = {
2795 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/ false)};
2796 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2797 AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput, audioConfig, mediaMatchCriteria);
2798 ASSERT_EQ(NO_ERROR, ret);
2799 std::vector<AudioMixMatchCriterion> navMatchCriteria = {
2800 createUsageCriterion(AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
2801 /*exclude=*/ false),
2802 createUserIdCriterion(/* userId */ 0, /* exclude */ true)};
2803 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2804 AUDIO_DEVICE_OUT_BUS, sCarBusNavigationOutput, audioConfig, navMatchCriteria);
2805 ASSERT_EQ(NO_ERROR, ret);
2806 audio_port_v7 navDevicePort;
2807 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_BUS,
2808 sCarBusNavigationOutput, &navDevicePort));
2809 audio_io_handle_t output;
2810 audio_port_handle_t portId;
2811 const audio_attributes_t navigationAttribute = {
2812 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
2813 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
2814 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
2815
2816 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
2817 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, &output, &portId, navigationAttribute);
2818
2819 ASSERT_NE(navDevicePort.id, selectedDeviceId);
2820}
2821
2822TEST_F(AudioPolicyManagerCarTest, GetOutputForAttrWithSelectedOutputExcludeUserIdCriteria) {
2823 status_t ret;
2824 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
2825 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
2826 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
2827 audioConfig.sample_rate = k48000SamplingRate;
2828 std::vector<AudioMixMatchCriterion> mediaMatchCriteria = {
2829 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/ false)};
2830 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2831 AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput, audioConfig, mediaMatchCriteria);
2832 ASSERT_EQ(NO_ERROR, ret);
2833 std::vector<AudioMixMatchCriterion> navMatchCriteria = {
2834 createUsageCriterion(AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
2835 /*exclude=*/ false),
2836 createUserIdCriterion(0 /* userId */, /* exclude */ true)};
2837 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2838 AUDIO_DEVICE_OUT_BUS, sCarBusNavigationOutput, audioConfig, navMatchCriteria);
2839 ASSERT_EQ(NO_ERROR, ret);
2840 audio_port_v7 navDevicePort;
2841 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_BUS,
2842 sCarBusNavigationOutput, &navDevicePort));
2843 audio_port_handle_t selectedDeviceId = navDevicePort.id;
2844 audio_io_handle_t output;
2845 audio_port_handle_t portId;
2846 const audio_attributes_t mediaAttribute = {
2847 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_MEDIA,
2848 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
2849
2850 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
2851 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, &output, &portId, mediaAttribute);
2852
2853 ASSERT_EQ(navDevicePort.id, selectedDeviceId);
2854}
2855
2856TEST_F(AudioPolicyManagerCarTest,
2857 GetOutputForAttrWithMatchingMixAndSelectedOutputAfterUserAffinities) {
2858 status_t ret;
2859 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
2860 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
2861 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
2862 audioConfig.sample_rate = k48000SamplingRate;
2863 std::vector<AudioMixMatchCriterion> mediaMatchCriteria = {
2864 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/ false)};
2865 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2866 AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput, audioConfig, mediaMatchCriteria);
2867 ASSERT_EQ(NO_ERROR, ret);
2868 std::vector<AudioMixMatchCriterion> navMatchCriteria = {
2869 createUsageCriterion(AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
2870 /*exclude=*/ false)};
2871 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2872 AUDIO_DEVICE_OUT_BUS, sCarBusNavigationOutput, audioConfig, navMatchCriteria);
2873 ASSERT_EQ(NO_ERROR, ret);
2874 const AudioDeviceTypeAddr mediaOutputDevice(AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput);
2875 const AudioDeviceTypeAddr navOutputDevice(AUDIO_DEVICE_OUT_BUS, sCarBusNavigationOutput);
2876 const AudioDeviceTypeAddrVector outputDevices = {mediaOutputDevice, navOutputDevice};
Oscar Azucena4f49ef62023-01-25 23:32:13 -08002877 mManager->setUserIdDeviceAffinities(/* userId */ 0, outputDevices);
Oscar Azucena873d10f2023-01-12 18:34:42 -08002878 audio_port_v7 navDevicePort;
2879 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_BUS,
2880 sCarBusNavigationOutput, &navDevicePort));
2881 audio_port_handle_t selectedDeviceId = navDevicePort.id;
2882 audio_io_handle_t output;
2883 audio_port_handle_t portId;
2884 const audio_attributes_t mediaAttribute = {
2885 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_MEDIA,
2886 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
2887
2888 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
2889 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, &output, &portId, mediaAttribute);
2890
2891 ASSERT_EQ(navDevicePort.id, selectedDeviceId);
2892}
2893
2894TEST_F(AudioPolicyManagerCarTest,
2895 GetOutputForAttrWithNoMatchingMaxAndSelectedOutputAfterUserAffinities) {
2896 status_t ret;
2897 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
2898 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
2899 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
2900 audioConfig.sample_rate = k48000SamplingRate;
2901 std::vector<AudioMixMatchCriterion> mediaMatchCriteria = {
2902 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/ false)};
2903 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2904 AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput, audioConfig, mediaMatchCriteria);
2905 ASSERT_EQ(NO_ERROR, ret);
2906 std::vector<AudioMixMatchCriterion> navMatchCriteria = {
2907 createUsageCriterion(AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
2908 /*exclude=*/ false)};
2909 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2910 AUDIO_DEVICE_OUT_BUS, sCarBusNavigationOutput, audioConfig, navMatchCriteria);
2911 ASSERT_EQ(NO_ERROR, ret);
2912 const AudioDeviceTypeAddr mediaOutputDevice(AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput);
2913 const AudioDeviceTypeAddr navOutputDevice(AUDIO_DEVICE_OUT_BUS, sCarBusNavigationOutput);
2914 const AudioDeviceTypeAddrVector outputDevices = {mediaOutputDevice, navOutputDevice};
Oscar Azucena4f49ef62023-01-25 23:32:13 -08002915 mManager->setUserIdDeviceAffinities(/* userId */ 0, outputDevices);
Oscar Azucena873d10f2023-01-12 18:34:42 -08002916 audio_port_v7 navDevicePort;
2917 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_BUS,
2918 sCarBusNavigationOutput, &navDevicePort));
2919 audio_port_handle_t selectedDeviceId = navDevicePort.id;
2920 audio_io_handle_t output;
2921 audio_port_handle_t portId;
2922 const audio_attributes_t alarmAttribute = {
2923 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_ALARM,
2924 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
2925
2926 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
2927 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, &output, &portId, alarmAttribute);
2928
2929 ASSERT_EQ(navDevicePort.id, selectedDeviceId);
2930}
2931
Oscar Azucena4f49ef62023-01-25 23:32:13 -08002932TEST_F(AudioPolicyManagerCarTest,
2933 GetOutputForAttrWithMatMixAfterUserAffinitiesForOneUser) {
2934 status_t ret;
2935 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
2936 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
2937 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
2938 audioConfig.sample_rate = k48000SamplingRate;
2939 std::vector<AudioMixMatchCriterion> mediaMatchCriteria = {
2940 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/ false)};
2941 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2942 AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput, audioConfig, mediaMatchCriteria);
2943 ASSERT_EQ(NO_ERROR, ret);
2944 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2945 AUDIO_DEVICE_OUT_BUS, sCarRearZoneOneOutput, audioConfig, mediaMatchCriteria);
2946 ASSERT_EQ(NO_ERROR, ret);
2947 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2948 AUDIO_DEVICE_OUT_BUS, sCarRearZoneTwoOutput, audioConfig, mediaMatchCriteria);
2949 ASSERT_EQ(NO_ERROR, ret);
2950 const AudioDeviceTypeAddr mediaOutputDevice(AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput);
2951 const AudioDeviceTypeAddrVector primaryZoneDevices = {mediaOutputDevice};
2952 mManager->setUserIdDeviceAffinities(/* userId */ 0, primaryZoneDevices);
2953 audio_port_v7 primaryZoneDevicePort;
2954 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_BUS,
2955 sCarBusMediaOutput, &primaryZoneDevicePort));
2956 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
2957 audio_io_handle_t output;
2958 audio_port_handle_t portId;
2959 const audio_attributes_t mediaAttribute = {
2960 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_MEDIA,
2961 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
2962 uid_t user11AppUid = multiuser_get_uid(/* user_id */ 11, /* app_id */ 12345);
2963
2964 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
2965 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, &output, &portId, mediaAttribute,
2966 AUDIO_SESSION_NONE, user11AppUid);
2967
2968 ASSERT_EQ(primaryZoneDevicePort.id, selectedDeviceId);
2969}
2970
2971TEST_F(AudioPolicyManagerCarTest,
2972 GetOutputForAttrWithMatMixAfterUserAffinitiesForTwoUsers) {
2973 status_t ret;
2974 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
2975 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
2976 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
2977 audioConfig.sample_rate = k48000SamplingRate;
2978 std::vector<AudioMixMatchCriterion> mediaMatchCriteria = {
2979 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/ false)};
2980 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2981 AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput, audioConfig, mediaMatchCriteria);
2982 ASSERT_EQ(NO_ERROR, ret);
2983 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2984 AUDIO_DEVICE_OUT_BUS, sCarRearZoneOneOutput, audioConfig, mediaMatchCriteria);
2985 ASSERT_EQ(NO_ERROR, ret);
2986 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2987 AUDIO_DEVICE_OUT_BUS, sCarRearZoneTwoOutput, audioConfig, mediaMatchCriteria);
2988 ASSERT_EQ(NO_ERROR, ret);
2989 const AudioDeviceTypeAddr mediaOutputDevice(AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput);
2990 const AudioDeviceTypeAddrVector primaryZoneDevices = {mediaOutputDevice};
2991 mManager->setUserIdDeviceAffinities(/* userId */ 0, primaryZoneDevices);
2992 const AudioDeviceTypeAddr secondaryOutputDevice(AUDIO_DEVICE_OUT_BUS, sCarRearZoneOneOutput);
2993 const AudioDeviceTypeAddrVector secondaryZoneDevices = {secondaryOutputDevice};
2994 mManager->setUserIdDeviceAffinities(/* userId */ 11, secondaryZoneDevices);
2995 audio_port_v7 secondaryZoneDevicePort;
2996 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_BUS,
2997 sCarRearZoneOneOutput, &secondaryZoneDevicePort));
2998 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
2999 audio_io_handle_t output;
3000 audio_port_handle_t portId;
3001 const audio_attributes_t mediaAttribute = {
3002 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_MEDIA,
3003 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
3004 uid_t user11AppUid = multiuser_get_uid(/* user_id */ 11, /* app_id */ 12345);
3005
3006 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
3007 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, &output, &portId, mediaAttribute,
3008 AUDIO_SESSION_NONE, user11AppUid);
3009
3010 ASSERT_EQ(secondaryZoneDevicePort.id, selectedDeviceId);
3011}
3012
3013TEST_F(AudioPolicyManagerCarTest,
3014 GetOutputForAttrWithMatMixAfterUserAffinitiesForThreeUsers) {
3015 status_t ret;
3016 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
3017 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
3018 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
3019 audioConfig.sample_rate = k48000SamplingRate;
3020 std::vector<AudioMixMatchCriterion> mediaMatchCriteria = {
3021 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/ false)};
3022 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
3023 AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput, audioConfig, mediaMatchCriteria);
3024 ASSERT_EQ(NO_ERROR, ret);
3025 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
3026 AUDIO_DEVICE_OUT_BUS, sCarRearZoneOneOutput, audioConfig, mediaMatchCriteria);
3027 ASSERT_EQ(NO_ERROR, ret);
3028 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
3029 AUDIO_DEVICE_OUT_BUS, sCarRearZoneTwoOutput, audioConfig, mediaMatchCriteria);
3030 ASSERT_EQ(NO_ERROR, ret);
3031 const AudioDeviceTypeAddr mediaOutputDevice(AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput);
3032 const AudioDeviceTypeAddrVector primaryZoneDevices = {mediaOutputDevice};
3033 mManager->setUserIdDeviceAffinities(/* userId */ 0, primaryZoneDevices);
3034 const AudioDeviceTypeAddr secondaryOutputDevice(AUDIO_DEVICE_OUT_BUS, sCarRearZoneOneOutput);
3035 const AudioDeviceTypeAddrVector secondaryZoneDevices = {secondaryOutputDevice};
3036 mManager->setUserIdDeviceAffinities(/* userId */ 11, secondaryZoneDevices);
3037 const AudioDeviceTypeAddr tertiaryOutputDevice(AUDIO_DEVICE_OUT_BUS, sCarRearZoneTwoOutput);
3038 const AudioDeviceTypeAddrVector tertiaryZoneDevices = {tertiaryOutputDevice};
3039 mManager->setUserIdDeviceAffinities(/* userId */ 15, tertiaryZoneDevices);
3040 audio_port_v7 tertiaryZoneDevicePort;
3041 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_BUS,
3042 sCarRearZoneTwoOutput, &tertiaryZoneDevicePort));
3043 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
3044 audio_io_handle_t output;
3045 audio_port_handle_t portId;
3046 const audio_attributes_t mediaAttribute = {
3047 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_MEDIA,
3048 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
3049 uid_t user15AppUid = multiuser_get_uid(/* user_id */ 15, /* app_id */ 12345);
3050
3051 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
3052 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, &output, &portId, mediaAttribute,
3053 AUDIO_SESSION_NONE, user15AppUid);
3054
3055 ASSERT_EQ(tertiaryZoneDevicePort.id, selectedDeviceId);
3056}
3057
Oscar Azucena873d10f2023-01-12 18:34:42 -08003058TEST_F(AudioPolicyManagerCarTest, GetOutputForAttrWithNoMatchingMix) {
3059 status_t ret;
3060 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
3061 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
3062 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
3063 audioConfig.sample_rate = k48000SamplingRate;
3064 std::vector<AudioMixMatchCriterion> mediaMatchCriteria = {
3065 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/ false)};
3066 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
3067 AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput, audioConfig, mediaMatchCriteria);
3068 ASSERT_EQ(NO_ERROR, ret);
3069 std::vector<AudioMixMatchCriterion> navMatchCriteria = {
3070 createUsageCriterion(AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
3071 /*exclude=*/ false)};
3072 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
3073 AUDIO_DEVICE_OUT_BUS, sCarBusNavigationOutput, audioConfig, navMatchCriteria);
3074 ASSERT_EQ(NO_ERROR, ret);
3075 const AudioDeviceTypeAddr mediaOutputDevice(AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput);
3076 const AudioDeviceTypeAddr navOutputDevice(AUDIO_DEVICE_OUT_BUS, sCarBusNavigationOutput);
3077 const AudioDeviceTypeAddrVector outputDevices = {mediaOutputDevice, navOutputDevice};
Oscar Azucena4f49ef62023-01-25 23:32:13 -08003078 mManager->setUserIdDeviceAffinities(/* userId */ 0, outputDevices);
Oscar Azucena873d10f2023-01-12 18:34:42 -08003079 audio_port_v7 navDevicePort;
3080 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_BUS,
3081 sCarBusNavigationOutput, &navDevicePort));
3082 audio_port_handle_t selectedDeviceId = navDevicePort.id;
3083 audio_io_handle_t output;
3084 audio_port_handle_t portId;
3085 const audio_attributes_t alarmAttribute = {
3086 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_ALARM,
3087 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
3088
3089 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
3090 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, &output, &portId, alarmAttribute);
3091
3092 ASSERT_EQ(navDevicePort.id, selectedDeviceId);
3093}
3094
jiabin24ff57a2023-11-27 21:06:51 +00003095TEST_F(AudioPolicyManagerCarTest, GetOutputForAttrForMMapWithPolicyMatched) {
3096 status_t ret;
3097 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
3098 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
3099 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
3100 audioConfig.sample_rate = k48000SamplingRate;
3101 std::vector<AudioMixMatchCriterion> mediaMatchCriteria = {
3102 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/ false)};
3103 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
3104 AUDIO_DEVICE_OUT_BUS, sCarBusMmapOutput, audioConfig, mediaMatchCriteria);
3105 ASSERT_EQ(NO_ERROR, ret);
3106 ASSERT_EQ(NO_ERROR, ret);
3107 audio_port_v7 mmapDevicePort;
3108 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_BUS,
3109 sCarBusMmapOutput, &mmapDevicePort));
3110 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
3111 audio_io_handle_t output;
3112 audio_port_handle_t portId;
3113 const audio_attributes_t mediaAttribute = {
3114 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_MEDIA,
3115 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
3116
3117 getOutputForAttr(
3118 &selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
3119 k48000SamplingRate,
3120 (audio_output_flags_t)(AUDIO_OUTPUT_FLAG_MMAP_NOIRQ | AUDIO_OUTPUT_FLAG_DIRECT),
3121 &output, &portId, mediaAttribute);
3122
3123 ASSERT_EQ(mmapDevicePort.id, selectedDeviceId);
3124}
3125
Mikhail Naganov0756bbf2019-09-06 13:53:26 -07003126class AudioPolicyManagerTVTest : public AudioPolicyManagerTestWithConfigurationFile {
3127protected:
3128 std::string getConfigFile() override { return sTvConfig; }
3129 void testHDMIPortSelection(audio_output_flags_t flags, const char* expectedMixPortName);
3130
3131 static const std::string sTvConfig;
3132};
3133
3134const std::string AudioPolicyManagerTVTest::sTvConfig =
3135 AudioPolicyManagerTVTest::sExecutableDir + "test_tv_apm_configuration.xml";
3136
3137// SwAudioOutputDescriptor doesn't populate flags so check against the port name.
3138void AudioPolicyManagerTVTest::testHDMIPortSelection(
3139 audio_output_flags_t flags, const char* expectedMixPortName) {
3140 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
3141 AUDIO_DEVICE_OUT_AUX_DIGITAL, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
3142 "" /*address*/, "" /*name*/, AUDIO_FORMAT_DEFAULT));
3143 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
3144 audio_io_handle_t output;
3145 audio_port_handle_t portId;
Dean Wheatleyd082f472022-02-04 11:10:48 +11003146 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
3147 k48000SamplingRate, flags, &output, &portId);
Mikhail Naganov0756bbf2019-09-06 13:53:26 -07003148 sp<SwAudioOutputDescriptor> outDesc = mManager->getOutputs().valueFor(output);
3149 ASSERT_NE(nullptr, outDesc.get());
jiabin19cdba52020-11-24 11:28:58 -08003150 audio_port_v7 port = {};
Mikhail Naganov0756bbf2019-09-06 13:53:26 -07003151 outDesc->toAudioPort(&port);
3152 mManager->releaseOutput(portId);
3153 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
3154 AUDIO_DEVICE_OUT_AUX_DIGITAL, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
3155 "" /*address*/, "" /*name*/, AUDIO_FORMAT_DEFAULT));
3156 ASSERT_EQ(AUDIO_PORT_TYPE_MIX, port.type);
3157 ASSERT_EQ(AUDIO_PORT_ROLE_SOURCE, port.role);
3158 ASSERT_STREQ(expectedMixPortName, port.name);
3159}
3160
3161TEST_F(AudioPolicyManagerTVTest, InitSuccess) {
3162 // SetUp must finish with no assertions.
3163}
3164
3165TEST_F(AudioPolicyManagerTVTest, Dump) {
3166 dumpToLog();
3167}
3168
Mikhail Naganov57ac2ce2019-09-11 09:29:41 -07003169TEST_F(AudioPolicyManagerTVTest, MatchNoFlags) {
3170 testHDMIPortSelection(AUDIO_OUTPUT_FLAG_NONE, "primary output");
3171}
3172
3173TEST_F(AudioPolicyManagerTVTest, MatchOutputDirectNoHwAvSync) {
Mikhail Naganov0756bbf2019-09-06 13:53:26 -07003174 // b/140447125: The selected port must not have HW AV Sync flag (see the config file).
3175 testHDMIPortSelection(AUDIO_OUTPUT_FLAG_DIRECT, "direct");
3176}
3177
Mikhail Naganov57ac2ce2019-09-11 09:29:41 -07003178TEST_F(AudioPolicyManagerTVTest, MatchOutputDirectHwAvSync) {
Mikhail Naganov0756bbf2019-09-06 13:53:26 -07003179 testHDMIPortSelection(static_cast<audio_output_flags_t>(
3180 AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_HW_AV_SYNC),
3181 "tunnel");
3182}
Mikhail Naganov57ac2ce2019-09-11 09:29:41 -07003183
3184TEST_F(AudioPolicyManagerTVTest, MatchOutputDirectMMapNoIrq) {
3185 testHDMIPortSelection(static_cast<audio_output_flags_t>(
3186 AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_MMAP_NOIRQ),
3187 "low latency");
3188}
Mikhail Naganovc0d04982020-03-02 21:02:28 +00003189
3190class AudioPolicyManagerDynamicHwModulesTest : public AudioPolicyManagerTestWithConfigurationFile {
3191protected:
3192 void SetUpManagerConfig() override;
3193};
3194
3195void AudioPolicyManagerDynamicHwModulesTest::SetUpManagerConfig() {
Mikhail Naganovd4c21aa2021-10-05 15:10:16 -07003196 ASSERT_NO_FATAL_FAILURE(AudioPolicyManagerTestWithConfigurationFile::SetUpManagerConfig());
Mikhail Naganovc0d04982020-03-02 21:02:28 +00003197 // Only allow successful opening of "primary" hw module during APM initialization.
3198 mClient->swapAllowedModuleNames({"primary"});
3199}
3200
3201TEST_F(AudioPolicyManagerDynamicHwModulesTest, InitSuccess) {
3202 // SetUp must finish with no assertions.
3203}
3204
3205TEST_F(AudioPolicyManagerDynamicHwModulesTest, DynamicAddition) {
3206 const auto handleBefore = mClient->peekNextModuleHandle();
3207 mManager->onNewAudioModulesAvailable();
3208 ASSERT_EQ(handleBefore, mClient->peekNextModuleHandle());
3209 // Reset module loading restrictions.
3210 mClient->swapAllowedModuleNames();
3211 mManager->onNewAudioModulesAvailable();
3212 const auto handleAfter = mClient->peekNextModuleHandle();
3213 ASSERT_GT(handleAfter, handleBefore);
3214 mManager->onNewAudioModulesAvailable();
3215 ASSERT_EQ(handleAfter, mClient->peekNextModuleHandle());
3216}
3217
3218TEST_F(AudioPolicyManagerDynamicHwModulesTest, AddedDeviceAvailable) {
3219 ASSERT_EQ(AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE, mManager->getDeviceConnectionState(
3220 AUDIO_DEVICE_IN_REMOTE_SUBMIX, "0"));
3221 mClient->swapAllowedModuleNames({"primary", "r_submix"});
3222 mManager->onNewAudioModulesAvailable();
3223 ASSERT_EQ(AUDIO_POLICY_DEVICE_STATE_AVAILABLE, mManager->getDeviceConnectionState(
3224 AUDIO_DEVICE_IN_REMOTE_SUBMIX, "0"));
3225}
Mikhail Naganovd0e2c742020-03-25 15:59:59 -07003226
3227TEST_F(AudioPolicyManagerDynamicHwModulesTest, ListAddedAudioPorts) {
3228 ASSERT_FALSE(
3229 findDevicePort(AUDIO_PORT_ROLE_SOURCE, AUDIO_DEVICE_IN_REMOTE_SUBMIX, "0", nullptr));
3230 mClient->swapAllowedModuleNames({"primary", "r_submix"});
3231 mManager->onNewAudioModulesAvailable();
jiabin19cdba52020-11-24 11:28:58 -08003232 struct audio_port_v7 port;
Mikhail Naganovd0e2c742020-03-25 15:59:59 -07003233 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SOURCE, AUDIO_DEVICE_IN_REMOTE_SUBMIX, "0", &port));
3234}
3235
3236TEST_F(AudioPolicyManagerDynamicHwModulesTest, ClientIsUpdated) {
3237 const size_t prevAudioPortListUpdateCount = mClient->getAudioPortListUpdateCount();
3238 const uint32_t prevAudioPortGeneration = mManager->getAudioPortGeneration();
3239 mClient->swapAllowedModuleNames({"primary", "r_submix"});
3240 mManager->onNewAudioModulesAvailable();
3241 EXPECT_GT(mClient->getAudioPortListUpdateCount(), prevAudioPortListUpdateCount);
3242 EXPECT_GT(mManager->getAudioPortGeneration(), prevAudioPortGeneration);
3243}
Jiabin Huang3b98d322020-09-03 17:54:16 +00003244
3245using DevicesRoleForCapturePresetParam = std::tuple<audio_source_t, device_role_t>;
3246
3247class AudioPolicyManagerDevicesRoleForCapturePresetTest
3248 : public AudioPolicyManagerTestWithConfigurationFile,
3249 public testing::WithParamInterface<DevicesRoleForCapturePresetParam> {
3250protected:
3251 // The `inputDevice` and `inputDevice2` indicate the audio devices type to be used for setting
3252 // device role. They must be declared in the test_audio_policy_configuration.xml
3253 AudioDeviceTypeAddr inputDevice = AudioDeviceTypeAddr(AUDIO_DEVICE_IN_BUILTIN_MIC, "");
3254 AudioDeviceTypeAddr inputDevice2 = AudioDeviceTypeAddr(AUDIO_DEVICE_IN_HDMI, "");
3255};
3256
3257TEST_P(AudioPolicyManagerDevicesRoleForCapturePresetTest, DevicesRoleForCapturePreset) {
3258 const audio_source_t audioSource = std::get<0>(GetParam());
3259 const device_role_t role = std::get<1>(GetParam());
3260
3261 // Test invalid device when setting
3262 const AudioDeviceTypeAddr outputDevice(AUDIO_DEVICE_OUT_SPEAKER, "");
3263 const AudioDeviceTypeAddrVector outputDevices = {outputDevice};
3264 ASSERT_EQ(BAD_VALUE,
3265 mManager->setDevicesRoleForCapturePreset(audioSource, role, outputDevices));
3266 ASSERT_EQ(BAD_VALUE,
3267 mManager->addDevicesRoleForCapturePreset(audioSource, role, outputDevices));
3268 AudioDeviceTypeAddrVector devices;
3269 ASSERT_EQ(NAME_NOT_FOUND,
3270 mManager->getDevicesForRoleAndCapturePreset(audioSource, role, devices));
3271 ASSERT_TRUE(devices.empty());
3272 ASSERT_EQ(BAD_VALUE,
3273 mManager->removeDevicesRoleForCapturePreset(audioSource, role, outputDevices));
3274
3275 // Without setting, call get/remove/clear must fail
3276 ASSERT_EQ(NAME_NOT_FOUND,
3277 mManager->getDevicesForRoleAndCapturePreset(audioSource, role, devices));
3278 ASSERT_EQ(NAME_NOT_FOUND,
3279 mManager->removeDevicesRoleForCapturePreset(audioSource, role, devices));
3280 ASSERT_EQ(NAME_NOT_FOUND,
3281 mManager->clearDevicesRoleForCapturePreset(audioSource, role));
3282
3283 // Test set/get devices role
3284 const AudioDeviceTypeAddrVector inputDevices = {inputDevice};
3285 ASSERT_EQ(NO_ERROR,
3286 mManager->setDevicesRoleForCapturePreset(audioSource, role, inputDevices));
3287 ASSERT_EQ(NO_ERROR, mManager->getDevicesForRoleAndCapturePreset(audioSource, role, devices));
3288 EXPECT_THAT(devices, UnorderedElementsAre(inputDevice));
3289
3290 // Test setting will change the previously set devices
3291 const AudioDeviceTypeAddrVector inputDevices2 = {inputDevice2};
3292 ASSERT_EQ(NO_ERROR,
3293 mManager->setDevicesRoleForCapturePreset(audioSource, role, inputDevices2));
3294 devices.clear();
3295 ASSERT_EQ(NO_ERROR, mManager->getDevicesForRoleAndCapturePreset(audioSource, role, devices));
3296 EXPECT_THAT(devices, UnorderedElementsAre(inputDevice2));
3297
3298 // Test add devices
3299 ASSERT_EQ(NO_ERROR,
3300 mManager->addDevicesRoleForCapturePreset(audioSource, role, inputDevices));
3301 devices.clear();
3302 ASSERT_EQ(NO_ERROR, mManager->getDevicesForRoleAndCapturePreset(audioSource, role, devices));
3303 EXPECT_THAT(devices, UnorderedElementsAre(inputDevice, inputDevice2));
3304
3305 // Test remove devices
3306 ASSERT_EQ(NO_ERROR,
3307 mManager->removeDevicesRoleForCapturePreset(audioSource, role, inputDevices));
3308 devices.clear();
3309 ASSERT_EQ(NO_ERROR, mManager->getDevicesForRoleAndCapturePreset(audioSource, role, devices));
3310 EXPECT_THAT(devices, UnorderedElementsAre(inputDevice2));
3311
3312 // Test remove devices that are not set as the device role
3313 ASSERT_EQ(BAD_VALUE,
3314 mManager->removeDevicesRoleForCapturePreset(audioSource, role, inputDevices));
3315
3316 // Test clear devices
3317 ASSERT_EQ(NO_ERROR,
3318 mManager->clearDevicesRoleForCapturePreset(audioSource, role));
3319 devices.clear();
3320 ASSERT_EQ(NAME_NOT_FOUND,
3321 mManager->getDevicesForRoleAndCapturePreset(audioSource, role, devices));
3322}
3323
jiabin14662b52023-03-06 21:35:29 +00003324TEST_F(AudioPolicyManagerDevicesRoleForCapturePresetTest, PreferredDeviceUsedForInput) {
3325 const audio_source_t source = AUDIO_SOURCE_MIC;
3326 const device_role_t role = DEVICE_ROLE_PREFERRED;
3327 const std::string address = "card=1;device=0";
3328 const std::string deviceName = "randomName";
3329
3330 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
3331 AUDIO_DEVICE_IN_USB_DEVICE, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
3332 address.c_str(), deviceName.c_str(), AUDIO_FORMAT_DEFAULT));
3333 auto availableDevices = mManager->getAvailableInputDevices();
3334 ASSERT_GT(availableDevices.size(), 1);
3335
3336 audio_attributes_t attr = AUDIO_ATTRIBUTES_INITIALIZER;
3337 attr.source = source;
3338 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
François Gaffie6ebbce02023-07-19 13:27:53 +02003339 audio_io_handle_t input = AUDIO_PORT_HANDLE_NONE;
3340 ASSERT_NO_FATAL_FAILURE(getInputForAttr(attr, &input, AUDIO_SESSION_NONE, 1, &selectedDeviceId,
jiabin14662b52023-03-06 21:35:29 +00003341 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO,
3342 48000));
3343 auto selectedDevice = availableDevices.getDeviceFromId(selectedDeviceId);
3344 ASSERT_NE(nullptr, selectedDevice);
3345
3346 sp<DeviceDescriptor> preferredDevice = nullptr;
3347 for (const auto& device : availableDevices) {
3348 if (device != selectedDevice) {
3349 preferredDevice = device;
3350 break;
3351 }
3352 }
3353 ASSERT_NE(nullptr, preferredDevice);
3354 // After setting preferred device for capture preset, the selected device for input should be
3355 // the preferred device.
3356 ASSERT_EQ(NO_ERROR,
3357 mManager->setDevicesRoleForCapturePreset(source, role,
3358 {preferredDevice->getDeviceTypeAddr()}));
3359 selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
François Gaffie6ebbce02023-07-19 13:27:53 +02003360 input = AUDIO_PORT_HANDLE_NONE;
3361 ASSERT_NO_FATAL_FAILURE(getInputForAttr(attr, &input, AUDIO_SESSION_NONE, 1, &selectedDeviceId,
jiabin14662b52023-03-06 21:35:29 +00003362 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO,
3363 48000));
3364 ASSERT_EQ(preferredDevice, availableDevices.getDeviceFromId(selectedDeviceId));
3365
3366 // After clearing preferred device for capture preset, the selected device for input should be
3367 // the same as original one.
3368 ASSERT_EQ(NO_ERROR,
3369 mManager->clearDevicesRoleForCapturePreset(source, role));
3370 selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
François Gaffie6ebbce02023-07-19 13:27:53 +02003371 input = AUDIO_PORT_HANDLE_NONE;
3372 ASSERT_NO_FATAL_FAILURE(getInputForAttr(attr, &input, AUDIO_SESSION_NONE, 1, &selectedDeviceId,
jiabin14662b52023-03-06 21:35:29 +00003373 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO,
3374 48000));
3375 ASSERT_EQ(selectedDevice, availableDevices.getDeviceFromId(selectedDeviceId));
3376
3377 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
3378 AUDIO_DEVICE_IN_USB_DEVICE, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
3379 address.c_str(), deviceName.c_str(), AUDIO_FORMAT_DEFAULT));
3380}
3381
3382TEST_F(AudioPolicyManagerDevicesRoleForCapturePresetTest, DisabledDeviceNotUsedForInput) {
3383 const audio_source_t source = AUDIO_SOURCE_MIC;
3384 const device_role_t role = DEVICE_ROLE_DISABLED;
3385 const std::string address = "card=1;device=0";
3386 const std::string deviceName = "randomName";
3387
3388 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
3389 AUDIO_DEVICE_IN_USB_DEVICE, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
3390 address.c_str(), deviceName.c_str(), AUDIO_FORMAT_DEFAULT));
3391 auto availableDevices = mManager->getAvailableInputDevices();
3392 ASSERT_GT(availableDevices.size(), 1);
3393
3394 audio_attributes_t attr = AUDIO_ATTRIBUTES_INITIALIZER;
3395 attr.source = source;
3396 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
François Gaffie6ebbce02023-07-19 13:27:53 +02003397 audio_io_handle_t input = AUDIO_PORT_HANDLE_NONE;
3398 ASSERT_NO_FATAL_FAILURE(getInputForAttr(attr, &input, AUDIO_SESSION_NONE, 1, &selectedDeviceId,
jiabin14662b52023-03-06 21:35:29 +00003399 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO,
3400 48000));
3401 auto selectedDevice = availableDevices.getDeviceFromId(selectedDeviceId);
3402 ASSERT_NE(nullptr, selectedDevice);
3403
3404 // After setting disabled device for capture preset, the disabled device must not be
3405 // selected for input.
3406 ASSERT_EQ(NO_ERROR,
3407 mManager->setDevicesRoleForCapturePreset(source, role,
3408 {selectedDevice->getDeviceTypeAddr()}));
3409 selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
François Gaffie6ebbce02023-07-19 13:27:53 +02003410 input = AUDIO_PORT_HANDLE_NONE;
3411 ASSERT_NO_FATAL_FAILURE(getInputForAttr(attr, &input, AUDIO_SESSION_NONE, 1,
3412 &selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT,
3413 AUDIO_CHANNEL_IN_STEREO, 48000));
jiabin14662b52023-03-06 21:35:29 +00003414 ASSERT_NE(selectedDevice, availableDevices.getDeviceFromId(selectedDeviceId));
3415
3416 // After clearing disabled device for capture preset, the selected device for input should be
3417 // the original one.
3418 ASSERT_EQ(NO_ERROR,
3419 mManager->clearDevicesRoleForCapturePreset(source, role));
3420 selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
François Gaffie6ebbce02023-07-19 13:27:53 +02003421 input = AUDIO_PORT_HANDLE_NONE;
3422 ASSERT_NO_FATAL_FAILURE(getInputForAttr(attr, &input, AUDIO_SESSION_NONE, 1, &selectedDeviceId,
jiabin14662b52023-03-06 21:35:29 +00003423 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO,
3424 48000));
3425 ASSERT_EQ(selectedDevice, availableDevices.getDeviceFromId(selectedDeviceId));
3426
3427 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
3428 AUDIO_DEVICE_IN_USB_DEVICE, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
3429 address.c_str(), deviceName.c_str(), AUDIO_FORMAT_DEFAULT));
3430}
3431
Jiabin Huang3b98d322020-09-03 17:54:16 +00003432INSTANTIATE_TEST_CASE_P(
3433 DevicesRoleForCapturePresetOperation,
3434 AudioPolicyManagerDevicesRoleForCapturePresetTest,
3435 testing::Values(
3436 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_MIC, DEVICE_ROLE_PREFERRED}),
3437 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_VOICE_UPLINK,
3438 DEVICE_ROLE_PREFERRED}),
3439 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_VOICE_DOWNLINK,
3440 DEVICE_ROLE_PREFERRED}),
3441 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_VOICE_CALL, DEVICE_ROLE_PREFERRED}),
3442 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_CAMCORDER, DEVICE_ROLE_PREFERRED}),
3443 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_VOICE_RECOGNITION,
3444 DEVICE_ROLE_PREFERRED}),
3445 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_VOICE_COMMUNICATION,
3446 DEVICE_ROLE_PREFERRED}),
3447 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_REMOTE_SUBMIX,
3448 DEVICE_ROLE_PREFERRED}),
3449 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_UNPROCESSED, DEVICE_ROLE_PREFERRED}),
3450 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_VOICE_PERFORMANCE,
3451 DEVICE_ROLE_PREFERRED}),
3452 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_ECHO_REFERENCE,
3453 DEVICE_ROLE_PREFERRED}),
3454 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_FM_TUNER, DEVICE_ROLE_PREFERRED}),
3455 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_HOTWORD, DEVICE_ROLE_PREFERRED})
3456 )
3457 );
François Gaffie6ebbce02023-07-19 13:27:53 +02003458
3459
3460const effect_descriptor_t TEST_EFFECT_DESC = {
3461 {0xf2a4bb20, 0x0c3c, 0x11e3, 0x8b07, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // type
3462 {0xff93e360, 0x0c3c, 0x11e3, 0x8a97, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // uuid
3463 EFFECT_CONTROL_API_VERSION,
3464 EFFECT_FLAG_TYPE_PRE_PROC,
3465 0,
3466 1,
3467 "APM test Effect",
3468 "The Android Open Source Project",
3469};
3470
3471class AudioPolicyManagerPreProcEffectTest : public AudioPolicyManagerTestWithConfigurationFile {
3472};
3473
3474TEST_F(AudioPolicyManagerPreProcEffectTest, DeviceDisconnectWhileClientActive) {
3475 const audio_source_t source = AUDIO_SOURCE_MIC;
3476 const std::string address = "BUS00_MIC";
3477 const std::string deviceName = "randomName";
3478 audio_port_handle_t portId;
3479 audio_devices_t type = AUDIO_DEVICE_IN_BUS;
3480
3481 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(type,
3482 AUDIO_POLICY_DEVICE_STATE_AVAILABLE, address.c_str(), deviceName.c_str(),
3483 AUDIO_FORMAT_DEFAULT));
3484 auto availableDevices = mManager->getAvailableInputDevices();
3485 ASSERT_GT(availableDevices.size(), 1);
3486
3487 audio_attributes_t attr = AUDIO_ATTRIBUTES_INITIALIZER;
3488 attr.source = source;
3489 audio_session_t session = TEST_SESSION_ID;
3490 audio_io_handle_t inputClientHandle = 777;
3491 int effectId = 666;
3492 audio_port_v7 devicePort;
3493 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SOURCE, type, address, &devicePort));
3494
3495 audio_port_handle_t routedPortId = devicePort.id;
3496 ASSERT_NO_FATAL_FAILURE(getInputForAttr(attr, &inputClientHandle, session, 1, &routedPortId,
3497 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO,
3498 48000, AUDIO_INPUT_FLAG_NONE, &portId));
3499 ASSERT_EQ(devicePort.id, routedPortId);
3500 auto selectedDevice = availableDevices.getDeviceFromId(routedPortId);
3501 ASSERT_NE(nullptr, selectedDevice);
3502
3503 // Add a pre processing effect on the input client session
3504 ASSERT_EQ(NO_ERROR, mManager->registerEffect(&TEST_EFFECT_DESC, inputClientHandle,
3505 PRODUCT_STRATEGY_NONE, session, effectId));
3506
3507 ASSERT_EQ(NO_ERROR, mManager->startInput(portId));
3508
3509 // Force a device disconnection to close the input, no crash expected of APM
3510 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
3511 type, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
3512 address.c_str(), deviceName.c_str(), AUDIO_FORMAT_DEFAULT));
3513
3514 // Reconnect the device
3515 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
3516 type, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
3517 address.c_str(), deviceName.c_str(), AUDIO_FORMAT_DEFAULT));
3518
3519 inputClientHandle += 1;
3520 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SOURCE, type, address, &devicePort));
3521 routedPortId = devicePort.id;
3522
3523 // Reconnect the client changing voluntarily the io, but keeping the session to get the
3524 // effect attached again
3525 ASSERT_NO_FATAL_FAILURE(getInputForAttr(attr, &inputClientHandle, session, 1, &routedPortId,
3526 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO,
3527 48000));
3528
3529 // unregister effect should succeed since effect shall have been restore on the client session
3530 ASSERT_EQ(NO_ERROR, mManager->unregisterEffect(effectId));
Mikhail Naganovf88c2f32024-04-16 15:01:13 -07003531}
jiabin220eea12024-05-17 17:55:20 +00003532
3533class AudioPolicyManagerTestBitPerfectBase : public AudioPolicyManagerTestWithConfigurationFile {
3534protected:
3535 void SetUp() override;
3536 void TearDown() override;
3537
3538 void startBitPerfectOutput();
3539 void reset();
3540 void getBitPerfectOutput(status_t expected);
3541
3542 const audio_format_t mBitPerfectFormat = AUDIO_FORMAT_PCM_16_BIT;
3543 const audio_channel_mask_t mBitPerfectChannelMask = AUDIO_CHANNEL_OUT_STEREO;
3544 const uint32_t mBitPerfectSampleRate = 48000;
3545 const uid_t mUid = 1234;
3546 audio_port_handle_t mUsbPortId = AUDIO_PORT_HANDLE_NONE;
3547
3548 audio_io_handle_t mBitPerfectOutput = AUDIO_IO_HANDLE_NONE;
3549 audio_port_handle_t mSelectedDeviceId = AUDIO_PORT_HANDLE_NONE;
3550 audio_port_handle_t mBitPerfectPortId = AUDIO_PORT_HANDLE_NONE;
3551
3552 static constexpr audio_attributes_t sMediaAttr = {
3553 .content_type = AUDIO_CONTENT_TYPE_MUSIC,
3554 .usage = AUDIO_USAGE_MEDIA,
3555 };
3556};
3557
3558void AudioPolicyManagerTestBitPerfectBase::SetUp() {
3559 ASSERT_NO_FATAL_FAILURE(AudioPolicyManagerTestWithConfigurationFile::SetUp());
3560
3561 mClient->addSupportedFormat(mBitPerfectFormat);
3562 mClient->addSupportedChannelMask(mBitPerfectChannelMask);
3563 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(AUDIO_DEVICE_OUT_USB_DEVICE,
3564 AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
3565 "", "", AUDIO_FORMAT_DEFAULT));
3566 auto devices = mManager->getAvailableOutputDevices();
3567 mUsbPortId = AUDIO_PORT_HANDLE_NONE;
3568 for (auto device : devices) {
3569 if (device->type() == AUDIO_DEVICE_OUT_USB_DEVICE) {
3570 mUsbPortId = device->getId();
3571 break;
3572 }
3573 }
3574 EXPECT_NE(AUDIO_PORT_HANDLE_NONE, mUsbPortId);
3575
3576 std::vector<audio_mixer_attributes_t> mixerAttributes;
3577 EXPECT_EQ(NO_ERROR, mManager->getSupportedMixerAttributes(mUsbPortId, mixerAttributes));
3578 EXPECT_GT(mixerAttributes.size(), 0);
3579 size_t bitPerfectIndex = 0;
3580 for (; bitPerfectIndex < mixerAttributes.size(); ++bitPerfectIndex) {
3581 if (mixerAttributes[bitPerfectIndex].mixer_behavior == AUDIO_MIXER_BEHAVIOR_BIT_PERFECT) {
3582 break;
3583 }
3584 }
3585 EXPECT_LT(bitPerfectIndex, mixerAttributes.size());
3586 EXPECT_EQ(mBitPerfectFormat, mixerAttributes[bitPerfectIndex].config.format);
3587 EXPECT_EQ(mBitPerfectChannelMask, mixerAttributes[bitPerfectIndex].config.channel_mask);
3588 EXPECT_EQ(mBitPerfectSampleRate, mixerAttributes[bitPerfectIndex].config.sample_rate);
3589 EXPECT_EQ(NO_ERROR,
3590 mManager->setPreferredMixerAttributes(
3591 &sMediaAttr, mUsbPortId, mUid, &mixerAttributes[bitPerfectIndex]));
3592}
3593
3594void AudioPolicyManagerTestBitPerfectBase::TearDown() {
3595 EXPECT_EQ(NO_ERROR,
3596 mManager->clearPreferredMixerAttributes(&sMediaAttr, mUsbPortId, mUid));
3597 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(AUDIO_DEVICE_OUT_USB_DEVICE,
3598 AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
3599 "", "", AUDIO_FORMAT_LDAC));
3600
3601 ASSERT_NO_FATAL_FAILURE(AudioPolicyManagerTestWithConfigurationFile::TearDown());
3602}
3603
3604void AudioPolicyManagerTestBitPerfectBase::startBitPerfectOutput() {
3605 reset();
3606 bool isBitPerfect;
3607
3608 getOutputForAttr(&mSelectedDeviceId, mBitPerfectFormat, mBitPerfectChannelMask,
3609 mBitPerfectSampleRate, AUDIO_OUTPUT_FLAG_NONE, &mBitPerfectOutput,
3610 &mBitPerfectPortId, sMediaAttr, AUDIO_SESSION_NONE, mUid, &isBitPerfect);
3611 status_t status = mManager->startOutput(mBitPerfectPortId);
3612 if (status == DEAD_OBJECT) {
3613 getOutputForAttr(&mSelectedDeviceId, mBitPerfectFormat, mBitPerfectChannelMask,
3614 mBitPerfectSampleRate, AUDIO_OUTPUT_FLAG_NONE, &mBitPerfectOutput,
3615 &mBitPerfectPortId, sMediaAttr, AUDIO_SESSION_NONE, mUid, &isBitPerfect);
3616 status = mManager->startOutput(mBitPerfectPortId);
3617 }
3618 EXPECT_EQ(NO_ERROR, status);
3619 EXPECT_TRUE(isBitPerfect);
3620 EXPECT_NE(AUDIO_IO_HANDLE_NONE, mBitPerfectOutput);
3621 const auto bitPerfectOutputDesc = mManager->getOutputs().valueFor(mBitPerfectOutput);
3622 EXPECT_NE(nullptr, bitPerfectOutputDesc);
3623 EXPECT_EQ(AUDIO_OUTPUT_FLAG_BIT_PERFECT,
3624 bitPerfectOutputDesc->mFlags & AUDIO_OUTPUT_FLAG_BIT_PERFECT);
3625};
3626
3627void AudioPolicyManagerTestBitPerfectBase::reset() {
3628 mBitPerfectOutput = AUDIO_IO_HANDLE_NONE;
3629 mSelectedDeviceId = AUDIO_PORT_HANDLE_NONE;
3630 mBitPerfectPortId = AUDIO_PORT_HANDLE_NONE;
3631}
3632
3633void AudioPolicyManagerTestBitPerfectBase::getBitPerfectOutput(status_t expected) {
3634 reset();
3635 audio_stream_type_t stream = AUDIO_STREAM_DEFAULT;
3636 AttributionSourceState attributionSource = createAttributionSourceState(mUid);
3637 audio_config_t config = AUDIO_CONFIG_INITIALIZER;
3638 config.sample_rate = mBitPerfectSampleRate;
3639 config.channel_mask = mBitPerfectChannelMask;
3640 config.format = mBitPerfectFormat;
3641 audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_BIT_PERFECT;
3642 AudioPolicyInterface::output_type_t outputType;
3643 bool isSpatialized;
3644 bool isBitPerfect;
Andy Hung6b137d12024-08-27 22:35:17 +00003645 float volume;
jiabin220eea12024-05-17 17:55:20 +00003646 EXPECT_EQ(expected,
3647 mManager->getOutputForAttr(&sMediaAttr, &mBitPerfectOutput, AUDIO_SESSION_NONE,
3648 &stream, attributionSource, &config, &flags,
3649 &mSelectedDeviceId, &mBitPerfectPortId, {}, &outputType,
Andy Hung6b137d12024-08-27 22:35:17 +00003650 &isSpatialized, &isBitPerfect, &volume));
jiabin220eea12024-05-17 17:55:20 +00003651}
3652
3653class AudioPolicyManagerTestBitPerfect : public AudioPolicyManagerTestBitPerfectBase {
3654};
3655
3656TEST_F(AudioPolicyManagerTestBitPerfect, UseBitPerfectOutput) {
3657 const uid_t anotherUid = 5678;
3658 audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
3659 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
3660 audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
3661 bool isBitPerfect;
3662
3663 // When there is no active bit-perfect playback, the output selection will follow default
3664 // routing strategy.
3665 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_QUAD,
3666 48000, AUDIO_OUTPUT_FLAG_NONE, &output, &portId, sMediaAttr,
3667 AUDIO_SESSION_NONE, mUid, &isBitPerfect);
3668 EXPECT_FALSE(isBitPerfect);
3669 EXPECT_NE(AUDIO_IO_HANDLE_NONE, output);
3670 const auto outputDesc = mManager->getOutputs().valueFor(output);
3671 EXPECT_NE(nullptr, outputDesc);
3672 EXPECT_NE(AUDIO_OUTPUT_FLAG_BIT_PERFECT, outputDesc->mFlags & AUDIO_OUTPUT_FLAG_BIT_PERFECT);
3673
3674 // Start bit-perfect playback
3675 ASSERT_NO_FATAL_FAILURE(startBitPerfectOutput());
3676
3677 // If the playback is from preferred mixer attributes owner but the request doesn't match
3678 // preferred mixer attributes, it will not be bit-perfect.
3679 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_QUAD,
3680 48000, AUDIO_OUTPUT_FLAG_NONE, &output, &portId, sMediaAttr,
3681 AUDIO_SESSION_NONE, mUid, &isBitPerfect);
3682 EXPECT_FALSE(isBitPerfect);
3683 EXPECT_EQ(mBitPerfectOutput, output);
3684
3685 // When bit-perfect playback is active, all other playback will be routed to bit-perfect output.
3686 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
3687 48000, AUDIO_OUTPUT_FLAG_NONE, &output, &portId, sMediaAttr,
3688 AUDIO_SESSION_NONE, anotherUid, &isBitPerfect);
3689 EXPECT_FALSE(isBitPerfect);
3690 EXPECT_EQ(mBitPerfectOutput, output);
3691
3692 // When bit-pefect playback is active, dtmf will also be routed to bit-perfect output.
3693 const audio_attributes_t dtmfAttr = {
3694 .content_type = AUDIO_CONTENT_TYPE_UNKNOWN,
3695 .usage = AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING,
3696 };
3697 audio_io_handle_t dtmfOutput = AUDIO_IO_HANDLE_NONE;
3698 selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
3699 portId = AUDIO_PORT_HANDLE_NONE;
3700 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
3701 48000, AUDIO_OUTPUT_FLAG_NONE, &dtmfOutput, &portId, dtmfAttr,
3702 AUDIO_SESSION_NONE, anotherUid, &isBitPerfect);
3703 EXPECT_FALSE(isBitPerfect);
3704 EXPECT_EQ(mBitPerfectOutput, dtmfOutput);
3705
3706 // When configuration matches preferred mixer attributes, which is bit-perfect, but the client
3707 // is not the owner of preferred mixer attributes, the playback will not be bit-perfect.
3708 getOutputForAttr(&selectedDeviceId, mBitPerfectFormat, mBitPerfectChannelMask,
3709 mBitPerfectSampleRate, AUDIO_OUTPUT_FLAG_NONE, &output, &portId, sMediaAttr,
3710 AUDIO_SESSION_NONE, anotherUid, &isBitPerfect);
3711 EXPECT_FALSE(isBitPerfect);
3712 EXPECT_EQ(mBitPerfectOutput, output);
3713}
3714
3715TEST_F_WITH_FLAGS(
3716 AudioPolicyManagerTestBitPerfect,
3717 InternalMuteWhenBitPerfectCLientIsActive,
3718 REQUIRES_FLAGS_ENABLED(
3719 ACONFIG_FLAG(com::android::media::audioserver,
3720 fix_concurrent_playback_behavior_with_bit_perfect_client))
3721) {
3722 ASSERT_NO_FATAL_FAILURE(startBitPerfectOutput());
3723
3724 // When bit-perfect playback is active, the system sound will be routed to bit-perfect output.
3725 // The system sound will be muted internally in this case. The bit-perfect client will be
3726 // played normally.
3727 const uint32_t anotherSampleRate = 44100;
3728 audio_port_handle_t systemSoundPortId = AUDIO_PORT_HANDLE_NONE;
3729 audio_io_handle_t systemSoundOutput = AUDIO_IO_HANDLE_NONE;
3730 const audio_attributes_t systemSoundAttr = {
3731 .content_type = AUDIO_CONTENT_TYPE_SONIFICATION,
3732 .usage = AUDIO_USAGE_ASSISTANCE_SONIFICATION,
3733 };
3734 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
3735 bool isBitPerfect;
3736 getOutputForAttr(&selectedDeviceId, mBitPerfectFormat, mBitPerfectChannelMask,
3737 anotherSampleRate, AUDIO_OUTPUT_FLAG_NONE, &systemSoundOutput,
3738 &systemSoundPortId, systemSoundAttr, AUDIO_SESSION_NONE, mUid, &isBitPerfect);
3739 EXPECT_FALSE(isBitPerfect);
3740 EXPECT_EQ(mBitPerfectOutput, systemSoundOutput);
3741 EXPECT_EQ(NO_ERROR, mManager->startOutput(systemSoundPortId));
3742 EXPECT_TRUE(mClient->getTrackInternalMute(systemSoundPortId));
3743 EXPECT_FALSE(mClient->getTrackInternalMute(mBitPerfectPortId));
3744 EXPECT_EQ(NO_ERROR, mManager->stopOutput(systemSoundPortId));
3745 EXPECT_FALSE(mClient->getTrackInternalMute(mBitPerfectPortId));
3746
3747 // When bit-perfect playback is active, the notification will be routed to bit-perfect output.
3748 // The notification sound will be played normally while the bit-perfect client will be muted
3749 // internally.
3750 audio_port_handle_t notificationPortId = AUDIO_PORT_HANDLE_NONE;
3751 audio_io_handle_t notificationOutput = AUDIO_IO_HANDLE_NONE;
3752 const audio_attributes_t notificationAttr = {
3753 .content_type = AUDIO_CONTENT_TYPE_SONIFICATION,
3754 .usage = AUDIO_USAGE_NOTIFICATION,
3755 };
3756 getOutputForAttr(&selectedDeviceId, mBitPerfectFormat, mBitPerfectChannelMask,
3757 anotherSampleRate, AUDIO_OUTPUT_FLAG_NONE, &notificationOutput,
3758 &notificationPortId, notificationAttr, AUDIO_SESSION_NONE, mUid,
3759 &isBitPerfect);
3760 EXPECT_FALSE(isBitPerfect);
3761 EXPECT_EQ(mBitPerfectOutput, notificationOutput);
3762 EXPECT_EQ(NO_ERROR, mManager->startOutput(notificationPortId));
3763 EXPECT_FALSE(mClient->getTrackInternalMute(notificationPortId));
3764 EXPECT_TRUE(mClient->getTrackInternalMute(mBitPerfectPortId));
3765 EXPECT_EQ(NO_ERROR, mManager->stopOutput(notificationPortId));
3766 EXPECT_FALSE(mClient->getTrackInternalMute(mBitPerfectPortId));
3767
3768 EXPECT_EQ(NO_ERROR, mManager->stopOutput(mBitPerfectPortId));
3769}
3770
3771class AudioPolicyManagerTestBitPerfectPhoneMode : public AudioPolicyManagerTestBitPerfectBase,
3772 public testing::WithParamInterface<audio_mode_t> {
3773};
3774
3775TEST_P(AudioPolicyManagerTestBitPerfectPhoneMode, RejectBitPerfectWhenPhoneModeIsNotNormal) {
3776 if (!com::android::media::audioserver::
3777 fix_concurrent_playback_behavior_with_bit_perfect_client()) {
3778 GTEST_SKIP()
3779 << "Flag fix_concurrent_playback_behavior_with_bit_perfect_client is not enabled";
3780 }
3781
3782 ASSERT_NO_FATAL_FAILURE(startBitPerfectOutput());
3783
3784 audio_mode_t mode = GetParam();
3785 mManager->setPhoneState(mode);
3786 // When the phone mode is not normal, the bit-perfect output will be reopned
3787 EXPECT_EQ(nullptr, mManager->getOutputs().valueFor(mBitPerfectOutput));
3788
3789 // When the phone mode is not normal, the bit-perfect output will be closed.
3790 ASSERT_NO_FATAL_FAILURE(getBitPerfectOutput(INVALID_OPERATION));
3791
3792 mManager->setPhoneState(AUDIO_MODE_NORMAL);
3793}
3794
3795INSTANTIATE_TEST_CASE_P(
3796 PhoneMode,
3797 AudioPolicyManagerTestBitPerfectPhoneMode,
3798 testing::Values(AUDIO_MODE_IN_CALL,
3799 AUDIO_MODE_RINGTONE,
3800 AUDIO_MODE_IN_COMMUNICATION,
3801 AUDIO_MODE_CALL_SCREEN)
3802);
3803
3804class AudioPolicyManagerTestBitPerfectHigherPriorityUseCaseActive :
3805 public AudioPolicyManagerTestBitPerfectBase,
3806 public testing::WithParamInterface<audio_usage_t> {
3807};
3808
3809TEST_P(AudioPolicyManagerTestBitPerfectHigherPriorityUseCaseActive,
3810 RejectBitPerfectWhenHigherPriorityUseCaseIsActive) {
3811 if (!com::android::media::audioserver::
3812 fix_concurrent_playback_behavior_with_bit_perfect_client()) {
3813 GTEST_SKIP()
3814 << "Flag fix_concurrent_playback_behavior_with_bit_perfect_client is not enabled";
3815 }
3816
3817 ASSERT_NO_FATAL_FAILURE(startBitPerfectOutput());
3818
3819 audio_attributes_t attr = {
3820 .usage = GetParam(),
3821 .content_type = AUDIO_CONTENT_TYPE_UNKNOWN
3822 };
3823 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
3824 audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
3825 audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
3826 ASSERT_NO_FATAL_FAILURE(
3827 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
3828 48000, AUDIO_OUTPUT_FLAG_NONE, &output, &portId, attr));
3829 EXPECT_NE(mBitPerfectOutput, output);
3830 EXPECT_EQ(NO_ERROR, mManager->startOutput(portId));
3831 // When a high priority use case is active, the bit-perfect output will be closed.
3832 EXPECT_EQ(nullptr, mManager->getOutputs().valueFor(mBitPerfectOutput));
3833
3834 // When any higher priority use case is active, the bit-perfect request will be rejected.
3835 ASSERT_NO_FATAL_FAILURE(getBitPerfectOutput(INVALID_OPERATION));
3836}
3837
3838INSTANTIATE_TEST_CASE_P(
3839 HigherPriorityUseCases,
3840 AudioPolicyManagerTestBitPerfectHigherPriorityUseCaseActive,
3841 testing::Values(AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE,
3842 AUDIO_USAGE_ALARM)
3843);
Eric Laurentc71b11b2024-06-03 12:54:53 +00003844
3845class AudioPolicyManagerInputPreemptionTest : public AudioPolicyManagerTestWithConfigurationFile {
3846};
3847
3848TEST_F_WITH_FLAGS(
3849 AudioPolicyManagerInputPreemptionTest,
3850 SameSessionReusesInput,
3851 REQUIRES_FLAGS_ENABLED(
3852 ACONFIG_FLAG(com::android::media::audioserver, fix_input_sharing_logic))
3853) {
3854 mClient->resetInputApiCallsCounters();
3855
3856 audio_attributes_t attr = AUDIO_ATTRIBUTES_INITIALIZER;
3857 attr.source = AUDIO_SOURCE_MIC;
3858 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
3859 audio_io_handle_t input1 = AUDIO_PORT_HANDLE_NONE;
3860 ASSERT_NO_FATAL_FAILURE(getInputForAttr(attr, &input1, TEST_SESSION_ID, 1, &selectedDeviceId,
3861 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO,
3862 48000));
3863
3864 EXPECT_EQ(1, mClient->getOpenInputCallsCount());
3865
3866 audio_io_handle_t input2 = AUDIO_PORT_HANDLE_NONE;
3867 ASSERT_NO_FATAL_FAILURE(getInputForAttr(attr, &input2, TEST_SESSION_ID, 1, &selectedDeviceId,
3868 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO,
3869 48000));
3870
3871 EXPECT_EQ(1, mClient->getOpenInputCallsCount());
3872 EXPECT_EQ(0, mClient->getCloseInputCallsCount());
3873 EXPECT_EQ(input1, input2);
3874}
3875
3876TEST_F_WITH_FLAGS(
3877 AudioPolicyManagerInputPreemptionTest,
3878 LesserPriorityReusesInput,
3879 REQUIRES_FLAGS_ENABLED(
3880 ACONFIG_FLAG(com::android::media::audioserver, fix_input_sharing_logic))
3881) {
3882 mClient->resetInputApiCallsCounters();
3883
3884 audio_attributes_t attr = AUDIO_ATTRIBUTES_INITIALIZER;
3885 attr.source = AUDIO_SOURCE_MIC;
3886 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
3887 audio_io_handle_t input1 = AUDIO_PORT_HANDLE_NONE;
3888 ASSERT_NO_FATAL_FAILURE(getInputForAttr(attr, &input1, TEST_SESSION_ID, 1, &selectedDeviceId,
3889 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO,
3890 48000));
3891
3892 EXPECT_EQ(1, mClient->getOpenInputCallsCount());
3893
3894 audio_io_handle_t input2 = AUDIO_PORT_HANDLE_NONE;
3895 attr.source = AUDIO_SOURCE_VOICE_RECOGNITION;
3896 ASSERT_NO_FATAL_FAILURE(getInputForAttr(attr, &input2, OTHER_SESSION_ID, 1, &selectedDeviceId,
3897 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO,
3898 48000));
3899
3900 EXPECT_EQ(1, mClient->getOpenInputCallsCount());
3901 EXPECT_EQ(0, mClient->getCloseInputCallsCount());
3902 EXPECT_EQ(input1, input2);
3903}
3904
3905TEST_F_WITH_FLAGS(
3906 AudioPolicyManagerInputPreemptionTest,
3907 HigherPriorityPreemptsInput,
3908 REQUIRES_FLAGS_ENABLED(
3909 ACONFIG_FLAG(com::android::media::audioserver, fix_input_sharing_logic))
3910) {
3911 mClient->resetInputApiCallsCounters();
3912
3913 audio_attributes_t attr = AUDIO_ATTRIBUTES_INITIALIZER;
3914 attr.source = AUDIO_SOURCE_MIC;
3915 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
3916 audio_io_handle_t input1 = AUDIO_PORT_HANDLE_NONE;
3917 ASSERT_NO_FATAL_FAILURE(getInputForAttr(attr, &input1, TEST_SESSION_ID, 1, &selectedDeviceId,
3918 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO,
3919 48000));
3920
3921 EXPECT_EQ(1, mClient->getOpenInputCallsCount());
3922
3923 audio_io_handle_t input2 = AUDIO_PORT_HANDLE_NONE;
3924 attr.source = AUDIO_SOURCE_CAMCORDER;
3925 ASSERT_NO_FATAL_FAILURE(getInputForAttr(attr, &input2, OTHER_SESSION_ID, 1, &selectedDeviceId,
3926 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO,
3927 48000));
3928
3929 EXPECT_EQ(2, mClient->getOpenInputCallsCount());
3930 EXPECT_EQ(1, mClient->getCloseInputCallsCount());
3931 EXPECT_NE(input1, input2);
3932}
Mikhail Naganov70b52652024-09-06 10:23:24 -07003933
3934int main(int argc, char** argv) {
3935 ::testing::InitGoogleTest(&argc, argv);
3936 ::testing::UnitTest::GetInstance()->listeners().Append(new TestExecutionTracer());
3937 return RUN_ALL_TESTS();
3938}