blob: de5670c7c6df1444381a0312d69c6b627b903c85 [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
Mikhail Naganov04a86632017-12-15 18:01:42 -080017#include <memory>
18#include <set>
Mikhail Naganov21b43362018-06-04 10:37:09 -070019#include <sys/wait.h>
20#include <unistd.h>
Mikhail Naganov04a86632017-12-15 18:01:42 -080021
Mikhail Naganovad3f8a12017-12-12 13:24:23 -080022#include <gtest/gtest.h>
23
Mikhail Naganov21b43362018-06-04 10:37:09 -070024#define LOG_TAG "APM_Test"
25#include <log/log.h>
Mikhail Naganovdc769682018-05-04 15:34:08 -070026#include <media/PatchBuilder.h>
27
Mikhail Naganovad3f8a12017-12-12 13:24:23 -080028#include "AudioPolicyTestClient.h"
29#include "AudioPolicyTestManager.h"
30
31using namespace android;
32
Mikhail Naganov04a86632017-12-15 18:01:42 -080033TEST(AudioPolicyManagerTestInit, Failure) {
Mikhail Naganovad3f8a12017-12-12 13:24:23 -080034 AudioPolicyTestClient client;
35 AudioPolicyTestManager manager(&client);
36 manager.getConfig().setDefault();
Mikhail Naganovbcbcb1b2017-12-13 13:03:35 -080037 // Since the default client fails to open anything,
38 // APM should indicate that the initialization didn't succeed.
Mikhail Naganovad3f8a12017-12-12 13:24:23 -080039 ASSERT_EQ(NO_INIT, manager.initialize());
Mikhail Naganovbcbcb1b2017-12-13 13:03:35 -080040 ASSERT_EQ(NO_INIT, manager.initCheck());
41}
42
43
Mikhail Naganov04a86632017-12-15 18:01:42 -080044class AudioPolicyManagerTestClient : public AudioPolicyTestClient {
Mikhail Naganovbcbcb1b2017-12-13 13:03:35 -080045 public:
Mikhail Naganov04a86632017-12-15 18:01:42 -080046 // AudioPolicyClientInterface implementation
Mikhail Naganovbcbcb1b2017-12-13 13:03:35 -080047 audio_module_handle_t loadHwModule(const char* /*name*/) override {
Mikhail Naganov04a86632017-12-15 18:01:42 -080048 return mNextModuleHandle++;
Mikhail Naganovbcbcb1b2017-12-13 13:03:35 -080049 }
Mikhail Naganov04a86632017-12-15 18:01:42 -080050
Mikhail Naganovbcbcb1b2017-12-13 13:03:35 -080051 status_t openOutput(audio_module_handle_t module,
52 audio_io_handle_t* output,
53 audio_config_t* /*config*/,
54 audio_devices_t* /*devices*/,
55 const String8& /*address*/,
56 uint32_t* /*latencyMs*/,
57 audio_output_flags_t /*flags*/) override {
Mikhail Naganov04a86632017-12-15 18:01:42 -080058 if (module >= mNextModuleHandle) {
Mikhail Naganovbcbcb1b2017-12-13 13:03:35 -080059 ALOGE("%s: Module handle %d has not been allocated yet (next is %d)",
Mikhail Naganov04a86632017-12-15 18:01:42 -080060 __func__, module, mNextModuleHandle);
Mikhail Naganovbcbcb1b2017-12-13 13:03:35 -080061 return BAD_VALUE;
62 }
63 *output = mNextIoHandle++;
64 return NO_ERROR;
65 }
Mikhail Naganov04a86632017-12-15 18:01:42 -080066
Mikhail Naganovbcbcb1b2017-12-13 13:03:35 -080067 status_t openInput(audio_module_handle_t module,
68 audio_io_handle_t* input,
69 audio_config_t* /*config*/,
70 audio_devices_t* /*device*/,
71 const String8& /*address*/,
72 audio_source_t /*source*/,
73 audio_input_flags_t /*flags*/) override {
Mikhail Naganov04a86632017-12-15 18:01:42 -080074 if (module >= mNextModuleHandle) {
Mikhail Naganovbcbcb1b2017-12-13 13:03:35 -080075 ALOGE("%s: Module handle %d has not been allocated yet (next is %d)",
Mikhail Naganov04a86632017-12-15 18:01:42 -080076 __func__, module, mNextModuleHandle);
Mikhail Naganovbcbcb1b2017-12-13 13:03:35 -080077 return BAD_VALUE;
78 }
79 *input = mNextIoHandle++;
80 return NO_ERROR;
81 }
Mikhail Naganov04a86632017-12-15 18:01:42 -080082
83 status_t createAudioPatch(const struct audio_patch* /*patch*/,
84 audio_patch_handle_t* handle,
85 int /*delayMs*/) override {
86 *handle = mNextPatchHandle++;
87 mActivePatches.insert(*handle);
88 return NO_ERROR;
89 }
90
91 status_t releaseAudioPatch(audio_patch_handle_t handle,
92 int /*delayMs*/) override {
93 if (mActivePatches.erase(handle) != 1) {
94 if (handle >= mNextPatchHandle) {
95 ALOGE("%s: Patch handle %d has not been allocated yet (next is %d)",
96 __func__, handle, mNextPatchHandle);
97 } else {
98 ALOGE("%s: Attempt to release patch %d twice", __func__, handle);
99 }
100 return BAD_VALUE;
101 }
102 return NO_ERROR;
103 }
104
105 // Helper methods for tests
106 size_t getActivePatchesCount() const { return mActivePatches.size(); }
107
Mikhail Naganovbcbcb1b2017-12-13 13:03:35 -0800108 private:
Mikhail Naganov04a86632017-12-15 18:01:42 -0800109 audio_module_handle_t mNextModuleHandle = AUDIO_MODULE_HANDLE_NONE + 1;
Mikhail Naganovbcbcb1b2017-12-13 13:03:35 -0800110 audio_io_handle_t mNextIoHandle = AUDIO_IO_HANDLE_NONE + 1;
Mikhail Naganov04a86632017-12-15 18:01:42 -0800111 audio_patch_handle_t mNextPatchHandle = AUDIO_PATCH_HANDLE_NONE + 1;
112 std::set<audio_patch_handle_t> mActivePatches;
Mikhail Naganovbcbcb1b2017-12-13 13:03:35 -0800113};
114
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800115class PatchCountCheck {
116 public:
117 explicit PatchCountCheck(AudioPolicyManagerTestClient *client)
118 : mClient{client},
119 mInitialCount{mClient->getActivePatchesCount()} {}
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800120 int deltaFromSnapshot() const {
121 size_t currentCount = mClient->getActivePatchesCount();
122 if (mInitialCount <= currentCount) {
123 return currentCount - mInitialCount;
124 } else {
125 return -(static_cast<int>(mInitialCount - currentCount));
126 }
127 }
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800128 private:
129 const AudioPolicyManagerTestClient *mClient;
130 const size_t mInitialCount;
131};
132
Mikhail Naganov04a86632017-12-15 18:01:42 -0800133class AudioPolicyManagerTest : public testing::Test {
134 protected:
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800135 void SetUp() override;
136 void TearDown() override;
137 virtual void SetUpConfig(AudioPolicyConfig *config) { (void)config; }
138
139 void dumpToLog();
140 void getOutputForAttr(
141 audio_port_handle_t *selectedDeviceId,
142 audio_format_t format,
143 int channelMask,
144 int sampleRate,
145 audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE,
146 audio_port_handle_t *portId = nullptr);
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800147 PatchCountCheck snapshotPatchCount() { return PatchCountCheck(mClient.get()); }
Mikhail Naganov04a86632017-12-15 18:01:42 -0800148
149 std::unique_ptr<AudioPolicyManagerTestClient> mClient;
150 std::unique_ptr<AudioPolicyTestManager> mManager;
151};
152
153void AudioPolicyManagerTest::SetUp() {
154 mClient.reset(new AudioPolicyManagerTestClient);
155 mManager.reset(new AudioPolicyTestManager(mClient.get()));
156 mManager->getConfig().setDefault();
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800157 SetUpConfig(&mManager->getConfig()); // Subclasses may want to customize the config.
Mikhail Naganov04a86632017-12-15 18:01:42 -0800158 ASSERT_EQ(NO_ERROR, mManager->initialize());
159 ASSERT_EQ(NO_ERROR, mManager->initCheck());
Mikhail Naganovad3f8a12017-12-12 13:24:23 -0800160}
Mikhail Naganov04a86632017-12-15 18:01:42 -0800161
162void AudioPolicyManagerTest::TearDown() {
163 mManager.reset();
164 mClient.reset();
165}
166
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800167void AudioPolicyManagerTest::dumpToLog() {
Mikhail Naganov21b43362018-06-04 10:37:09 -0700168 int pipefd[2];
169 ASSERT_NE(-1, pipe(pipefd));
170 pid_t cpid = fork();
171 ASSERT_NE(-1, cpid);
172 if (cpid == 0) {
173 // Child process reads from the pipe and logs.
174 close(pipefd[1]);
175 std::string line;
176 char buf;
177 while (read(pipefd[0], &buf, sizeof(buf)) > 0) {
178 if (buf != '\n') {
179 line += buf;
180 } else {
181 ALOGI("%s", line.c_str());
182 line = "";
183 }
184 }
185 if (!line.empty()) ALOGI("%s", line.c_str());
186 close(pipefd[0]);
187 _exit(EXIT_SUCCESS);
188 } else {
189 // Parent does the dump and checks the status code.
190 close(pipefd[0]);
191 ASSERT_EQ(NO_ERROR, mManager->dump(pipefd[1]));
192 close(pipefd[1]);
193 wait(NULL); // Wait for the child to exit.
194 }
195}
196
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800197void AudioPolicyManagerTest::getOutputForAttr(
198 audio_port_handle_t *selectedDeviceId,
199 audio_format_t format,
200 int channelMask,
201 int sampleRate,
202 audio_output_flags_t flags,
203 audio_port_handle_t *portId) {
204 audio_attributes_t attr = {};
205 audio_io_handle_t output = AUDIO_PORT_HANDLE_NONE;
206 audio_stream_type_t stream = AUDIO_STREAM_DEFAULT;
207 audio_config_t config = AUDIO_CONFIG_INITIALIZER;
208 config.sample_rate = sampleRate;
209 config.channel_mask = channelMask;
210 config.format = format;
211 *selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
212 audio_port_handle_t localPortId;
213 if (!portId) portId = &localPortId;
214 *portId = AUDIO_PORT_HANDLE_NONE;
215 ASSERT_EQ(OK, mManager->getOutputForAttr(
216 &attr, &output, AUDIO_SESSION_NONE, &stream, 0 /*uid*/, &config, &flags,
Kevin Rocard153f92d2018-12-18 18:33:28 -0800217 selectedDeviceId, portId, {}));
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800218 ASSERT_NE(AUDIO_PORT_HANDLE_NONE, *portId);
219}
220
221
222TEST_F(AudioPolicyManagerTest, InitSuccess) {
223 // SetUp must finish with no assertions.
224}
225
226TEST_F(AudioPolicyManagerTest, Dump) {
227 dumpToLog();
228}
229
Mikhail Naganov04a86632017-12-15 18:01:42 -0800230TEST_F(AudioPolicyManagerTest, CreateAudioPatchFailure) {
231 audio_patch patch{};
232 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800233 const PatchCountCheck patchCount = snapshotPatchCount();
Mikhail Naganov04a86632017-12-15 18:01:42 -0800234 ASSERT_EQ(BAD_VALUE, mManager->createAudioPatch(nullptr, &handle, 0));
235 ASSERT_EQ(BAD_VALUE, mManager->createAudioPatch(&patch, nullptr, 0));
236 ASSERT_EQ(BAD_VALUE, mManager->createAudioPatch(&patch, &handle, 0));
237 patch.num_sources = AUDIO_PATCH_PORTS_MAX + 1;
238 patch.num_sinks = 1;
239 ASSERT_EQ(BAD_VALUE, mManager->createAudioPatch(&patch, &handle, 0));
240 patch.num_sources = 1;
241 patch.num_sinks = AUDIO_PATCH_PORTS_MAX + 1;
242 ASSERT_EQ(BAD_VALUE, mManager->createAudioPatch(&patch, &handle, 0));
243 patch.num_sources = 2;
244 patch.num_sinks = 1;
245 ASSERT_EQ(INVALID_OPERATION, mManager->createAudioPatch(&patch, &handle, 0));
246 patch = {};
247 patch.num_sources = 1;
248 patch.sources[0].role = AUDIO_PORT_ROLE_SINK;
249 patch.num_sinks = 1;
250 patch.sinks[0].role = AUDIO_PORT_ROLE_SINK;
251 ASSERT_EQ(INVALID_OPERATION, mManager->createAudioPatch(&patch, &handle, 0));
252 patch = {};
253 patch.num_sources = 1;
254 patch.sources[0].role = AUDIO_PORT_ROLE_SOURCE;
255 patch.num_sinks = 1;
256 patch.sinks[0].role = AUDIO_PORT_ROLE_SOURCE;
257 ASSERT_EQ(INVALID_OPERATION, mManager->createAudioPatch(&patch, &handle, 0));
258 // Verify that the handle is left unchanged.
259 ASSERT_EQ(AUDIO_PATCH_HANDLE_NONE, handle);
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800260 ASSERT_EQ(0, patchCount.deltaFromSnapshot());
Mikhail Naganov04a86632017-12-15 18:01:42 -0800261}
262
263TEST_F(AudioPolicyManagerTest, CreateAudioPatchFromMix) {
Mikhail Naganov04a86632017-12-15 18:01:42 -0800264 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
265 uid_t uid = 42;
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800266 const PatchCountCheck patchCount = snapshotPatchCount();
Mikhail Naganovdc769682018-05-04 15:34:08 -0700267 ASSERT_FALSE(mManager->getConfig().getAvailableInputDevices().isEmpty());
268 PatchBuilder patchBuilder;
269 patchBuilder.addSource(mManager->getConfig().getAvailableInputDevices()[0]).
270 addSink(mManager->getConfig().getDefaultOutputDevice());
271 ASSERT_EQ(NO_ERROR, mManager->createAudioPatch(patchBuilder.patch(), &handle, uid));
Mikhail Naganov04a86632017-12-15 18:01:42 -0800272 ASSERT_NE(AUDIO_PATCH_HANDLE_NONE, handle);
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800273 ASSERT_EQ(1, patchCount.deltaFromSnapshot());
Mikhail Naganov04a86632017-12-15 18:01:42 -0800274}
275
276// TODO: Add patch creation tests that involve already existing patch
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800277
278class AudioPolicyManagerTestMsd : public AudioPolicyManagerTest {
279 protected:
280 void SetUpConfig(AudioPolicyConfig *config) override;
281 void TearDown() override;
282
283 sp<DeviceDescriptor> mMsdOutputDevice;
284 sp<DeviceDescriptor> mMsdInputDevice;
285};
286
287void AudioPolicyManagerTestMsd::SetUpConfig(AudioPolicyConfig *config) {
288 // TODO: Consider using Serializer to load part of the config from a string.
289 mMsdOutputDevice = new DeviceDescriptor(AUDIO_DEVICE_OUT_BUS);
290 sp<AudioProfile> pcmOutputProfile = new AudioProfile(
291 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO, 48000);
292 sp<AudioProfile> ac3OutputProfile = new AudioProfile(
293 AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1, 48000);
294 mMsdOutputDevice->addAudioProfile(pcmOutputProfile);
295 mMsdOutputDevice->addAudioProfile(ac3OutputProfile);
296 mMsdInputDevice = new DeviceDescriptor(AUDIO_DEVICE_IN_BUS);
297 // Match output profile from AudioPolicyConfig::setDefault.
298 sp<AudioProfile> pcmInputProfile = new AudioProfile(
299 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO, 44100);
300 mMsdInputDevice->addAudioProfile(pcmInputProfile);
301 config->addAvailableDevice(mMsdOutputDevice);
302 config->addAvailableDevice(mMsdInputDevice);
303
304 sp<HwModule> msdModule = new HwModule(AUDIO_HARDWARE_MODULE_ID_MSD, 2 /*halVersionMajor*/);
305 HwModuleCollection modules = config->getHwModules();
306 modules.add(msdModule);
307 config->setHwModules(modules);
308 mMsdOutputDevice->attach(msdModule);
309 mMsdInputDevice->attach(msdModule);
310
311 sp<OutputProfile> msdOutputProfile = new OutputProfile(String8("msd input"));
312 msdOutputProfile->addAudioProfile(pcmOutputProfile);
313 msdOutputProfile->addSupportedDevice(mMsdOutputDevice);
314 msdModule->addOutputProfile(msdOutputProfile);
315 sp<OutputProfile> msdCompressedOutputProfile =
316 new OutputProfile(String8("msd compressed input"));
317 msdCompressedOutputProfile->addAudioProfile(ac3OutputProfile);
318 msdCompressedOutputProfile->setFlags(
319 AUDIO_OUTPUT_FLAG_DIRECT | AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD |
320 AUDIO_OUTPUT_FLAG_NON_BLOCKING);
321 msdCompressedOutputProfile->addSupportedDevice(mMsdOutputDevice);
322 msdModule->addOutputProfile(msdCompressedOutputProfile);
323
324 sp<InputProfile> msdInputProfile = new InputProfile(String8("msd output"));
325 msdInputProfile->addAudioProfile(pcmInputProfile);
326 msdInputProfile->addSupportedDevice(mMsdInputDevice);
327 msdModule->addInputProfile(msdInputProfile);
328
329 // Add a profile with another encoding to the default device to test routing
330 // of streams that are not supported by MSD.
331 sp<AudioProfile> dtsOutputProfile = new AudioProfile(
332 AUDIO_FORMAT_DTS, AUDIO_CHANNEL_OUT_5POINT1, 48000);
333 config->getDefaultOutputDevice()->addAudioProfile(dtsOutputProfile);
334 sp<OutputProfile> primaryEncodedOutputProfile = new OutputProfile(String8("encoded"));
335 primaryEncodedOutputProfile->addAudioProfile(dtsOutputProfile);
336 primaryEncodedOutputProfile->setFlags(AUDIO_OUTPUT_FLAG_DIRECT);
337 primaryEncodedOutputProfile->addSupportedDevice(config->getDefaultOutputDevice());
338 config->getHwModules().getModuleFromName(AUDIO_HARDWARE_MODULE_ID_PRIMARY)->
339 addOutputProfile(primaryEncodedOutputProfile);
340}
341
342void AudioPolicyManagerTestMsd::TearDown() {
343 mMsdOutputDevice.clear();
344 mMsdInputDevice.clear();
345 AudioPolicyManagerTest::TearDown();
346}
347
348TEST_F(AudioPolicyManagerTestMsd, InitSuccess) {
349 ASSERT_TRUE(mMsdOutputDevice);
350 ASSERT_TRUE(mMsdInputDevice);
351}
352
353TEST_F(AudioPolicyManagerTestMsd, Dump) {
354 dumpToLog();
355}
356
357TEST_F(AudioPolicyManagerTestMsd, PatchCreationOnSetForceUse) {
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800358 const PatchCountCheck patchCount = snapshotPatchCount();
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800359 mManager->setForceUse(AUDIO_POLICY_FORCE_FOR_ENCODED_SURROUND,
360 AUDIO_POLICY_FORCE_ENCODED_SURROUND_ALWAYS);
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800361 ASSERT_EQ(1, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800362}
363
364TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrEncodedRoutesToMsd) {
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800365 const PatchCountCheck patchCount = snapshotPatchCount();
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800366 audio_port_handle_t selectedDeviceId;
367 getOutputForAttr(&selectedDeviceId,
368 AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1, 48000, AUDIO_OUTPUT_FLAG_DIRECT);
369 ASSERT_EQ(selectedDeviceId, mMsdOutputDevice->getId());
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800370 ASSERT_EQ(1, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800371}
372
373TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrPcmRoutesToMsd) {
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800374 const PatchCountCheck patchCount = snapshotPatchCount();
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800375 audio_port_handle_t selectedDeviceId;
376 getOutputForAttr(&selectedDeviceId,
377 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO, 48000);
378 ASSERT_EQ(selectedDeviceId, mMsdOutputDevice->getId());
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800379 ASSERT_EQ(1, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800380}
381
382TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrEncodedPlusPcmRoutesToMsd) {
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800383 const PatchCountCheck patchCount = snapshotPatchCount();
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800384 audio_port_handle_t selectedDeviceId;
385 getOutputForAttr(&selectedDeviceId,
386 AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1, 48000, AUDIO_OUTPUT_FLAG_DIRECT);
387 ASSERT_EQ(selectedDeviceId, mMsdOutputDevice->getId());
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800388 ASSERT_EQ(1, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800389 getOutputForAttr(&selectedDeviceId,
390 AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO, 48000);
391 ASSERT_EQ(selectedDeviceId, mMsdOutputDevice->getId());
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800392 ASSERT_EQ(1, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800393}
394
395TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrUnsupportedFormatBypassesMsd) {
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800396 const PatchCountCheck patchCount = snapshotPatchCount();
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800397 audio_port_handle_t selectedDeviceId;
398 getOutputForAttr(&selectedDeviceId,
399 AUDIO_FORMAT_DTS, AUDIO_CHANNEL_OUT_5POINT1, 48000, AUDIO_OUTPUT_FLAG_DIRECT);
400 ASSERT_NE(selectedDeviceId, mMsdOutputDevice->getId());
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800401 ASSERT_EQ(0, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800402}
403
404TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrFormatSwitching) {
405 // Switch between formats that are supported and not supported by MSD.
406 {
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800407 const PatchCountCheck patchCount = snapshotPatchCount();
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800408 audio_port_handle_t selectedDeviceId, portId;
409 getOutputForAttr(&selectedDeviceId,
410 AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1, 48000, AUDIO_OUTPUT_FLAG_DIRECT,
411 &portId);
412 ASSERT_EQ(selectedDeviceId, mMsdOutputDevice->getId());
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800413 ASSERT_EQ(1, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800414 mManager->releaseOutput(portId);
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800415 ASSERT_EQ(1, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800416 }
417 {
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800418 const PatchCountCheck patchCount = snapshotPatchCount();
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800419 audio_port_handle_t selectedDeviceId, portId;
420 getOutputForAttr(&selectedDeviceId,
421 AUDIO_FORMAT_DTS, AUDIO_CHANNEL_OUT_5POINT1, 48000, AUDIO_OUTPUT_FLAG_DIRECT,
422 &portId);
423 ASSERT_NE(selectedDeviceId, mMsdOutputDevice->getId());
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800424 ASSERT_EQ(-1, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800425 mManager->releaseOutput(portId);
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800426 ASSERT_EQ(0, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800427 }
428 {
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800429 const PatchCountCheck patchCount = snapshotPatchCount();
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800430 audio_port_handle_t selectedDeviceId;
431 getOutputForAttr(&selectedDeviceId,
432 AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1, 48000, AUDIO_OUTPUT_FLAG_DIRECT);
433 ASSERT_EQ(selectedDeviceId, mMsdOutputDevice->getId());
Mikhail Naganovd53525f2019-01-24 13:15:46 -0800434 ASSERT_EQ(0, patchCount.deltaFromSnapshot());
Mikhail Naganovdf2e3592018-12-19 14:27:42 -0800435 }
436}