xref: /aosp_15_r20/system/media/tests/systemaudio_tests.cpp (revision b9df5ad1c9ac98a7fefaac271a55f7ae3db05414)
1*b9df5ad1SAndroid Build Coastguard Worker /*
2*b9df5ad1SAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
3*b9df5ad1SAndroid Build Coastguard Worker  *
4*b9df5ad1SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*b9df5ad1SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*b9df5ad1SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*b9df5ad1SAndroid Build Coastguard Worker  *
8*b9df5ad1SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*b9df5ad1SAndroid Build Coastguard Worker  *
10*b9df5ad1SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*b9df5ad1SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*b9df5ad1SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*b9df5ad1SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*b9df5ad1SAndroid Build Coastguard Worker  * limitations under the License.
15*b9df5ad1SAndroid Build Coastguard Worker  */
16*b9df5ad1SAndroid Build Coastguard Worker 
17*b9df5ad1SAndroid Build Coastguard Worker #include <algorithm>
18*b9df5ad1SAndroid Build Coastguard Worker #include <cstdlib>
19*b9df5ad1SAndroid Build Coastguard Worker #include <cstring>
20*b9df5ad1SAndroid Build Coastguard Worker #include <functional>
21*b9df5ad1SAndroid Build Coastguard Worker #include <string>
22*b9df5ad1SAndroid Build Coastguard Worker #include <unordered_set>
23*b9df5ad1SAndroid Build Coastguard Worker 
24*b9df5ad1SAndroid Build Coastguard Worker #include <gtest/gtest.h>
25*b9df5ad1SAndroid Build Coastguard Worker 
26*b9df5ad1SAndroid Build Coastguard Worker #define LOG_TAG "SysAudio_Test"
27*b9df5ad1SAndroid Build Coastguard Worker #include <log/log.h>
28*b9df5ad1SAndroid Build Coastguard Worker #include <media/PatchBuilder.h>
29*b9df5ad1SAndroid Build Coastguard Worker #include <system/audio.h>
30*b9df5ad1SAndroid Build Coastguard Worker 
31*b9df5ad1SAndroid Build Coastguard Worker using namespace android;
32*b9df5ad1SAndroid Build Coastguard Worker 
TEST(SystemAudioTest,PatchInvalid)33*b9df5ad1SAndroid Build Coastguard Worker TEST(SystemAudioTest, PatchInvalid) {
34*b9df5ad1SAndroid Build Coastguard Worker     audio_patch patch{};
35*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_FALSE(audio_patch_is_valid(&patch));
36*b9df5ad1SAndroid Build Coastguard Worker     patch.num_sources = AUDIO_PATCH_PORTS_MAX + 1;
37*b9df5ad1SAndroid Build Coastguard Worker     patch.num_sinks = 1;
38*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_FALSE(audio_patch_is_valid(&patch));
39*b9df5ad1SAndroid Build Coastguard Worker     patch.num_sources = 1;
40*b9df5ad1SAndroid Build Coastguard Worker     patch.num_sinks = AUDIO_PATCH_PORTS_MAX + 1;
41*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_FALSE(audio_patch_is_valid(&patch));
42*b9df5ad1SAndroid Build Coastguard Worker     patch.num_sources = 0;
43*b9df5ad1SAndroid Build Coastguard Worker     patch.num_sinks = 1;
44*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_FALSE(audio_patch_is_valid(&patch));
45*b9df5ad1SAndroid Build Coastguard Worker }
46*b9df5ad1SAndroid Build Coastguard Worker 
TEST(SystemAudioTest,PatchValid)47*b9df5ad1SAndroid Build Coastguard Worker TEST(SystemAudioTest, PatchValid) {
48*b9df5ad1SAndroid Build Coastguard Worker     const audio_port_config src = {
49*b9df5ad1SAndroid Build Coastguard Worker         .id = 1, .role = AUDIO_PORT_ROLE_SOURCE, .type = AUDIO_PORT_TYPE_DEVICE };
50*b9df5ad1SAndroid Build Coastguard Worker     // It's OK not to have sinks.
51*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_TRUE(audio_patch_is_valid((PatchBuilder{}).addSource(src).patch()));
52*b9df5ad1SAndroid Build Coastguard Worker     const audio_port_config sink = {
53*b9df5ad1SAndroid Build Coastguard Worker         .id = 2, .role = AUDIO_PORT_ROLE_SINK, .type = AUDIO_PORT_TYPE_DEVICE };
54*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_TRUE(audio_patch_is_valid((PatchBuilder{}).addSource(src).addSink(sink).patch()));
55*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_TRUE(audio_patch_is_valid(
56*b9df5ad1SAndroid Build Coastguard Worker                     (PatchBuilder{}).addSource(src).addSource(src).addSink(sink).patch()));
57*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_TRUE(audio_patch_is_valid(
58*b9df5ad1SAndroid Build Coastguard Worker                     (PatchBuilder{}).addSource(src).addSink(sink).addSink(sink).patch()));
59*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_TRUE(audio_patch_is_valid(
60*b9df5ad1SAndroid Build Coastguard Worker                     (PatchBuilder{}).addSource(src).addSource(src).
61*b9df5ad1SAndroid Build Coastguard Worker                     addSink(sink).addSink(sink).patch()));
62*b9df5ad1SAndroid Build Coastguard Worker }
63*b9df5ad1SAndroid Build Coastguard Worker 
TEST(SystemAudioTest,PatchHwAvSync)64*b9df5ad1SAndroid Build Coastguard Worker TEST(SystemAudioTest, PatchHwAvSync) {
65*b9df5ad1SAndroid Build Coastguard Worker     audio_port_config device_src_cfg = {
66*b9df5ad1SAndroid Build Coastguard Worker         .id = 1, .role = AUDIO_PORT_ROLE_SOURCE, .type = AUDIO_PORT_TYPE_DEVICE };
67*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_FALSE(audio_port_config_has_hw_av_sync(&device_src_cfg));
68*b9df5ad1SAndroid Build Coastguard Worker     device_src_cfg.config_mask |= AUDIO_PORT_CONFIG_FLAGS;
69*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_FALSE(audio_port_config_has_hw_av_sync(&device_src_cfg));
70*b9df5ad1SAndroid Build Coastguard Worker     device_src_cfg.flags.input = AUDIO_INPUT_FLAG_HW_AV_SYNC;
71*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_TRUE(audio_port_config_has_hw_av_sync(&device_src_cfg));
72*b9df5ad1SAndroid Build Coastguard Worker 
73*b9df5ad1SAndroid Build Coastguard Worker     audio_port_config device_sink_cfg = {
74*b9df5ad1SAndroid Build Coastguard Worker         .id = 1, .role = AUDIO_PORT_ROLE_SINK, .type = AUDIO_PORT_TYPE_DEVICE };
75*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_FALSE(audio_port_config_has_hw_av_sync(&device_sink_cfg));
76*b9df5ad1SAndroid Build Coastguard Worker     device_sink_cfg.config_mask |= AUDIO_PORT_CONFIG_FLAGS;
77*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_FALSE(audio_port_config_has_hw_av_sync(&device_sink_cfg));
78*b9df5ad1SAndroid Build Coastguard Worker     device_sink_cfg.flags.output = AUDIO_OUTPUT_FLAG_HW_AV_SYNC;
79*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_TRUE(audio_port_config_has_hw_av_sync(&device_sink_cfg));
80*b9df5ad1SAndroid Build Coastguard Worker 
81*b9df5ad1SAndroid Build Coastguard Worker     audio_port_config mix_sink_cfg = {
82*b9df5ad1SAndroid Build Coastguard Worker         .id = 1, .role = AUDIO_PORT_ROLE_SINK, .type = AUDIO_PORT_TYPE_MIX };
83*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_FALSE(audio_port_config_has_hw_av_sync(&mix_sink_cfg));
84*b9df5ad1SAndroid Build Coastguard Worker     mix_sink_cfg.config_mask |= AUDIO_PORT_CONFIG_FLAGS;
85*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_FALSE(audio_port_config_has_hw_av_sync(&mix_sink_cfg));
86*b9df5ad1SAndroid Build Coastguard Worker     mix_sink_cfg.flags.input = AUDIO_INPUT_FLAG_HW_AV_SYNC;
87*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_TRUE(audio_port_config_has_hw_av_sync(&mix_sink_cfg));
88*b9df5ad1SAndroid Build Coastguard Worker 
89*b9df5ad1SAndroid Build Coastguard Worker     audio_port_config mix_src_cfg = {
90*b9df5ad1SAndroid Build Coastguard Worker         .id = 1, .role = AUDIO_PORT_ROLE_SOURCE, .type = AUDIO_PORT_TYPE_MIX };
91*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_FALSE(audio_port_config_has_hw_av_sync(&mix_src_cfg));
92*b9df5ad1SAndroid Build Coastguard Worker     mix_src_cfg.config_mask |= AUDIO_PORT_CONFIG_FLAGS;
93*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_FALSE(audio_port_config_has_hw_av_sync(&mix_src_cfg));
94*b9df5ad1SAndroid Build Coastguard Worker     mix_src_cfg.flags.output = AUDIO_OUTPUT_FLAG_HW_AV_SYNC;
95*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_TRUE(audio_port_config_has_hw_av_sync(&mix_src_cfg));
96*b9df5ad1SAndroid Build Coastguard Worker }
97*b9df5ad1SAndroid Build Coastguard Worker 
TEST(SystemAudioTest,PatchEqual)98*b9df5ad1SAndroid Build Coastguard Worker TEST(SystemAudioTest, PatchEqual) {
99*b9df5ad1SAndroid Build Coastguard Worker     const audio_patch patch1{}, patch2{};
100*b9df5ad1SAndroid Build Coastguard Worker     // Invalid patches are not equal.
101*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_FALSE(audio_patches_are_equal(&patch1, &patch2));
102*b9df5ad1SAndroid Build Coastguard Worker     const audio_port_config src = {
103*b9df5ad1SAndroid Build Coastguard Worker         .id = 1, .role = AUDIO_PORT_ROLE_SOURCE, .type = AUDIO_PORT_TYPE_DEVICE };
104*b9df5ad1SAndroid Build Coastguard Worker     const audio_port_config sink = {
105*b9df5ad1SAndroid Build Coastguard Worker         .id = 2, .role = AUDIO_PORT_ROLE_SINK, .type = AUDIO_PORT_TYPE_DEVICE };
106*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_FALSE(audio_patches_are_equal(
107*b9df5ad1SAndroid Build Coastguard Worker                     (PatchBuilder{}).addSource(src).patch(),
108*b9df5ad1SAndroid Build Coastguard Worker                     (PatchBuilder{}).addSource(src).addSink(sink).patch()));
109*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_TRUE(audio_patches_are_equal(
110*b9df5ad1SAndroid Build Coastguard Worker                     (PatchBuilder{}).addSource(src).addSink(sink).patch(),
111*b9df5ad1SAndroid Build Coastguard Worker                     (PatchBuilder{}).addSource(src).addSink(sink).patch()));
112*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_FALSE(audio_patches_are_equal(
113*b9df5ad1SAndroid Build Coastguard Worker                     (PatchBuilder{}).addSource(src).addSink(sink).patch(),
114*b9df5ad1SAndroid Build Coastguard Worker                     (PatchBuilder{}).addSource(src).addSource(src).addSink(sink).patch()));
115*b9df5ad1SAndroid Build Coastguard Worker     audio_port_config sink_hw_av_sync = sink;
116*b9df5ad1SAndroid Build Coastguard Worker     sink_hw_av_sync.config_mask |= AUDIO_PORT_CONFIG_FLAGS;
117*b9df5ad1SAndroid Build Coastguard Worker     sink_hw_av_sync.flags.output = AUDIO_OUTPUT_FLAG_HW_AV_SYNC;
118*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_FALSE(audio_patches_are_equal(
119*b9df5ad1SAndroid Build Coastguard Worker                     (PatchBuilder{}).addSource(src).addSink(sink).patch(),
120*b9df5ad1SAndroid Build Coastguard Worker                     (PatchBuilder{}).addSource(src).addSink(sink_hw_av_sync).patch()));
121*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_TRUE(audio_patches_are_equal(
122*b9df5ad1SAndroid Build Coastguard Worker                     (PatchBuilder{}).addSource(src).addSink(sink_hw_av_sync).patch(),
123*b9df5ad1SAndroid Build Coastguard Worker                     (PatchBuilder{}).addSource(src).addSink(sink_hw_av_sync).patch()));
124*b9df5ad1SAndroid Build Coastguard Worker }
125*b9df5ad1SAndroid Build Coastguard Worker 
runAudioDeviceTypeHelperFunction(const std::unordered_set<audio_devices_t> & allDevices,const audio_devices_t targetDevices[],unsigned int targetDeviceCount,const std::string & deviceTag,bool (* device_type_helper_function)(audio_devices_t))126*b9df5ad1SAndroid Build Coastguard Worker void runAudioDeviceTypeHelperFunction(const std::unordered_set<audio_devices_t>& allDevices,
127*b9df5ad1SAndroid Build Coastguard Worker                                       const audio_devices_t targetDevices[],
128*b9df5ad1SAndroid Build Coastguard Worker                                       unsigned int targetDeviceCount,
129*b9df5ad1SAndroid Build Coastguard Worker                                       const std::string& deviceTag,
130*b9df5ad1SAndroid Build Coastguard Worker                                       bool (*device_type_helper_function)(audio_devices_t))
131*b9df5ad1SAndroid Build Coastguard Worker {
132*b9df5ad1SAndroid Build Coastguard Worker     std::unordered_set<audio_devices_t> devices(targetDevices, targetDevices + targetDeviceCount);
133*b9df5ad1SAndroid Build Coastguard Worker     for (auto device : allDevices) {
134*b9df5ad1SAndroid Build Coastguard Worker         if (devices.find(device) == devices.end()) {
135*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_FALSE(device_type_helper_function(device))
136*b9df5ad1SAndroid Build Coastguard Worker                     << std::hex << device << " should not be " << deviceTag << " device";
137*b9df5ad1SAndroid Build Coastguard Worker         } else {
138*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_TRUE(device_type_helper_function(device))
139*b9df5ad1SAndroid Build Coastguard Worker                     << std::hex << device << " should be " << deviceTag << " device";
140*b9df5ad1SAndroid Build Coastguard Worker         }
141*b9df5ad1SAndroid Build Coastguard Worker     }
142*b9df5ad1SAndroid Build Coastguard Worker }
143*b9df5ad1SAndroid Build Coastguard Worker 
TEST(SystemAudioTest,AudioDeviceTypeHelperFunction)144*b9df5ad1SAndroid Build Coastguard Worker TEST(SystemAudioTest, AudioDeviceTypeHelperFunction) {
145*b9df5ad1SAndroid Build Coastguard Worker     std::unordered_set<audio_devices_t> allDeviceTypes;
146*b9df5ad1SAndroid Build Coastguard Worker     allDeviceTypes.insert(std::begin(AUDIO_DEVICE_OUT_ALL_ARRAY),
147*b9df5ad1SAndroid Build Coastguard Worker             std::end(AUDIO_DEVICE_OUT_ALL_ARRAY));
148*b9df5ad1SAndroid Build Coastguard Worker     allDeviceTypes.insert(std::begin(AUDIO_DEVICE_IN_ALL_ARRAY),
149*b9df5ad1SAndroid Build Coastguard Worker             std::end(AUDIO_DEVICE_IN_ALL_ARRAY));
150*b9df5ad1SAndroid Build Coastguard Worker 
151*b9df5ad1SAndroid Build Coastguard Worker     runAudioDeviceTypeHelperFunction(allDeviceTypes, AUDIO_DEVICE_OUT_ALL_ARRAY,
152*b9df5ad1SAndroid Build Coastguard Worker             std::size(AUDIO_DEVICE_OUT_ALL_ARRAY), "output", audio_is_output_device);
153*b9df5ad1SAndroid Build Coastguard Worker     runAudioDeviceTypeHelperFunction(allDeviceTypes, AUDIO_DEVICE_IN_ALL_ARRAY,
154*b9df5ad1SAndroid Build Coastguard Worker             std::size(AUDIO_DEVICE_IN_ALL_ARRAY), "input", audio_is_input_device);
155*b9df5ad1SAndroid Build Coastguard Worker     runAudioDeviceTypeHelperFunction(allDeviceTypes, AUDIO_DEVICE_OUT_ALL_A2DP_ARRAY,
156*b9df5ad1SAndroid Build Coastguard Worker             std::size(AUDIO_DEVICE_OUT_ALL_A2DP_ARRAY), "a2dp out", audio_is_a2dp_out_device);
157*b9df5ad1SAndroid Build Coastguard Worker     const audio_devices_t bluetoothInA2dpDevices[] = { AUDIO_DEVICE_IN_BLUETOOTH_A2DP };
158*b9df5ad1SAndroid Build Coastguard Worker     runAudioDeviceTypeHelperFunction(allDeviceTypes, bluetoothInA2dpDevices,
159*b9df5ad1SAndroid Build Coastguard Worker             std::size(bluetoothInA2dpDevices), "a2dp in", audio_is_a2dp_in_device);
160*b9df5ad1SAndroid Build Coastguard Worker     runAudioDeviceTypeHelperFunction(allDeviceTypes, AUDIO_DEVICE_OUT_ALL_SCO_ARRAY,
161*b9df5ad1SAndroid Build Coastguard Worker             std::size(AUDIO_DEVICE_OUT_ALL_SCO_ARRAY), "bluetooth out sco",
162*b9df5ad1SAndroid Build Coastguard Worker             audio_is_bluetooth_out_sco_device);
163*b9df5ad1SAndroid Build Coastguard Worker     runAudioDeviceTypeHelperFunction(allDeviceTypes, AUDIO_DEVICE_IN_ALL_SCO_ARRAY,
164*b9df5ad1SAndroid Build Coastguard Worker             std::size(AUDIO_DEVICE_IN_ALL_SCO_ARRAY), "bluetooth in sco",
165*b9df5ad1SAndroid Build Coastguard Worker             audio_is_bluetooth_in_sco_device);
166*b9df5ad1SAndroid Build Coastguard Worker     const unsigned int scoDeviceCount = AUDIO_DEVICE_OUT_SCO_CNT + AUDIO_DEVICE_IN_SCO_CNT;
167*b9df5ad1SAndroid Build Coastguard Worker     audio_devices_t scoDevices[scoDeviceCount];
168*b9df5ad1SAndroid Build Coastguard Worker     std::copy(std::begin(AUDIO_DEVICE_OUT_ALL_SCO_ARRAY), std::end(AUDIO_DEVICE_OUT_ALL_SCO_ARRAY),
169*b9df5ad1SAndroid Build Coastguard Worker               std::begin(scoDevices));
170*b9df5ad1SAndroid Build Coastguard Worker     std::copy(std::begin(AUDIO_DEVICE_IN_ALL_SCO_ARRAY), std::end(AUDIO_DEVICE_IN_ALL_SCO_ARRAY),
171*b9df5ad1SAndroid Build Coastguard Worker               std::begin(scoDevices) + AUDIO_DEVICE_OUT_SCO_CNT);
172*b9df5ad1SAndroid Build Coastguard Worker     runAudioDeviceTypeHelperFunction(allDeviceTypes, scoDevices,
173*b9df5ad1SAndroid Build Coastguard Worker             std::size(scoDevices), "bluetooth sco", audio_is_bluetooth_sco_device);
174*b9df5ad1SAndroid Build Coastguard Worker     const audio_devices_t hearingAidOutDevices[] = { AUDIO_DEVICE_OUT_HEARING_AID };
175*b9df5ad1SAndroid Build Coastguard Worker     runAudioDeviceTypeHelperFunction(allDeviceTypes, hearingAidOutDevices,
176*b9df5ad1SAndroid Build Coastguard Worker             std::size(hearingAidOutDevices), "hearing aid out", audio_is_hearing_aid_out_device);
177*b9df5ad1SAndroid Build Coastguard Worker     runAudioDeviceTypeHelperFunction(allDeviceTypes, AUDIO_DEVICE_OUT_ALL_USB_ARRAY,
178*b9df5ad1SAndroid Build Coastguard Worker             std::size(AUDIO_DEVICE_OUT_ALL_USB_ARRAY), "usb out", audio_is_usb_out_device);
179*b9df5ad1SAndroid Build Coastguard Worker     runAudioDeviceTypeHelperFunction(allDeviceTypes, AUDIO_DEVICE_IN_ALL_USB_ARRAY,
180*b9df5ad1SAndroid Build Coastguard Worker             std::size(AUDIO_DEVICE_IN_ALL_USB_ARRAY), "usb in", audio_is_usb_in_device);
181*b9df5ad1SAndroid Build Coastguard Worker     const audio_devices_t remoteSubmixDevices[] = {
182*b9df5ad1SAndroid Build Coastguard Worker             AUDIO_DEVICE_IN_REMOTE_SUBMIX, AUDIO_DEVICE_OUT_REMOTE_SUBMIX };
183*b9df5ad1SAndroid Build Coastguard Worker     runAudioDeviceTypeHelperFunction(allDeviceTypes, remoteSubmixDevices,
184*b9df5ad1SAndroid Build Coastguard Worker             std::size(remoteSubmixDevices), "remote submix", audio_is_remote_submix_device);
185*b9df5ad1SAndroid Build Coastguard Worker     runAudioDeviceTypeHelperFunction(allDeviceTypes, AUDIO_DEVICE_OUT_ALL_DIGITAL_ARRAY,
186*b9df5ad1SAndroid Build Coastguard Worker             std::size(AUDIO_DEVICE_OUT_ALL_DIGITAL_ARRAY), "digital out",
187*b9df5ad1SAndroid Build Coastguard Worker             audio_is_digital_out_device);
188*b9df5ad1SAndroid Build Coastguard Worker     runAudioDeviceTypeHelperFunction(allDeviceTypes, AUDIO_DEVICE_IN_ALL_DIGITAL_ARRAY,
189*b9df5ad1SAndroid Build Coastguard Worker             std::size(AUDIO_DEVICE_IN_ALL_DIGITAL_ARRAY), "digital in",
190*b9df5ad1SAndroid Build Coastguard Worker             audio_is_digital_in_device);
191*b9df5ad1SAndroid Build Coastguard Worker     const unsigned int digitalDeviceCount
192*b9df5ad1SAndroid Build Coastguard Worker             = AUDIO_DEVICE_OUT_DIGITAL_CNT + AUDIO_DEVICE_IN_DIGITAL_CNT;
193*b9df5ad1SAndroid Build Coastguard Worker     audio_devices_t digitalDevices[digitalDeviceCount];
194*b9df5ad1SAndroid Build Coastguard Worker     std::copy(std::begin(AUDIO_DEVICE_OUT_ALL_DIGITAL_ARRAY),
195*b9df5ad1SAndroid Build Coastguard Worker               std::end(AUDIO_DEVICE_OUT_ALL_DIGITAL_ARRAY),
196*b9df5ad1SAndroid Build Coastguard Worker               std::begin(digitalDevices));
197*b9df5ad1SAndroid Build Coastguard Worker     std::copy(std::begin(AUDIO_DEVICE_IN_ALL_DIGITAL_ARRAY),
198*b9df5ad1SAndroid Build Coastguard Worker               std::end(AUDIO_DEVICE_IN_ALL_DIGITAL_ARRAY),
199*b9df5ad1SAndroid Build Coastguard Worker               std::begin(digitalDevices) + AUDIO_DEVICE_OUT_DIGITAL_CNT);
200*b9df5ad1SAndroid Build Coastguard Worker     runAudioDeviceTypeHelperFunction(allDeviceTypes, digitalDevices,
201*b9df5ad1SAndroid Build Coastguard Worker               std::size(digitalDevices), "digital", audio_device_is_digital);
202*b9df5ad1SAndroid Build Coastguard Worker     runAudioDeviceTypeHelperFunction(allDeviceTypes, AUDIO_DEVICE_OUT_ALL_BLE_ARRAY,
203*b9df5ad1SAndroid Build Coastguard Worker             std::size(AUDIO_DEVICE_OUT_ALL_BLE_ARRAY), "ble out",
204*b9df5ad1SAndroid Build Coastguard Worker             audio_is_ble_out_device);
205*b9df5ad1SAndroid Build Coastguard Worker     runAudioDeviceTypeHelperFunction(allDeviceTypes, AUDIO_DEVICE_IN_ALL_BLE_ARRAY,
206*b9df5ad1SAndroid Build Coastguard Worker             std::size(AUDIO_DEVICE_IN_ALL_BLE_ARRAY), "ble in",
207*b9df5ad1SAndroid Build Coastguard Worker             audio_is_ble_in_device);
208*b9df5ad1SAndroid Build Coastguard Worker     runAudioDeviceTypeHelperFunction(allDeviceTypes, AUDIO_DEVICE_OUT_BLE_UNICAST_ARRAY,
209*b9df5ad1SAndroid Build Coastguard Worker             std::size(AUDIO_DEVICE_OUT_BLE_UNICAST_ARRAY), "ble unicast",
210*b9df5ad1SAndroid Build Coastguard Worker             audio_is_ble_unicast_device);
211*b9df5ad1SAndroid Build Coastguard Worker     runAudioDeviceTypeHelperFunction(allDeviceTypes, AUDIO_DEVICE_OUT_BLE_BROADCAST_ARRAY,
212*b9df5ad1SAndroid Build Coastguard Worker             std::size(AUDIO_DEVICE_OUT_BLE_BROADCAST_ARRAY), "ble broadcast",
213*b9df5ad1SAndroid Build Coastguard Worker             audio_is_ble_broadcast_device);
214*b9df5ad1SAndroid Build Coastguard Worker }
215*b9df5ad1SAndroid Build Coastguard Worker 
216*b9df5ad1SAndroid Build Coastguard Worker 
217*b9df5ad1SAndroid Build Coastguard Worker // An array whose length is AUDIO_PORT_MAX_CHANNEL_MASKS for generating audio port information.
218*b9df5ad1SAndroid Build Coastguard Worker static constexpr audio_channel_mask_t OUT_CHANNEL_MASKS[AUDIO_PORT_MAX_CHANNEL_MASKS] = {
219*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_FRONT_LEFT,
220*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_FRONT_RIGHT,
221*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_FRONT_CENTER,
222*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_LOW_FREQUENCY,
223*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_BACK_LEFT,
224*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_BACK_RIGHT,
225*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER,
226*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER,
227*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_BACK_CENTER,
228*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_SIDE_LEFT,
229*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_SIDE_RIGHT,
230*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_TOP_CENTER,
231*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT,
232*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER,
233*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT,
234*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_TOP_BACK_LEFT,
235*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_TOP_BACK_CENTER,
236*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT,
237*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_TOP_SIDE_LEFT,
238*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_TOP_SIDE_RIGHT,
239*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_HAPTIC_A,
240*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_HAPTIC_B,
241*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_MONO,
242*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_STEREO,
243*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_2POINT1,
244*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_TRI,
245*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_TRI_BACK,
246*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_3POINT1,
247*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_2POINT0POINT2,
248*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_2POINT1POINT2,
249*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_3POINT0POINT2,
250*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_OUT_QUAD
251*b9df5ad1SAndroid Build Coastguard Worker };
252*b9df5ad1SAndroid Build Coastguard Worker 
253*b9df5ad1SAndroid Build Coastguard Worker // An array whose length is AUDIO_PORT_MAX_CHANNEL_MASKS for generating audio port information.
254*b9df5ad1SAndroid Build Coastguard Worker static constexpr audio_channel_mask_t IN_CHANNEL_MASKS[AUDIO_PORT_MAX_CHANNEL_MASKS] = {
255*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_LEFT,
256*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_RIGHT,
257*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_FRONT,
258*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_BACK,
259*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_LEFT_PROCESSED,
260*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_RIGHT_PROCESSED,
261*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_FRONT_PROCESSED,
262*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_BACK_PROCESSED,
263*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_PRESSURE,
264*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_X_AXIS,
265*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_Y_AXIS,
266*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_Z_AXIS,
267*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_BACK_LEFT,
268*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_BACK_RIGHT,
269*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_CENTER,
270*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_LOW_FREQUENCY,
271*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_TOP_LEFT,
272*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_TOP_RIGHT,
273*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_VOICE_UPLINK,
274*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_VOICE_DNLINK,
275*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_MONO,
276*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_STEREO,
277*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_FRONT_BACK,
278*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_6,
279*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_2POINT0POINT2,
280*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_2POINT1POINT2,
281*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_3POINT0POINT2,
282*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_3POINT1POINT2,
283*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_5POINT1,
284*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_VOICE_UPLINK_MONO,
285*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_VOICE_DNLINK_MONO,
286*b9df5ad1SAndroid Build Coastguard Worker     AUDIO_CHANNEL_IN_VOICE_CALL_MONO
287*b9df5ad1SAndroid Build Coastguard Worker };
288*b9df5ad1SAndroid Build Coastguard Worker 
289*b9df5ad1SAndroid Build Coastguard Worker static constexpr unsigned int SHORT_AUDIO_DESCRIPTOR_LENGTH = 3;
290*b9df5ad1SAndroid Build Coastguard Worker 
291*b9df5ad1SAndroid Build Coastguard Worker using SystemAudioPortTestParams = std::tuple<audio_port_role_t, audio_port_type_t>;
292*b9df5ad1SAndroid Build Coastguard Worker 
293*b9df5ad1SAndroid Build Coastguard Worker class SystemAudioPortTest : public testing::TestWithParam<SystemAudioPortTestParams> {
294*b9df5ad1SAndroid Build Coastguard Worker protected:
295*b9df5ad1SAndroid Build Coastguard Worker     const struct audio_gain_config mGainConfig = {
296*b9df5ad1SAndroid Build Coastguard Worker             .index = 0,
297*b9df5ad1SAndroid Build Coastguard Worker             .mode = AUDIO_GAIN_MODE_JOINT,
298*b9df5ad1SAndroid Build Coastguard Worker             .channel_mask = AUDIO_CHANNEL_OUT_FRONT_LEFT,
299*b9df5ad1SAndroid Build Coastguard Worker             .values = {1, 2},
300*b9df5ad1SAndroid Build Coastguard Worker             .ramp_duration_ms = 10
301*b9df5ad1SAndroid Build Coastguard Worker     };
302*b9df5ad1SAndroid Build Coastguard Worker     const struct audio_gain mGain = {
303*b9df5ad1SAndroid Build Coastguard Worker             .mode = AUDIO_GAIN_MODE_JOINT,
304*b9df5ad1SAndroid Build Coastguard Worker             .channel_mask = AUDIO_CHANNEL_OUT_FRONT_LEFT,
305*b9df5ad1SAndroid Build Coastguard Worker             .min_value = 10,
306*b9df5ad1SAndroid Build Coastguard Worker             .max_value = 100,
307*b9df5ad1SAndroid Build Coastguard Worker             .default_value = 42,
308*b9df5ad1SAndroid Build Coastguard Worker             .step_value = 2,
309*b9df5ad1SAndroid Build Coastguard Worker             .min_ramp_ms = 10,
310*b9df5ad1SAndroid Build Coastguard Worker             .max_ramp_ms = 20
311*b9df5ad1SAndroid Build Coastguard Worker     };
312*b9df5ad1SAndroid Build Coastguard Worker     const std::string mName = "SystemAudioPortTestName";
313*b9df5ad1SAndroid Build Coastguard Worker     const size_t mLastFormat = 0x7f;
314*b9df5ad1SAndroid Build Coastguard Worker     const audio_input_flags_t mInputFlag = AUDIO_INPUT_FLAG_FAST;
315*b9df5ad1SAndroid Build Coastguard Worker     const audio_output_flags_t mOutputFlag = AUDIO_OUTPUT_FLAG_FAST;
316*b9df5ad1SAndroid Build Coastguard Worker     const audio_module_handle_t mHwModule = 1;
317*b9df5ad1SAndroid Build Coastguard Worker     const std::string mAddress = "SystemAudioPortTestAddress";
318*b9df5ad1SAndroid Build Coastguard Worker     const audio_devices_t mInputDeviceType = AUDIO_DEVICE_IN_BUILTIN_MIC;
319*b9df5ad1SAndroid Build Coastguard Worker     const audio_devices_t mOutputDeviceType = AUDIO_DEVICE_OUT_SPEAKER;
320*b9df5ad1SAndroid Build Coastguard Worker     const audio_io_handle_t mIoHandle = 1;
321*b9df5ad1SAndroid Build Coastguard Worker     const audio_stream_type_t mStream = AUDIO_STREAM_MUSIC;
322*b9df5ad1SAndroid Build Coastguard Worker     const audio_source_t mSource = AUDIO_SOURCE_MIC;
323*b9df5ad1SAndroid Build Coastguard Worker     const audio_session_t mSession = AUDIO_SESSION_DEVICE;
324*b9df5ad1SAndroid Build Coastguard Worker 
325*b9df5ad1SAndroid Build Coastguard Worker     size_t fillFakeFormats(audio_format_t formats[], size_t numFormats);
326*b9df5ad1SAndroid Build Coastguard Worker     void fillFakeAudioPortConfigInfo(struct audio_port_config* config);
327*b9df5ad1SAndroid Build Coastguard Worker     void fillFakeAudioPortInfo(struct audio_port* audioPort);
328*b9df5ad1SAndroid Build Coastguard Worker     void fillFakeAudioPortV7Info(struct audio_port_v7* portV7, bool containsExtraAudioDescriptor);
329*b9df5ad1SAndroid Build Coastguard Worker 
330*b9df5ad1SAndroid Build Coastguard Worker     template <typename T, typename U, typename Func>
updateFieldAndCompare(const T updatedValue,T U::* field,U * lhs,U * rhs,Func p)331*b9df5ad1SAndroid Build Coastguard Worker     void updateFieldAndCompare(const T updatedValue, T U::*field, U* lhs, U* rhs, Func p) {
332*b9df5ad1SAndroid Build Coastguard Worker         lhs->*field = updatedValue;
333*b9df5ad1SAndroid Build Coastguard Worker         ASSERT_FALSE(p(lhs, rhs));
334*b9df5ad1SAndroid Build Coastguard Worker         lhs->*field = rhs->*field;
335*b9df5ad1SAndroid Build Coastguard Worker         ASSERT_TRUE(p(lhs, rhs));
336*b9df5ad1SAndroid Build Coastguard Worker     }
337*b9df5ad1SAndroid Build Coastguard Worker 
338*b9df5ad1SAndroid Build Coastguard Worker     template <typename T, typename Func>
updateConfigFieldAndCompare(const T updatedValue,T audio_port_config::* field,struct audio_port_config * lhs,struct audio_port_config * rhs,unsigned int configMask,Func p)339*b9df5ad1SAndroid Build Coastguard Worker     void updateConfigFieldAndCompare(const T updatedValue, T audio_port_config::*field,
340*b9df5ad1SAndroid Build Coastguard Worker             struct audio_port_config* lhs, struct audio_port_config* rhs,
341*b9df5ad1SAndroid Build Coastguard Worker             unsigned int configMask, Func p) {
342*b9df5ad1SAndroid Build Coastguard Worker         lhs->*field = updatedValue;
343*b9df5ad1SAndroid Build Coastguard Worker         ASSERT_FALSE(p(lhs, rhs));
344*b9df5ad1SAndroid Build Coastguard Worker         unsigned int savedConfigMask = lhs->config_mask;
345*b9df5ad1SAndroid Build Coastguard Worker         lhs->config_mask &= ~configMask;
346*b9df5ad1SAndroid Build Coastguard Worker         rhs->config_mask = lhs->config_mask;
347*b9df5ad1SAndroid Build Coastguard Worker         ASSERT_TRUE(p(lhs, rhs));
348*b9df5ad1SAndroid Build Coastguard Worker         lhs->config_mask = savedConfigMask;
349*b9df5ad1SAndroid Build Coastguard Worker         rhs->config_mask = savedConfigMask;
350*b9df5ad1SAndroid Build Coastguard Worker         lhs->*field = rhs->*field;
351*b9df5ad1SAndroid Build Coastguard Worker         ASSERT_TRUE(p(lhs, rhs));
352*b9df5ad1SAndroid Build Coastguard Worker     }
353*b9df5ad1SAndroid Build Coastguard Worker 
354*b9df5ad1SAndroid Build Coastguard Worker     template <typename T>
fillFakeAudioPortBaseInfo(T * port)355*b9df5ad1SAndroid Build Coastguard Worker     void fillFakeAudioPortBaseInfo(T* port) {
356*b9df5ad1SAndroid Build Coastguard Worker         port->id = 1;
357*b9df5ad1SAndroid Build Coastguard Worker         port->role = std::get<0>(GetParam());
358*b9df5ad1SAndroid Build Coastguard Worker         port->type = std::get<1>(GetParam());
359*b9df5ad1SAndroid Build Coastguard Worker         // Intentionally make a name that is not ended with '\0' to test the conversion function.
360*b9df5ad1SAndroid Build Coastguard Worker         strncpy(port->name, mName.c_str(), AUDIO_PORT_MAX_NAME_LEN);
361*b9df5ad1SAndroid Build Coastguard Worker         port->num_gains = AUDIO_PORT_MAX_GAINS;
362*b9df5ad1SAndroid Build Coastguard Worker         for (size_t i = 0; i < port->num_gains; ++i) {
363*b9df5ad1SAndroid Build Coastguard Worker             port->gains[i] = mGain;
364*b9df5ad1SAndroid Build Coastguard Worker             port->gains[i].max_ramp_ms *= (i + 1);
365*b9df5ad1SAndroid Build Coastguard Worker         }
366*b9df5ad1SAndroid Build Coastguard Worker         fillFakeAudioPortConfigInfo(&port->active_config);
367*b9df5ad1SAndroid Build Coastguard Worker         switch (port->type) {
368*b9df5ad1SAndroid Build Coastguard Worker         case AUDIO_PORT_TYPE_DEVICE:
369*b9df5ad1SAndroid Build Coastguard Worker             port->ext.device.hw_module = mHwModule;
370*b9df5ad1SAndroid Build Coastguard Worker             port->ext.device.type = port->role == AUDIO_PORT_ROLE_SINK ? mOutputDeviceType
371*b9df5ad1SAndroid Build Coastguard Worker                                         : mInputDeviceType;
372*b9df5ad1SAndroid Build Coastguard Worker             strncpy(port->ext.device.address, mAddress.c_str(), AUDIO_DEVICE_MAX_ADDRESS_LEN);
373*b9df5ad1SAndroid Build Coastguard Worker #ifndef AUDIO_NO_SYSTEM_DECLARATIONS
374*b9df5ad1SAndroid Build Coastguard Worker             port->ext.device.encapsulation_modes = AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM;
375*b9df5ad1SAndroid Build Coastguard Worker             port->ext.device.encapsulation_metadata_types =
376*b9df5ad1SAndroid Build Coastguard Worker                     AUDIO_ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER;
377*b9df5ad1SAndroid Build Coastguard Worker #endif
378*b9df5ad1SAndroid Build Coastguard Worker             break;
379*b9df5ad1SAndroid Build Coastguard Worker         case AUDIO_PORT_TYPE_MIX:
380*b9df5ad1SAndroid Build Coastguard Worker             port->ext.mix = {
381*b9df5ad1SAndroid Build Coastguard Worker                     mHwModule,
382*b9df5ad1SAndroid Build Coastguard Worker                     mIoHandle,
383*b9df5ad1SAndroid Build Coastguard Worker                     AUDIO_LATENCY_NORMAL
384*b9df5ad1SAndroid Build Coastguard Worker             };
385*b9df5ad1SAndroid Build Coastguard Worker             break;
386*b9df5ad1SAndroid Build Coastguard Worker         case AUDIO_PORT_TYPE_SESSION:
387*b9df5ad1SAndroid Build Coastguard Worker             port->ext.session.session = mSession;
388*b9df5ad1SAndroid Build Coastguard Worker             break;
389*b9df5ad1SAndroid Build Coastguard Worker         default:
390*b9df5ad1SAndroid Build Coastguard Worker             // Must not happen
391*b9df5ad1SAndroid Build Coastguard Worker             FAIL() << "Unknown port type " << port->type;
392*b9df5ad1SAndroid Build Coastguard Worker         }
393*b9df5ad1SAndroid Build Coastguard Worker     }
394*b9df5ad1SAndroid Build Coastguard Worker 
395*b9df5ad1SAndroid Build Coastguard Worker     template <typename T, typename Func>
testAudioPortExtBaseEquivalent(T * lhs,T * rhs,Func p)396*b9df5ad1SAndroid Build Coastguard Worker     void testAudioPortExtBaseEquivalent(T* lhs, T* rhs, Func p) {
397*b9df5ad1SAndroid Build Coastguard Worker         switch (lhs->type) {
398*b9df5ad1SAndroid Build Coastguard Worker         case AUDIO_PORT_TYPE_DEVICE:
399*b9df5ad1SAndroid Build Coastguard Worker             lhs->ext.device.hw_module = rhs->ext.device.hw_module + 1;
400*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_FALSE(p(lhs, rhs));
401*b9df5ad1SAndroid Build Coastguard Worker             lhs->ext.device.hw_module = rhs->ext.device.hw_module;
402*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_TRUE(p(lhs, rhs));
403*b9df5ad1SAndroid Build Coastguard Worker             lhs->ext.device.type = AUDIO_DEVICE_NONE;
404*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_FALSE(p(lhs, rhs));
405*b9df5ad1SAndroid Build Coastguard Worker             lhs->ext.device.type = rhs->ext.device.type;
406*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_TRUE(p(lhs, rhs));
407*b9df5ad1SAndroid Build Coastguard Worker             memset(lhs->ext.device.address, 0, sizeof(lhs->ext.device.address));
408*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_FALSE(p(lhs, rhs));
409*b9df5ad1SAndroid Build Coastguard Worker             strncpy(lhs->ext.device.address, rhs->ext.device.address, AUDIO_DEVICE_MAX_ADDRESS_LEN);
410*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_TRUE(p(lhs, rhs));
411*b9df5ad1SAndroid Build Coastguard Worker             break;
412*b9df5ad1SAndroid Build Coastguard Worker         case AUDIO_PORT_TYPE_MIX:
413*b9df5ad1SAndroid Build Coastguard Worker             lhs->ext.mix.hw_module = rhs->ext.mix.hw_module + 1;
414*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_FALSE(p(lhs, rhs));
415*b9df5ad1SAndroid Build Coastguard Worker             lhs->ext.mix.hw_module = rhs->ext.mix.hw_module;
416*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_TRUE(p(lhs, rhs));
417*b9df5ad1SAndroid Build Coastguard Worker             lhs->ext.mix.handle = rhs->ext.mix.handle + 1;
418*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_FALSE(p(lhs, rhs));
419*b9df5ad1SAndroid Build Coastguard Worker             lhs->ext.mix.handle = rhs->ext.mix.handle;
420*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_TRUE(p(lhs, rhs));
421*b9df5ad1SAndroid Build Coastguard Worker             break;
422*b9df5ad1SAndroid Build Coastguard Worker         case AUDIO_PORT_TYPE_SESSION:
423*b9df5ad1SAndroid Build Coastguard Worker             lhs->ext.session.session = AUDIO_SESSION_NONE;
424*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_FALSE(p(lhs, rhs));
425*b9df5ad1SAndroid Build Coastguard Worker             lhs->ext.session.session = rhs->ext.session.session;
426*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_TRUE(p(lhs, rhs));
427*b9df5ad1SAndroid Build Coastguard Worker             break;
428*b9df5ad1SAndroid Build Coastguard Worker         default:
429*b9df5ad1SAndroid Build Coastguard Worker             break;
430*b9df5ad1SAndroid Build Coastguard Worker         }
431*b9df5ad1SAndroid Build Coastguard Worker     }
432*b9df5ad1SAndroid Build Coastguard Worker 
433*b9df5ad1SAndroid Build Coastguard Worker     template <typename T, typename Func>
testAudioPortEquivalent(T * lhs,T * rhs,Func p)434*b9df5ad1SAndroid Build Coastguard Worker     void testAudioPortEquivalent(T* lhs, T* rhs, Func p) {
435*b9df5ad1SAndroid Build Coastguard Worker         updateFieldAndCompare(rhs->id + 1, &T::id, lhs, rhs, p);
436*b9df5ad1SAndroid Build Coastguard Worker         updateFieldAndCompare(AUDIO_PORT_ROLE_NONE, &T::role, lhs, rhs, p);
437*b9df5ad1SAndroid Build Coastguard Worker         updateFieldAndCompare(AUDIO_PORT_TYPE_NONE, &T::type, lhs, rhs, p);
438*b9df5ad1SAndroid Build Coastguard Worker         memset(lhs->name, 0, sizeof(lhs->name));
439*b9df5ad1SAndroid Build Coastguard Worker         ASSERT_FALSE(p(lhs, rhs));
440*b9df5ad1SAndroid Build Coastguard Worker         strncpy(lhs->name, rhs->name, AUDIO_PORT_MAX_NAME_LEN);
441*b9df5ad1SAndroid Build Coastguard Worker         ASSERT_TRUE(p(lhs, rhs));
442*b9df5ad1SAndroid Build Coastguard Worker         updateFieldAndCompare(rhs->num_gains + 1, &T::num_gains, lhs, rhs, p);
443*b9df5ad1SAndroid Build Coastguard Worker 
444*b9df5ad1SAndroid Build Coastguard Worker         lhs->gains[0] = {};
445*b9df5ad1SAndroid Build Coastguard Worker         ASSERT_FALSE(p(lhs, rhs));
446*b9df5ad1SAndroid Build Coastguard Worker         lhs->gains[0] = rhs->gains[0];
447*b9df5ad1SAndroid Build Coastguard Worker         ASSERT_TRUE(p(lhs, rhs));
448*b9df5ad1SAndroid Build Coastguard Worker 
449*b9df5ad1SAndroid Build Coastguard Worker         testAudioPortExtBaseEquivalent(lhs, rhs, p);
450*b9df5ad1SAndroid Build Coastguard Worker         switch (lhs->type) {
451*b9df5ad1SAndroid Build Coastguard Worker         case AUDIO_PORT_TYPE_DEVICE:
452*b9df5ad1SAndroid Build Coastguard Worker #ifndef AUDIO_NO_SYSTEM_DECLARATIONS
453*b9df5ad1SAndroid Build Coastguard Worker             lhs->ext.device.encapsulation_modes = AUDIO_ENCAPSULATION_MODE_NONE;
454*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_FALSE(p(lhs, rhs));
455*b9df5ad1SAndroid Build Coastguard Worker             lhs->ext.device.encapsulation_modes = rhs->ext.device.encapsulation_modes;
456*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_TRUE(p(lhs, rhs));
457*b9df5ad1SAndroid Build Coastguard Worker             lhs->ext.device.encapsulation_metadata_types = AUDIO_ENCAPSULATION_METADATA_TYPE_NONE;
458*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_FALSE(p(lhs, rhs));
459*b9df5ad1SAndroid Build Coastguard Worker             lhs->ext.device.encapsulation_metadata_types =
460*b9df5ad1SAndroid Build Coastguard Worker                     rhs->ext.device.encapsulation_metadata_types;
461*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_TRUE(p(lhs, rhs));
462*b9df5ad1SAndroid Build Coastguard Worker #endif
463*b9df5ad1SAndroid Build Coastguard Worker             break;
464*b9df5ad1SAndroid Build Coastguard Worker         case AUDIO_PORT_TYPE_MIX:
465*b9df5ad1SAndroid Build Coastguard Worker             lhs->ext.mix.latency_class = AUDIO_LATENCY_LOW;
466*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_FALSE(p(lhs, rhs));
467*b9df5ad1SAndroid Build Coastguard Worker             lhs->ext.mix.latency_class = rhs->ext.mix.latency_class;
468*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_TRUE(p(lhs, rhs));
469*b9df5ad1SAndroid Build Coastguard Worker             break;
470*b9df5ad1SAndroid Build Coastguard Worker         default:
471*b9df5ad1SAndroid Build Coastguard Worker             break;
472*b9df5ad1SAndroid Build Coastguard Worker         }
473*b9df5ad1SAndroid Build Coastguard Worker     }
474*b9df5ad1SAndroid Build Coastguard Worker 
475*b9df5ad1SAndroid Build Coastguard Worker     template <typename T, typename U, typename Func>
testAudioPortCapabilityArraysEquivalent(T values[],size_t size,const T & replacedValue,U * lhs,U * rhs,Func p)476*b9df5ad1SAndroid Build Coastguard Worker     void testAudioPortCapabilityArraysEquivalent(T values[], size_t size, const T& replacedValue,
477*b9df5ad1SAndroid Build Coastguard Worker             U* lhs, U* rhs, Func p) {
478*b9df5ad1SAndroid Build Coastguard Worker         ASSERT_GT(size, 1);
479*b9df5ad1SAndroid Build Coastguard Worker         std::swap(values[0], values[1]);
480*b9df5ad1SAndroid Build Coastguard Worker         ASSERT_TRUE(p(lhs, rhs));
481*b9df5ad1SAndroid Build Coastguard Worker         T savedValue = values[0];
482*b9df5ad1SAndroid Build Coastguard Worker         values[0] = replacedValue;
483*b9df5ad1SAndroid Build Coastguard Worker         ASSERT_FALSE(p(lhs, rhs));
484*b9df5ad1SAndroid Build Coastguard Worker         values[0] = savedValue;
485*b9df5ad1SAndroid Build Coastguard Worker         ASSERT_TRUE(p(lhs, rhs));
486*b9df5ad1SAndroid Build Coastguard Worker     }
487*b9df5ad1SAndroid Build Coastguard Worker };
488*b9df5ad1SAndroid Build Coastguard Worker 
fillFakeAudioPortConfigInfo(struct audio_port_config * config)489*b9df5ad1SAndroid Build Coastguard Worker void SystemAudioPortTest::fillFakeAudioPortConfigInfo(struct audio_port_config* config) {
490*b9df5ad1SAndroid Build Coastguard Worker     config->id = 0;
491*b9df5ad1SAndroid Build Coastguard Worker     config->role = std::get<0>(GetParam());
492*b9df5ad1SAndroid Build Coastguard Worker     config->type = std::get<1>(GetParam());
493*b9df5ad1SAndroid Build Coastguard Worker     config->config_mask = AUDIO_PORT_CONFIG_ALL;
494*b9df5ad1SAndroid Build Coastguard Worker     config->sample_rate = 48000;
495*b9df5ad1SAndroid Build Coastguard Worker     config->channel_mask = audio_port_config_has_input_direction(config) ?
496*b9df5ad1SAndroid Build Coastguard Worker             AUDIO_CHANNEL_IN_MONO : AUDIO_CHANNEL_OUT_MONO;
497*b9df5ad1SAndroid Build Coastguard Worker     config->format = AUDIO_FORMAT_PCM_16_BIT;
498*b9df5ad1SAndroid Build Coastguard Worker     config->gain = mGainConfig;
499*b9df5ad1SAndroid Build Coastguard Worker     if (audio_port_config_has_input_direction(config)) {
500*b9df5ad1SAndroid Build Coastguard Worker         config->flags.input = mInputFlag;
501*b9df5ad1SAndroid Build Coastguard Worker     } else {
502*b9df5ad1SAndroid Build Coastguard Worker         config->flags.output = mOutputFlag;
503*b9df5ad1SAndroid Build Coastguard Worker     }
504*b9df5ad1SAndroid Build Coastguard Worker     const bool outputDevice = config->role == AUDIO_PORT_ROLE_SINK;
505*b9df5ad1SAndroid Build Coastguard Worker     switch (config->type) {
506*b9df5ad1SAndroid Build Coastguard Worker     case AUDIO_PORT_TYPE_DEVICE:
507*b9df5ad1SAndroid Build Coastguard Worker         config->ext.device.hw_module = mHwModule;
508*b9df5ad1SAndroid Build Coastguard Worker         config->ext.device.type =
509*b9df5ad1SAndroid Build Coastguard Worker             outputDevice ? mOutputDeviceType : mInputDeviceType;
510*b9df5ad1SAndroid Build Coastguard Worker         strncpy(config->ext.device.address, mAddress.c_str(), AUDIO_DEVICE_MAX_ADDRESS_LEN);
511*b9df5ad1SAndroid Build Coastguard Worker         config->ext.device.speaker_layout_channel_mask =
512*b9df5ad1SAndroid Build Coastguard Worker             outputDevice ? AUDIO_CHANNEL_OUT_5POINT1 : AUDIO_CHANNEL_NONE;
513*b9df5ad1SAndroid Build Coastguard Worker         break;
514*b9df5ad1SAndroid Build Coastguard Worker     case AUDIO_PORT_TYPE_MIX:
515*b9df5ad1SAndroid Build Coastguard Worker         config->ext.mix.hw_module = mHwModule;
516*b9df5ad1SAndroid Build Coastguard Worker         config->ext.mix.handle = mIoHandle;
517*b9df5ad1SAndroid Build Coastguard Worker         if (config->role == AUDIO_PORT_ROLE_SOURCE) {
518*b9df5ad1SAndroid Build Coastguard Worker             config->ext.mix.usecase.stream = mStream;
519*b9df5ad1SAndroid Build Coastguard Worker         } else {
520*b9df5ad1SAndroid Build Coastguard Worker             config->ext.mix.usecase.source = mSource;
521*b9df5ad1SAndroid Build Coastguard Worker         }
522*b9df5ad1SAndroid Build Coastguard Worker         break;
523*b9df5ad1SAndroid Build Coastguard Worker     case AUDIO_PORT_TYPE_SESSION:
524*b9df5ad1SAndroid Build Coastguard Worker         config->ext.session.session = mSession;
525*b9df5ad1SAndroid Build Coastguard Worker         break;
526*b9df5ad1SAndroid Build Coastguard Worker     default:
527*b9df5ad1SAndroid Build Coastguard Worker         // Must not happen
528*b9df5ad1SAndroid Build Coastguard Worker         FAIL() << "Unknown port type " << config->type;
529*b9df5ad1SAndroid Build Coastguard Worker     }
530*b9df5ad1SAndroid Build Coastguard Worker }
531*b9df5ad1SAndroid Build Coastguard Worker 
fillFakeFormats(audio_format_t formats[],size_t numFormats)532*b9df5ad1SAndroid Build Coastguard Worker size_t SystemAudioPortTest::fillFakeFormats(audio_format_t formats[], size_t numFormats) {
533*b9df5ad1SAndroid Build Coastguard Worker     size_t j = 0;
534*b9df5ad1SAndroid Build Coastguard Worker     size_t format = 0x1;
535*b9df5ad1SAndroid Build Coastguard Worker     while (j < numFormats) {
536*b9df5ad1SAndroid Build Coastguard Worker         while (format <= mLastFormat) {
537*b9df5ad1SAndroid Build Coastguard Worker             if (audio_is_valid_format(static_cast<audio_format_t>(format << 24))) {
538*b9df5ad1SAndroid Build Coastguard Worker                 break;
539*b9df5ad1SAndroid Build Coastguard Worker             }
540*b9df5ad1SAndroid Build Coastguard Worker             format++;
541*b9df5ad1SAndroid Build Coastguard Worker         }
542*b9df5ad1SAndroid Build Coastguard Worker         if (format > mLastFormat) {
543*b9df5ad1SAndroid Build Coastguard Worker             break;
544*b9df5ad1SAndroid Build Coastguard Worker         }
545*b9df5ad1SAndroid Build Coastguard Worker         formats[j++] = static_cast<audio_format_t>((format++) << 24);
546*b9df5ad1SAndroid Build Coastguard Worker     }
547*b9df5ad1SAndroid Build Coastguard Worker     return j;
548*b9df5ad1SAndroid Build Coastguard Worker }
549*b9df5ad1SAndroid Build Coastguard Worker 
fillFakeAudioPortInfo(struct audio_port * audioPort)550*b9df5ad1SAndroid Build Coastguard Worker void SystemAudioPortTest::fillFakeAudioPortInfo(struct audio_port* audioPort) {
551*b9df5ad1SAndroid Build Coastguard Worker     fillFakeAudioPortBaseInfo(audioPort);
552*b9df5ad1SAndroid Build Coastguard Worker     // Use the maximum number of sample rates, formats, channel masks and gains for test
553*b9df5ad1SAndroid Build Coastguard Worker     audioPort->num_sample_rates = AUDIO_PORT_MAX_SAMPLING_RATES;
554*b9df5ad1SAndroid Build Coastguard Worker     for (size_t i = 0; i < audioPort->num_sample_rates; ++i) {
555*b9df5ad1SAndroid Build Coastguard Worker         // The numbers doesn't make any difference.
556*b9df5ad1SAndroid Build Coastguard Worker         audioPort->sample_rates[i] = (i + 1) * 1000;
557*b9df5ad1SAndroid Build Coastguard Worker     }
558*b9df5ad1SAndroid Build Coastguard Worker     audioPort->num_channel_masks = AUDIO_PORT_MAX_CHANNEL_MASKS;
559*b9df5ad1SAndroid Build Coastguard Worker     auto channelMasks = audioPort->role == AUDIO_PORT_ROLE_SINK ? OUT_CHANNEL_MASKS
560*b9df5ad1SAndroid Build Coastguard Worker                                                                 : IN_CHANNEL_MASKS;
561*b9df5ad1SAndroid Build Coastguard Worker     std::copy(channelMasks, channelMasks+audioPort->num_channel_masks,
562*b9df5ad1SAndroid Build Coastguard Worker             std::begin(audioPort->channel_masks));
563*b9df5ad1SAndroid Build Coastguard Worker     audioPort->num_formats = AUDIO_PORT_MAX_FORMATS;
564*b9df5ad1SAndroid Build Coastguard Worker     audioPort->num_formats = fillFakeFormats(audioPort->formats, audioPort->num_formats);
565*b9df5ad1SAndroid Build Coastguard Worker }
566*b9df5ad1SAndroid Build Coastguard Worker 
fillFakeAudioPortV7Info(struct audio_port_v7 * portV7,bool containsExtraAudioDescriptor)567*b9df5ad1SAndroid Build Coastguard Worker void SystemAudioPortTest::fillFakeAudioPortV7Info(struct audio_port_v7* portV7,
568*b9df5ad1SAndroid Build Coastguard Worker                                                   bool containsExtraAudioDescriptor) {
569*b9df5ad1SAndroid Build Coastguard Worker     fillFakeAudioPortBaseInfo(portV7);
570*b9df5ad1SAndroid Build Coastguard Worker     audio_format_t formats[AUDIO_PORT_MAX_FORMATS];
571*b9df5ad1SAndroid Build Coastguard Worker     portV7->num_audio_profiles = fillFakeFormats(formats, AUDIO_PORT_MAX_FORMATS);
572*b9df5ad1SAndroid Build Coastguard Worker     for (size_t i = 0; i < portV7->num_audio_profiles; ++i) {
573*b9df5ad1SAndroid Build Coastguard Worker         portV7->audio_profiles[i].format = formats[i];
574*b9df5ad1SAndroid Build Coastguard Worker         // Use the maximum number of sample rates, formats, channel masks and gains for test
575*b9df5ad1SAndroid Build Coastguard Worker         portV7->audio_profiles[i].num_sample_rates = AUDIO_PORT_MAX_SAMPLING_RATES;
576*b9df5ad1SAndroid Build Coastguard Worker         for (size_t j = 0; j < portV7->audio_profiles[i].num_sample_rates; ++j) {
577*b9df5ad1SAndroid Build Coastguard Worker             // The numbers doesn't make any difference.
578*b9df5ad1SAndroid Build Coastguard Worker             portV7->audio_profiles[i].sample_rates[j] = rand();
579*b9df5ad1SAndroid Build Coastguard Worker         }
580*b9df5ad1SAndroid Build Coastguard Worker         portV7->audio_profiles[i].num_channel_masks = AUDIO_PORT_MAX_CHANNEL_MASKS;
581*b9df5ad1SAndroid Build Coastguard Worker         auto channelMasks = portV7->role == AUDIO_PORT_ROLE_SINK ? OUT_CHANNEL_MASKS
582*b9df5ad1SAndroid Build Coastguard Worker                                                                  : IN_CHANNEL_MASKS;
583*b9df5ad1SAndroid Build Coastguard Worker         std::copy(channelMasks, channelMasks+portV7->audio_profiles[i].num_channel_masks,
584*b9df5ad1SAndroid Build Coastguard Worker                 std::begin(portV7->audio_profiles[i].channel_masks));
585*b9df5ad1SAndroid Build Coastguard Worker     }
586*b9df5ad1SAndroid Build Coastguard Worker     if (containsExtraAudioDescriptor) {
587*b9df5ad1SAndroid Build Coastguard Worker         portV7->num_extra_audio_descriptors = AUDIO_PORT_MAX_EXTRA_AUDIO_DESCRIPTORS;
588*b9df5ad1SAndroid Build Coastguard Worker         for (size_t i = 0; i < portV7->num_extra_audio_descriptors; ++i) {
589*b9df5ad1SAndroid Build Coastguard Worker             portV7->extra_audio_descriptors[i].standard = AUDIO_STANDARD_EDID;
590*b9df5ad1SAndroid Build Coastguard Worker             portV7->extra_audio_descriptors[i].descriptor_length = SHORT_AUDIO_DESCRIPTOR_LENGTH;
591*b9df5ad1SAndroid Build Coastguard Worker             for (unsigned int j = 0; j < SHORT_AUDIO_DESCRIPTOR_LENGTH; ++j) {
592*b9df5ad1SAndroid Build Coastguard Worker                 portV7->extra_audio_descriptors[i].descriptor[j] = rand() % 254 + 1;
593*b9df5ad1SAndroid Build Coastguard Worker             }
594*b9df5ad1SAndroid Build Coastguard Worker             portV7->extra_audio_descriptors[i].encapsulation_type =
595*b9df5ad1SAndroid Build Coastguard Worker                     AUDIO_ENCAPSULATION_TYPE_IEC61937;
596*b9df5ad1SAndroid Build Coastguard Worker         }
597*b9df5ad1SAndroid Build Coastguard Worker     }
598*b9df5ad1SAndroid Build Coastguard Worker }
599*b9df5ad1SAndroid Build Coastguard Worker 
TEST_F(SystemAudioPortTest,AudioGainConfigEquivalentTest)600*b9df5ad1SAndroid Build Coastguard Worker TEST_F(SystemAudioPortTest, AudioGainConfigEquivalentTest) {
601*b9df5ad1SAndroid Build Coastguard Worker     struct audio_gain_config lhs = mGainConfig;
602*b9df5ad1SAndroid Build Coastguard Worker     struct audio_gain_config rhs = mGainConfig;
603*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_TRUE(audio_gain_config_are_equal(&lhs, &rhs));
604*b9df5ad1SAndroid Build Coastguard Worker     lhs.index = rhs.index + 1;
605*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_TRUE(audio_gain_config_are_equal(&lhs, &rhs));
606*b9df5ad1SAndroid Build Coastguard Worker     lhs.index = rhs.index;
607*b9df5ad1SAndroid Build Coastguard Worker     lhs.values[0] = rhs.values[0] + 1;
608*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_FALSE(audio_gain_config_are_equal(&lhs, &rhs));
609*b9df5ad1SAndroid Build Coastguard Worker     lhs.values[0] = rhs.values[0];
610*b9df5ad1SAndroid Build Coastguard Worker     updateFieldAndCompare(rhs.ramp_duration_ms + 10, &audio_gain_config::ramp_duration_ms,
611*b9df5ad1SAndroid Build Coastguard Worker             &lhs, &rhs, audio_gain_config_are_equal);
612*b9df5ad1SAndroid Build Coastguard Worker     for (const audio_gain_mode_t mode : {AUDIO_GAIN_MODE_CHANNELS, AUDIO_GAIN_MODE_RAMP}) {
613*b9df5ad1SAndroid Build Coastguard Worker         lhs.mode = mode;
614*b9df5ad1SAndroid Build Coastguard Worker         ASSERT_FALSE(audio_gain_config_are_equal(&lhs, &rhs));
615*b9df5ad1SAndroid Build Coastguard Worker         rhs.mode = lhs.mode;
616*b9df5ad1SAndroid Build Coastguard Worker         ASSERT_TRUE(audio_gain_config_are_equal(&lhs, &rhs));
617*b9df5ad1SAndroid Build Coastguard Worker         lhs.values[2] = rhs.values[2] + 1;
618*b9df5ad1SAndroid Build Coastguard Worker         ASSERT_TRUE(audio_gain_config_are_equal(&lhs, &rhs));
619*b9df5ad1SAndroid Build Coastguard Worker         lhs.values[2] = rhs.values[2];
620*b9df5ad1SAndroid Build Coastguard Worker         lhs.values[0] = rhs.values[0] + 1;
621*b9df5ad1SAndroid Build Coastguard Worker         ASSERT_FALSE(audio_gain_config_are_equal(&lhs, &rhs));
622*b9df5ad1SAndroid Build Coastguard Worker         lhs.values[0] = rhs.values[0];
623*b9df5ad1SAndroid Build Coastguard Worker     }
624*b9df5ad1SAndroid Build Coastguard Worker }
625*b9df5ad1SAndroid Build Coastguard Worker 
TEST_F(SystemAudioPortTest,AudioGainEquivalentTest)626*b9df5ad1SAndroid Build Coastguard Worker TEST_F(SystemAudioPortTest, AudioGainEquivalentTest) {
627*b9df5ad1SAndroid Build Coastguard Worker     struct audio_gain lhs = mGain;
628*b9df5ad1SAndroid Build Coastguard Worker     struct audio_gain rhs = mGain;
629*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_TRUE(audio_gains_are_equal(&lhs, &rhs));
630*b9df5ad1SAndroid Build Coastguard Worker 
631*b9df5ad1SAndroid Build Coastguard Worker     lhs.mode = AUDIO_GAIN_MODE_CHANNELS;
632*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_FALSE(audio_gains_are_equal(&lhs, &rhs));
633*b9df5ad1SAndroid Build Coastguard Worker     rhs.mode = lhs.mode;
634*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_TRUE(audio_gains_are_equal(&lhs, &rhs));
635*b9df5ad1SAndroid Build Coastguard Worker     updateFieldAndCompare(static_cast<audio_channel_mask_t>(rhs.channel_mask << 1),
636*b9df5ad1SAndroid Build Coastguard Worker             &audio_gain::channel_mask, &lhs, &rhs, audio_gains_are_equal);
637*b9df5ad1SAndroid Build Coastguard Worker 
638*b9df5ad1SAndroid Build Coastguard Worker     updateFieldAndCompare(rhs.min_value + 10, &audio_gain::min_value,
639*b9df5ad1SAndroid Build Coastguard Worker             &lhs, &rhs, audio_gains_are_equal);
640*b9df5ad1SAndroid Build Coastguard Worker     updateFieldAndCompare(rhs.max_value + 10, &audio_gain::max_value,
641*b9df5ad1SAndroid Build Coastguard Worker             &lhs, &rhs, audio_gains_are_equal);
642*b9df5ad1SAndroid Build Coastguard Worker     updateFieldAndCompare(rhs.default_value + 10, &audio_gain::default_value,
643*b9df5ad1SAndroid Build Coastguard Worker             &lhs, &rhs, audio_gains_are_equal);
644*b9df5ad1SAndroid Build Coastguard Worker     updateFieldAndCompare(rhs.step_value + 10, &audio_gain::step_value,
645*b9df5ad1SAndroid Build Coastguard Worker             &lhs, &rhs, audio_gains_are_equal);
646*b9df5ad1SAndroid Build Coastguard Worker     updateFieldAndCompare(rhs.min_ramp_ms + 10, &audio_gain::min_ramp_ms,
647*b9df5ad1SAndroid Build Coastguard Worker             &lhs, &rhs, audio_gains_are_equal);
648*b9df5ad1SAndroid Build Coastguard Worker     updateFieldAndCompare(rhs.max_ramp_ms + 10, &audio_gain::max_ramp_ms,
649*b9df5ad1SAndroid Build Coastguard Worker             &lhs, &rhs, audio_gains_are_equal);
650*b9df5ad1SAndroid Build Coastguard Worker }
651*b9df5ad1SAndroid Build Coastguard Worker 
TEST_P(SystemAudioPortTest,AudioPortConfigEquivalentTest)652*b9df5ad1SAndroid Build Coastguard Worker TEST_P(SystemAudioPortTest, AudioPortConfigEquivalentTest) {
653*b9df5ad1SAndroid Build Coastguard Worker     struct audio_port_config lhs;
654*b9df5ad1SAndroid Build Coastguard Worker     struct audio_port_config rhs;
655*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(fillFakeAudioPortConfigInfo(&lhs));
656*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(fillFakeAudioPortConfigInfo(&rhs));
657*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_TRUE(audio_port_configs_are_equal(&lhs, &rhs));
658*b9df5ad1SAndroid Build Coastguard Worker 
659*b9df5ad1SAndroid Build Coastguard Worker     updateFieldAndCompare(AUDIO_PORT_ROLE_NONE, &audio_port_config::role,
660*b9df5ad1SAndroid Build Coastguard Worker             &lhs, &rhs, audio_port_configs_are_equal);
661*b9df5ad1SAndroid Build Coastguard Worker     updateFieldAndCompare(AUDIO_PORT_TYPE_NONE, &audio_port_config::type,
662*b9df5ad1SAndroid Build Coastguard Worker             &lhs, &rhs, audio_port_configs_are_equal);
663*b9df5ad1SAndroid Build Coastguard Worker 
664*b9df5ad1SAndroid Build Coastguard Worker     updateConfigFieldAndCompare(rhs.sample_rate * 2, &audio_port_config::sample_rate,
665*b9df5ad1SAndroid Build Coastguard Worker             &lhs, &rhs, AUDIO_PORT_CONFIG_SAMPLE_RATE, audio_port_configs_are_equal);
666*b9df5ad1SAndroid Build Coastguard Worker     updateConfigFieldAndCompare(AUDIO_CHANNEL_NONE, &audio_port_config::channel_mask,
667*b9df5ad1SAndroid Build Coastguard Worker             &lhs, &rhs, AUDIO_PORT_CONFIG_CHANNEL_MASK, audio_port_configs_are_equal);
668*b9df5ad1SAndroid Build Coastguard Worker     updateConfigFieldAndCompare(AUDIO_FORMAT_DEFAULT, &audio_port_config::format,
669*b9df5ad1SAndroid Build Coastguard Worker             &lhs, &rhs, AUDIO_PORT_CONFIG_FORMAT, audio_port_configs_are_equal);
670*b9df5ad1SAndroid Build Coastguard Worker     lhs.gain.ramp_duration_ms = rhs.gain.ramp_duration_ms * 2;
671*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_FALSE(audio_port_configs_are_equal(&lhs, &rhs));
672*b9df5ad1SAndroid Build Coastguard Worker     lhs.config_mask &= ~AUDIO_PORT_CONFIG_GAIN;
673*b9df5ad1SAndroid Build Coastguard Worker     rhs.config_mask = lhs.config_mask;
674*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_TRUE(audio_port_configs_are_equal(&lhs, &rhs));
675*b9df5ad1SAndroid Build Coastguard Worker 
676*b9df5ad1SAndroid Build Coastguard Worker     lhs.config_mask |= AUDIO_PORT_CONFIG_FLAGS;
677*b9df5ad1SAndroid Build Coastguard Worker     rhs.config_mask = lhs.config_mask;
678*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_TRUE(audio_port_configs_are_equal(&lhs, &rhs));
679*b9df5ad1SAndroid Build Coastguard Worker     if (audio_port_config_has_input_direction(&lhs)) {
680*b9df5ad1SAndroid Build Coastguard Worker         lhs.flags.input = AUDIO_INPUT_FLAG_NONE;
681*b9df5ad1SAndroid Build Coastguard Worker     } else {
682*b9df5ad1SAndroid Build Coastguard Worker         lhs.flags.output = AUDIO_OUTPUT_FLAG_NONE;
683*b9df5ad1SAndroid Build Coastguard Worker     }
684*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_FALSE(audio_port_configs_are_equal(&lhs, &rhs));
685*b9df5ad1SAndroid Build Coastguard Worker     lhs.config_mask &= ~AUDIO_PORT_CONFIG_FLAGS;
686*b9df5ad1SAndroid Build Coastguard Worker     rhs.config_mask = lhs.config_mask;
687*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_TRUE(audio_port_configs_are_equal(&lhs, &rhs));
688*b9df5ad1SAndroid Build Coastguard Worker 
689*b9df5ad1SAndroid Build Coastguard Worker     testAudioPortExtBaseEquivalent(&lhs, &rhs, audio_port_configs_are_equal);
690*b9df5ad1SAndroid Build Coastguard Worker     if (lhs.type == AUDIO_PORT_TYPE_MIX) {
691*b9df5ad1SAndroid Build Coastguard Worker         if (lhs.role == AUDIO_PORT_ROLE_SINK) {
692*b9df5ad1SAndroid Build Coastguard Worker             lhs.ext.mix.usecase.source = AUDIO_SOURCE_DEFAULT;
693*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_FALSE(audio_port_configs_are_equal(&lhs, &rhs));
694*b9df5ad1SAndroid Build Coastguard Worker             lhs.ext.mix.usecase.source = rhs.ext.mix.usecase.source;
695*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_TRUE(audio_port_configs_are_equal(&lhs, &rhs));
696*b9df5ad1SAndroid Build Coastguard Worker         } else if (lhs.role == AUDIO_PORT_ROLE_SOURCE) {
697*b9df5ad1SAndroid Build Coastguard Worker             lhs.ext.mix.usecase.stream = AUDIO_STREAM_DEFAULT;
698*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_FALSE(audio_port_configs_are_equal(&lhs, &rhs));
699*b9df5ad1SAndroid Build Coastguard Worker             lhs.ext.mix.usecase.stream = rhs.ext.mix.usecase.stream;
700*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_TRUE(audio_port_configs_are_equal(&lhs, &rhs));
701*b9df5ad1SAndroid Build Coastguard Worker         }
702*b9df5ad1SAndroid Build Coastguard Worker     }
703*b9df5ad1SAndroid Build Coastguard Worker     if (lhs.type == AUDIO_PORT_TYPE_DEVICE) {
704*b9df5ad1SAndroid Build Coastguard Worker       lhs.ext.device.speaker_layout_channel_mask = AUDIO_CHANNEL_OUT_MONO;
705*b9df5ad1SAndroid Build Coastguard Worker       ASSERT_FALSE(audio_port_configs_are_equal(&lhs, &rhs));
706*b9df5ad1SAndroid Build Coastguard Worker       lhs.ext.device.speaker_layout_channel_mask =
707*b9df5ad1SAndroid Build Coastguard Worker           rhs.ext.device.speaker_layout_channel_mask;
708*b9df5ad1SAndroid Build Coastguard Worker       ASSERT_TRUE(audio_port_configs_are_equal(&lhs, &rhs));
709*b9df5ad1SAndroid Build Coastguard Worker     }
710*b9df5ad1SAndroid Build Coastguard Worker }
711*b9df5ad1SAndroid Build Coastguard Worker 
TEST_P(SystemAudioPortTest,AudioPortEquivalentTest)712*b9df5ad1SAndroid Build Coastguard Worker TEST_P(SystemAudioPortTest, AudioPortEquivalentTest) {
713*b9df5ad1SAndroid Build Coastguard Worker     struct audio_port lhs;
714*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(fillFakeAudioPortInfo(&lhs));
715*b9df5ad1SAndroid Build Coastguard Worker     struct audio_port rhs = lhs;
716*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_TRUE(audio_ports_are_equal(&lhs, &rhs));
717*b9df5ad1SAndroid Build Coastguard Worker 
718*b9df5ad1SAndroid Build Coastguard Worker     testAudioPortEquivalent(&lhs, &rhs, audio_ports_are_equal);
719*b9df5ad1SAndroid Build Coastguard Worker 
720*b9df5ad1SAndroid Build Coastguard Worker     testAudioPortCapabilityArraysEquivalent(lhs.formats, lhs.num_formats,
721*b9df5ad1SAndroid Build Coastguard Worker             AUDIO_FORMAT_DEFAULT, &lhs, &rhs, audio_ports_are_equal);
722*b9df5ad1SAndroid Build Coastguard Worker     testAudioPortCapabilityArraysEquivalent(lhs.channel_masks, lhs.num_channel_masks,
723*b9df5ad1SAndroid Build Coastguard Worker             AUDIO_CHANNEL_NONE, &lhs, &rhs, audio_ports_are_equal);
724*b9df5ad1SAndroid Build Coastguard Worker     testAudioPortCapabilityArraysEquivalent(lhs.sample_rates, lhs.num_sample_rates,
725*b9df5ad1SAndroid Build Coastguard Worker             (unsigned int) 0 /*replacedValue*/, &lhs, &rhs, audio_ports_are_equal);
726*b9df5ad1SAndroid Build Coastguard Worker }
727*b9df5ad1SAndroid Build Coastguard Worker 
TEST_P(SystemAudioPortTest,AudioPortV7EquivalentTest)728*b9df5ad1SAndroid Build Coastguard Worker TEST_P(SystemAudioPortTest, AudioPortV7EquivalentTest) {
729*b9df5ad1SAndroid Build Coastguard Worker     struct audio_port_v7 lhs;
730*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(fillFakeAudioPortV7Info(&lhs, true /*containsExtraAudioDescriptor*/));
731*b9df5ad1SAndroid Build Coastguard Worker     struct audio_port_v7 rhs = lhs;
732*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_TRUE(audio_ports_v7_are_equal(&lhs, &rhs));
733*b9df5ad1SAndroid Build Coastguard Worker 
734*b9df5ad1SAndroid Build Coastguard Worker     testAudioPortEquivalent(&lhs, &rhs, audio_ports_v7_are_equal);
735*b9df5ad1SAndroid Build Coastguard Worker 
736*b9df5ad1SAndroid Build Coastguard Worker     struct audio_profile emptyProfile = {};
737*b9df5ad1SAndroid Build Coastguard Worker     testAudioPortCapabilityArraysEquivalent(lhs.audio_profiles, lhs.num_audio_profiles,
738*b9df5ad1SAndroid Build Coastguard Worker             emptyProfile, &lhs, &rhs, audio_ports_v7_are_equal);
739*b9df5ad1SAndroid Build Coastguard Worker     auto& firstProfile = lhs.audio_profiles[0];
740*b9df5ad1SAndroid Build Coastguard Worker     testAudioPortCapabilityArraysEquivalent(firstProfile.sample_rates,
741*b9df5ad1SAndroid Build Coastguard Worker             firstProfile.num_sample_rates, (unsigned int) 0 /*replacedValue*/,
742*b9df5ad1SAndroid Build Coastguard Worker             &lhs, &rhs, audio_ports_v7_are_equal);
743*b9df5ad1SAndroid Build Coastguard Worker     testAudioPortCapabilityArraysEquivalent(firstProfile.channel_masks,
744*b9df5ad1SAndroid Build Coastguard Worker             firstProfile.num_channel_masks, AUDIO_CHANNEL_NONE,
745*b9df5ad1SAndroid Build Coastguard Worker             &lhs, &rhs, audio_ports_v7_are_equal);
746*b9df5ad1SAndroid Build Coastguard Worker 
747*b9df5ad1SAndroid Build Coastguard Worker     struct audio_extra_audio_descriptor emptyDesc = {};
748*b9df5ad1SAndroid Build Coastguard Worker     testAudioPortCapabilityArraysEquivalent(lhs.extra_audio_descriptors,
749*b9df5ad1SAndroid Build Coastguard Worker             lhs.num_extra_audio_descriptors, emptyDesc, &lhs, &rhs, audio_ports_v7_are_equal);
750*b9df5ad1SAndroid Build Coastguard Worker }
751*b9df5ad1SAndroid Build Coastguard Worker 
TEST_P(SystemAudioPortTest,AudioPortV7ConversionTest)752*b9df5ad1SAndroid Build Coastguard Worker TEST_P(SystemAudioPortTest, AudioPortV7ConversionTest) {
753*b9df5ad1SAndroid Build Coastguard Worker     struct audio_port srcPort, dstPort = {};
754*b9df5ad1SAndroid Build Coastguard Worker     struct audio_port_v7 portV7;
755*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(fillFakeAudioPortInfo(&srcPort));
756*b9df5ad1SAndroid Build Coastguard Worker     audio_populate_audio_port_v7(&srcPort, &portV7);
757*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_TRUE(audio_populate_audio_port(&portV7, &dstPort));
758*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_TRUE(audio_ports_are_equal(&srcPort, &dstPort));
759*b9df5ad1SAndroid Build Coastguard Worker 
760*b9df5ad1SAndroid Build Coastguard Worker     struct audio_port_v7 srcPortV7, dstPortV7 = {};
761*b9df5ad1SAndroid Build Coastguard Worker     struct audio_port audioPort;
762*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(
763*b9df5ad1SAndroid Build Coastguard Worker             fillFakeAudioPortV7Info(&srcPortV7, false /*containsExtraAudioDescriptor*/));
764*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_EQ(srcPortV7.num_audio_profiles, AUDIO_PORT_MAX_AUDIO_PROFILES);
765*b9df5ad1SAndroid Build Coastguard Worker     auto& profile = srcPortV7.audio_profiles[0];
766*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_EQ(profile.num_channel_masks, AUDIO_PORT_MAX_CHANNEL_MASKS);
767*b9df5ad1SAndroid Build Coastguard Worker     // Set a channel mask that is not present in the list
768*b9df5ad1SAndroid Build Coastguard Worker     profile.channel_masks[0] = AUDIO_CHANNEL_NONE;
769*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_FALSE(audio_populate_audio_port(&srcPortV7, &audioPort));
770*b9df5ad1SAndroid Build Coastguard Worker     audio_populate_audio_port_v7(&audioPort, &dstPortV7);
771*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_EQ(dstPortV7.num_audio_profiles, AUDIO_PORT_MAX_AUDIO_PROFILES);
772*b9df5ad1SAndroid Build Coastguard Worker     // Do not compare audio profiles' information as the audio profiles will not be the
773*b9df5ad1SAndroid Build Coastguard Worker     // same after conversion from audio_port_v7->audio_port and audio_port->audio_port_v7
774*b9df5ad1SAndroid Build Coastguard Worker     srcPortV7.num_audio_profiles = 0;
775*b9df5ad1SAndroid Build Coastguard Worker     dstPortV7.num_audio_profiles = 0;
776*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_TRUE(audio_ports_v7_are_equal(&srcPortV7, &dstPortV7));
777*b9df5ad1SAndroid Build Coastguard Worker }
778*b9df5ad1SAndroid Build Coastguard Worker 
TEST_P(SystemAudioPortTest,AudioPortV7ContainingExtraAudioDescriptorConversionTest)779*b9df5ad1SAndroid Build Coastguard Worker TEST_P(SystemAudioPortTest, AudioPortV7ContainingExtraAudioDescriptorConversionTest) {
780*b9df5ad1SAndroid Build Coastguard Worker     struct audio_port_v7 srcPortV7, dstPortV7 = {};
781*b9df5ad1SAndroid Build Coastguard Worker     struct audio_port audioPort;
782*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(
783*b9df5ad1SAndroid Build Coastguard Worker             fillFakeAudioPortV7Info(&srcPortV7, true /*containsExtraAudioDescriptor*/));
784*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_FALSE(audio_populate_audio_port(&srcPortV7, &audioPort));
785*b9df5ad1SAndroid Build Coastguard Worker     audio_populate_audio_port_v7(&audioPort, &dstPortV7);
786*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_FALSE(audio_ports_v7_are_equal(&srcPortV7, &dstPortV7));
787*b9df5ad1SAndroid Build Coastguard Worker }
788*b9df5ad1SAndroid Build Coastguard Worker 
789*b9df5ad1SAndroid Build Coastguard Worker INSTANTIATE_TEST_CASE_P(SystemAudioPortTest, SystemAudioPortTest,
790*b9df5ad1SAndroid Build Coastguard Worker         testing::Combine(
791*b9df5ad1SAndroid Build Coastguard Worker                 testing::Values(AUDIO_PORT_ROLE_SOURCE,
792*b9df5ad1SAndroid Build Coastguard Worker                                 AUDIO_PORT_ROLE_SINK),
793*b9df5ad1SAndroid Build Coastguard Worker                 testing::Values(AUDIO_PORT_TYPE_DEVICE,
794*b9df5ad1SAndroid Build Coastguard Worker                                 AUDIO_PORT_TYPE_MIX,
795*b9df5ad1SAndroid Build Coastguard Worker                                 AUDIO_PORT_TYPE_SESSION))
796*b9df5ad1SAndroid Build Coastguard Worker         );
797