blob: d209c81662a7b62a00cf7e4cd2c88bb6ee0af8d5 [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>
Svet Ganov3e5f14f2021-05-13 22:51:08 +000029#include <android/content/AttributionSourceState.h>
jiabinf4eb15a2019-08-28 15:31:47 -070030#include <media/AudioPolicy.h>
Mikhail Naganovdc769682018-05-04 15:34:08 -070031#include <media/PatchBuilder.h>
jiabinf4eb15a2019-08-28 15:31:47 -070032#include <media/RecordingActivityTracker.h>
33#include <utils/Log.h>
34#include <utils/Vector.h>
Mikhail Naganovdc769682018-05-04 15:34:08 -070035
jiabinf4eb15a2019-08-28 15:31:47 -070036#include "AudioPolicyInterface.h"
jiabinb3f98042019-09-26 17:56:44 -070037#include "AudioPolicyManagerTestClient.h"
Mikhail Naganovad3f8a12017-12-12 13:24:23 -080038#include "AudioPolicyTestClient.h"
39#include "AudioPolicyTestManager.h"
40
41using namespace android;
Jiabin Huang3b98d322020-09-03 17:54:16 +000042using testing::UnorderedElementsAre;
Svet Ganov3e5f14f2021-05-13 22:51:08 +000043using android::content::AttributionSourceState;
Mikhail Naganovad3f8a12017-12-12 13:24:23 -080044
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +020045namespace {
46
47AudioMixMatchCriterion createUidCriterion(uint32_t uid, bool exclude = false) {
48 AudioMixMatchCriterion criterion;
49 criterion.mValue.mUid = uid;
50 criterion.mRule = exclude ? RULE_EXCLUDE_UID : RULE_MATCH_UID;
51 return criterion;
52}
53
Oscar Azucena873d10f2023-01-12 18:34:42 -080054AudioMixMatchCriterion createUserIdCriterion(int userId, bool exclude = false) {
55 AudioMixMatchCriterion criterion;
56 criterion.mValue.mUserId = userId;
57 criterion.mRule = exclude ? RULE_EXCLUDE_USERID : RULE_MATCH_USERID;
58 return criterion;
59}
60
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +020061AudioMixMatchCriterion createUsageCriterion(audio_usage_t usage, bool exclude = false) {
62 AudioMixMatchCriterion criterion;
63 criterion.mValue.mUsage = usage;
64 criterion.mRule = exclude ? RULE_EXCLUDE_ATTRIBUTE_USAGE : RULE_MATCH_ATTRIBUTE_USAGE;
65 return criterion;
66}
67
68AudioMixMatchCriterion createCapturePresetCriterion(audio_source_t source, bool exclude = false) {
69 AudioMixMatchCriterion criterion;
70 criterion.mValue.mSource = source;
71 criterion.mRule = exclude ?
72 RULE_EXCLUDE_ATTRIBUTE_CAPTURE_PRESET : RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET;
73 return criterion;
74}
75
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +020076AudioMixMatchCriterion createSessionIdCriterion(audio_session_t session, bool exclude = false) {
77 AudioMixMatchCriterion criterion;
78 criterion.mValue.mAudioSessionId = session;
79 criterion.mRule = exclude ?
80 RULE_EXCLUDE_AUDIO_SESSION_ID : RULE_MATCH_AUDIO_SESSION_ID;
81 return criterion;
82}
83
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +020084} // namespace
85
Mikhail Naganov47835552019-05-14 10:32:51 -070086TEST(AudioPolicyManagerTestInit, EngineFailure) {
87 AudioPolicyTestClient client;
88 AudioPolicyTestManager manager(&client);
89 manager.getConfig().setDefault();
90 manager.getConfig().setEngineLibraryNameSuffix("non-existent");
91 ASSERT_EQ(NO_INIT, manager.initialize());
92 ASSERT_EQ(NO_INIT, manager.initCheck());
93}
94
95TEST(AudioPolicyManagerTestInit, ClientFailure) {
Mikhail Naganovad3f8a12017-12-12 13:24:23 -080096 AudioPolicyTestClient client;
97 AudioPolicyTestManager manager(&client);
98 manager.getConfig().setDefault();
Mikhail Naganovbcbcb1b2017-12-13 13:03:35 -080099 // Since the default client fails to open anything,
100 // APM should indicate that the initialization didn't succeed.
Mikhail Naganovad3f8a12017-12-12 13:24:23 -0800101 ASSERT_EQ(NO_INIT, manager.initialize());
Mikhail Naganovbcbcb1b2017-12-13 13:03:35 -0800102 ASSERT_EQ(NO_INIT, manager.initCheck());
103}
104
Mikhail Naganov946c0032020-10-21 13:04:58 -0700105// Verifies that a failure while loading a config doesn't leave
106// APM config in a "dirty" state. Since AudioPolicyConfig object
107// is a proxy for the data hosted by APM, it isn't possible
108// to "deep copy" it, and thus we have to test its elements
109// individually.
110TEST(AudioPolicyManagerTestInit, ConfigLoadingIsTransactional) {
111 AudioPolicyTestClient client;
112 AudioPolicyTestManager manager(&client);
113 ASSERT_TRUE(manager.getConfig().getHwModules().isEmpty());
114 ASSERT_TRUE(manager.getConfig().getInputDevices().isEmpty());
115 ASSERT_TRUE(manager.getConfig().getOutputDevices().isEmpty());
116 status_t status = deserializeAudioPolicyFile(
117 (base::GetExecutableDirectory() +
118 "/test_invalid_audio_policy_configuration.xml").c_str(),
119 &manager.getConfig());
120 ASSERT_NE(NO_ERROR, status);
121 EXPECT_TRUE(manager.getConfig().getHwModules().isEmpty());
122 EXPECT_TRUE(manager.getConfig().getInputDevices().isEmpty());
123 EXPECT_TRUE(manager.getConfig().getOutputDevices().isEmpty());
124 status = deserializeAudioPolicyFile(
125 (base::GetExecutableDirectory() + "/test_audio_policy_configuration.xml").c_str(),
126 &manager.getConfig());
127 ASSERT_EQ(NO_ERROR, status);
128 EXPECT_FALSE(manager.getConfig().getHwModules().isEmpty());
129 EXPECT_FALSE(manager.getConfig().getInputDevices().isEmpty());
130 EXPECT_FALSE(manager.getConfig().getOutputDevices().isEmpty());
131}
132
Mikhail Naganovbcbcb1b2017-12-13 13:03:35 -0800133
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800134class PatchCountCheck {
135 public:
136 explicit PatchCountCheck(AudioPolicyManagerTestClient *client)
137 : mClient{client},
138 mInitialCount{mClient->getActivePatchesCount()} {}
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800139 int deltaFromSnapshot() const {
140 size_t currentCount = mClient->getActivePatchesCount();
141 if (mInitialCount <= currentCount) {
142 return currentCount - mInitialCount;
143 } else {
144 return -(static_cast<int>(mInitialCount - currentCount));
145 }
146 }
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800147 private:
148 const AudioPolicyManagerTestClient *mClient;
149 const size_t mInitialCount;
150};
151
Mikhail Naganov04a86632017-12-15 18:01:42 -0800152class AudioPolicyManagerTest : public testing::Test {
153 protected:
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800154 void SetUp() override;
155 void TearDown() override;
jiabin7c0205e2019-09-05 10:26:04 -0700156 virtual void SetUpManagerConfig();
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800157
158 void dumpToLog();
Mikhail Naganov0756bbf2019-09-06 13:53:26 -0700159 // When explicit routing is needed, selectedDeviceId needs to be set as the wanted port
160 // id. Otherwise, selectedDeviceId needs to be initialized as AUDIO_PORT_HANDLE_NONE.
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800161 void getOutputForAttr(
162 audio_port_handle_t *selectedDeviceId,
163 audio_format_t format,
Mikhail Naganov55773032020-10-01 15:08:13 -0700164 audio_channel_mask_t channelMask,
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800165 int sampleRate,
166 audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE,
Mikhail Naganov0756bbf2019-09-06 13:53:26 -0700167 audio_io_handle_t *output = nullptr,
jiabinf4eb15a2019-08-28 15:31:47 -0700168 audio_port_handle_t *portId = nullptr,
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +0200169 audio_attributes_t attr = {},
jiabin3ff8d7d2022-12-13 06:27:44 +0000170 audio_session_t session = AUDIO_SESSION_NONE,
jiabin5eaf0962022-12-20 20:11:38 +0000171 int uid = 0,
172 bool* isBitPerfect = nullptr);
jiabinf4eb15a2019-08-28 15:31:47 -0700173 void getInputForAttr(
174 const audio_attributes_t &attr,
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +0200175 audio_session_t session,
jiabinf4eb15a2019-08-28 15:31:47 -0700176 audio_unique_id_t riid,
177 audio_port_handle_t *selectedDeviceId,
178 audio_format_t format,
Mikhail Naganov55773032020-10-01 15:08:13 -0700179 audio_channel_mask_t channelMask,
jiabinf4eb15a2019-08-28 15:31:47 -0700180 int sampleRate,
181 audio_input_flags_t flags = AUDIO_INPUT_FLAG_NONE,
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800182 audio_port_handle_t *portId = nullptr);
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800183 PatchCountCheck snapshotPatchCount() { return PatchCountCheck(mClient.get()); }
Mikhail Naganov04a86632017-12-15 18:01:42 -0800184
Mikhail Naganov0805de12022-02-15 23:00:07 +0000185 void getAudioPorts(audio_port_type_t type, audio_port_role_t role,
186 std::vector<audio_port_v7>* ports);
Mikhail Naganovd0e2c742020-03-25 15:59:59 -0700187 // Tries to find a device port. If 'foundPort' isn't nullptr,
188 // will generate a failure if the port hasn't been found.
189 bool findDevicePort(audio_port_role_t role, audio_devices_t deviceType,
jiabin19cdba52020-11-24 11:28:58 -0800190 const std::string &address, audio_port_v7 *foundPort);
jiabin7c0205e2019-09-05 10:26:04 -0700191 static audio_port_handle_t getDeviceIdFromPatch(const struct audio_patch* patch);
Kriti Dangef6be8f2020-11-05 11:58:19 +0100192 virtual AudioPolicyManagerTestClient* getClient() { return new AudioPolicyManagerTestClient; }
jiabinf4eb15a2019-08-28 15:31:47 -0700193
Mikhail Naganov04a86632017-12-15 18:01:42 -0800194 std::unique_ptr<AudioPolicyManagerTestClient> mClient;
195 std::unique_ptr<AudioPolicyTestManager> mManager;
Dean Wheatleyd082f472022-02-04 11:10:48 +1100196
197 const uint32_t k48000SamplingRate = 48000;
Mikhail Naganov04a86632017-12-15 18:01:42 -0800198};
199
200void AudioPolicyManagerTest::SetUp() {
Kriti Dangef6be8f2020-11-05 11:58:19 +0100201 mClient.reset(getClient());
Mikhail Naganov04a86632017-12-15 18:01:42 -0800202 mManager.reset(new AudioPolicyTestManager(mClient.get()));
Mikhail Naganovd4c21aa2021-10-05 15:10:16 -0700203 ASSERT_NO_FATAL_FAILURE(SetUpManagerConfig()); // Subclasses may want to customize the config.
Mikhail Naganov04a86632017-12-15 18:01:42 -0800204 ASSERT_EQ(NO_ERROR, mManager->initialize());
205 ASSERT_EQ(NO_ERROR, mManager->initCheck());
Mikhail Naganovad3f8a12017-12-12 13:24:23 -0800206}
Mikhail Naganov04a86632017-12-15 18:01:42 -0800207
208void AudioPolicyManagerTest::TearDown() {
209 mManager.reset();
210 mClient.reset();
211}
212
jiabin7c0205e2019-09-05 10:26:04 -0700213void AudioPolicyManagerTest::SetUpManagerConfig() {
214 mManager->getConfig().setDefault();
215}
216
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800217void AudioPolicyManagerTest::dumpToLog() {
Mikhail Naganov21b43362018-06-04 10:37:09 -0700218 int pipefd[2];
219 ASSERT_NE(-1, pipe(pipefd));
220 pid_t cpid = fork();
221 ASSERT_NE(-1, cpid);
222 if (cpid == 0) {
223 // Child process reads from the pipe and logs.
224 close(pipefd[1]);
225 std::string line;
226 char buf;
227 while (read(pipefd[0], &buf, sizeof(buf)) > 0) {
228 if (buf != '\n') {
229 line += buf;
230 } else {
231 ALOGI("%s", line.c_str());
232 line = "";
233 }
234 }
235 if (!line.empty()) ALOGI("%s", line.c_str());
236 close(pipefd[0]);
237 _exit(EXIT_SUCCESS);
238 } else {
239 // Parent does the dump and checks the status code.
240 close(pipefd[0]);
241 ASSERT_EQ(NO_ERROR, mManager->dump(pipefd[1]));
242 close(pipefd[1]);
243 wait(NULL); // Wait for the child to exit.
244 }
245}
246
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800247void AudioPolicyManagerTest::getOutputForAttr(
248 audio_port_handle_t *selectedDeviceId,
249 audio_format_t format,
Mikhail Naganov55773032020-10-01 15:08:13 -0700250 audio_channel_mask_t channelMask,
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800251 int sampleRate,
252 audio_output_flags_t flags,
Mikhail Naganov0756bbf2019-09-06 13:53:26 -0700253 audio_io_handle_t *output,
jiabinf4eb15a2019-08-28 15:31:47 -0700254 audio_port_handle_t *portId,
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +0200255 audio_attributes_t attr,
jiabin3ff8d7d2022-12-13 06:27:44 +0000256 audio_session_t session,
jiabin5eaf0962022-12-20 20:11:38 +0000257 int uid,
258 bool* isBitPerfect) {
Mikhail Naganov0756bbf2019-09-06 13:53:26 -0700259 audio_io_handle_t localOutput;
260 if (!output) output = &localOutput;
261 *output = AUDIO_IO_HANDLE_NONE;
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800262 audio_stream_type_t stream = AUDIO_STREAM_DEFAULT;
263 audio_config_t config = AUDIO_CONFIG_INITIALIZER;
264 config.sample_rate = sampleRate;
265 config.channel_mask = channelMask;
266 config.format = format;
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800267 audio_port_handle_t localPortId;
268 if (!portId) portId = &localPortId;
269 *portId = AUDIO_PORT_HANDLE_NONE;
Eric Laurent8a1095a2019-11-08 14:44:16 -0800270 AudioPolicyInterface::output_type_t outputType;
Eric Laurentb0a7bc92022-04-05 15:06:08 +0200271 bool isSpatialized;
jiabin5eaf0962022-12-20 20:11:38 +0000272 bool isBitPerfectInternal;
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000273 // TODO b/182392769: use attribution source util
274 AttributionSourceState attributionSource = AttributionSourceState();
jiabin3ff8d7d2022-12-13 06:27:44 +0000275 attributionSource.uid = uid;
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000276 attributionSource.token = sp<BBinder>::make();
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800277 ASSERT_EQ(OK, mManager->getOutputForAttr(
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +0200278 &attr, output, session, &stream, attributionSource, &config, &flags,
jiabin5eaf0962022-12-20 20:11:38 +0000279 selectedDeviceId, portId, {}, &outputType, &isSpatialized,
280 isBitPerfect == nullptr ? &isBitPerfectInternal : isBitPerfect));
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800281 ASSERT_NE(AUDIO_PORT_HANDLE_NONE, *portId);
Mikhail Naganov0756bbf2019-09-06 13:53:26 -0700282 ASSERT_NE(AUDIO_IO_HANDLE_NONE, *output);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800283}
284
jiabinf4eb15a2019-08-28 15:31:47 -0700285void AudioPolicyManagerTest::getInputForAttr(
286 const audio_attributes_t &attr,
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +0200287 const audio_session_t session,
jiabinf4eb15a2019-08-28 15:31:47 -0700288 audio_unique_id_t riid,
289 audio_port_handle_t *selectedDeviceId,
290 audio_format_t format,
Mikhail Naganov55773032020-10-01 15:08:13 -0700291 audio_channel_mask_t channelMask,
jiabinf4eb15a2019-08-28 15:31:47 -0700292 int sampleRate,
293 audio_input_flags_t flags,
294 audio_port_handle_t *portId) {
295 audio_io_handle_t input = AUDIO_PORT_HANDLE_NONE;
296 audio_config_base_t config = AUDIO_CONFIG_BASE_INITIALIZER;
297 config.sample_rate = sampleRate;
298 config.channel_mask = channelMask;
299 config.format = format;
jiabinf4eb15a2019-08-28 15:31:47 -0700300 audio_port_handle_t localPortId;
301 if (!portId) portId = &localPortId;
302 *portId = AUDIO_PORT_HANDLE_NONE;
303 AudioPolicyInterface::input_type_t inputType;
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000304 // TODO b/182392769: use attribution source util
305 AttributionSourceState attributionSource = AttributionSourceState();
306 attributionSource.uid = 0;
307 attributionSource.token = sp<BBinder>::make();
jiabinf4eb15a2019-08-28 15:31:47 -0700308 ASSERT_EQ(OK, mManager->getInputForAttr(
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +0200309 &attr, &input, riid, session, attributionSource, &config, flags,
jiabinf4eb15a2019-08-28 15:31:47 -0700310 selectedDeviceId, &inputType, portId));
311 ASSERT_NE(AUDIO_PORT_HANDLE_NONE, *portId);
312}
313
Mikhail Naganov0805de12022-02-15 23:00:07 +0000314void AudioPolicyManagerTest::getAudioPorts(audio_port_type_t type, audio_port_role_t role,
315 std::vector<audio_port_v7>* ports) {
jiabinf4eb15a2019-08-28 15:31:47 -0700316 uint32_t numPorts = 0;
317 uint32_t generation1;
318 status_t ret;
319
Mikhail Naganov0805de12022-02-15 23:00:07 +0000320 ret = mManager->listAudioPorts(role, type, &numPorts, nullptr, &generation1);
321 ASSERT_EQ(NO_ERROR, ret) << "mManager->listAudioPorts returned error";
jiabinf4eb15a2019-08-28 15:31:47 -0700322
323 uint32_t generation2;
Mikhail Naganov0805de12022-02-15 23:00:07 +0000324 ports->resize(numPorts);
325 ret = mManager->listAudioPorts(role, type, &numPorts, ports->data(), &generation2);
326 ASSERT_EQ(NO_ERROR, ret) << "mManager->listAudioPorts returned error";
327 ASSERT_EQ(generation1, generation2) << "Generations changed during ports retrieval";
328}
329
330bool AudioPolicyManagerTest::findDevicePort(audio_port_role_t role,
331 audio_devices_t deviceType, const std::string &address, audio_port_v7 *foundPort) {
332 std::vector<audio_port_v7> ports;
333 getAudioPorts(AUDIO_PORT_TYPE_DEVICE, role, &ports);
Mikhail Naganovd0e2c742020-03-25 15:59:59 -0700334 if (HasFailure()) return false;
jiabinf4eb15a2019-08-28 15:31:47 -0700335
336 for (const auto &port : ports) {
337 if (port.role == role && port.ext.device.type == deviceType &&
338 (strncmp(port.ext.device.address, address.c_str(),
339 AUDIO_DEVICE_MAX_ADDRESS_LEN) == 0)) {
Mikhail Naganovd0e2c742020-03-25 15:59:59 -0700340 if (foundPort) *foundPort = port;
341 return true;
jiabinf4eb15a2019-08-28 15:31:47 -0700342 }
343 }
Mikhail Naganovd0e2c742020-03-25 15:59:59 -0700344 if (foundPort) {
345 ADD_FAILURE() << "Device port with role " << role << " and address "
346 << address << " not found";
347 }
348 return false;
jiabinf4eb15a2019-08-28 15:31:47 -0700349}
350
jiabin7c0205e2019-09-05 10:26:04 -0700351audio_port_handle_t AudioPolicyManagerTest::getDeviceIdFromPatch(
352 const struct audio_patch* patch) {
353 // The logic here is the same as the one in AudioIoDescriptor.
354 // Note this function is aim to get routed device id for test.
355 // In that case, device to device patch is not expected here.
356 if (patch->num_sources != 0 && patch->num_sinks != 0) {
357 if (patch->sources[0].type == AUDIO_PORT_TYPE_MIX) {
358 return patch->sinks[0].id;
359 } else {
360 return patch->sources[0].id;
361 }
362 }
363 return AUDIO_PORT_HANDLE_NONE;
364}
365
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800366
367TEST_F(AudioPolicyManagerTest, InitSuccess) {
368 // SetUp must finish with no assertions.
369}
370
371TEST_F(AudioPolicyManagerTest, Dump) {
372 dumpToLog();
373}
374
Mikhail Naganov04a86632017-12-15 18:01:42 -0800375TEST_F(AudioPolicyManagerTest, CreateAudioPatchFailure) {
376 audio_patch patch{};
377 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800378 const PatchCountCheck patchCount = snapshotPatchCount();
Mikhail Naganov04a86632017-12-15 18:01:42 -0800379 ASSERT_EQ(BAD_VALUE, mManager->createAudioPatch(nullptr, &handle, 0));
380 ASSERT_EQ(BAD_VALUE, mManager->createAudioPatch(&patch, nullptr, 0));
381 ASSERT_EQ(BAD_VALUE, mManager->createAudioPatch(&patch, &handle, 0));
382 patch.num_sources = AUDIO_PATCH_PORTS_MAX + 1;
383 patch.num_sinks = 1;
384 ASSERT_EQ(BAD_VALUE, mManager->createAudioPatch(&patch, &handle, 0));
385 patch.num_sources = 1;
386 patch.num_sinks = AUDIO_PATCH_PORTS_MAX + 1;
387 ASSERT_EQ(BAD_VALUE, mManager->createAudioPatch(&patch, &handle, 0));
388 patch.num_sources = 2;
389 patch.num_sinks = 1;
390 ASSERT_EQ(INVALID_OPERATION, mManager->createAudioPatch(&patch, &handle, 0));
391 patch = {};
392 patch.num_sources = 1;
393 patch.sources[0].role = AUDIO_PORT_ROLE_SINK;
394 patch.num_sinks = 1;
395 patch.sinks[0].role = AUDIO_PORT_ROLE_SINK;
396 ASSERT_EQ(INVALID_OPERATION, mManager->createAudioPatch(&patch, &handle, 0));
397 patch = {};
398 patch.num_sources = 1;
399 patch.sources[0].role = AUDIO_PORT_ROLE_SOURCE;
400 patch.num_sinks = 1;
401 patch.sinks[0].role = AUDIO_PORT_ROLE_SOURCE;
402 ASSERT_EQ(INVALID_OPERATION, mManager->createAudioPatch(&patch, &handle, 0));
403 // Verify that the handle is left unchanged.
404 ASSERT_EQ(AUDIO_PATCH_HANDLE_NONE, handle);
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800405 ASSERT_EQ(0, patchCount.deltaFromSnapshot());
Mikhail Naganov04a86632017-12-15 18:01:42 -0800406}
407
408TEST_F(AudioPolicyManagerTest, CreateAudioPatchFromMix) {
Mikhail Naganov04a86632017-12-15 18:01:42 -0800409 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
410 uid_t uid = 42;
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800411 const PatchCountCheck patchCount = snapshotPatchCount();
Mikhail Naganovc0d04982020-03-02 21:02:28 +0000412 ASSERT_FALSE(mManager->getAvailableInputDevices().isEmpty());
Mikhail Naganovdc769682018-05-04 15:34:08 -0700413 PatchBuilder patchBuilder;
Mikhail Naganovc0d04982020-03-02 21:02:28 +0000414 patchBuilder.addSource(mManager->getAvailableInputDevices()[0]).
Mikhail Naganovdc769682018-05-04 15:34:08 -0700415 addSink(mManager->getConfig().getDefaultOutputDevice());
416 ASSERT_EQ(NO_ERROR, mManager->createAudioPatch(patchBuilder.patch(), &handle, uid));
Mikhail Naganov04a86632017-12-15 18:01:42 -0800417 ASSERT_NE(AUDIO_PATCH_HANDLE_NONE, handle);
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800418 ASSERT_EQ(1, patchCount.deltaFromSnapshot());
Mikhail Naganov04a86632017-12-15 18:01:42 -0800419}
420
421// TODO: Add patch creation tests that involve already existing patch
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800422
Michael Chan6fb34492020-12-08 15:44:49 +1100423enum
424{
425 MSD_AUDIO_PATCH_COUNT_NUM_AUDIO_PATCHES_INDEX = 0,
426 MSD_AUDIO_PATCH_COUNT_NAME_INDEX = 1
427};
428using MsdAudioPatchCountSpecification = std::tuple<size_t, std::string>;
429
430class AudioPolicyManagerTestMsd : public AudioPolicyManagerTest,
431 public ::testing::WithParamInterface<MsdAudioPatchCountSpecification> {
432 public:
433 AudioPolicyManagerTestMsd();
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800434 protected:
jiabin7c0205e2019-09-05 10:26:04 -0700435 void SetUpManagerConfig() override;
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800436 void TearDown() override;
Dorin Drimus94d94412022-02-02 09:05:02 +0100437 AudioProfileVector getDirectProfilesForAttributes(const audio_attributes_t& attr);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800438
439 sp<DeviceDescriptor> mMsdOutputDevice;
440 sp<DeviceDescriptor> mMsdInputDevice;
Eric Laurent74c38dc2020-12-23 18:19:44 +0100441 sp<DeviceDescriptor> mDefaultOutputDevice;
Michael Chan6fb34492020-12-08 15:44:49 +1100442
443 const size_t mExpectedAudioPatchCount;
444 sp<DeviceDescriptor> mSpdifDevice;
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100445
446 sp<DeviceDescriptor> mHdmiInputDevice;
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800447};
448
Michael Chan6fb34492020-12-08 15:44:49 +1100449AudioPolicyManagerTestMsd::AudioPolicyManagerTestMsd()
450 : mExpectedAudioPatchCount(std::get<MSD_AUDIO_PATCH_COUNT_NUM_AUDIO_PATCHES_INDEX>(
451 GetParam())) {}
452
453INSTANTIATE_TEST_CASE_P(
454 MsdAudioPatchCount,
455 AudioPolicyManagerTestMsd,
456 ::testing::Values(
457 MsdAudioPatchCountSpecification(1u, "single"),
458 MsdAudioPatchCountSpecification(2u, "dual")
459 ),
460 [](const ::testing::TestParamInfo<MsdAudioPatchCountSpecification> &info) {
461 return std::get<MSD_AUDIO_PATCH_COUNT_NAME_INDEX>(info.param); }
462);
463
jiabin7c0205e2019-09-05 10:26:04 -0700464void AudioPolicyManagerTestMsd::SetUpManagerConfig() {
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800465 // TODO: Consider using Serializer to load part of the config from a string.
Mikhail Naganovd4c21aa2021-10-05 15:10:16 -0700466 ASSERT_NO_FATAL_FAILURE(AudioPolicyManagerTest::SetUpManagerConfig());
jiabin7c0205e2019-09-05 10:26:04 -0700467 AudioPolicyConfig& config = mManager->getConfig();
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800468 mMsdOutputDevice = new DeviceDescriptor(AUDIO_DEVICE_OUT_BUS);
469 sp<AudioProfile> pcmOutputProfile = new AudioProfile(
Dean Wheatleyd082f472022-02-04 11:10:48 +1100470 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO, k48000SamplingRate);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800471 sp<AudioProfile> ac3OutputProfile = new AudioProfile(
Dean Wheatleyd082f472022-02-04 11:10:48 +1100472 AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1, k48000SamplingRate);
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100473 sp<AudioProfile> iec958OutputProfile = new AudioProfile(
Dean Wheatley16809da2022-12-09 14:55:46 +1100474 AUDIO_FORMAT_IEC60958, AUDIO_CHANNEL_INDEX_MASK_24, k48000SamplingRate);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800475 mMsdOutputDevice->addAudioProfile(pcmOutputProfile);
476 mMsdOutputDevice->addAudioProfile(ac3OutputProfile);
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100477 mMsdOutputDevice->addAudioProfile(iec958OutputProfile);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800478 mMsdInputDevice = new DeviceDescriptor(AUDIO_DEVICE_IN_BUS);
479 // Match output profile from AudioPolicyConfig::setDefault.
480 sp<AudioProfile> pcmInputProfile = new AudioProfile(
481 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO, 44100);
482 mMsdInputDevice->addAudioProfile(pcmInputProfile);
Mikhail Naganovc0d04982020-03-02 21:02:28 +0000483 config.addDevice(mMsdOutputDevice);
484 config.addDevice(mMsdInputDevice);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800485
Michael Chan6fb34492020-12-08 15:44:49 +1100486 if (mExpectedAudioPatchCount == 2) {
487 // Add SPDIF device with PCM output profile as a second device for dual MSD audio patching.
488 mSpdifDevice = new DeviceDescriptor(AUDIO_DEVICE_OUT_SPDIF);
489 mSpdifDevice->addAudioProfile(pcmOutputProfile);
490 config.addDevice(mSpdifDevice);
491
492 sp<OutputProfile> spdifOutputProfile = new OutputProfile("spdif output");
493 spdifOutputProfile->addAudioProfile(pcmOutputProfile);
494 spdifOutputProfile->addSupportedDevice(mSpdifDevice);
495 config.getHwModules().getModuleFromName(AUDIO_HARDWARE_MODULE_ID_PRIMARY)->
496 addOutputProfile(spdifOutputProfile);
497 }
498
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800499 sp<HwModule> msdModule = new HwModule(AUDIO_HARDWARE_MODULE_ID_MSD, 2 /*halVersionMajor*/);
jiabin7c0205e2019-09-05 10:26:04 -0700500 HwModuleCollection modules = config.getHwModules();
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800501 modules.add(msdModule);
jiabin7c0205e2019-09-05 10:26:04 -0700502 config.setHwModules(modules);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800503
jiabin5740f082019-08-19 15:08:30 -0700504 sp<OutputProfile> msdOutputProfile = new OutputProfile("msd input");
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800505 msdOutputProfile->addAudioProfile(pcmOutputProfile);
506 msdOutputProfile->addSupportedDevice(mMsdOutputDevice);
507 msdModule->addOutputProfile(msdOutputProfile);
jiabin5740f082019-08-19 15:08:30 -0700508 sp<OutputProfile> msdCompressedOutputProfile = new OutputProfile("msd compressed input");
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800509 msdCompressedOutputProfile->addAudioProfile(ac3OutputProfile);
510 msdCompressedOutputProfile->setFlags(
511 AUDIO_OUTPUT_FLAG_DIRECT | AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD |
512 AUDIO_OUTPUT_FLAG_NON_BLOCKING);
513 msdCompressedOutputProfile->addSupportedDevice(mMsdOutputDevice);
514 msdModule->addOutputProfile(msdCompressedOutputProfile);
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100515 sp<OutputProfile> msdIec958OutputProfile = new OutputProfile("msd iec958 input");
516 msdIec958OutputProfile->addAudioProfile(iec958OutputProfile);
517 msdIec958OutputProfile->setFlags(AUDIO_OUTPUT_FLAG_DIRECT);
518 msdIec958OutputProfile->addSupportedDevice(mMsdOutputDevice);
519 msdModule->addOutputProfile(msdIec958OutputProfile);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800520
jiabin5740f082019-08-19 15:08:30 -0700521 sp<InputProfile> msdInputProfile = new InputProfile("msd output");
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800522 msdInputProfile->addAudioProfile(pcmInputProfile);
523 msdInputProfile->addSupportedDevice(mMsdInputDevice);
524 msdModule->addInputProfile(msdInputProfile);
525
526 // Add a profile with another encoding to the default device to test routing
527 // of streams that are not supported by MSD.
528 sp<AudioProfile> dtsOutputProfile = new AudioProfile(
Dean Wheatleyd082f472022-02-04 11:10:48 +1100529 AUDIO_FORMAT_DTS, AUDIO_CHANNEL_OUT_5POINT1, k48000SamplingRate);
jiabin7c0205e2019-09-05 10:26:04 -0700530 config.getDefaultOutputDevice()->addAudioProfile(dtsOutputProfile);
jiabin5740f082019-08-19 15:08:30 -0700531 sp<OutputProfile> primaryEncodedOutputProfile = new OutputProfile("encoded");
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800532 primaryEncodedOutputProfile->addAudioProfile(dtsOutputProfile);
533 primaryEncodedOutputProfile->setFlags(AUDIO_OUTPUT_FLAG_DIRECT);
jiabin7c0205e2019-09-05 10:26:04 -0700534 primaryEncodedOutputProfile->addSupportedDevice(config.getDefaultOutputDevice());
535 config.getHwModules().getModuleFromName(AUDIO_HARDWARE_MODULE_ID_PRIMARY)->
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800536 addOutputProfile(primaryEncodedOutputProfile);
Eric Laurent74c38dc2020-12-23 18:19:44 +0100537
538 mDefaultOutputDevice = config.getDefaultOutputDevice();
Michael Chan6fb34492020-12-08 15:44:49 +1100539 if (mExpectedAudioPatchCount == 2) {
540 mSpdifDevice->addAudioProfile(dtsOutputProfile);
541 primaryEncodedOutputProfile->addSupportedDevice(mSpdifDevice);
542 }
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100543
544 // Add HDMI input device with IEC60958 profile for HDMI in -> MSD patching.
545 mHdmiInputDevice = new DeviceDescriptor(AUDIO_DEVICE_IN_HDMI);
546 sp<AudioProfile> iec958InputProfile = new AudioProfile(
Dean Wheatley16809da2022-12-09 14:55:46 +1100547 AUDIO_FORMAT_IEC60958, AUDIO_CHANNEL_INDEX_MASK_24, k48000SamplingRate);
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100548 mHdmiInputDevice->addAudioProfile(iec958InputProfile);
549 config.addDevice(mHdmiInputDevice);
550 sp<InputProfile> hdmiInputProfile = new InputProfile("hdmi input");
551 hdmiInputProfile->addAudioProfile(iec958InputProfile);
552 hdmiInputProfile->setFlags(AUDIO_INPUT_FLAG_DIRECT);
553 hdmiInputProfile->addSupportedDevice(mHdmiInputDevice);
554 config.getHwModules().getModuleFromName(AUDIO_HARDWARE_MODULE_ID_PRIMARY)->
555 addInputProfile(hdmiInputProfile);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800556}
557
558void AudioPolicyManagerTestMsd::TearDown() {
559 mMsdOutputDevice.clear();
560 mMsdInputDevice.clear();
Eric Laurent74c38dc2020-12-23 18:19:44 +0100561 mDefaultOutputDevice.clear();
Michael Chan6fb34492020-12-08 15:44:49 +1100562 mSpdifDevice.clear();
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100563 mHdmiInputDevice.clear();
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800564 AudioPolicyManagerTest::TearDown();
565}
566
Dorin Drimus94d94412022-02-02 09:05:02 +0100567AudioProfileVector AudioPolicyManagerTestMsd::getDirectProfilesForAttributes(
568 const audio_attributes_t& attr) {
569 AudioProfileVector audioProfilesVector;
570 mManager->getDirectProfilesForAttributes(&attr, audioProfilesVector);
571 return audioProfilesVector;
572}
573
Michael Chan6fb34492020-12-08 15:44:49 +1100574TEST_P(AudioPolicyManagerTestMsd, InitSuccess) {
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800575 ASSERT_TRUE(mMsdOutputDevice);
576 ASSERT_TRUE(mMsdInputDevice);
Eric Laurent74c38dc2020-12-23 18:19:44 +0100577 ASSERT_TRUE(mDefaultOutputDevice);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800578}
579
Michael Chan6fb34492020-12-08 15:44:49 +1100580TEST_P(AudioPolicyManagerTestMsd, Dump) {
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800581 dumpToLog();
582}
583
Michael Chan6fb34492020-12-08 15:44:49 +1100584TEST_P(AudioPolicyManagerTestMsd, PatchCreationOnSetForceUse) {
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800585 const PatchCountCheck patchCount = snapshotPatchCount();
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800586 mManager->setForceUse(AUDIO_POLICY_FORCE_FOR_ENCODED_SURROUND,
587 AUDIO_POLICY_FORCE_ENCODED_SURROUND_ALWAYS);
Michael Chan6fb34492020-12-08 15:44:49 +1100588 ASSERT_EQ(mExpectedAudioPatchCount, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800589}
590
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100591TEST_P(AudioPolicyManagerTestMsd, PatchCreationSetReleaseMsdOutputPatches) {
Michael Chan6fb34492020-12-08 15:44:49 +1100592 const PatchCountCheck patchCount = snapshotPatchCount();
593 DeviceVector devices = mManager->getAvailableOutputDevices();
594 // Remove MSD output device to avoid patching to itself
595 devices.remove(mMsdOutputDevice);
596 ASSERT_EQ(mExpectedAudioPatchCount, devices.size());
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100597 mManager->setMsdOutputPatches(&devices);
Michael Chan6fb34492020-12-08 15:44:49 +1100598 ASSERT_EQ(mExpectedAudioPatchCount, patchCount.deltaFromSnapshot());
599 // Dual patch: exercise creating one new audio patch and reusing another existing audio patch.
600 DeviceVector singleDevice(devices[0]);
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100601 mManager->releaseMsdOutputPatches(singleDevice);
Michael Chan6fb34492020-12-08 15:44:49 +1100602 ASSERT_EQ(mExpectedAudioPatchCount - 1, patchCount.deltaFromSnapshot());
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100603 mManager->setMsdOutputPatches(&devices);
Michael Chan6fb34492020-12-08 15:44:49 +1100604 ASSERT_EQ(mExpectedAudioPatchCount, patchCount.deltaFromSnapshot());
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100605 mManager->releaseMsdOutputPatches(devices);
Michael Chan6fb34492020-12-08 15:44:49 +1100606 ASSERT_EQ(0, patchCount.deltaFromSnapshot());
607}
608
609TEST_P(AudioPolicyManagerTestMsd, GetOutputForAttrEncodedRoutesToMsd) {
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800610 const PatchCountCheck patchCount = snapshotPatchCount();
jiabin7c0205e2019-09-05 10:26:04 -0700611 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
Dean Wheatleyd082f472022-02-04 11:10:48 +1100612 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1,
613 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT);
Eric Laurent74c38dc2020-12-23 18:19:44 +0100614 ASSERT_EQ(selectedDeviceId, mDefaultOutputDevice->getId());
Michael Chan6fb34492020-12-08 15:44:49 +1100615 ASSERT_EQ(mExpectedAudioPatchCount, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800616}
617
Michael Chan6fb34492020-12-08 15:44:49 +1100618TEST_P(AudioPolicyManagerTestMsd, GetOutputForAttrPcmRoutesToMsd) {
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800619 const PatchCountCheck patchCount = snapshotPatchCount();
jiabin7c0205e2019-09-05 10:26:04 -0700620 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800621 getOutputForAttr(&selectedDeviceId,
Dean Wheatleyd082f472022-02-04 11:10:48 +1100622 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO, k48000SamplingRate);
Eric Laurent74c38dc2020-12-23 18:19:44 +0100623 ASSERT_EQ(selectedDeviceId, mDefaultOutputDevice->getId());
Michael Chan6fb34492020-12-08 15:44:49 +1100624 ASSERT_EQ(mExpectedAudioPatchCount, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800625}
626
Michael Chan6fb34492020-12-08 15:44:49 +1100627TEST_P(AudioPolicyManagerTestMsd, GetOutputForAttrEncodedPlusPcmRoutesToMsd) {
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800628 const PatchCountCheck patchCount = snapshotPatchCount();
jiabin7c0205e2019-09-05 10:26:04 -0700629 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
Dean Wheatleyd082f472022-02-04 11:10:48 +1100630 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1,
631 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT);
Eric Laurent74c38dc2020-12-23 18:19:44 +0100632 ASSERT_EQ(selectedDeviceId, mDefaultOutputDevice->getId());
Michael Chan6fb34492020-12-08 15:44:49 +1100633 ASSERT_EQ(mExpectedAudioPatchCount, patchCount.deltaFromSnapshot());
634 selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800635 getOutputForAttr(&selectedDeviceId,
Dean Wheatleyd082f472022-02-04 11:10:48 +1100636 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO, k48000SamplingRate);
Eric Laurent74c38dc2020-12-23 18:19:44 +0100637 ASSERT_EQ(selectedDeviceId, mDefaultOutputDevice->getId());
Michael Chan6fb34492020-12-08 15:44:49 +1100638 ASSERT_EQ(mExpectedAudioPatchCount, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800639}
640
Michael Chan6fb34492020-12-08 15:44:49 +1100641TEST_P(AudioPolicyManagerTestMsd, GetOutputForAttrUnsupportedFormatBypassesMsd) {
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800642 const PatchCountCheck patchCount = snapshotPatchCount();
jiabin7c0205e2019-09-05 10:26:04 -0700643 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
Dean Wheatleyd082f472022-02-04 11:10:48 +1100644 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_DTS, AUDIO_CHANNEL_OUT_5POINT1,
645 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800646 ASSERT_NE(selectedDeviceId, mMsdOutputDevice->getId());
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800647 ASSERT_EQ(0, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800648}
649
Michael Chan6fb34492020-12-08 15:44:49 +1100650TEST_P(AudioPolicyManagerTestMsd, GetOutputForAttrFormatSwitching) {
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800651 // Switch between formats that are supported and not supported by MSD.
652 {
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800653 const PatchCountCheck patchCount = snapshotPatchCount();
jiabin7c0205e2019-09-05 10:26:04 -0700654 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
655 audio_port_handle_t portId;
Dean Wheatleyd082f472022-02-04 11:10:48 +1100656 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1,
657 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, nullptr /*output*/, &portId);
Eric Laurent74c38dc2020-12-23 18:19:44 +0100658 ASSERT_EQ(selectedDeviceId, mDefaultOutputDevice->getId());
Michael Chan6fb34492020-12-08 15:44:49 +1100659 ASSERT_EQ(mExpectedAudioPatchCount, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800660 mManager->releaseOutput(portId);
Michael Chan6fb34492020-12-08 15:44:49 +1100661 ASSERT_EQ(mExpectedAudioPatchCount, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800662 }
663 {
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800664 const PatchCountCheck patchCount = snapshotPatchCount();
jiabin7c0205e2019-09-05 10:26:04 -0700665 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
666 audio_port_handle_t portId;
Dean Wheatleyd082f472022-02-04 11:10:48 +1100667 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_DTS, AUDIO_CHANNEL_OUT_5POINT1,
668 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, nullptr /*output*/, &portId);
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800669 ASSERT_NE(selectedDeviceId, mMsdOutputDevice->getId());
Michael Chan6fb34492020-12-08 15:44:49 +1100670 ASSERT_EQ(-static_cast<int>(mExpectedAudioPatchCount), patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800671 mManager->releaseOutput(portId);
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800672 ASSERT_EQ(0, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800673 }
674 {
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800675 const PatchCountCheck patchCount = snapshotPatchCount();
jiabin7c0205e2019-09-05 10:26:04 -0700676 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
Dean Wheatleyd082f472022-02-04 11:10:48 +1100677 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1,
678 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT);
Eric Laurent74c38dc2020-12-23 18:19:44 +0100679 ASSERT_EQ(selectedDeviceId, mDefaultOutputDevice->getId());
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800680 ASSERT_EQ(0, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800681 }
682}
jiabinf4eb15a2019-08-28 15:31:47 -0700683
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100684TEST_P(AudioPolicyManagerTestMsd, PatchCreationFromHdmiInToMsd) {
685 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
686 uid_t uid = 42;
687 const PatchCountCheck patchCount = snapshotPatchCount();
688 ASSERT_FALSE(mManager->getAvailableInputDevices().isEmpty());
689 PatchBuilder patchBuilder;
690 patchBuilder.
691 addSource(mManager->getAvailableInputDevices().
692 getDevice(AUDIO_DEVICE_IN_HDMI, String8(""), AUDIO_FORMAT_DEFAULT)).
693 addSink(mManager->getAvailableOutputDevices().
694 getDevice(AUDIO_DEVICE_OUT_BUS, String8(""), AUDIO_FORMAT_DEFAULT));
695 ASSERT_EQ(NO_ERROR, mManager->createAudioPatch(patchBuilder.patch(), &handle, uid));
696 ASSERT_NE(AUDIO_PATCH_HANDLE_NONE, handle);
697 AudioPatchCollection patches = mManager->getAudioPatches();
698 sp<AudioPatch> patch = patches.valueFor(handle);
699 ASSERT_EQ(1, patch->mPatch.num_sources);
700 ASSERT_EQ(1, patch->mPatch.num_sinks);
701 ASSERT_EQ(AUDIO_PORT_ROLE_SOURCE, patch->mPatch.sources[0].role);
702 ASSERT_EQ(AUDIO_PORT_ROLE_SINK, patch->mPatch.sinks[0].role);
703 ASSERT_EQ(AUDIO_FORMAT_IEC60958, patch->mPatch.sources[0].format);
704 ASSERT_EQ(AUDIO_FORMAT_IEC60958, patch->mPatch.sinks[0].format);
Dean Wheatley16809da2022-12-09 14:55:46 +1100705 ASSERT_EQ(AUDIO_CHANNEL_INDEX_MASK_24, patch->mPatch.sources[0].channel_mask);
706 ASSERT_EQ(AUDIO_CHANNEL_INDEX_MASK_24, patch->mPatch.sinks[0].channel_mask);
Dean Wheatleyd082f472022-02-04 11:10:48 +1100707 ASSERT_EQ(k48000SamplingRate, patch->mPatch.sources[0].sample_rate);
708 ASSERT_EQ(k48000SamplingRate, patch->mPatch.sinks[0].sample_rate);
Dean Wheatley8bee85a2021-02-10 16:02:23 +1100709 ASSERT_EQ(1, patchCount.deltaFromSnapshot());
710}
711
Dorin Drimus94d94412022-02-02 09:05:02 +0100712TEST_P(AudioPolicyManagerTestMsd, GetDirectProfilesForAttributesWithMsd) {
713 const audio_attributes_t attr = {
714 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_UNKNOWN,
715 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
716
717 // count expected direct profiles for the default device
718 int countDirectProfilesPrimary = 0;
719 const auto& primary = mManager->getConfig().getHwModules()
720 .getModuleFromName(AUDIO_HARDWARE_MODULE_ID_PRIMARY);
721 for (const auto outputProfile : primary->getOutputProfiles()) {
722 if (outputProfile->asAudioPort()->isDirectOutput()) {
723 countDirectProfilesPrimary += outputProfile->asAudioPort()->getAudioProfiles().size();
724 }
725 }
726
727 // count expected direct profiles for the msd device
728 int countDirectProfilesMsd = 0;
729 const auto& msd = mManager->getConfig().getHwModules()
730 .getModuleFromName(AUDIO_HARDWARE_MODULE_ID_MSD);
731 for (const auto outputProfile : msd->getOutputProfiles()) {
732 if (outputProfile->asAudioPort()->isDirectOutput()) {
733 countDirectProfilesMsd += outputProfile->asAudioPort()->getAudioProfiles().size();
734 }
735 }
736
737 // before setting up MSD audio patches we only have the primary hal direct profiles
738 ASSERT_EQ(countDirectProfilesPrimary, getDirectProfilesForAttributes(attr).size());
739
740 DeviceVector outputDevices = mManager->getAvailableOutputDevices();
741 // Remove MSD output device to avoid patching to itself
742 outputDevices.remove(mMsdOutputDevice);
743 mManager->setMsdOutputPatches(&outputDevices);
744
745 // after setting up MSD audio patches the MSD direct profiles are added
746 ASSERT_EQ(countDirectProfilesPrimary + countDirectProfilesMsd,
747 getDirectProfilesForAttributes(attr).size());
748
749 mManager->releaseMsdOutputPatches(outputDevices);
750 // releasing the MSD audio patches gets us back to the primary hal direct profiles only
751 ASSERT_EQ(countDirectProfilesPrimary, getDirectProfilesForAttributes(attr).size());
752}
753
Dorin Drimusecc9f422022-03-09 17:57:40 +0100754TEST_P(AudioPolicyManagerTestMsd, IsDirectPlaybackSupportedWithMsd) {
755 const audio_attributes_t attr = {
756 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_UNKNOWN,
757 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
758
759 audio_config_base_t directConfig = AUDIO_CONFIG_BASE_INITIALIZER;
760 directConfig.format = AUDIO_FORMAT_DTS;
761 directConfig.sample_rate = 48000;
762 directConfig.channel_mask = AUDIO_CHANNEL_OUT_5POINT1;
763
764 audio_config_base_t nonDirectConfig = AUDIO_CONFIG_BASE_INITIALIZER;
765 nonDirectConfig.format = AUDIO_FORMAT_PCM_16_BIT;
766 nonDirectConfig.sample_rate = 48000;
767 nonDirectConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
768
769 audio_config_base_t nonExistentConfig = AUDIO_CONFIG_BASE_INITIALIZER;
770 nonExistentConfig.format = AUDIO_FORMAT_E_AC3;
771 nonExistentConfig.sample_rate = 48000;
772 nonExistentConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
773
774 audio_config_base_t msdDirectConfig1 = AUDIO_CONFIG_BASE_INITIALIZER;
775 msdDirectConfig1.format = AUDIO_FORMAT_AC3;
776 msdDirectConfig1.sample_rate = 48000;
777 msdDirectConfig1.channel_mask = AUDIO_CHANNEL_OUT_5POINT1;
778
779 audio_config_base_t msdDirectConfig2 = AUDIO_CONFIG_BASE_INITIALIZER;
780 msdDirectConfig2.format = AUDIO_FORMAT_IEC60958;
781 msdDirectConfig2.sample_rate = 48000;
Dean Wheatley16809da2022-12-09 14:55:46 +1100782 msdDirectConfig2.channel_mask = AUDIO_CHANNEL_INDEX_MASK_24;
Dorin Drimusecc9f422022-03-09 17:57:40 +0100783
784 audio_config_base_t msdNonDirectConfig = AUDIO_CONFIG_BASE_INITIALIZER;
785 msdNonDirectConfig.format = AUDIO_FORMAT_PCM_16_BIT;
786 msdNonDirectConfig.sample_rate = 96000;
787 msdNonDirectConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
788
789 ASSERT_TRUE(mManager->isDirectOutputSupported(directConfig, attr));
790 ASSERT_FALSE(mManager->isDirectOutputSupported(nonDirectConfig, attr));
791 ASSERT_FALSE(mManager->isDirectOutputSupported(nonExistentConfig, attr));
792 // before setting MSD patches the direct MSD configs return false
793 ASSERT_FALSE(mManager->isDirectOutputSupported(msdDirectConfig1, attr));
794 ASSERT_FALSE(mManager->isDirectOutputSupported(msdDirectConfig2, attr));
795 ASSERT_FALSE(mManager->isDirectOutputSupported(msdNonDirectConfig, attr));
796
797 DeviceVector outputDevices = mManager->getAvailableOutputDevices();
798 // Remove MSD output device to avoid patching to itself
799 outputDevices.remove(mMsdOutputDevice);
800 mManager->setMsdOutputPatches(&outputDevices);
801
802 ASSERT_TRUE(mManager->isDirectOutputSupported(directConfig, attr));
803 ASSERT_FALSE(mManager->isDirectOutputSupported(nonDirectConfig, attr));
804 ASSERT_FALSE(mManager->isDirectOutputSupported(nonExistentConfig, attr));
805 // after setting MSD patches the direct MSD configs return true
806 ASSERT_TRUE(mManager->isDirectOutputSupported(msdDirectConfig1, attr));
807 ASSERT_TRUE(mManager->isDirectOutputSupported(msdDirectConfig2, attr));
808 ASSERT_FALSE(mManager->isDirectOutputSupported(msdNonDirectConfig, attr));
809
810 mManager->releaseMsdOutputPatches(outputDevices);
811
812 ASSERT_TRUE(mManager->isDirectOutputSupported(directConfig, attr));
813 ASSERT_FALSE(mManager->isDirectOutputSupported(nonDirectConfig, attr));
814 ASSERT_FALSE(mManager->isDirectOutputSupported(nonExistentConfig, attr));
815 // AFTER releasing MSD patches the direct MSD configs return false
816 ASSERT_FALSE(mManager->isDirectOutputSupported(msdDirectConfig1, attr));
817 ASSERT_FALSE(mManager->isDirectOutputSupported(msdDirectConfig2, attr));
818 ASSERT_FALSE(mManager->isDirectOutputSupported(msdNonDirectConfig, attr));
819}
820
Dorin Drimusfae3c642022-03-17 18:36:30 +0100821TEST_P(AudioPolicyManagerTestMsd, GetDirectPlaybackSupportWithMsd) {
822 const audio_attributes_t attr = {
823 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_UNKNOWN,
824 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
825
826 audio_config_t directConfig = AUDIO_CONFIG_INITIALIZER;
827 directConfig.format = AUDIO_FORMAT_DTS;
828 directConfig.sample_rate = 48000;
829 directConfig.channel_mask = AUDIO_CHANNEL_OUT_5POINT1;
830
831 audio_config_t nonDirectConfig = AUDIO_CONFIG_INITIALIZER;
832 nonDirectConfig.format = AUDIO_FORMAT_PCM_16_BIT;
833 nonDirectConfig.sample_rate = 48000;
834 nonDirectConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
835
836 audio_config_t nonExistentConfig = AUDIO_CONFIG_INITIALIZER;
837 nonExistentConfig.format = AUDIO_FORMAT_E_AC3;
838 nonExistentConfig.sample_rate = 48000;
839 nonExistentConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
840
841 audio_config_t msdDirectConfig1 = AUDIO_CONFIG_INITIALIZER;
842 msdDirectConfig1.format = AUDIO_FORMAT_AC3;
843 msdDirectConfig1.sample_rate = 48000;
844 msdDirectConfig1.channel_mask = AUDIO_CHANNEL_OUT_5POINT1;
845
846 audio_config_t msdDirectConfig2 = AUDIO_CONFIG_INITIALIZER;
847 msdDirectConfig2.format = AUDIO_FORMAT_IEC60958;
848 msdDirectConfig2.sample_rate = 48000;
Dean Wheatley16809da2022-12-09 14:55:46 +1100849 msdDirectConfig2.channel_mask = AUDIO_CHANNEL_INDEX_MASK_24;
Dorin Drimusfae3c642022-03-17 18:36:30 +0100850
851 audio_config_t msdNonDirectConfig = AUDIO_CONFIG_INITIALIZER;
852 msdNonDirectConfig.format = AUDIO_FORMAT_PCM_16_BIT;
853 msdNonDirectConfig.sample_rate = 96000;
854 msdNonDirectConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
855
856 ASSERT_EQ(AUDIO_DIRECT_BITSTREAM_SUPPORTED,
857 mManager->getDirectPlaybackSupport(&attr, &directConfig));
858 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
859 mManager->getDirectPlaybackSupport(&attr, &nonDirectConfig));
860 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
861 mManager->getDirectPlaybackSupport(&attr, &nonExistentConfig));
862 // before setting MSD patches the direct MSD configs return AUDIO_DIRECT_NOT_SUPPORTED
863 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
864 mManager->getDirectPlaybackSupport(&attr, &msdDirectConfig1));
865 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
866 mManager->getDirectPlaybackSupport(&attr, &msdDirectConfig2));
867 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
868 mManager->getDirectPlaybackSupport(&attr, &msdNonDirectConfig));
869
870 DeviceVector outputDevices = mManager->getAvailableOutputDevices();
871 // Remove MSD output device to avoid patching to itself
872 outputDevices.remove(mMsdOutputDevice);
873 mManager->setMsdOutputPatches(&outputDevices);
874
875 ASSERT_EQ(AUDIO_DIRECT_BITSTREAM_SUPPORTED,
876 mManager->getDirectPlaybackSupport(&attr, &directConfig));
877 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
878 mManager->getDirectPlaybackSupport(&attr, &nonDirectConfig));
879 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
880 mManager->getDirectPlaybackSupport(&attr, &nonExistentConfig));
881 // after setting MSD patches the direct MSD configs return values according to their flags
882 ASSERT_EQ(AUDIO_DIRECT_OFFLOAD_SUPPORTED,
883 mManager->getDirectPlaybackSupport(&attr, &msdDirectConfig1));
884 ASSERT_EQ(AUDIO_DIRECT_BITSTREAM_SUPPORTED,
885 mManager->getDirectPlaybackSupport(&attr, &msdDirectConfig2));
886 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
887 mManager->getDirectPlaybackSupport(&attr, &msdNonDirectConfig));
888
889 mManager->releaseMsdOutputPatches(outputDevices);
890
891 ASSERT_EQ(AUDIO_DIRECT_BITSTREAM_SUPPORTED,
892 mManager->getDirectPlaybackSupport(&attr, &directConfig));
893 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
894 mManager->getDirectPlaybackSupport(&attr, &nonDirectConfig));
895 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
896 mManager->getDirectPlaybackSupport(&attr, &nonExistentConfig));
897 // after releasing MSD patches the direct MSD configs return AUDIO_DIRECT_NOT_SUPPORTED
898 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
899 mManager->getDirectPlaybackSupport(&attr, &msdDirectConfig1));
900 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
901 mManager->getDirectPlaybackSupport(&attr, &msdDirectConfig2));
902 ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED,
903 mManager->getDirectPlaybackSupport(&attr, &msdNonDirectConfig));
904}
905
jiabin7c0205e2019-09-05 10:26:04 -0700906class AudioPolicyManagerTestWithConfigurationFile : public AudioPolicyManagerTest {
907protected:
908 void SetUpManagerConfig() override;
909 virtual std::string getConfigFile() { return sDefaultConfig; }
910
911 static const std::string sExecutableDir;
912 static const std::string sDefaultConfig;
913};
914
915const std::string AudioPolicyManagerTestWithConfigurationFile::sExecutableDir =
916 base::GetExecutableDirectory() + "/";
917
918const std::string AudioPolicyManagerTestWithConfigurationFile::sDefaultConfig =
919 sExecutableDir + "test_audio_policy_configuration.xml";
920
921void AudioPolicyManagerTestWithConfigurationFile::SetUpManagerConfig() {
922 status_t status = deserializeAudioPolicyFile(getConfigFile().c_str(), &mManager->getConfig());
923 ASSERT_EQ(NO_ERROR, status);
Mikhail Naganovd4c21aa2021-10-05 15:10:16 -0700924 mManager->getConfig().setSource(getConfigFile());
jiabin7c0205e2019-09-05 10:26:04 -0700925}
926
927TEST_F(AudioPolicyManagerTestWithConfigurationFile, InitSuccess) {
928 // SetUp must finish with no assertions.
929}
930
931TEST_F(AudioPolicyManagerTestWithConfigurationFile, Dump) {
932 dumpToLog();
933}
934
Mikhail Naganov0805de12022-02-15 23:00:07 +0000935TEST_F(AudioPolicyManagerTestWithConfigurationFile, ListAudioPortsHasFlags) {
936 // Create an input for VOIP TX because it's not opened automatically like outputs are.
937 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
938 audio_port_handle_t mixPortId = AUDIO_PORT_HANDLE_NONE;
939 audio_source_t source = AUDIO_SOURCE_VOICE_COMMUNICATION;
940 audio_attributes_t attr = {
941 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_UNKNOWN, source, AUDIO_FLAG_NONE, ""};
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +0200942 ASSERT_NO_FATAL_FAILURE(getInputForAttr(attr, AUDIO_SESSION_NONE, 1, &selectedDeviceId,
943 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_MONO, 8000, AUDIO_INPUT_FLAG_VOIP_TX, &mixPortId));
Mikhail Naganov0805de12022-02-15 23:00:07 +0000944
945 std::vector<audio_port_v7> ports;
946 ASSERT_NO_FATAL_FAILURE(
947 getAudioPorts(AUDIO_PORT_TYPE_MIX, AUDIO_PORT_ROLE_NONE, &ports));
948 EXPECT_NE(0, ports.size());
949 bool hasFlags = false, foundPrimary = false, foundVoipRx = false, foundVoipTx = false;
950 for (const auto& port : ports) {
951 if ((port.active_config.config_mask & AUDIO_PORT_CONFIG_FLAGS) != 0) {
952 hasFlags = true;
953 if (port.role == AUDIO_PORT_ROLE_SOURCE) {
954 if ((port.active_config.flags.output & AUDIO_OUTPUT_FLAG_PRIMARY) != 0) {
955 foundPrimary = true;
956 }
957 if ((port.active_config.flags.output & AUDIO_OUTPUT_FLAG_VOIP_RX) != 0) {
958 foundVoipRx = true;
959 }
960 } else if (port.role == AUDIO_PORT_ROLE_SINK) {
961 if ((port.active_config.flags.input & AUDIO_INPUT_FLAG_VOIP_TX) != 0) {
962 foundVoipTx = true;
963 }
964 }
965 }
966 }
967 EXPECT_TRUE(hasFlags);
968 EXPECT_TRUE(foundPrimary);
969 EXPECT_TRUE(foundVoipRx);
970 EXPECT_TRUE(foundVoipTx);
971}
972
Ram Mohan M594558d2022-06-14 14:42:44 +0530973TEST_F(AudioPolicyManagerTestWithConfigurationFile, HandleDeviceConfigChange) {
974 {
975 const auto prevCounter = mClient->getRoutingUpdatedCounter();
976
977 EXPECT_EQ(NO_ERROR, mManager->setDeviceConnectionState(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP,
978 AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
979 "", "", AUDIO_FORMAT_LDAC));
980 const auto currCounter = mClient->getRoutingUpdatedCounter();
981 EXPECT_GT(currCounter, prevCounter);
982 }
983 {
984 const auto prevCounter = mClient->getRoutingUpdatedCounter();
985 // Update device configuration
986 EXPECT_EQ(NO_ERROR, mManager->handleDeviceConfigChange(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP,
987 "" /*address*/, "" /*name*/,
988 AUDIO_FORMAT_AAC));
989
990 // As mClient marks isReconfigA2dpSupported to false, device state needs to be toggled for
991 // config changes to take effect
992 const auto currCounter = mClient->getRoutingUpdatedCounter();
993 EXPECT_GT(currCounter, prevCounter);
994 }
995}
996
jiabina84c3d32022-12-02 18:59:55 +0000997TEST_F(AudioPolicyManagerTestWithConfigurationFile, PreferredMixerAttributes) {
998 mClient->addSupportedFormat(AUDIO_FORMAT_PCM_16_BIT);
999 mClient->addSupportedChannelMask(AUDIO_CHANNEL_OUT_STEREO);
1000 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(AUDIO_DEVICE_OUT_USB_DEVICE,
1001 AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
1002 "", "", AUDIO_FORMAT_DEFAULT));
1003 auto devices = mManager->getAvailableOutputDevices();
1004 audio_port_handle_t maxPortId = 0;
1005 audio_port_handle_t speakerPortId;
1006 audio_port_handle_t usbPortId;
1007 for (auto device : devices) {
1008 maxPortId = std::max(maxPortId, device->getId());
1009 if (device->type() == AUDIO_DEVICE_OUT_SPEAKER) {
1010 speakerPortId = device->getId();
1011 } else if (device->type() == AUDIO_DEVICE_OUT_USB_DEVICE) {
1012 usbPortId = device->getId();
1013 }
1014 }
1015
1016 const uid_t uid = 1234;
1017 const uid_t otherUid = 4321;
1018 const audio_attributes_t mediaAttr = {
1019 .content_type = AUDIO_CONTENT_TYPE_MUSIC,
1020 .usage = AUDIO_USAGE_MEDIA,
1021 };
1022 const audio_attributes_t alarmAttr = {
1023 .content_type = AUDIO_CONTENT_TYPE_SONIFICATION,
1024 .usage = AUDIO_USAGE_ALARM,
1025 };
1026
1027 std::vector<audio_mixer_attributes_t> mixerAttributes;
1028 EXPECT_EQ(NO_ERROR, mManager->getSupportedMixerAttributes(usbPortId, mixerAttributes));
1029 for (const auto attrToSet : mixerAttributes) {
1030 audio_mixer_attributes_t attrFromQuery = AUDIO_MIXER_ATTRIBUTES_INITIALIZER;
1031
1032 // The given device is not available
1033 EXPECT_EQ(BAD_VALUE,
1034 mManager->setPreferredMixerAttributes(
1035 &mediaAttr, maxPortId + 1, uid, &attrToSet));
1036 // The only allowed device is USB
1037 EXPECT_EQ(BAD_VALUE,
1038 mManager->setPreferredMixerAttributes(
1039 &mediaAttr, speakerPortId, uid, &attrToSet));
1040 // The only allowed usage is media
1041 EXPECT_EQ(BAD_VALUE,
1042 mManager->setPreferredMixerAttributes(&alarmAttr, usbPortId, uid, &attrToSet));
1043 // Nothing set yet, must get null when query
1044 EXPECT_EQ(NAME_NOT_FOUND,
1045 mManager->getPreferredMixerAttributes(&mediaAttr, usbPortId, &attrFromQuery));
1046 EXPECT_EQ(NO_ERROR,
1047 mManager->setPreferredMixerAttributes(
1048 &mediaAttr, usbPortId, uid, &attrToSet));
1049 EXPECT_EQ(NO_ERROR,
1050 mManager->getPreferredMixerAttributes(&mediaAttr, usbPortId, &attrFromQuery));
1051 EXPECT_EQ(attrToSet.config.format, attrFromQuery.config.format);
1052 EXPECT_EQ(attrToSet.config.sample_rate, attrFromQuery.config.sample_rate);
1053 EXPECT_EQ(attrToSet.config.channel_mask, attrFromQuery.config.channel_mask);
1054 EXPECT_EQ(attrToSet.mixer_behavior, attrFromQuery.mixer_behavior);
1055 EXPECT_EQ(NAME_NOT_FOUND,
1056 mManager->clearPreferredMixerAttributes(&mediaAttr, speakerPortId, uid));
1057 EXPECT_EQ(PERMISSION_DENIED,
1058 mManager->clearPreferredMixerAttributes(&mediaAttr, usbPortId, otherUid));
1059 EXPECT_EQ(NO_ERROR,
1060 mManager->clearPreferredMixerAttributes(&mediaAttr, usbPortId, uid));
1061 }
1062
1063 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(AUDIO_DEVICE_OUT_USB_DEVICE,
1064 AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
1065 "", "", AUDIO_FORMAT_LDAC));
1066}
1067
jiabin3ff8d7d2022-12-13 06:27:44 +00001068TEST_F(AudioPolicyManagerTestWithConfigurationFile, RoutingChangedWithPreferredMixerAttributes) {
1069 mClient->addSupportedFormat(AUDIO_FORMAT_PCM_16_BIT);
1070 mClient->addSupportedChannelMask(AUDIO_CHANNEL_OUT_STEREO);
1071 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(AUDIO_DEVICE_OUT_USB_DEVICE,
1072 AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
1073 "", "", AUDIO_FORMAT_DEFAULT));
1074 auto devices = mManager->getAvailableOutputDevices();
1075 audio_port_handle_t usbPortId = AUDIO_PORT_HANDLE_NONE;
1076 for (auto device : devices) {
1077 if (device->type() == AUDIO_DEVICE_OUT_USB_DEVICE) {
1078 usbPortId = device->getId();
1079 break;
1080 }
1081 }
1082 EXPECT_NE(AUDIO_PORT_HANDLE_NONE, usbPortId);
1083
1084 const uid_t uid = 1234;
1085 const audio_attributes_t mediaAttr = {
1086 .content_type = AUDIO_CONTENT_TYPE_MUSIC,
1087 .usage = AUDIO_USAGE_MEDIA,
1088 };
1089
1090 std::vector<audio_mixer_attributes_t> mixerAttributes;
1091 EXPECT_EQ(NO_ERROR, mManager->getSupportedMixerAttributes(usbPortId, mixerAttributes));
1092 EXPECT_GT(mixerAttributes.size(), 0);
1093 EXPECT_EQ(NO_ERROR,
1094 mManager->setPreferredMixerAttributes(
1095 &mediaAttr, usbPortId, uid, &mixerAttributes[0]));
1096
1097 audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
1098 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
1099 audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
1100 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
1101 48000, AUDIO_OUTPUT_FLAG_NONE, &output, &portId, mediaAttr,
1102 AUDIO_SESSION_NONE, uid);
1103 status_t status = mManager->startOutput(portId);
1104 if (status == DEAD_OBJECT) {
1105 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
1106 48000, AUDIO_OUTPUT_FLAG_NONE, &output, &portId, mediaAttr,
1107 AUDIO_SESSION_NONE, uid);
1108 status = mManager->startOutput(portId);
1109 }
1110 EXPECT_EQ(NO_ERROR, status);
1111 EXPECT_NE(AUDIO_IO_HANDLE_NONE, output);
1112 EXPECT_NE(nullptr, mManager->getOutputs().valueFor(output));
1113 EXPECT_EQ(NO_ERROR, mManager->setDeviceConnectionState(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP,
1114 AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
1115 "", "", AUDIO_FORMAT_LDAC));
1116 // When BT device is connected, it will be selected as media device and trigger routing changed.
1117 // When this happens, existing output that is opened with preferred mixer attributes will be
1118 // closed and reopened with default config.
1119 EXPECT_EQ(nullptr, mManager->getOutputs().valueFor(output));
1120
1121 EXPECT_EQ(NO_ERROR,
1122 mManager->clearPreferredMixerAttributes(&mediaAttr, usbPortId, uid));
1123
1124 EXPECT_EQ(NO_ERROR, mManager->setDeviceConnectionState(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP,
1125 AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
1126 "", "", AUDIO_FORMAT_LDAC));
1127 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(AUDIO_DEVICE_OUT_USB_DEVICE,
1128 AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
1129 "", "", AUDIO_FORMAT_LDAC));
1130}
1131
jiabin5eaf0962022-12-20 20:11:38 +00001132TEST_F(AudioPolicyManagerTestWithConfigurationFile, BitPerfectPlayback) {
1133 const audio_format_t bitPerfectFormat = AUDIO_FORMAT_PCM_16_BIT;
1134 const audio_channel_mask_t bitPerfectChannelMask = AUDIO_CHANNEL_OUT_QUAD;
1135 const uint32_t bitPerfectSampleRate = 48000;
1136 mClient->addSupportedFormat(bitPerfectFormat);
1137 mClient->addSupportedChannelMask(bitPerfectChannelMask);
1138 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(AUDIO_DEVICE_OUT_USB_DEVICE,
1139 AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
1140 "", "", AUDIO_FORMAT_DEFAULT));
1141 auto devices = mManager->getAvailableOutputDevices();
1142 audio_port_handle_t usbPortId = AUDIO_PORT_HANDLE_NONE;
1143 for (auto device : devices) {
1144 if (device->type() == AUDIO_DEVICE_OUT_USB_DEVICE) {
1145 usbPortId = device->getId();
1146 break;
1147 }
1148 }
1149 EXPECT_NE(AUDIO_PORT_HANDLE_NONE, usbPortId);
1150
1151 const uid_t uid = 1234;
1152 const uid_t anotherUid = 5678;
1153 const audio_attributes_t mediaAttr = {
1154 .content_type = AUDIO_CONTENT_TYPE_MUSIC,
1155 .usage = AUDIO_USAGE_MEDIA,
1156 };
1157
1158 std::vector<audio_mixer_attributes_t> mixerAttributes;
1159 EXPECT_EQ(NO_ERROR, mManager->getSupportedMixerAttributes(usbPortId, mixerAttributes));
1160 EXPECT_GT(mixerAttributes.size(), 0);
1161 size_t bitPerfectIndex = 0;
1162 for (; bitPerfectIndex < mixerAttributes.size(); ++bitPerfectIndex) {
1163 if (mixerAttributes[bitPerfectIndex].mixer_behavior == AUDIO_MIXER_BEHAVIOR_BIT_PERFECT) {
1164 break;
1165 }
1166 }
1167 EXPECT_LT(bitPerfectIndex, mixerAttributes.size());
1168 EXPECT_EQ(bitPerfectFormat, mixerAttributes[bitPerfectIndex].config.format);
1169 EXPECT_EQ(bitPerfectChannelMask, mixerAttributes[bitPerfectIndex].config.channel_mask);
1170 EXPECT_EQ(bitPerfectSampleRate, mixerAttributes[bitPerfectIndex].config.sample_rate);
1171 EXPECT_EQ(NO_ERROR,
1172 mManager->setPreferredMixerAttributes(
1173 &mediaAttr, usbPortId, uid, &mixerAttributes[bitPerfectIndex]));
1174
1175 audio_io_handle_t bitPerfectOutput = AUDIO_IO_HANDLE_NONE;
1176 audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
1177 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
1178 audio_port_handle_t bitPerfectPortId = AUDIO_PORT_HANDLE_NONE;
1179 audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
1180 bool isBitPerfect;
1181
1182 // When there is no active bit-perfect playback, the output selection will follow default
1183 // routing strategy.
1184 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
1185 48000, AUDIO_OUTPUT_FLAG_NONE, &output, &portId, mediaAttr, AUDIO_SESSION_NONE,
1186 uid, &isBitPerfect);
1187 EXPECT_FALSE(isBitPerfect);
1188 EXPECT_NE(AUDIO_IO_HANDLE_NONE, output);
1189 const auto outputDesc = mManager->getOutputs().valueFor(output);
1190 EXPECT_NE(nullptr, outputDesc);
1191 EXPECT_NE(AUDIO_OUTPUT_FLAG_BIT_PERFECT, outputDesc->mFlags & AUDIO_OUTPUT_FLAG_BIT_PERFECT);
1192
1193 // Start bit-perfect playback
1194 getOutputForAttr(&selectedDeviceId, bitPerfectFormat, bitPerfectChannelMask,
1195 bitPerfectSampleRate, AUDIO_OUTPUT_FLAG_NONE, &bitPerfectOutput, &bitPerfectPortId,
1196 mediaAttr, AUDIO_SESSION_NONE, uid, &isBitPerfect);
1197 status_t status = mManager->startOutput(bitPerfectPortId);
1198 if (status == DEAD_OBJECT) {
1199 getOutputForAttr(&selectedDeviceId, bitPerfectFormat, bitPerfectChannelMask,
1200 bitPerfectSampleRate, AUDIO_OUTPUT_FLAG_NONE, &bitPerfectOutput, &bitPerfectPortId,
1201 mediaAttr, AUDIO_SESSION_NONE, uid, &isBitPerfect);
1202 status = mManager->startOutput(bitPerfectPortId);
1203 }
1204 EXPECT_EQ(NO_ERROR, status);
1205 EXPECT_TRUE(isBitPerfect);
1206 EXPECT_NE(AUDIO_IO_HANDLE_NONE, bitPerfectOutput);
1207 const auto bitPerfectOutputDesc = mManager->getOutputs().valueFor(bitPerfectOutput);
1208 EXPECT_NE(nullptr, bitPerfectOutputDesc);
1209 EXPECT_EQ(AUDIO_OUTPUT_FLAG_BIT_PERFECT,
1210 bitPerfectOutputDesc->mFlags & AUDIO_OUTPUT_FLAG_BIT_PERFECT);
1211
1212 // If the playback is from preferred mixer attributes owner but the request doesn't match
1213 // preferred mixer attributes, it will not be bit-perfect.
1214 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
1215 48000, AUDIO_OUTPUT_FLAG_NONE, &output, &portId, mediaAttr, AUDIO_SESSION_NONE,
1216 uid, &isBitPerfect);
1217 EXPECT_FALSE(isBitPerfect);
1218 EXPECT_EQ(bitPerfectOutput, output);
1219
1220 // When bit-perfect playback is active, all other playback will be routed to bit-perfect output.
1221 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
1222 48000, AUDIO_OUTPUT_FLAG_NONE, &output, &portId, mediaAttr, AUDIO_SESSION_NONE,
1223 anotherUid, &isBitPerfect);
1224 EXPECT_FALSE(isBitPerfect);
1225 EXPECT_EQ(bitPerfectOutput, output);
1226
1227 // When configuration matches preferred mixer attributes, which is bit-perfect, but the client
1228 // is not the owner of preferred mixer attributes, the playback will not be bit-perfect.
1229 getOutputForAttr(&selectedDeviceId, bitPerfectFormat, bitPerfectChannelMask,
1230 bitPerfectSampleRate, AUDIO_OUTPUT_FLAG_NONE, &output, &portId, mediaAttr,
1231 AUDIO_SESSION_NONE, anotherUid, &isBitPerfect);
1232 EXPECT_FALSE(isBitPerfect);
1233 EXPECT_EQ(bitPerfectOutput, output);
1234
1235 EXPECT_EQ(NO_ERROR,
1236 mManager->clearPreferredMixerAttributes(&mediaAttr, usbPortId, uid));
1237 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(AUDIO_DEVICE_OUT_USB_DEVICE,
1238 AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
1239 "", "", AUDIO_FORMAT_LDAC));
1240}
1241
jiabin7c0205e2019-09-05 10:26:04 -07001242class AudioPolicyManagerTestDynamicPolicy : public AudioPolicyManagerTestWithConfigurationFile {
jiabinf4eb15a2019-08-28 15:31:47 -07001243protected:
jiabinf4eb15a2019-08-28 15:31:47 -07001244 void TearDown() override;
1245
1246 status_t addPolicyMix(int mixType, int mixFlag, audio_devices_t deviceType,
1247 std::string mixAddress, const audio_config_t& audioConfig,
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +02001248 const std::vector<AudioMixMatchCriterion>& matchCriteria);
jiabinf4eb15a2019-08-28 15:31:47 -07001249 void clearPolicyMix();
jiabinf4eb15a2019-08-28 15:31:47 -07001250
1251 Vector<AudioMix> mAudioMixes;
jiabinf4eb15a2019-08-28 15:31:47 -07001252 const std::string mMixAddress = "remote_submix_media";
1253};
1254
jiabinf4eb15a2019-08-28 15:31:47 -07001255void AudioPolicyManagerTestDynamicPolicy::TearDown() {
1256 mManager->unregisterPolicyMixes(mAudioMixes);
jiabin7c0205e2019-09-05 10:26:04 -07001257 AudioPolicyManagerTestWithConfigurationFile::TearDown();
jiabinf4eb15a2019-08-28 15:31:47 -07001258}
1259
1260status_t AudioPolicyManagerTestDynamicPolicy::addPolicyMix(int mixType, int mixFlag,
1261 audio_devices_t deviceType, std::string mixAddress, const audio_config_t& audioConfig,
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +02001262 const std::vector<AudioMixMatchCriterion>& matchCriteria = {}) {
1263 AudioMix myAudioMix(matchCriteria, mixType, audioConfig, mixFlag,
jiabinf4eb15a2019-08-28 15:31:47 -07001264 String8(mixAddress.c_str()), 0);
1265 myAudioMix.mDeviceType = deviceType;
1266 // Clear mAudioMix before add new one to make sure we don't add already exist mixes.
1267 mAudioMixes.clear();
1268 mAudioMixes.add(myAudioMix);
1269
1270 // As the policy mixes registration may fail at some case,
1271 // caller need to check the returned status.
1272 status_t ret = mManager->registerPolicyMixes(mAudioMixes);
1273 return ret;
1274}
1275
1276void AudioPolicyManagerTestDynamicPolicy::clearPolicyMix() {
1277 if (mManager != nullptr) {
1278 mManager->unregisterPolicyMixes(mAudioMixes);
1279 }
1280 mAudioMixes.clear();
1281}
1282
jiabinf4eb15a2019-08-28 15:31:47 -07001283TEST_F(AudioPolicyManagerTestDynamicPolicy, InitSuccess) {
jiabin7c0205e2019-09-05 10:26:04 -07001284 // SetUp must finish with no assertions
jiabinf4eb15a2019-08-28 15:31:47 -07001285}
1286
1287TEST_F(AudioPolicyManagerTestDynamicPolicy, Dump) {
1288 dumpToLog();
1289}
1290
1291TEST_F(AudioPolicyManagerTestDynamicPolicy, RegisterPolicyMixes) {
1292 status_t ret;
1293 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
1294
1295 // Only capture of playback is allowed in LOOP_BACK &RENDER mode
1296 ret = addPolicyMix(MIX_TYPE_RECORDERS, MIX_ROUTE_FLAG_LOOP_BACK_AND_RENDER,
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +02001297 AUDIO_DEVICE_OUT_REMOTE_SUBMIX, "", audioConfig);
jiabinf4eb15a2019-08-28 15:31:47 -07001298 ASSERT_EQ(INVALID_OPERATION, ret);
1299
1300 // Fail due to the device is already connected.
1301 clearPolicyMix();
1302 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_LOOP_BACK,
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +02001303 AUDIO_DEVICE_OUT_REMOTE_SUBMIX, "", audioConfig);
jiabinf4eb15a2019-08-28 15:31:47 -07001304 ASSERT_EQ(INVALID_OPERATION, ret);
1305
1306 // The first time to register policy mixes with valid parameter should succeed.
1307 clearPolicyMix();
1308 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
1309 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
Dean Wheatleyd082f472022-02-04 11:10:48 +11001310 audioConfig.sample_rate = k48000SamplingRate;
jiabinf4eb15a2019-08-28 15:31:47 -07001311 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_LOOP_BACK,
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +02001312 AUDIO_DEVICE_OUT_REMOTE_SUBMIX, mMixAddress, audioConfig);
jiabinf4eb15a2019-08-28 15:31:47 -07001313 ASSERT_EQ(NO_ERROR, ret);
1314 // Registering the same policy mixes should fail.
1315 ret = mManager->registerPolicyMixes(mAudioMixes);
1316 ASSERT_EQ(INVALID_OPERATION, ret);
1317
jiabinf4eb15a2019-08-28 15:31:47 -07001318 // Registration should fail due to device not found.
1319 // Note that earpiece is not present in the test configuration file.
1320 // This will need to be updated if earpiece is added in the test configuration file.
jiabin7c0205e2019-09-05 10:26:04 -07001321 clearPolicyMix();
jiabinf4eb15a2019-08-28 15:31:47 -07001322 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +02001323 AUDIO_DEVICE_OUT_EARPIECE, "", audioConfig);
jiabinf4eb15a2019-08-28 15:31:47 -07001324 ASSERT_EQ(INVALID_OPERATION, ret);
1325
1326 // Registration should fail due to output not found.
1327 clearPolicyMix();
1328 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +02001329 AUDIO_DEVICE_OUT_REMOTE_SUBMIX, "", audioConfig);
jiabinf4eb15a2019-08-28 15:31:47 -07001330 ASSERT_EQ(INVALID_OPERATION, ret);
1331
1332 // The first time to register valid policy mixes should succeed.
1333 clearPolicyMix();
1334 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +02001335 AUDIO_DEVICE_OUT_SPEAKER, "", audioConfig);
jiabinf4eb15a2019-08-28 15:31:47 -07001336 ASSERT_EQ(NO_ERROR, ret);
1337 // Registering the same policy mixes should fail.
1338 ret = mManager->registerPolicyMixes(mAudioMixes);
1339 ASSERT_EQ(INVALID_OPERATION, ret);
1340}
1341
1342TEST_F(AudioPolicyManagerTestDynamicPolicy, UnregisterPolicyMixes) {
1343 status_t ret;
1344 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
1345
1346 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
1347 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
Dean Wheatleyd082f472022-02-04 11:10:48 +11001348 audioConfig.sample_rate = k48000SamplingRate;
jiabinf4eb15a2019-08-28 15:31:47 -07001349 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_LOOP_BACK,
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +02001350 AUDIO_DEVICE_OUT_REMOTE_SUBMIX, mMixAddress, audioConfig);
jiabinf4eb15a2019-08-28 15:31:47 -07001351 ASSERT_EQ(NO_ERROR, ret);
1352
1353 // After successfully registering policy mixes, it should be able to unregister.
1354 ret = mManager->unregisterPolicyMixes(mAudioMixes);
1355 ASSERT_EQ(NO_ERROR, ret);
1356
1357 // After unregistering policy mixes successfully, it should fail unregistering
1358 // the same policy mixes as they are not registered.
1359 ret = mManager->unregisterPolicyMixes(mAudioMixes);
1360 ASSERT_EQ(INVALID_OPERATION, ret);
jiabin7c0205e2019-09-05 10:26:04 -07001361}
jiabinf4eb15a2019-08-28 15:31:47 -07001362
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +02001363TEST_F(AudioPolicyManagerTestDynamicPolicy, RegisterPolicyWithConsistentMixSucceeds) {
1364 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
1365 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
1366 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
1367 audioConfig.sample_rate = k48000SamplingRate;
1368
1369 std::vector<AudioMixMatchCriterion> mixMatchCriteria = {
1370 createUidCriterion(/*uid=*/42),
1371 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/true)};
1372 status_t ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_LOOP_BACK,
1373 AUDIO_DEVICE_OUT_REMOTE_SUBMIX, mMixAddress, audioConfig,
1374 mixMatchCriteria);
1375 ASSERT_EQ(NO_ERROR, ret);
1376}
1377
1378TEST_F(AudioPolicyManagerTestDynamicPolicy, RegisterPolicyWithInconsistentMixFails) {
1379 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
1380 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
1381 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
1382 audioConfig.sample_rate = k48000SamplingRate;
1383
1384 std::vector<AudioMixMatchCriterion> mixMatchCriteria = {
1385 createUidCriterion(/*uid=*/42),
1386 createUidCriterion(/*uid=*/1235, /*exclude=*/true),
1387 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/true)};
1388 status_t ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_LOOP_BACK,
1389 AUDIO_DEVICE_OUT_REMOTE_SUBMIX, mMixAddress, audioConfig,
1390 mixMatchCriteria);
1391 ASSERT_EQ(INVALID_OPERATION, ret);
1392}
1393
Kriti Dangef6be8f2020-11-05 11:58:19 +01001394class AudioPolicyManagerTestForHdmi
Mikhail Naganov18885d32021-10-01 13:03:09 -07001395 : public AudioPolicyManagerTestWithConfigurationFile,
1396 public testing::WithParamInterface<audio_format_t> {
Kriti Dangef6be8f2020-11-05 11:58:19 +01001397protected:
1398 void SetUp() override;
1399 std::string getConfigFile() override { return sTvConfig; }
Kriti Dang6537def2021-03-02 13:46:59 +01001400 std::map<audio_format_t, bool> getSurroundFormatsHelper();
1401 std::vector<audio_format_t> getReportedSurroundFormatsHelper();
Kriti Dangef6be8f2020-11-05 11:58:19 +01001402 std::unordered_set<audio_format_t> getFormatsFromPorts();
Kriti Dangef6be8f2020-11-05 11:58:19 +01001403 void TearDown() override;
1404
1405 static const std::string sTvConfig;
1406
1407};
1408
1409const std::string AudioPolicyManagerTestForHdmi::sTvConfig =
1410 AudioPolicyManagerTestForHdmi::sExecutableDir +
1411 "test_settop_box_surround_configuration.xml";
1412
1413void AudioPolicyManagerTestForHdmi::SetUp() {
Mikhail Naganovd4c21aa2021-10-05 15:10:16 -07001414 ASSERT_NO_FATAL_FAILURE(AudioPolicyManagerTest::SetUp());
Mikhail Naganov83caee02021-10-05 15:52:01 -07001415 mClient->addSupportedFormat(AUDIO_FORMAT_AC3);
Kriti Dangef6be8f2020-11-05 11:58:19 +01001416 mClient->addSupportedFormat(AUDIO_FORMAT_E_AC3);
1417 mManager->setDeviceConnectionState(
1418 AUDIO_DEVICE_OUT_HDMI, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
1419 "" /*address*/, "" /*name*/, AUDIO_FORMAT_DEFAULT);
1420}
1421
1422void AudioPolicyManagerTestForHdmi::TearDown() {
1423 mManager->setDeviceConnectionState(
1424 AUDIO_DEVICE_OUT_HDMI, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
1425 "" /*address*/, "" /*name*/, AUDIO_FORMAT_DEFAULT);
1426 AudioPolicyManagerTest::TearDown();
1427}
1428
1429std::map<audio_format_t, bool>
Kriti Dang6537def2021-03-02 13:46:59 +01001430 AudioPolicyManagerTestForHdmi::getSurroundFormatsHelper() {
Kriti Dangef6be8f2020-11-05 11:58:19 +01001431 unsigned int numSurroundFormats = 0;
1432 std::map<audio_format_t, bool> surroundFormatsMap;
1433 status_t ret = mManager->getSurroundFormats(
1434 &numSurroundFormats, nullptr /* surroundFormats */,
Kriti Dang6537def2021-03-02 13:46:59 +01001435 nullptr /* surroundFormatsEnabled */);
Kriti Dangef6be8f2020-11-05 11:58:19 +01001436 EXPECT_EQ(NO_ERROR, ret);
1437 if (ret != NO_ERROR) {
1438 return surroundFormatsMap;
1439 }
1440 audio_format_t surroundFormats[numSurroundFormats];
1441 memset(surroundFormats, 0, sizeof(audio_format_t) * numSurroundFormats);
1442 bool surroundFormatsEnabled[numSurroundFormats];
1443 memset(surroundFormatsEnabled, 0, sizeof(bool) * numSurroundFormats);
1444 ret = mManager->getSurroundFormats(
Kriti Dang6537def2021-03-02 13:46:59 +01001445 &numSurroundFormats, surroundFormats, surroundFormatsEnabled);
Kriti Dangef6be8f2020-11-05 11:58:19 +01001446 EXPECT_EQ(NO_ERROR, ret);
1447 if (ret != NO_ERROR) {
1448 return surroundFormatsMap;
1449 }
1450 for (int i = 0; i< numSurroundFormats; i++) {
1451 surroundFormatsMap[surroundFormats[i]] = surroundFormatsEnabled[i];
1452 }
1453 return surroundFormatsMap;
1454}
1455
Kriti Dang6537def2021-03-02 13:46:59 +01001456std::vector<audio_format_t> AudioPolicyManagerTestForHdmi::getReportedSurroundFormatsHelper() {
1457 unsigned int numSurroundFormats = 0;
1458 std::vector<audio_format_t> surroundFormatsVector;
1459 status_t ret = mManager->getReportedSurroundFormats(
1460 &numSurroundFormats, nullptr /* surroundFormats */);
1461 EXPECT_EQ(NO_ERROR, ret);
1462 if (ret != NO_ERROR) {
1463 return surroundFormatsVector;
1464 }
1465 audio_format_t surroundFormats[numSurroundFormats];
1466 memset(surroundFormats, 0, sizeof(audio_format_t) * numSurroundFormats);
1467 ret = mManager->getReportedSurroundFormats(&numSurroundFormats, surroundFormats);
1468 EXPECT_EQ(NO_ERROR, ret);
1469 if (ret != NO_ERROR) {
1470 return surroundFormatsVector;
1471 }
1472 for (const auto &surroundFormat : surroundFormats) {
1473 surroundFormatsVector.push_back(surroundFormat);
1474 }
1475 return surroundFormatsVector;
1476}
1477
Kriti Dangef6be8f2020-11-05 11:58:19 +01001478std::unordered_set<audio_format_t>
1479 AudioPolicyManagerTestForHdmi::getFormatsFromPorts() {
1480 uint32_t numPorts = 0;
1481 uint32_t generation1;
1482 status_t ret;
1483 std::unordered_set<audio_format_t> formats;
1484 ret = mManager->listAudioPorts(
1485 AUDIO_PORT_ROLE_SINK, AUDIO_PORT_TYPE_DEVICE, &numPorts, nullptr, &generation1);
1486 EXPECT_EQ(NO_ERROR, ret) << "mManager->listAudioPorts returned error";
1487 if (ret != NO_ERROR) {
1488 return formats;
1489 }
jiabin19cdba52020-11-24 11:28:58 -08001490 struct audio_port_v7 ports[numPorts];
Kriti Dangef6be8f2020-11-05 11:58:19 +01001491 ret = mManager->listAudioPorts(
1492 AUDIO_PORT_ROLE_SINK, AUDIO_PORT_TYPE_DEVICE, &numPorts, ports, &generation1);
1493 EXPECT_EQ(NO_ERROR, ret) << "mManager->listAudioPorts returned error";
1494 if (ret != NO_ERROR) {
1495 return formats;
1496 }
1497 for (const auto &port : ports) {
jiabin19cdba52020-11-24 11:28:58 -08001498 for (size_t i = 0; i < port.num_audio_profiles; ++i) {
1499 formats.insert(port.audio_profiles[i].format);
1500 }
Kriti Dangef6be8f2020-11-05 11:58:19 +01001501 }
1502 return formats;
1503}
1504
Mikhail Naganov18885d32021-10-01 13:03:09 -07001505TEST_P(AudioPolicyManagerTestForHdmi, GetSurroundFormatsReturnsSupportedFormats) {
Kriti Dangef6be8f2020-11-05 11:58:19 +01001506 mManager->setForceUse(
1507 AUDIO_POLICY_FORCE_FOR_ENCODED_SURROUND, AUDIO_POLICY_FORCE_ENCODED_SURROUND_ALWAYS);
Kriti Dang6537def2021-03-02 13:46:59 +01001508 auto surroundFormats = getSurroundFormatsHelper();
Mikhail Naganov18885d32021-10-01 13:03:09 -07001509 ASSERT_EQ(1, surroundFormats.count(GetParam()));
Kriti Dangef6be8f2020-11-05 11:58:19 +01001510}
1511
Mikhail Naganov18885d32021-10-01 13:03:09 -07001512TEST_P(AudioPolicyManagerTestForHdmi,
Kriti Dangef6be8f2020-11-05 11:58:19 +01001513 GetSurroundFormatsReturnsManipulatedFormats) {
1514 mManager->setForceUse(
1515 AUDIO_POLICY_FORCE_FOR_ENCODED_SURROUND, AUDIO_POLICY_FORCE_ENCODED_SURROUND_MANUAL);
1516
1517 status_t ret =
Mikhail Naganov18885d32021-10-01 13:03:09 -07001518 mManager->setSurroundFormatEnabled(GetParam(), false /*enabled*/);
Kriti Dangef6be8f2020-11-05 11:58:19 +01001519 ASSERT_EQ(NO_ERROR, ret);
Kriti Dang6537def2021-03-02 13:46:59 +01001520 auto surroundFormats = getSurroundFormatsHelper();
Mikhail Naganov18885d32021-10-01 13:03:09 -07001521 ASSERT_EQ(1, surroundFormats.count(GetParam()));
1522 ASSERT_FALSE(surroundFormats[GetParam()]);
Kriti Dangef6be8f2020-11-05 11:58:19 +01001523
Mikhail Naganov18885d32021-10-01 13:03:09 -07001524 ret = mManager->setSurroundFormatEnabled(GetParam(), true /*enabled*/);
Kriti Dangef6be8f2020-11-05 11:58:19 +01001525 ASSERT_EQ(NO_ERROR, ret);
Kriti Dang6537def2021-03-02 13:46:59 +01001526 surroundFormats = getSurroundFormatsHelper();
Mikhail Naganov18885d32021-10-01 13:03:09 -07001527 ASSERT_EQ(1, surroundFormats.count(GetParam()));
1528 ASSERT_TRUE(surroundFormats[GetParam()]);
Kriti Dangef6be8f2020-11-05 11:58:19 +01001529
Mikhail Naganov18885d32021-10-01 13:03:09 -07001530 ret = mManager->setSurroundFormatEnabled(GetParam(), false /*enabled*/);
Kriti Dangef6be8f2020-11-05 11:58:19 +01001531 ASSERT_EQ(NO_ERROR, ret);
Kriti Dang6537def2021-03-02 13:46:59 +01001532 surroundFormats = getSurroundFormatsHelper();
Mikhail Naganov18885d32021-10-01 13:03:09 -07001533 ASSERT_EQ(1, surroundFormats.count(GetParam()));
1534 ASSERT_FALSE(surroundFormats[GetParam()]);
Kriti Dangef6be8f2020-11-05 11:58:19 +01001535}
1536
Mikhail Naganov18885d32021-10-01 13:03:09 -07001537TEST_P(AudioPolicyManagerTestForHdmi,
Kriti Dangef6be8f2020-11-05 11:58:19 +01001538 ListAudioPortsReturnManipulatedHdmiFormats) {
1539 mManager->setForceUse(
1540 AUDIO_POLICY_FORCE_FOR_ENCODED_SURROUND, AUDIO_POLICY_FORCE_ENCODED_SURROUND_MANUAL);
1541
Mikhail Naganov18885d32021-10-01 13:03:09 -07001542 ASSERT_EQ(NO_ERROR, mManager->setSurroundFormatEnabled(GetParam(), false /*enabled*/));
Kriti Dangef6be8f2020-11-05 11:58:19 +01001543 auto formats = getFormatsFromPorts();
Mikhail Naganov18885d32021-10-01 13:03:09 -07001544 ASSERT_EQ(0, formats.count(GetParam()));
Kriti Dangef6be8f2020-11-05 11:58:19 +01001545
Mikhail Naganov18885d32021-10-01 13:03:09 -07001546 ASSERT_EQ(NO_ERROR, mManager->setSurroundFormatEnabled(GetParam(), true /*enabled*/));
Kriti Dangef6be8f2020-11-05 11:58:19 +01001547 formats = getFormatsFromPorts();
Mikhail Naganov18885d32021-10-01 13:03:09 -07001548 ASSERT_EQ(1, formats.count(GetParam()));
Kriti Dangef6be8f2020-11-05 11:58:19 +01001549}
1550
Mikhail Naganov18885d32021-10-01 13:03:09 -07001551TEST_P(AudioPolicyManagerTestForHdmi,
Kriti Dangef6be8f2020-11-05 11:58:19 +01001552 GetReportedSurroundFormatsReturnsHdmiReportedFormats) {
1553 mManager->setForceUse(
1554 AUDIO_POLICY_FORCE_FOR_ENCODED_SURROUND, AUDIO_POLICY_FORCE_ENCODED_SURROUND_ALWAYS);
Kriti Dang6537def2021-03-02 13:46:59 +01001555 auto surroundFormats = getReportedSurroundFormatsHelper();
Mikhail Naganov18885d32021-10-01 13:03:09 -07001556 ASSERT_EQ(1, std::count(surroundFormats.begin(), surroundFormats.end(), GetParam()));
Kriti Dangef6be8f2020-11-05 11:58:19 +01001557}
1558
Mikhail Naganov18885d32021-10-01 13:03:09 -07001559TEST_P(AudioPolicyManagerTestForHdmi,
Kriti Dangef6be8f2020-11-05 11:58:19 +01001560 GetReportedSurroundFormatsReturnsNonManipulatedHdmiReportedFormats) {
1561 mManager->setForceUse(
1562 AUDIO_POLICY_FORCE_FOR_ENCODED_SURROUND, AUDIO_POLICY_FORCE_ENCODED_SURROUND_MANUAL);
1563
Mikhail Naganov18885d32021-10-01 13:03:09 -07001564 status_t ret = mManager->setSurroundFormatEnabled(GetParam(), false /*enabled*/);
Kriti Dangef6be8f2020-11-05 11:58:19 +01001565 ASSERT_EQ(NO_ERROR, ret);
Kriti Dang6537def2021-03-02 13:46:59 +01001566 auto surroundFormats = getReportedSurroundFormatsHelper();
Mikhail Naganov18885d32021-10-01 13:03:09 -07001567 ASSERT_EQ(1, std::count(surroundFormats.begin(), surroundFormats.end(), GetParam()));
Kriti Dangef6be8f2020-11-05 11:58:19 +01001568
Mikhail Naganov18885d32021-10-01 13:03:09 -07001569 ret = mManager->setSurroundFormatEnabled(GetParam(), true /*enabled*/);
Kriti Dangef6be8f2020-11-05 11:58:19 +01001570 ASSERT_EQ(NO_ERROR, ret);
Kriti Dang6537def2021-03-02 13:46:59 +01001571 surroundFormats = getReportedSurroundFormatsHelper();
Mikhail Naganov18885d32021-10-01 13:03:09 -07001572 ASSERT_EQ(1, std::count(surroundFormats.begin(), surroundFormats.end(), GetParam()));
Kriti Dangef6be8f2020-11-05 11:58:19 +01001573}
1574
Mikhail Naganov18885d32021-10-01 13:03:09 -07001575TEST_P(AudioPolicyManagerTestForHdmi, GetSurroundFormatsIgnoresSupportedFormats) {
1576 mManager->setForceUse(
1577 AUDIO_POLICY_FORCE_FOR_ENCODED_SURROUND, AUDIO_POLICY_FORCE_ENCODED_SURROUND_NEVER);
1578 auto surroundFormats = getSurroundFormatsHelper();
1579 ASSERT_EQ(1, surroundFormats.count(GetParam()));
1580 ASSERT_FALSE(surroundFormats[GetParam()]);
1581}
1582
1583INSTANTIATE_TEST_SUITE_P(SurroundFormatSupport, AudioPolicyManagerTestForHdmi,
1584 testing::Values(AUDIO_FORMAT_AC3, AUDIO_FORMAT_E_AC3),
1585 [](const ::testing::TestParamInfo<AudioPolicyManagerTestForHdmi::ParamType>& info) {
1586 return audio_format_to_string(info.param);
1587 });
1588
jiabin7c0205e2019-09-05 10:26:04 -07001589class AudioPolicyManagerTestDPNoRemoteSubmixModule : public AudioPolicyManagerTestDynamicPolicy {
1590protected:
1591 std::string getConfigFile() override { return sPrimaryOnlyConfig; }
1592
1593 static const std::string sPrimaryOnlyConfig;
1594};
1595
1596const std::string AudioPolicyManagerTestDPNoRemoteSubmixModule::sPrimaryOnlyConfig =
1597 sExecutableDir + "test_audio_policy_primary_only_configuration.xml";
1598
1599TEST_F(AudioPolicyManagerTestDPNoRemoteSubmixModule, InitSuccess) {
1600 // SetUp must finish with no assertions.
1601}
1602
1603TEST_F(AudioPolicyManagerTestDPNoRemoteSubmixModule, Dump) {
1604 dumpToLog();
1605}
1606
1607TEST_F(AudioPolicyManagerTestDPNoRemoteSubmixModule, RegistrationFailure) {
1608 // Registration/Unregistration should fail due to module for remote submix not found.
1609 status_t ret;
1610 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
1611 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
1612 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
Dean Wheatleyd082f472022-02-04 11:10:48 +11001613 audioConfig.sample_rate = k48000SamplingRate;
jiabin7c0205e2019-09-05 10:26:04 -07001614 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_LOOP_BACK,
Jan Sebechlebsky0e7b2f12022-08-18 14:40:37 +02001615 AUDIO_DEVICE_OUT_REMOTE_SUBMIX, "", audioConfig);
jiabin7c0205e2019-09-05 10:26:04 -07001616 ASSERT_EQ(INVALID_OPERATION, ret);
1617
jiabinf4eb15a2019-08-28 15:31:47 -07001618 ret = mManager->unregisterPolicyMixes(mAudioMixes);
1619 ASSERT_EQ(INVALID_OPERATION, ret);
1620}
1621
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001622struct DPTestParam {
1623 DPTestParam(const std::vector<AudioMixMatchCriterion>& mixCriteria,
1624 bool expected_match = false)
1625 : mixCriteria(mixCriteria), attributes(defaultAttr), session(AUDIO_SESSION_NONE),
1626 expected_match(expected_match) {}
1627
1628 DPTestParam& withUsage(audio_usage_t usage) {
1629 attributes.usage = usage;
1630 return *this;
1631 }
1632
1633 DPTestParam& withTags(const char *tags) {
1634 std::strncpy(attributes.tags, tags, sizeof(attributes.tags));
1635 return *this;
1636 }
1637
1638 DPTestParam& withSource(audio_source_t source) {
1639 attributes.source = source;
1640 return *this;
1641 }
1642
1643 DPTestParam& withSessionId(audio_session_t sessionId) {
1644 session = sessionId;
1645 return *this;
1646 }
1647
1648 std::vector<AudioMixMatchCriterion> mixCriteria;
1649 audio_attributes_t attributes;
1650 audio_session_t session;
1651 bool expected_match;
1652};
1653
jiabinf4eb15a2019-08-28 15:31:47 -07001654class AudioPolicyManagerTestDPPlaybackReRouting : public AudioPolicyManagerTestDynamicPolicy,
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001655 public testing::WithParamInterface<DPTestParam> {
jiabinf4eb15a2019-08-28 15:31:47 -07001656protected:
1657 void SetUp() override;
1658 void TearDown() override;
1659
1660 std::unique_ptr<RecordingActivityTracker> mTracker;
jiabin19cdba52020-11-24 11:28:58 -08001661 struct audio_port_v7 mInjectionPort;
jiabinf4eb15a2019-08-28 15:31:47 -07001662 audio_port_handle_t mPortId = AUDIO_PORT_HANDLE_NONE;
1663};
1664
1665void AudioPolicyManagerTestDPPlaybackReRouting::SetUp() {
Mikhail Naganovd4c21aa2021-10-05 15:10:16 -07001666 ASSERT_NO_FATAL_FAILURE(AudioPolicyManagerTestDynamicPolicy::SetUp());
jiabinf4eb15a2019-08-28 15:31:47 -07001667
1668 mTracker.reset(new RecordingActivityTracker());
1669
1670 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
1671 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
1672 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
Dean Wheatleyd082f472022-02-04 11:10:48 +11001673 audioConfig.sample_rate = k48000SamplingRate;
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001674
1675 DPTestParam param = GetParam();
jiabinf4eb15a2019-08-28 15:31:47 -07001676 status_t ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_LOOP_BACK,
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001677 AUDIO_DEVICE_OUT_REMOTE_SUBMIX, mMixAddress, audioConfig, param.mixCriteria);
jiabinf4eb15a2019-08-28 15:31:47 -07001678 ASSERT_EQ(NO_ERROR, ret);
1679
jiabin19cdba52020-11-24 11:28:58 -08001680 struct audio_port_v7 extractionPort;
Mikhail Naganovd0e2c742020-03-25 15:59:59 -07001681 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SOURCE, AUDIO_DEVICE_IN_REMOTE_SUBMIX,
1682 mMixAddress, &extractionPort));
jiabinf4eb15a2019-08-28 15:31:47 -07001683
1684 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
1685 audio_source_t source = AUDIO_SOURCE_REMOTE_SUBMIX;
Mikhail Naganov55773032020-10-01 15:08:13 -07001686 audio_attributes_t attr = {
1687 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_UNKNOWN, source, AUDIO_FLAG_NONE, ""};
jiabinf4eb15a2019-08-28 15:31:47 -07001688 std::string tags = "addr=" + mMixAddress;
1689 strncpy(attr.tags, tags.c_str(), AUDIO_ATTRIBUTES_TAGS_MAX_SIZE - 1);
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001690 getInputForAttr(attr, param.session, mTracker->getRiid(), &selectedDeviceId,
1691 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO, k48000SamplingRate,
1692 AUDIO_INPUT_FLAG_NONE, &mPortId);
jiabinf4eb15a2019-08-28 15:31:47 -07001693 ASSERT_EQ(NO_ERROR, mManager->startInput(mPortId));
1694 ASSERT_EQ(extractionPort.id, selectedDeviceId);
1695
Mikhail Naganovd0e2c742020-03-25 15:59:59 -07001696 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_REMOTE_SUBMIX,
1697 mMixAddress, &mInjectionPort));
jiabinf4eb15a2019-08-28 15:31:47 -07001698}
1699
1700void AudioPolicyManagerTestDPPlaybackReRouting::TearDown() {
1701 mManager->stopInput(mPortId);
1702 AudioPolicyManagerTestDynamicPolicy::TearDown();
1703}
1704
jiabinf4eb15a2019-08-28 15:31:47 -07001705TEST_P(AudioPolicyManagerTestDPPlaybackReRouting, PlaybackReRouting) {
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001706 const DPTestParam param = GetParam();
1707 const audio_attributes_t& attr = param.attributes;
jiabinf4eb15a2019-08-28 15:31:47 -07001708
jiabin7c0205e2019-09-05 10:26:04 -07001709 audio_port_handle_t playbackRoutedPortId = AUDIO_PORT_HANDLE_NONE;
jiabinf4eb15a2019-08-28 15:31:47 -07001710 getOutputForAttr(&playbackRoutedPortId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
Dean Wheatleyd082f472022-02-04 11:10:48 +11001711 k48000SamplingRate, AUDIO_OUTPUT_FLAG_NONE, nullptr /*output*/, nullptr /*portId*/,
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001712 attr, param.session);
1713 if (param.expected_match) {
jiabinf4eb15a2019-08-28 15:31:47 -07001714 EXPECT_EQ(mInjectionPort.id, playbackRoutedPortId);
1715 } else {
1716 EXPECT_NE(mInjectionPort.id, playbackRoutedPortId);
1717 }
1718}
1719
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001720const std::vector<AudioMixMatchCriterion> USAGE_MEDIA_ALARM_CRITERIA = {
1721 createUsageCriterion(AUDIO_USAGE_MEDIA),
1722 createUsageCriterion(AUDIO_USAGE_ALARM)
1723};
jiabinf4eb15a2019-08-28 15:31:47 -07001724
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001725INSTANTIATE_TEST_SUITE_P(
1726 PlaybackReroutingUsageMatch,
1727 AudioPolicyManagerTestDPPlaybackReRouting,
1728 testing::Values(
1729 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1730 .withUsage(AUDIO_USAGE_MEDIA),
1731 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1732 .withUsage(AUDIO_USAGE_MEDIA).withTags("addr=other"),
1733 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1734 .withUsage(AUDIO_USAGE_ALARM),
1735 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1736 .withUsage(AUDIO_USAGE_VOICE_COMMUNICATION),
1737 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1738 .withUsage(AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING),
1739 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1740 .withUsage(AUDIO_USAGE_NOTIFICATION),
1741 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1742 .withUsage(AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE),
1743 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1744 .withUsage(AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST),
1745 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1746 .withUsage(AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT),
1747 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1748 .withUsage(AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED),
1749 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1750 .withUsage(AUDIO_USAGE_NOTIFICATION_EVENT),
1751 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1752 .withUsage(AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY),
1753 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1754 .withUsage(AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE),
1755 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1756 .withUsage(AUDIO_USAGE_ASSISTANCE_SONIFICATION),
1757 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1758 .withUsage(AUDIO_USAGE_GAME),
1759 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ false)
1760 .withUsage(AUDIO_USAGE_ASSISTANT)));
jiabinf4eb15a2019-08-28 15:31:47 -07001761
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001762INSTANTIATE_TEST_SUITE_P(
1763 PlaybackReroutingAddressPriorityMatch,
1764 AudioPolicyManagerTestDPPlaybackReRouting,
1765 testing::Values(
1766 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1767 .withUsage(AUDIO_USAGE_MEDIA).withTags("addr=remote_submix_media"),
1768 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1769 .withUsage(AUDIO_USAGE_VOICE_COMMUNICATION).withTags("addr=remote_submix_media"),
1770 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1771 .withUsage(AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING)
1772 .withTags("addr=remote_submix_media"),
1773 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1774 .withUsage(AUDIO_USAGE_ALARM)
1775 .withTags("addr=remote_submix_media"),
1776 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1777 .withUsage(AUDIO_USAGE_NOTIFICATION)
1778 .withTags("addr=remote_submix_media"),
1779 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1780 .withUsage(AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE)
1781 .withTags("addr=remote_submix_media"),
1782 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1783 .withUsage(AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST)
1784 .withTags("addr=remote_submix_media"),
1785 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1786 .withUsage(AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT)
1787 .withTags("addr=remote_submix_media"),
1788 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1789 .withUsage(AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED)
1790 .withTags("addr=remote_submix_media"),
1791 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1792 .withUsage(AUDIO_USAGE_NOTIFICATION_EVENT)
1793 .withTags("addr=remote_submix_media"),
1794 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1795 .withUsage(AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY)
1796 .withTags("addr=remote_submix_media"),
1797 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1798 .withUsage(AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE)
1799 .withTags("addr=remote_submix_media"),
1800 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1801 .withUsage(AUDIO_USAGE_ASSISTANCE_SONIFICATION)
1802 .withTags("addr=remote_submix_media"),
1803 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1804 .withUsage(AUDIO_USAGE_GAME)
1805 .withTags("addr=remote_submix_media"),
1806 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1807 .withUsage(AUDIO_USAGE_VIRTUAL_SOURCE)
1808 .withTags("addr=remote_submix_media"),
1809 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1810 .withUsage(AUDIO_USAGE_ASSISTANT)
Jan Sebechlebskybc56bcd2022-09-26 13:15:19 +02001811 .withTags("addr=remote_submix_media"),
1812 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1813 .withUsage(AUDIO_USAGE_ASSISTANT)
1814 .withTags("sometag;addr=remote_submix_media;othertag=somevalue"),
1815 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1816 .withUsage(AUDIO_USAGE_ASSISTANT)
1817 .withTags("addr=remote_submix_media;othertag"),
1818 DPTestParam(USAGE_MEDIA_ALARM_CRITERIA, /*expected_match=*/ true)
1819 .withUsage(AUDIO_USAGE_ASSISTANT)
1820 .withTags("sometag;othertag;addr=remote_submix_media")));
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001821
1822static constexpr audio_session_t TEST_SESSION_ID = static_cast<audio_session_t>(42);
1823static constexpr audio_session_t OTHER_SESSION_ID = static_cast<audio_session_t>(77);
1824
1825INSTANTIATE_TEST_SUITE_P(
1826 PlaybackReRoutingWithSessionId,
1827 AudioPolicyManagerTestDPPlaybackReRouting,
1828 testing::Values(
1829 // Mix is matched because the session id matches the one specified by the mix rule.
1830 DPTestParam(/*mixCriteria=*/ {createSessionIdCriterion(TEST_SESSION_ID)},
1831 /*expected_match=*/ true)
1832 .withSessionId(TEST_SESSION_ID),
1833 // Mix is not matched because the session id doesn't match the one specified
1834 // by the mix rule.
1835 DPTestParam(/*mixCriteria=*/ {createSessionIdCriterion(TEST_SESSION_ID)},
1836 /*expected_match=*/ false)
1837 .withSessionId(OTHER_SESSION_ID),
1838 // Mix is matched, the session id doesn't match the one specified by rule,
1839 // but there's address specified in the tags which takes precedence.
1840 DPTestParam(/*mixCriteria=*/ {createSessionIdCriterion(TEST_SESSION_ID)},
1841 /*expected_match=*/ true)
1842 .withSessionId(OTHER_SESSION_ID).withTags("addr=remote_submix_media"),
1843 // Mix is matched, both the session id and the usage match ones specified by mix rule.
1844 DPTestParam(/*mixCriteria=*/ {createSessionIdCriterion(TEST_SESSION_ID),
1845 createUsageCriterion(AUDIO_USAGE_MEDIA)},
1846 /*expected_match=*/ true)
1847 .withSessionId(TEST_SESSION_ID).withUsage(AUDIO_USAGE_MEDIA),
1848 // Mix is not matched, the session id matches the one specified by mix rule,
1849 // but usage does not.
1850 DPTestParam(/*mixCriteria=*/ {createSessionIdCriterion(TEST_SESSION_ID),
1851 createUsageCriterion(AUDIO_USAGE_MEDIA)},
1852 /*expected_match=*/ false)
1853 .withSessionId(TEST_SESSION_ID).withUsage(AUDIO_USAGE_GAME),
1854 // Mix is not matched, the usage matches the one specified by mix rule,
1855 // but the session id is excluded.
1856 DPTestParam(/*mixCriteria=*/ {createSessionIdCriterion(TEST_SESSION_ID, /*exclude=*/ true),
1857 createUsageCriterion(AUDIO_USAGE_MEDIA)},
1858 /*expected_match=*/ false)
1859 .withSessionId(TEST_SESSION_ID).withUsage(AUDIO_USAGE_MEDIA)));
jiabinf4eb15a2019-08-28 15:31:47 -07001860
1861class AudioPolicyManagerTestDPMixRecordInjection : public AudioPolicyManagerTestDynamicPolicy,
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001862 public testing::WithParamInterface<DPTestParam> {
jiabinf4eb15a2019-08-28 15:31:47 -07001863protected:
1864 void SetUp() override;
1865 void TearDown() override;
1866
1867 std::unique_ptr<RecordingActivityTracker> mTracker;
jiabin19cdba52020-11-24 11:28:58 -08001868 struct audio_port_v7 mExtractionPort;
jiabinf4eb15a2019-08-28 15:31:47 -07001869 audio_port_handle_t mPortId = AUDIO_PORT_HANDLE_NONE;
1870};
1871
1872void AudioPolicyManagerTestDPMixRecordInjection::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_IN_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();
jiabinf4eb15a2019-08-28 15:31:47 -07001883 status_t ret = addPolicyMix(MIX_TYPE_RECORDERS, MIX_ROUTE_FLAG_LOOP_BACK,
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001884 AUDIO_DEVICE_IN_REMOTE_SUBMIX, mMixAddress, audioConfig, param.mixCriteria);
jiabinf4eb15a2019-08-28 15:31:47 -07001885 ASSERT_EQ(NO_ERROR, ret);
1886
jiabin19cdba52020-11-24 11:28:58 -08001887 struct audio_port_v7 injectionPort;
Mikhail Naganovd0e2c742020-03-25 15:59:59 -07001888 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_REMOTE_SUBMIX,
1889 mMixAddress, &injectionPort));
jiabinf4eb15a2019-08-28 15:31:47 -07001890
1891 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
1892 audio_usage_t usage = AUDIO_USAGE_VIRTUAL_SOURCE;
Mikhail Naganov55773032020-10-01 15:08:13 -07001893 audio_attributes_t attr =
1894 {AUDIO_CONTENT_TYPE_UNKNOWN, usage, AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
jiabinf4eb15a2019-08-28 15:31:47 -07001895 std::string tags = std::string("addr=") + mMixAddress;
1896 strncpy(attr.tags, tags.c_str(), AUDIO_ATTRIBUTES_TAGS_MAX_SIZE - 1);
1897 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
Dean Wheatleyd082f472022-02-04 11:10:48 +11001898 k48000SamplingRate, AUDIO_OUTPUT_FLAG_NONE, nullptr /*output*/, &mPortId, attr);
jiabinf4eb15a2019-08-28 15:31:47 -07001899 ASSERT_EQ(NO_ERROR, mManager->startOutput(mPortId));
1900 ASSERT_EQ(injectionPort.id, getDeviceIdFromPatch(mClient->getLastAddedPatch()));
1901
Mikhail Naganovd0e2c742020-03-25 15:59:59 -07001902 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SOURCE, AUDIO_DEVICE_IN_REMOTE_SUBMIX,
1903 mMixAddress, &mExtractionPort));
jiabinf4eb15a2019-08-28 15:31:47 -07001904}
1905
1906void AudioPolicyManagerTestDPMixRecordInjection::TearDown() {
1907 mManager->stopOutput(mPortId);
1908 AudioPolicyManagerTestDynamicPolicy::TearDown();
1909}
1910
jiabinf4eb15a2019-08-28 15:31:47 -07001911TEST_P(AudioPolicyManagerTestDPMixRecordInjection, RecordingInjection) {
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001912 const DPTestParam param = GetParam();
jiabinf4eb15a2019-08-28 15:31:47 -07001913
jiabin7c0205e2019-09-05 10:26:04 -07001914 audio_port_handle_t captureRoutedPortId = AUDIO_PORT_HANDLE_NONE;
jiabinf4eb15a2019-08-28 15:31:47 -07001915 audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001916 getInputForAttr(param.attributes, param.session, mTracker->getRiid(), &captureRoutedPortId,
1917 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO, k48000SamplingRate,
1918 AUDIO_INPUT_FLAG_NONE, &portId);
1919 if (param.expected_match) {
jiabinf4eb15a2019-08-28 15:31:47 -07001920 EXPECT_EQ(mExtractionPort.id, captureRoutedPortId);
1921 } else {
1922 EXPECT_NE(mExtractionPort.id, captureRoutedPortId);
1923 }
1924}
1925
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001926const std::vector<AudioMixMatchCriterion> SOURCE_CAM_MIC_VOICE_CRITERIA = {
1927 createCapturePresetCriterion(AUDIO_SOURCE_CAMCORDER),
1928 createCapturePresetCriterion(AUDIO_SOURCE_MIC),
1929 createCapturePresetCriterion(AUDIO_SOURCE_VOICE_COMMUNICATION)
1930};
1931
jiabinf4eb15a2019-08-28 15:31:47 -07001932// No address priority rule for remote recording, address is a "don't care"
1933INSTANTIATE_TEST_CASE_P(
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001934 RecordInjectionSource,
jiabinf4eb15a2019-08-28 15:31:47 -07001935 AudioPolicyManagerTestDPMixRecordInjection,
1936 testing::Values(
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001937 DPTestParam(SOURCE_CAM_MIC_VOICE_CRITERIA, /*expected_match=*/ true)
1938 .withSource(AUDIO_SOURCE_CAMCORDER),
1939 DPTestParam(SOURCE_CAM_MIC_VOICE_CRITERIA, /*expected_match=*/ true)
1940 .withSource(AUDIO_SOURCE_CAMCORDER)
1941 .withTags("addr=remote_submix_media"),
1942 DPTestParam(SOURCE_CAM_MIC_VOICE_CRITERIA, /*expected_match=*/ true)
1943 .withSource(AUDIO_SOURCE_MIC),
1944 DPTestParam(SOURCE_CAM_MIC_VOICE_CRITERIA, /*expected_match=*/ true)
1945 .withSource(AUDIO_SOURCE_MIC)
1946 .withTags("addr=remote_submix_media"),
1947 DPTestParam(SOURCE_CAM_MIC_VOICE_CRITERIA, /*expected_match=*/ true)
1948 .withSource(AUDIO_SOURCE_VOICE_COMMUNICATION),
1949 DPTestParam(SOURCE_CAM_MIC_VOICE_CRITERIA, /*expected_match=*/ true)
1950 .withSource(AUDIO_SOURCE_VOICE_COMMUNICATION)
1951 .withTags("addr=remote_submix_media"),
1952 DPTestParam(SOURCE_CAM_MIC_VOICE_CRITERIA, /*expected_match=*/ false)
1953 .withSource(AUDIO_SOURCE_VOICE_RECOGNITION),
1954 DPTestParam(SOURCE_CAM_MIC_VOICE_CRITERIA, /*expected_match=*/ false)
1955 .withSource(AUDIO_SOURCE_VOICE_RECOGNITION)
1956 .withTags("addr=remote_submix_media"),
1957 DPTestParam(SOURCE_CAM_MIC_VOICE_CRITERIA, /*expected_match=*/ false)
1958 .withSource(AUDIO_SOURCE_HOTWORD),
1959 DPTestParam(SOURCE_CAM_MIC_VOICE_CRITERIA, /*expected_match=*/ false)
1960 .withSource(AUDIO_SOURCE_HOTWORD)
1961 .withTags("addr=remote_submix_media")));
jiabinf4eb15a2019-08-28 15:31:47 -07001962
jiabinf4eb15a2019-08-28 15:31:47 -07001963INSTANTIATE_TEST_CASE_P(
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001964 RecordInjectionWithSessionId,
jiabinf4eb15a2019-08-28 15:31:47 -07001965 AudioPolicyManagerTestDPMixRecordInjection,
1966 testing::Values(
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02001967 // Mix is matched because the session id matches the one specified by the mix rule.
1968 DPTestParam(/*mixCriteria=*/ {createSessionIdCriterion(TEST_SESSION_ID)},
1969 /*expected_match=*/ true)
1970 .withSessionId(TEST_SESSION_ID),
1971 // Mix is not matched because the session id doesn't match the one specified
1972 // by the mix rule.
1973 DPTestParam(/*mixCriteria=*/ {createSessionIdCriterion(TEST_SESSION_ID)},
1974 /*expected_match=*/ false)
1975 .withSessionId(OTHER_SESSION_ID),
1976 // Mix is not matched, the session id doesn't match the one specified by rule,
1977 // but tand address specified in the tags is ignored for recorder mix.
1978 DPTestParam(/*mixCriteria=*/ {createSessionIdCriterion(TEST_SESSION_ID)},
1979 /*expected_match=*/ false)
1980 .withSessionId(OTHER_SESSION_ID).withTags("addr=remote_submix_media"),
1981 // Mix is matched, both the session id and the source match ones specified by mix rule
1982 DPTestParam(/*mixCriteria=*/ {createSessionIdCriterion(TEST_SESSION_ID),
1983 createCapturePresetCriterion(AUDIO_SOURCE_CAMCORDER)},
1984 /*expected_match=*/ true)
1985 .withSessionId(TEST_SESSION_ID).withSource(AUDIO_SOURCE_CAMCORDER),
1986 // Mix is not matched, the session id matches the one specified by mix rule,
1987 // but source does not.
1988 DPTestParam(/*mixCriteria=*/ {createSessionIdCriterion(TEST_SESSION_ID),
1989 createCapturePresetCriterion(AUDIO_SOURCE_CAMCORDER)},
1990 /*expected_match=*/ false)
1991 .withSessionId(TEST_SESSION_ID).withSource(AUDIO_SOURCE_MIC),
1992 // Mix is not matched, the source matches the one specified by mix rule,
1993 // but the session id is excluded.
1994 DPTestParam(/*mixCriteria=*/ {createSessionIdCriterion(TEST_SESSION_ID,
1995 /*exclude=*/ true),
1996 createCapturePresetCriterion(AUDIO_SOURCE_MIC)},
1997 /*expected_match=*/ false)
1998 .withSessionId(TEST_SESSION_ID).withSource(AUDIO_SOURCE_MIC)));
jiabin43848a52019-09-05 14:07:25 -07001999
2000using DeviceConnectionTestParams =
2001 std::tuple<audio_devices_t /*type*/, std::string /*name*/, std::string /*address*/>;
2002
2003class AudioPolicyManagerTestDeviceConnection : public AudioPolicyManagerTestWithConfigurationFile,
2004 public testing::WithParamInterface<DeviceConnectionTestParams> {
2005};
2006
2007TEST_F(AudioPolicyManagerTestDeviceConnection, InitSuccess) {
2008 // SetUp must finish with no assertions.
2009}
2010
2011TEST_F(AudioPolicyManagerTestDeviceConnection, Dump) {
2012 dumpToLog();
2013}
2014
Jean-Michel Trivi9a6b9ad2020-10-22 16:46:43 -07002015TEST_F(AudioPolicyManagerTestDeviceConnection, RoutingUpdate) {
2016 mClient->resetRoutingUpdatedCounter();
2017 // Connecting a valid output device with valid parameters should trigger a routing update
2018 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
2019 AUDIO_DEVICE_OUT_BLUETOOTH_SCO, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
2020 "a", "b", AUDIO_FORMAT_DEFAULT));
2021 ASSERT_EQ(1, mClient->getRoutingUpdatedCounter());
2022
2023 // Disconnecting a connected device should succeed and trigger a routing update
2024 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
2025 AUDIO_DEVICE_OUT_BLUETOOTH_SCO, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
2026 "a", "b", AUDIO_FORMAT_DEFAULT));
2027 ASSERT_EQ(2, mClient->getRoutingUpdatedCounter());
2028
2029 // Disconnecting a disconnected device should fail and not trigger a routing update
2030 ASSERT_EQ(INVALID_OPERATION, mManager->setDeviceConnectionState(
2031 AUDIO_DEVICE_OUT_BLUETOOTH_SCO, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
2032 "a", "b", AUDIO_FORMAT_DEFAULT));
2033 ASSERT_EQ(2, mClient->getRoutingUpdatedCounter());
2034
2035 // Changing force use should trigger an update
2036 auto config = mManager->getForceUse(AUDIO_POLICY_FORCE_FOR_MEDIA);
2037 auto newConfig = config == AUDIO_POLICY_FORCE_BT_A2DP ?
2038 AUDIO_POLICY_FORCE_NONE : AUDIO_POLICY_FORCE_BT_A2DP;
2039 mManager->setForceUse(AUDIO_POLICY_FORCE_FOR_MEDIA, newConfig);
2040 ASSERT_EQ(3, mClient->getRoutingUpdatedCounter());
2041}
2042
jiabin43848a52019-09-05 14:07:25 -07002043TEST_P(AudioPolicyManagerTestDeviceConnection, SetDeviceConnectionState) {
2044 const audio_devices_t type = std::get<0>(GetParam());
2045 const std::string name = std::get<1>(GetParam());
2046 const std::string address = std::get<2>(GetParam());
2047
2048 if (type == AUDIO_DEVICE_OUT_HDMI) {
2049 // Set device connection state failed due to no device descriptor found
2050 // For HDMI case, it is easier to simulate device descriptor not found error
Mikhail Naganov83caee02021-10-05 15:52:01 -07002051 // by using an encoded format which isn't listed in the 'encodedFormats'
2052 // attribute for this devicePort.
jiabin43848a52019-09-05 14:07:25 -07002053 ASSERT_EQ(INVALID_OPERATION, mManager->setDeviceConnectionState(
2054 type, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
2055 address.c_str(), name.c_str(), AUDIO_FORMAT_MAT_2_1));
2056 }
2057 // Connect with valid parameters should succeed
2058 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
2059 type, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
2060 address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT));
2061 // Try to connect with the same device again should fail
2062 ASSERT_EQ(INVALID_OPERATION, mManager->setDeviceConnectionState(
2063 type, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
2064 address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT));
2065 // Disconnect the connected device should succeed
2066 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
2067 type, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
2068 address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT));
2069 // Disconnect device that is not connected should fail
2070 ASSERT_EQ(INVALID_OPERATION, mManager->setDeviceConnectionState(
2071 type, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
2072 address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT));
2073 // Try to set device connection state with a invalid connection state should fail
2074 ASSERT_EQ(BAD_VALUE, mManager->setDeviceConnectionState(
2075 type, AUDIO_POLICY_DEVICE_STATE_CNT,
2076 "", "", AUDIO_FORMAT_DEFAULT));
2077}
2078
2079TEST_P(AudioPolicyManagerTestDeviceConnection, ExplicitlyRoutingAfterConnection) {
2080 const audio_devices_t type = std::get<0>(GetParam());
2081 const std::string name = std::get<1>(GetParam());
2082 const std::string address = std::get<2>(GetParam());
2083
2084 // Connect device to do explicitly routing test
2085 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
2086 type, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
2087 address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT));
2088
jiabin19cdba52020-11-24 11:28:58 -08002089 audio_port_v7 devicePort;
jiabin43848a52019-09-05 14:07:25 -07002090 const audio_port_role_t role = audio_is_output_device(type)
2091 ? AUDIO_PORT_ROLE_SINK : AUDIO_PORT_ROLE_SOURCE;
Mikhail Naganovd0e2c742020-03-25 15:59:59 -07002092 ASSERT_TRUE(findDevicePort(role, type, address, &devicePort));
jiabin43848a52019-09-05 14:07:25 -07002093
2094 audio_port_handle_t routedPortId = devicePort.id;
jiabin43848a52019-09-05 14:07:25 -07002095 // Try start input or output according to the device type
2096 if (audio_is_output_devices(type)) {
2097 getOutputForAttr(&routedPortId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
Dean Wheatleyd082f472022-02-04 11:10:48 +11002098 k48000SamplingRate, AUDIO_OUTPUT_FLAG_NONE);
jiabin43848a52019-09-05 14:07:25 -07002099 } else if (audio_is_input_device(type)) {
2100 RecordingActivityTracker tracker;
Jan Sebechlebsky1a80c062022-08-09 15:21:18 +02002101 getInputForAttr({}, AUDIO_SESSION_NONE, tracker.getRiid(), &routedPortId,
2102 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO, k48000SamplingRate,
2103 AUDIO_INPUT_FLAG_NONE);
jiabin43848a52019-09-05 14:07:25 -07002104 }
2105 ASSERT_EQ(devicePort.id, routedPortId);
2106
2107 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
2108 type, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
2109 address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT));
2110}
2111
Mikhail Naganovddc5f312022-06-11 00:47:52 +00002112android::media::audio::common::ExtraAudioDescriptor make_ExtraAudioDescriptor(
2113 android::media::audio::common::AudioStandard audioStandard,
2114 android::media::audio::common::AudioEncapsulationType audioEncapsulationType) {
2115 android::media::audio::common::ExtraAudioDescriptor result;
2116 result.standard = audioStandard;
2117 result.audioDescriptor = {0xb4, 0xaf, 0x98, 0x1a};
2118 result.encapsulationType = audioEncapsulationType;
2119 return result;
2120}
2121
2122TEST_P(AudioPolicyManagerTestDeviceConnection, PassingExtraAudioDescriptors) {
2123 const audio_devices_t type = std::get<0>(GetParam());
2124 if (!audio_device_is_digital(type)) {
2125 // EADs are used only for HDMI devices.
2126 GTEST_SKIP() << "Not a digital device type: " << audio_device_to_string(type);
2127 }
2128 const std::string name = std::get<1>(GetParam());
2129 const std::string address = std::get<2>(GetParam());
Atneya Nair638a6e42022-12-18 16:45:15 -08002130 android::media::AudioPortFw audioPort;
Mikhail Naganovddc5f312022-06-11 00:47:52 +00002131 ASSERT_EQ(NO_ERROR,
2132 mManager->deviceToAudioPort(type, address.c_str(), name.c_str(), &audioPort));
2133 android::media::audio::common::AudioPort& port = audioPort.hal;
2134 port.extraAudioDescriptors.push_back(make_ExtraAudioDescriptor(
2135 android::media::audio::common::AudioStandard::EDID,
2136 android::media::audio::common::AudioEncapsulationType::IEC61937));
2137 const size_t lastConnectedDevicePortCount = mClient->getConnectedDevicePortCount();
2138 const size_t lastDisconnectedDevicePortCount = mClient->getDisconnectedDevicePortCount();
2139 EXPECT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
2140 AUDIO_POLICY_DEVICE_STATE_AVAILABLE, port, AUDIO_FORMAT_DEFAULT));
2141 EXPECT_EQ(lastConnectedDevicePortCount + 1, mClient->getConnectedDevicePortCount());
2142 EXPECT_EQ(lastDisconnectedDevicePortCount, mClient->getDisconnectedDevicePortCount());
2143 const audio_port_v7* devicePort = mClient->getLastConnectedDevicePort();
2144 EXPECT_EQ(port.extraAudioDescriptors.size(), devicePort->num_extra_audio_descriptors);
2145 EXPECT_EQ(AUDIO_STANDARD_EDID, devicePort->extra_audio_descriptors[0].standard);
2146 EXPECT_EQ(AUDIO_ENCAPSULATION_TYPE_IEC61937,
2147 devicePort->extra_audio_descriptors[0].encapsulation_type);
2148 EXPECT_NE(0, devicePort->extra_audio_descriptors[0].descriptor[0]);
2149}
2150
jiabin43848a52019-09-05 14:07:25 -07002151INSTANTIATE_TEST_CASE_P(
2152 DeviceConnectionState,
2153 AudioPolicyManagerTestDeviceConnection,
2154 testing::Values(
2155 DeviceConnectionTestParams({AUDIO_DEVICE_IN_HDMI, "test_in_hdmi",
2156 "audio_policy_test_in_hdmi"}),
2157 DeviceConnectionTestParams({AUDIO_DEVICE_OUT_HDMI, "test_out_hdmi",
2158 "audio_policy_test_out_hdmi"}),
2159 DeviceConnectionTestParams({AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, "bt_hfp_in",
2160 "hfp_client_in"}),
2161 DeviceConnectionTestParams({AUDIO_DEVICE_OUT_BLUETOOTH_SCO, "bt_hfp_out",
2162 "hfp_client_out"})
2163 )
2164 );
Mikhail Naganov0756bbf2019-09-06 13:53:26 -07002165
Dean Wheatleyd082f472022-02-04 11:10:48 +11002166class AudioPolicyManagerCarTest : public AudioPolicyManagerTestDynamicPolicy {
2167protected:
2168 std::string getConfigFile() override { return sCarConfig; }
2169
2170 static const std::string sCarConfig;
Oscar Azucena873d10f2023-01-12 18:34:42 -08002171 static const std::string sCarBusMediaOutput;
2172 static const std::string sCarBusNavigationOutput;
Dean Wheatleyd082f472022-02-04 11:10:48 +11002173};
2174
2175const std::string AudioPolicyManagerCarTest::sCarConfig =
2176 AudioPolicyManagerCarTest::sExecutableDir + "test_car_ap_atmos_offload_configuration.xml";
2177
Oscar Azucena873d10f2023-01-12 18:34:42 -08002178const std::string AudioPolicyManagerCarTest::sCarBusMediaOutput = "bus0_media_out";
2179
2180const std::string AudioPolicyManagerCarTest::sCarBusNavigationOutput = "bus1_navigation_out";
2181
Dean Wheatleyd082f472022-02-04 11:10:48 +11002182TEST_F(AudioPolicyManagerCarTest, InitSuccess) {
2183 // SetUp must finish with no assertions.
2184}
2185
2186TEST_F(AudioPolicyManagerCarTest, Dump) {
2187 dumpToLog();
2188}
2189
Dean Wheatleyecbf2ee2022-03-04 10:51:36 +11002190TEST_F(AudioPolicyManagerCarTest, GetOutputForAttrAtmosOutputAfterRegisteringPolicyMix) {
Dean Wheatleyd082f472022-02-04 11:10:48 +11002191 status_t ret;
2192 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
Dean Wheatleyd082f472022-02-04 11:10:48 +11002193 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
Oscar Azucena873d10f2023-01-12 18:34:42 -08002194 AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput, audioConfig);
Dean Wheatleyd082f472022-02-04 11:10:48 +11002195 ASSERT_EQ(NO_ERROR, ret);
2196
2197 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
2198 audio_io_handle_t output;
2199 audio_port_handle_t portId;
2200 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_E_AC3_JOC, AUDIO_CHANNEL_OUT_5POINT1,
2201 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, &output, &portId);
2202 ASSERT_NE(AUDIO_PORT_HANDLE_NONE, selectedDeviceId);
2203 sp<SwAudioOutputDescriptor> outDesc = mManager->getOutputs().valueFor(output);
2204 ASSERT_NE(nullptr, outDesc.get());
2205 ASSERT_EQ(AUDIO_FORMAT_E_AC3_JOC, outDesc->getFormat());
2206 ASSERT_EQ(AUDIO_CHANNEL_OUT_5POINT1, outDesc->getChannelMask());
2207 ASSERT_EQ(k48000SamplingRate, outDesc->getSamplingRate());
Dean Wheatleyecbf2ee2022-03-04 10:51:36 +11002208
2209 selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
2210 output = AUDIO_IO_HANDLE_NONE;
2211 portId = AUDIO_PORT_HANDLE_NONE;
2212 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_7POINT1POINT4,
2213 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, &output, &portId);
2214 ASSERT_NE(AUDIO_PORT_HANDLE_NONE, selectedDeviceId);
2215 outDesc = mManager->getOutputs().valueFor(output);
2216 ASSERT_NE(nullptr, outDesc.get());
2217 ASSERT_EQ(AUDIO_FORMAT_PCM_16_BIT, outDesc->getFormat());
2218 ASSERT_EQ(AUDIO_CHANNEL_OUT_7POINT1POINT4, outDesc->getChannelMask());
2219 ASSERT_EQ(k48000SamplingRate, outDesc->getSamplingRate());
Dean Wheatleyd082f472022-02-04 11:10:48 +11002220}
2221
Oscar Azucena873d10f2023-01-12 18:34:42 -08002222TEST_F(AudioPolicyManagerCarTest, GetOutputForAttrAfterRegisteringPolicyMix) {
2223 status_t ret;
2224 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
2225 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
2226 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
2227 audioConfig.sample_rate = k48000SamplingRate;
2228 std::vector<AudioMixMatchCriterion> mediaMatchCriteria = {
2229 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/ false)};
2230 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2231 AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput, audioConfig, mediaMatchCriteria);
2232 ASSERT_EQ(NO_ERROR, ret);
2233 std::vector<AudioMixMatchCriterion> navMatchCriteria = {
2234 createUsageCriterion(AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
2235 /*exclude=*/ false)};
2236 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2237 AUDIO_DEVICE_OUT_BUS, sCarBusNavigationOutput, audioConfig, navMatchCriteria);
2238 ASSERT_EQ(NO_ERROR, ret);
2239 audio_port_v7 mediaDevicePort;
2240 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_BUS,
2241 sCarBusMediaOutput, &mediaDevicePort));
2242 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
2243 audio_io_handle_t output;
2244 audio_port_handle_t portId;
2245 const audio_attributes_t mediaAttribute = {
2246 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_MEDIA,
2247 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
2248
2249 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
2250 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, &output, &portId, mediaAttribute);
2251
2252 ASSERT_EQ(mediaDevicePort.id, selectedDeviceId);
2253}
2254
2255TEST_F(AudioPolicyManagerCarTest, GetOutputForAttrWithSelectedOutputAfterRegisteringPolicyMix) {
2256 status_t ret;
2257 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
2258 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
2259 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
2260 audioConfig.sample_rate = k48000SamplingRate;
2261 std::vector<AudioMixMatchCriterion> mediaMatchCriteria = {
2262 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/ false)};
2263 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2264 AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput, audioConfig, mediaMatchCriteria);
2265 ASSERT_EQ(NO_ERROR, ret);
2266 std::vector<AudioMixMatchCriterion> navMatchCriteria = {
2267 createUsageCriterion(AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
2268 /*exclude=*/ false)};
2269 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2270 AUDIO_DEVICE_OUT_BUS, sCarBusNavigationOutput, audioConfig, navMatchCriteria);
2271 ASSERT_EQ(NO_ERROR, ret);
2272 audio_port_v7 navDevicePort;
2273 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_BUS,
2274 sCarBusNavigationOutput, &navDevicePort));
2275 audio_port_handle_t selectedDeviceId = navDevicePort.id;
2276 audio_io_handle_t output;
2277 audio_port_handle_t portId;
2278 const audio_attributes_t mediaAttribute = {
2279 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_MEDIA,
2280 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
2281
2282 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
2283 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, &output, &portId, mediaAttribute);
2284
2285 ASSERT_EQ(navDevicePort.id, selectedDeviceId);
2286}
2287
2288TEST_F(AudioPolicyManagerCarTest, GetOutputForAttrWithSelectedOutputAfterUserAffinities) {
2289 status_t ret;
2290 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
2291 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
2292 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
2293 audioConfig.sample_rate = k48000SamplingRate;
2294 std::vector<AudioMixMatchCriterion> mediaMatchCriteria = {
2295 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/ false)};
2296 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2297 AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput, audioConfig, mediaMatchCriteria);
2298 ASSERT_EQ(NO_ERROR, ret);
2299 std::vector<AudioMixMatchCriterion> navMatchCriteria = {
2300 createUsageCriterion(AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
2301 /*exclude=*/ false)};
2302 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2303 AUDIO_DEVICE_OUT_BUS, sCarBusNavigationOutput, audioConfig, navMatchCriteria);
2304 ASSERT_EQ(NO_ERROR, ret);
2305 const AudioDeviceTypeAddr mediaOutputDevice(AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput);
2306 const AudioDeviceTypeAddrVector outputDevices = {mediaOutputDevice};
2307 mManager->setUserIdDeviceAffinities(0, outputDevices);
2308 audio_port_v7 navDevicePort;
2309 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_BUS,
2310 sCarBusNavigationOutput, &navDevicePort));
2311 audio_port_handle_t selectedDeviceId = navDevicePort.id;
2312 audio_io_handle_t output;
2313 audio_port_handle_t portId;
2314 const audio_attributes_t mediaAttribute = {
2315 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_MEDIA,
2316 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
2317
2318 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
2319 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, &output, &portId, mediaAttribute);
2320
2321 ASSERT_NE(navDevicePort.id, selectedDeviceId);
2322}
2323
2324TEST_F(AudioPolicyManagerCarTest, GetOutputForAttrWithExcludeUserIdCriteria) {
2325 status_t ret;
2326 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
2327 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
2328 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
2329 audioConfig.sample_rate = k48000SamplingRate;
2330 std::vector<AudioMixMatchCriterion> mediaMatchCriteria = {
2331 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/ false)};
2332 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2333 AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput, audioConfig, mediaMatchCriteria);
2334 ASSERT_EQ(NO_ERROR, ret);
2335 std::vector<AudioMixMatchCriterion> navMatchCriteria = {
2336 createUsageCriterion(AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
2337 /*exclude=*/ false),
2338 createUserIdCriterion(/* userId */ 0, /* exclude */ true)};
2339 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2340 AUDIO_DEVICE_OUT_BUS, sCarBusNavigationOutput, audioConfig, navMatchCriteria);
2341 ASSERT_EQ(NO_ERROR, ret);
2342 audio_port_v7 navDevicePort;
2343 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_BUS,
2344 sCarBusNavigationOutput, &navDevicePort));
2345 audio_io_handle_t output;
2346 audio_port_handle_t portId;
2347 const audio_attributes_t navigationAttribute = {
2348 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
2349 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
2350 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
2351
2352 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
2353 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, &output, &portId, navigationAttribute);
2354
2355 ASSERT_NE(navDevicePort.id, selectedDeviceId);
2356}
2357
2358TEST_F(AudioPolicyManagerCarTest, GetOutputForAttrWithSelectedOutputExcludeUserIdCriteria) {
2359 status_t ret;
2360 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
2361 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
2362 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
2363 audioConfig.sample_rate = k48000SamplingRate;
2364 std::vector<AudioMixMatchCriterion> mediaMatchCriteria = {
2365 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/ false)};
2366 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2367 AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput, audioConfig, mediaMatchCriteria);
2368 ASSERT_EQ(NO_ERROR, ret);
2369 std::vector<AudioMixMatchCriterion> navMatchCriteria = {
2370 createUsageCriterion(AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
2371 /*exclude=*/ false),
2372 createUserIdCriterion(0 /* userId */, /* exclude */ true)};
2373 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2374 AUDIO_DEVICE_OUT_BUS, sCarBusNavigationOutput, audioConfig, navMatchCriteria);
2375 ASSERT_EQ(NO_ERROR, ret);
2376 audio_port_v7 navDevicePort;
2377 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_BUS,
2378 sCarBusNavigationOutput, &navDevicePort));
2379 audio_port_handle_t selectedDeviceId = navDevicePort.id;
2380 audio_io_handle_t output;
2381 audio_port_handle_t portId;
2382 const audio_attributes_t mediaAttribute = {
2383 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_MEDIA,
2384 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
2385
2386 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
2387 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, &output, &portId, mediaAttribute);
2388
2389 ASSERT_EQ(navDevicePort.id, selectedDeviceId);
2390}
2391
2392TEST_F(AudioPolicyManagerCarTest,
2393 GetOutputForAttrWithMatchingMixAndSelectedOutputAfterUserAffinities) {
2394 status_t ret;
2395 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
2396 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
2397 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
2398 audioConfig.sample_rate = k48000SamplingRate;
2399 std::vector<AudioMixMatchCriterion> mediaMatchCriteria = {
2400 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/ false)};
2401 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2402 AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput, audioConfig, mediaMatchCriteria);
2403 ASSERT_EQ(NO_ERROR, ret);
2404 std::vector<AudioMixMatchCriterion> navMatchCriteria = {
2405 createUsageCriterion(AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
2406 /*exclude=*/ false)};
2407 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2408 AUDIO_DEVICE_OUT_BUS, sCarBusNavigationOutput, audioConfig, navMatchCriteria);
2409 ASSERT_EQ(NO_ERROR, ret);
2410 const AudioDeviceTypeAddr mediaOutputDevice(AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput);
2411 const AudioDeviceTypeAddr navOutputDevice(AUDIO_DEVICE_OUT_BUS, sCarBusNavigationOutput);
2412 const AudioDeviceTypeAddrVector outputDevices = {mediaOutputDevice, navOutputDevice};
2413 mManager->setUserIdDeviceAffinities(0, outputDevices);
2414 audio_port_v7 navDevicePort;
2415 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_BUS,
2416 sCarBusNavigationOutput, &navDevicePort));
2417 audio_port_handle_t selectedDeviceId = navDevicePort.id;
2418 audio_io_handle_t output;
2419 audio_port_handle_t portId;
2420 const audio_attributes_t mediaAttribute = {
2421 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_MEDIA,
2422 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
2423
2424 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
2425 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, &output, &portId, mediaAttribute);
2426
2427 ASSERT_EQ(navDevicePort.id, selectedDeviceId);
2428}
2429
2430TEST_F(AudioPolicyManagerCarTest,
2431 GetOutputForAttrWithNoMatchingMaxAndSelectedOutputAfterUserAffinities) {
2432 status_t ret;
2433 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
2434 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
2435 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
2436 audioConfig.sample_rate = k48000SamplingRate;
2437 std::vector<AudioMixMatchCriterion> mediaMatchCriteria = {
2438 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/ false)};
2439 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2440 AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput, audioConfig, mediaMatchCriteria);
2441 ASSERT_EQ(NO_ERROR, ret);
2442 std::vector<AudioMixMatchCriterion> navMatchCriteria = {
2443 createUsageCriterion(AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
2444 /*exclude=*/ false)};
2445 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2446 AUDIO_DEVICE_OUT_BUS, sCarBusNavigationOutput, audioConfig, navMatchCriteria);
2447 ASSERT_EQ(NO_ERROR, ret);
2448 const AudioDeviceTypeAddr mediaOutputDevice(AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput);
2449 const AudioDeviceTypeAddr navOutputDevice(AUDIO_DEVICE_OUT_BUS, sCarBusNavigationOutput);
2450 const AudioDeviceTypeAddrVector outputDevices = {mediaOutputDevice, navOutputDevice};
2451 mManager->setUserIdDeviceAffinities(0, outputDevices);
2452 audio_port_v7 navDevicePort;
2453 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_BUS,
2454 sCarBusNavigationOutput, &navDevicePort));
2455 audio_port_handle_t selectedDeviceId = navDevicePort.id;
2456 audio_io_handle_t output;
2457 audio_port_handle_t portId;
2458 const audio_attributes_t alarmAttribute = {
2459 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_ALARM,
2460 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
2461
2462 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
2463 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, &output, &portId, alarmAttribute);
2464
2465 ASSERT_EQ(navDevicePort.id, selectedDeviceId);
2466}
2467
2468TEST_F(AudioPolicyManagerCarTest, GetOutputForAttrWithNoMatchingMix) {
2469 status_t ret;
2470 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
2471 audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
2472 audioConfig.format = AUDIO_FORMAT_PCM_16_BIT;
2473 audioConfig.sample_rate = k48000SamplingRate;
2474 std::vector<AudioMixMatchCriterion> mediaMatchCriteria = {
2475 createUsageCriterion(AUDIO_USAGE_MEDIA, /*exclude=*/ false)};
2476 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2477 AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput, audioConfig, mediaMatchCriteria);
2478 ASSERT_EQ(NO_ERROR, ret);
2479 std::vector<AudioMixMatchCriterion> navMatchCriteria = {
2480 createUsageCriterion(AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
2481 /*exclude=*/ false)};
2482 ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
2483 AUDIO_DEVICE_OUT_BUS, sCarBusNavigationOutput, audioConfig, navMatchCriteria);
2484 ASSERT_EQ(NO_ERROR, ret);
2485 const AudioDeviceTypeAddr mediaOutputDevice(AUDIO_DEVICE_OUT_BUS, sCarBusMediaOutput);
2486 const AudioDeviceTypeAddr navOutputDevice(AUDIO_DEVICE_OUT_BUS, sCarBusNavigationOutput);
2487 const AudioDeviceTypeAddrVector outputDevices = {mediaOutputDevice, navOutputDevice};
2488 mManager->setUserIdDeviceAffinities(0, outputDevices);
2489 audio_port_v7 navDevicePort;
2490 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_BUS,
2491 sCarBusNavigationOutput, &navDevicePort));
2492 audio_port_handle_t selectedDeviceId = navDevicePort.id;
2493 audio_io_handle_t output;
2494 audio_port_handle_t portId;
2495 const audio_attributes_t alarmAttribute = {
2496 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_ALARM,
2497 AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""};
2498
2499 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
2500 k48000SamplingRate, AUDIO_OUTPUT_FLAG_DIRECT, &output, &portId, alarmAttribute);
2501
2502 ASSERT_EQ(navDevicePort.id, selectedDeviceId);
2503}
2504
Mikhail Naganov0756bbf2019-09-06 13:53:26 -07002505class AudioPolicyManagerTVTest : public AudioPolicyManagerTestWithConfigurationFile {
2506protected:
2507 std::string getConfigFile() override { return sTvConfig; }
2508 void testHDMIPortSelection(audio_output_flags_t flags, const char* expectedMixPortName);
2509
2510 static const std::string sTvConfig;
2511};
2512
2513const std::string AudioPolicyManagerTVTest::sTvConfig =
2514 AudioPolicyManagerTVTest::sExecutableDir + "test_tv_apm_configuration.xml";
2515
2516// SwAudioOutputDescriptor doesn't populate flags so check against the port name.
2517void AudioPolicyManagerTVTest::testHDMIPortSelection(
2518 audio_output_flags_t flags, const char* expectedMixPortName) {
2519 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
2520 AUDIO_DEVICE_OUT_AUX_DIGITAL, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
2521 "" /*address*/, "" /*name*/, AUDIO_FORMAT_DEFAULT));
2522 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
2523 audio_io_handle_t output;
2524 audio_port_handle_t portId;
Dean Wheatleyd082f472022-02-04 11:10:48 +11002525 getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
2526 k48000SamplingRate, flags, &output, &portId);
Mikhail Naganov0756bbf2019-09-06 13:53:26 -07002527 sp<SwAudioOutputDescriptor> outDesc = mManager->getOutputs().valueFor(output);
2528 ASSERT_NE(nullptr, outDesc.get());
jiabin19cdba52020-11-24 11:28:58 -08002529 audio_port_v7 port = {};
Mikhail Naganov0756bbf2019-09-06 13:53:26 -07002530 outDesc->toAudioPort(&port);
2531 mManager->releaseOutput(portId);
2532 ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
2533 AUDIO_DEVICE_OUT_AUX_DIGITAL, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
2534 "" /*address*/, "" /*name*/, AUDIO_FORMAT_DEFAULT));
2535 ASSERT_EQ(AUDIO_PORT_TYPE_MIX, port.type);
2536 ASSERT_EQ(AUDIO_PORT_ROLE_SOURCE, port.role);
2537 ASSERT_STREQ(expectedMixPortName, port.name);
2538}
2539
2540TEST_F(AudioPolicyManagerTVTest, InitSuccess) {
2541 // SetUp must finish with no assertions.
2542}
2543
2544TEST_F(AudioPolicyManagerTVTest, Dump) {
2545 dumpToLog();
2546}
2547
Mikhail Naganov57ac2ce2019-09-11 09:29:41 -07002548TEST_F(AudioPolicyManagerTVTest, MatchNoFlags) {
2549 testHDMIPortSelection(AUDIO_OUTPUT_FLAG_NONE, "primary output");
2550}
2551
2552TEST_F(AudioPolicyManagerTVTest, MatchOutputDirectNoHwAvSync) {
Mikhail Naganov0756bbf2019-09-06 13:53:26 -07002553 // b/140447125: The selected port must not have HW AV Sync flag (see the config file).
2554 testHDMIPortSelection(AUDIO_OUTPUT_FLAG_DIRECT, "direct");
2555}
2556
Mikhail Naganov57ac2ce2019-09-11 09:29:41 -07002557TEST_F(AudioPolicyManagerTVTest, MatchOutputDirectHwAvSync) {
Mikhail Naganov0756bbf2019-09-06 13:53:26 -07002558 testHDMIPortSelection(static_cast<audio_output_flags_t>(
2559 AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_HW_AV_SYNC),
2560 "tunnel");
2561}
Mikhail Naganov57ac2ce2019-09-11 09:29:41 -07002562
2563TEST_F(AudioPolicyManagerTVTest, MatchOutputDirectMMapNoIrq) {
2564 testHDMIPortSelection(static_cast<audio_output_flags_t>(
2565 AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_MMAP_NOIRQ),
2566 "low latency");
2567}
Mikhail Naganovc0d04982020-03-02 21:02:28 +00002568
2569class AudioPolicyManagerDynamicHwModulesTest : public AudioPolicyManagerTestWithConfigurationFile {
2570protected:
2571 void SetUpManagerConfig() override;
2572};
2573
2574void AudioPolicyManagerDynamicHwModulesTest::SetUpManagerConfig() {
Mikhail Naganovd4c21aa2021-10-05 15:10:16 -07002575 ASSERT_NO_FATAL_FAILURE(AudioPolicyManagerTestWithConfigurationFile::SetUpManagerConfig());
Mikhail Naganovc0d04982020-03-02 21:02:28 +00002576 // Only allow successful opening of "primary" hw module during APM initialization.
2577 mClient->swapAllowedModuleNames({"primary"});
2578}
2579
2580TEST_F(AudioPolicyManagerDynamicHwModulesTest, InitSuccess) {
2581 // SetUp must finish with no assertions.
2582}
2583
2584TEST_F(AudioPolicyManagerDynamicHwModulesTest, DynamicAddition) {
2585 const auto handleBefore = mClient->peekNextModuleHandle();
2586 mManager->onNewAudioModulesAvailable();
2587 ASSERT_EQ(handleBefore, mClient->peekNextModuleHandle());
2588 // Reset module loading restrictions.
2589 mClient->swapAllowedModuleNames();
2590 mManager->onNewAudioModulesAvailable();
2591 const auto handleAfter = mClient->peekNextModuleHandle();
2592 ASSERT_GT(handleAfter, handleBefore);
2593 mManager->onNewAudioModulesAvailable();
2594 ASSERT_EQ(handleAfter, mClient->peekNextModuleHandle());
2595}
2596
2597TEST_F(AudioPolicyManagerDynamicHwModulesTest, AddedDeviceAvailable) {
2598 ASSERT_EQ(AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE, mManager->getDeviceConnectionState(
2599 AUDIO_DEVICE_IN_REMOTE_SUBMIX, "0"));
2600 mClient->swapAllowedModuleNames({"primary", "r_submix"});
2601 mManager->onNewAudioModulesAvailable();
2602 ASSERT_EQ(AUDIO_POLICY_DEVICE_STATE_AVAILABLE, mManager->getDeviceConnectionState(
2603 AUDIO_DEVICE_IN_REMOTE_SUBMIX, "0"));
2604}
Mikhail Naganovd0e2c742020-03-25 15:59:59 -07002605
2606TEST_F(AudioPolicyManagerDynamicHwModulesTest, ListAddedAudioPorts) {
2607 ASSERT_FALSE(
2608 findDevicePort(AUDIO_PORT_ROLE_SOURCE, AUDIO_DEVICE_IN_REMOTE_SUBMIX, "0", nullptr));
2609 mClient->swapAllowedModuleNames({"primary", "r_submix"});
2610 mManager->onNewAudioModulesAvailable();
jiabin19cdba52020-11-24 11:28:58 -08002611 struct audio_port_v7 port;
Mikhail Naganovd0e2c742020-03-25 15:59:59 -07002612 ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SOURCE, AUDIO_DEVICE_IN_REMOTE_SUBMIX, "0", &port));
2613}
2614
2615TEST_F(AudioPolicyManagerDynamicHwModulesTest, ClientIsUpdated) {
2616 const size_t prevAudioPortListUpdateCount = mClient->getAudioPortListUpdateCount();
2617 const uint32_t prevAudioPortGeneration = mManager->getAudioPortGeneration();
2618 mClient->swapAllowedModuleNames({"primary", "r_submix"});
2619 mManager->onNewAudioModulesAvailable();
2620 EXPECT_GT(mClient->getAudioPortListUpdateCount(), prevAudioPortListUpdateCount);
2621 EXPECT_GT(mManager->getAudioPortGeneration(), prevAudioPortGeneration);
2622}
Jiabin Huang3b98d322020-09-03 17:54:16 +00002623
2624using DevicesRoleForCapturePresetParam = std::tuple<audio_source_t, device_role_t>;
2625
2626class AudioPolicyManagerDevicesRoleForCapturePresetTest
2627 : public AudioPolicyManagerTestWithConfigurationFile,
2628 public testing::WithParamInterface<DevicesRoleForCapturePresetParam> {
2629protected:
2630 // The `inputDevice` and `inputDevice2` indicate the audio devices type to be used for setting
2631 // device role. They must be declared in the test_audio_policy_configuration.xml
2632 AudioDeviceTypeAddr inputDevice = AudioDeviceTypeAddr(AUDIO_DEVICE_IN_BUILTIN_MIC, "");
2633 AudioDeviceTypeAddr inputDevice2 = AudioDeviceTypeAddr(AUDIO_DEVICE_IN_HDMI, "");
2634};
2635
2636TEST_P(AudioPolicyManagerDevicesRoleForCapturePresetTest, DevicesRoleForCapturePreset) {
2637 const audio_source_t audioSource = std::get<0>(GetParam());
2638 const device_role_t role = std::get<1>(GetParam());
2639
2640 // Test invalid device when setting
2641 const AudioDeviceTypeAddr outputDevice(AUDIO_DEVICE_OUT_SPEAKER, "");
2642 const AudioDeviceTypeAddrVector outputDevices = {outputDevice};
2643 ASSERT_EQ(BAD_VALUE,
2644 mManager->setDevicesRoleForCapturePreset(audioSource, role, outputDevices));
2645 ASSERT_EQ(BAD_VALUE,
2646 mManager->addDevicesRoleForCapturePreset(audioSource, role, outputDevices));
2647 AudioDeviceTypeAddrVector devices;
2648 ASSERT_EQ(NAME_NOT_FOUND,
2649 mManager->getDevicesForRoleAndCapturePreset(audioSource, role, devices));
2650 ASSERT_TRUE(devices.empty());
2651 ASSERT_EQ(BAD_VALUE,
2652 mManager->removeDevicesRoleForCapturePreset(audioSource, role, outputDevices));
2653
2654 // Without setting, call get/remove/clear must fail
2655 ASSERT_EQ(NAME_NOT_FOUND,
2656 mManager->getDevicesForRoleAndCapturePreset(audioSource, role, devices));
2657 ASSERT_EQ(NAME_NOT_FOUND,
2658 mManager->removeDevicesRoleForCapturePreset(audioSource, role, devices));
2659 ASSERT_EQ(NAME_NOT_FOUND,
2660 mManager->clearDevicesRoleForCapturePreset(audioSource, role));
2661
2662 // Test set/get devices role
2663 const AudioDeviceTypeAddrVector inputDevices = {inputDevice};
2664 ASSERT_EQ(NO_ERROR,
2665 mManager->setDevicesRoleForCapturePreset(audioSource, role, inputDevices));
2666 ASSERT_EQ(NO_ERROR, mManager->getDevicesForRoleAndCapturePreset(audioSource, role, devices));
2667 EXPECT_THAT(devices, UnorderedElementsAre(inputDevice));
2668
2669 // Test setting will change the previously set devices
2670 const AudioDeviceTypeAddrVector inputDevices2 = {inputDevice2};
2671 ASSERT_EQ(NO_ERROR,
2672 mManager->setDevicesRoleForCapturePreset(audioSource, role, inputDevices2));
2673 devices.clear();
2674 ASSERT_EQ(NO_ERROR, mManager->getDevicesForRoleAndCapturePreset(audioSource, role, devices));
2675 EXPECT_THAT(devices, UnorderedElementsAre(inputDevice2));
2676
2677 // Test add devices
2678 ASSERT_EQ(NO_ERROR,
2679 mManager->addDevicesRoleForCapturePreset(audioSource, role, inputDevices));
2680 devices.clear();
2681 ASSERT_EQ(NO_ERROR, mManager->getDevicesForRoleAndCapturePreset(audioSource, role, devices));
2682 EXPECT_THAT(devices, UnorderedElementsAre(inputDevice, inputDevice2));
2683
2684 // Test remove devices
2685 ASSERT_EQ(NO_ERROR,
2686 mManager->removeDevicesRoleForCapturePreset(audioSource, role, inputDevices));
2687 devices.clear();
2688 ASSERT_EQ(NO_ERROR, mManager->getDevicesForRoleAndCapturePreset(audioSource, role, devices));
2689 EXPECT_THAT(devices, UnorderedElementsAre(inputDevice2));
2690
2691 // Test remove devices that are not set as the device role
2692 ASSERT_EQ(BAD_VALUE,
2693 mManager->removeDevicesRoleForCapturePreset(audioSource, role, inputDevices));
2694
2695 // Test clear devices
2696 ASSERT_EQ(NO_ERROR,
2697 mManager->clearDevicesRoleForCapturePreset(audioSource, role));
2698 devices.clear();
2699 ASSERT_EQ(NAME_NOT_FOUND,
2700 mManager->getDevicesForRoleAndCapturePreset(audioSource, role, devices));
2701}
2702
2703INSTANTIATE_TEST_CASE_P(
2704 DevicesRoleForCapturePresetOperation,
2705 AudioPolicyManagerDevicesRoleForCapturePresetTest,
2706 testing::Values(
2707 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_MIC, DEVICE_ROLE_PREFERRED}),
2708 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_VOICE_UPLINK,
2709 DEVICE_ROLE_PREFERRED}),
2710 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_VOICE_DOWNLINK,
2711 DEVICE_ROLE_PREFERRED}),
2712 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_VOICE_CALL, DEVICE_ROLE_PREFERRED}),
2713 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_CAMCORDER, DEVICE_ROLE_PREFERRED}),
2714 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_VOICE_RECOGNITION,
2715 DEVICE_ROLE_PREFERRED}),
2716 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_VOICE_COMMUNICATION,
2717 DEVICE_ROLE_PREFERRED}),
2718 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_REMOTE_SUBMIX,
2719 DEVICE_ROLE_PREFERRED}),
2720 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_UNPROCESSED, DEVICE_ROLE_PREFERRED}),
2721 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_VOICE_PERFORMANCE,
2722 DEVICE_ROLE_PREFERRED}),
2723 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_ECHO_REFERENCE,
2724 DEVICE_ROLE_PREFERRED}),
2725 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_FM_TUNER, DEVICE_ROLE_PREFERRED}),
2726 DevicesRoleForCapturePresetParam({AUDIO_SOURCE_HOTWORD, DEVICE_ROLE_PREFERRED})
2727 )
2728 );