• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2024 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 
17 // Test platform related API from AAudio
18 
19 #include <aaudio/AAudio.h>
20 #include <gtest/gtest.h>
21 
22 #include <functional>
23 #include <set>
24 #include <sstream>
25 #include <string>
26 
27 #include "utils.h"
28 
29 #define AAUDIO_CASE_ENUM(name) \
30     case name:                 \
31         return #name
32 
deviceToString(AAudio_DeviceType device)33 static std::string deviceToString(AAudio_DeviceType device) {
34     switch (device) {
35         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_BUILTIN_EARPIECE);
36         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_BUILTIN_SPEAKER);
37         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_WIRED_HEADSET);
38         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_WIRED_HEADPHONES);
39         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_LINE_ANALOG);
40         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_LINE_DIGITAL);
41         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_BLUETOOTH_SCO);
42         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_BLUETOOTH_A2DP);
43         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_HDMI);
44         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_HDMI_ARC);
45         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_USB_DEVICE);
46         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_USB_ACCESSORY);
47         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_DOCK);
48         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_FM);
49         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_BUILTIN_MIC);
50         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_FM_TUNER);
51         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_TV_TUNER);
52         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_TELEPHONY);
53         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_AUX_LINE);
54         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_IP);
55         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_BUS);
56         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_USB_HEADSET);
57         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_HEARING_AID);
58         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_BUILTIN_SPEAKER_SAFE);
59         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_REMOTE_SUBMIX);
60         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_BLE_HEADSET);
61         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_BLE_SPEAKER);
62         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_HDMI_EARC);
63         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_BLE_BROADCAST);
64         AAUDIO_CASE_ENUM(AAUDIO_DEVICE_DOCK_ANALOG);
65         default:
66             return std::to_string(device);
67     }
68 }
69 
70 using PlatformPolicyTestParam = std::tuple<AAudio_DeviceType, aaudio_direction_t>;
71 
72 class PlatformPolicyTest : public AAudioCtsBase,
73                            public ::testing::WithParamInterface<PlatformPolicyTestParam> {
74 public:
75     static std::string getTestName(const ::testing::TestParamInfo<PlatformPolicyTestParam>& info);
76 
77 protected:
78     enum policy_type_t {
79         DEFAULT,
80         EXCLUSIVE,
81     };
82 
83     void runTest(AAudio_DeviceType device, aaudio_direction_t direction, policy_type_t policyType);
84 };
85 
86 // static
getTestName(const::testing::TestParamInfo<PlatformPolicyTestParam> & info)87 std::string PlatformPolicyTest::getTestName(
88         const ::testing::TestParamInfo<PlatformPolicyTestParam>& info) {
89     return deviceToString(std::get<0>(info.param)) + "_as_" +
90             (std::get<1>(info.param) == AAUDIO_DIRECTION_INPUT ? "input" : "output");
91 }
92 
runTest(AAudio_DeviceType device,aaudio_direction_t direction,policy_type_t policyType)93 void PlatformPolicyTest::runTest(AAudio_DeviceType device, aaudio_direction_t direction,
94                                  policy_type_t policyType) {
95     const bool isValidValue = direction == AAUDIO_DIRECTION_INPUT
96             ? (ALL_VALID_INPUT_DEVICES.count(device) != 0)
97             : (ALL_VALID_OUTPUT_DEVICES.count(device) != 0);
98     auto result = policyType == DEFAULT
99             ? AAudioExtensions::getInstance().getPlatformMMapPolicy(device, direction)
100             : AAudioExtensions::getInstance().getPlatformMMapExclusivePolicy(device, direction);
101     if (isValidValue) {
102         ASSERT_GT(ALL_VALID_POLICIES.count(result), 0);
103     } else {
104         ASSERT_EQ(AAUDIO_ERROR_ILLEGAL_ARGUMENT, result);
105     }
106 }
107 
TEST_P(PlatformPolicyTest,getDefaultPolicy)108 TEST_P(PlatformPolicyTest, getDefaultPolicy) {
109     ASSERT_NO_FATAL_FAILURE(runTest(std::get<0>(GetParam()), std::get<1>(GetParam()), DEFAULT));
110 }
111 
TEST_P(PlatformPolicyTest,getExclusivePolicy)112 TEST_P(PlatformPolicyTest, getExclusivePolicy) {
113     ASSERT_NO_FATAL_FAILURE(runTest(std::get<0>(GetParam()), std::get<1>(GetParam()), EXCLUSIVE));
114 }
115 
116 INSTANTIATE_TEST_CASE_P(
117         AAudioTestPlatform, PlatformPolicyTest,
118         ::testing::Combine(
119                 ::testing::Values(
120                         AAUDIO_DEVICE_BUILTIN_EARPIECE, AAUDIO_DEVICE_BUILTIN_SPEAKER,
121                         AAUDIO_DEVICE_WIRED_HEADSET, AAUDIO_DEVICE_WIRED_HEADPHONES,
122                         AAUDIO_DEVICE_LINE_ANALOG, AAUDIO_DEVICE_LINE_DIGITAL,
123                         AAUDIO_DEVICE_BLUETOOTH_SCO, AAUDIO_DEVICE_BLUETOOTH_A2DP,
124                         AAUDIO_DEVICE_HDMI, AAUDIO_DEVICE_HDMI_ARC, AAUDIO_DEVICE_USB_DEVICE,
125                         AAUDIO_DEVICE_USB_ACCESSORY, AAUDIO_DEVICE_DOCK, AAUDIO_DEVICE_FM,
126                         AAUDIO_DEVICE_BUILTIN_MIC, AAUDIO_DEVICE_FM_TUNER, AAUDIO_DEVICE_TV_TUNER,
127                         AAUDIO_DEVICE_TELEPHONY, AAUDIO_DEVICE_AUX_LINE, AAUDIO_DEVICE_IP,
128                         AAUDIO_DEVICE_BUS, AAUDIO_DEVICE_USB_HEADSET, AAUDIO_DEVICE_HEARING_AID,
129                         AAUDIO_DEVICE_BUILTIN_SPEAKER_SAFE, AAUDIO_DEVICE_REMOTE_SUBMIX,
130                         AAUDIO_DEVICE_BLE_HEADSET, AAUDIO_DEVICE_BLE_SPEAKER,
131                         AAUDIO_DEVICE_HDMI_EARC, AAUDIO_DEVICE_BLE_BROADCAST,
132                         AAUDIO_DEVICE_DOCK_ANALOG,
133                         1234567 /*random number that is not yet defined as a device type*/),
134                 ::testing::Values(AAUDIO_DIRECTION_INPUT, AAUDIO_DIRECTION_OUTPUT)),
135         &PlatformPolicyTest::getTestName);
136