1 /*
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 
17 // Test AAudio attributes such as Usage, ContentType and InputPreset.
18 
19 // TODO Many of these tests are duplicates of CTS tests in
20 // "test_aaudio_attributes.cpp". That other file is more current.
21 // So these tests could be deleted.
22 
23 #include <memory>
24 #include <stdio.h>
25 #include <unistd.h>
26 
27 #include <aaudio/AAudio.h>
28 #include <gtest/gtest.h>
29 
30 constexpr int64_t kNanosPerSecond = 1000000000;
31 constexpr int kNumFrames = 256;
32 constexpr int kChannelCount = 2;
33 
34 constexpr int32_t DONT_SET = -1000;
35 
checkAttributes(aaudio_performance_mode_t perfMode,aaudio_usage_t usage,aaudio_content_type_t contentType,aaudio_input_preset_t preset=DONT_SET,aaudio_allowed_capture_policy_t capturePolicy=DONT_SET,int privacyMode=DONT_SET,aaudio_direction_t direction=AAUDIO_DIRECTION_OUTPUT)36 static void checkAttributes(aaudio_performance_mode_t perfMode,
37                             aaudio_usage_t usage,
38                             aaudio_content_type_t contentType,
39                             aaudio_input_preset_t preset = DONT_SET,
40                             aaudio_allowed_capture_policy_t capturePolicy = DONT_SET,
41                             int privacyMode = DONT_SET,
42                             aaudio_direction_t direction = AAUDIO_DIRECTION_OUTPUT) {
43 
44     std::unique_ptr<float[]> buffer(new float[kNumFrames * kChannelCount]);
45 
46     AAudioStreamBuilder *aaudioBuilder = nullptr;
47     AAudioStream *aaudioStream = nullptr;
48 
49     // Use an AAudioStreamBuilder to contain requested parameters.
50     ASSERT_EQ(AAUDIO_OK, AAudio_createStreamBuilder(&aaudioBuilder));
51 
52     // Request stream properties.
53     AAudioStreamBuilder_setPerformanceMode(aaudioBuilder, perfMode);
54     AAudioStreamBuilder_setDirection(aaudioBuilder, direction);
55 
56     // Set the attribute in the builder.
57     if (usage != DONT_SET) {
58         AAudioStreamBuilder_setUsage(aaudioBuilder, usage);
59     }
60     if (contentType != DONT_SET) {
61         AAudioStreamBuilder_setContentType(aaudioBuilder, contentType);
62     }
63     if (preset != DONT_SET) {
64         AAudioStreamBuilder_setInputPreset(aaudioBuilder, preset);
65     }
66     if (capturePolicy != DONT_SET) {
67         AAudioStreamBuilder_setAllowedCapturePolicy(aaudioBuilder, capturePolicy);
68     }
69     if (privacyMode != DONT_SET) {
70         AAudioStreamBuilder_setPrivacySensitive(aaudioBuilder, (bool)privacyMode);
71     }
72 
73     // Create an AAudioStream using the Builder.
74     ASSERT_EQ(AAUDIO_OK, AAudioStreamBuilder_openStream(aaudioBuilder, &aaudioStream));
75     AAudioStreamBuilder_delete(aaudioBuilder);
76 
77     // Make sure we get the same attributes back from the stream.
78     aaudio_usage_t expectedUsage =
79             (usage == DONT_SET || usage == AAUDIO_UNSPECIFIED)
80             ? AAUDIO_USAGE_MEDIA // default
81             : usage;
82     EXPECT_EQ(expectedUsage, AAudioStream_getUsage(aaudioStream));
83 
84     aaudio_content_type_t expectedContentType =
85             (contentType == DONT_SET || contentType == AAUDIO_UNSPECIFIED)
86             ? AAUDIO_CONTENT_TYPE_MUSIC // default
87             : contentType;
88     EXPECT_EQ(expectedContentType, AAudioStream_getContentType(aaudioStream));
89 
90     aaudio_input_preset_t expectedPreset =
91             (preset == DONT_SET || preset == AAUDIO_UNSPECIFIED)
92             ? AAUDIO_INPUT_PRESET_VOICE_RECOGNITION // default
93             : preset;
94     EXPECT_EQ(expectedPreset, AAudioStream_getInputPreset(aaudioStream));
95 
96     aaudio_allowed_capture_policy_t expectedCapturePolicy =
97             (capturePolicy == DONT_SET || capturePolicy == AAUDIO_UNSPECIFIED)
98             ? AAUDIO_ALLOW_CAPTURE_BY_ALL // default
99             : capturePolicy;
100     EXPECT_EQ(expectedCapturePolicy, AAudioStream_getAllowedCapturePolicy(aaudioStream));
101 
102     bool expectedPrivacyMode =
103             (privacyMode == DONT_SET) ?
104                 ((preset == AAUDIO_INPUT_PRESET_VOICE_COMMUNICATION
105                     || preset == AAUDIO_INPUT_PRESET_CAMCORDER) ? true : false) :
106                 privacyMode;
107     EXPECT_EQ(expectedPrivacyMode, AAudioStream_isPrivacySensitive(aaudioStream));
108 
109     EXPECT_EQ(AAUDIO_OK, AAudioStream_requestStart(aaudioStream));
110 
111     if (direction == AAUDIO_DIRECTION_INPUT) {
112         EXPECT_EQ(kNumFrames,
113                   AAudioStream_read(aaudioStream, buffer.get(), kNumFrames, kNanosPerSecond));
114     } else {
115         EXPECT_EQ(kNumFrames,
116                   AAudioStream_write(aaudioStream, buffer.get(), kNumFrames, kNanosPerSecond));
117     }
118 
119     EXPECT_EQ(AAUDIO_OK, AAudioStream_requestStop(aaudioStream));
120 
121     EXPECT_EQ(AAUDIO_OK, AAudioStream_close(aaudioStream));
122 }
123 
124 static const aaudio_usage_t sUsages[] = {
125     DONT_SET,
126     AAUDIO_UNSPECIFIED,
127     AAUDIO_USAGE_MEDIA,
128     AAUDIO_USAGE_VOICE_COMMUNICATION,
129     AAUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING,
130     AAUDIO_USAGE_ALARM,
131     AAUDIO_USAGE_NOTIFICATION,
132     AAUDIO_USAGE_NOTIFICATION_RINGTONE,
133     AAUDIO_USAGE_NOTIFICATION_EVENT,
134     AAUDIO_USAGE_ASSISTANCE_ACCESSIBILITY,
135     AAUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
136     AAUDIO_USAGE_ASSISTANCE_SONIFICATION,
137     AAUDIO_USAGE_GAME,
138     AAUDIO_USAGE_ASSISTANT,
139     // Note that the AAUDIO_SYSTEM_USAGE_* values requires special permission.
140 };
141 
142 static const aaudio_content_type_t sContentypes[] = {
143     DONT_SET,
144     AAUDIO_UNSPECIFIED,
145     AAUDIO_CONTENT_TYPE_SPEECH,
146     AAUDIO_CONTENT_TYPE_MUSIC,
147     AAUDIO_CONTENT_TYPE_MOVIE,
148     AAUDIO_CONTENT_TYPE_SONIFICATION
149 };
150 
151 static const aaudio_input_preset_t sInputPresets[] = {
152     DONT_SET,
153     AAUDIO_UNSPECIFIED,
154     AAUDIO_INPUT_PRESET_GENERIC,
155     AAUDIO_INPUT_PRESET_CAMCORDER,
156     AAUDIO_INPUT_PRESET_VOICE_RECOGNITION,
157     AAUDIO_INPUT_PRESET_VOICE_COMMUNICATION,
158     AAUDIO_INPUT_PRESET_UNPROCESSED,
159     AAUDIO_INPUT_PRESET_VOICE_PERFORMANCE,
160 };
161 
162 static const aaudio_input_preset_t sAllowCapturePolicies[] = {
163     DONT_SET,
164     AAUDIO_UNSPECIFIED,
165     AAUDIO_ALLOW_CAPTURE_BY_ALL,
166     AAUDIO_ALLOW_CAPTURE_BY_SYSTEM,
167     AAUDIO_ALLOW_CAPTURE_BY_NONE,
168 };
169 
170 static const int sPrivacyModes[] = {
171     DONT_SET,
172     false,
173     true,
174 };
175 
checkAttributesUsage(aaudio_performance_mode_t perfMode)176 static void checkAttributesUsage(aaudio_performance_mode_t perfMode) {
177     for (aaudio_usage_t usage : sUsages) {
178         checkAttributes(perfMode, usage, DONT_SET);
179     }
180 }
181 
checkAttributesContentType(aaudio_performance_mode_t perfMode)182 static void checkAttributesContentType(aaudio_performance_mode_t perfMode) {
183     for (aaudio_content_type_t contentType : sContentypes) {
184         checkAttributes(perfMode, DONT_SET, contentType);
185     }
186 }
187 
checkAttributesInputPreset(aaudio_performance_mode_t perfMode)188 static void checkAttributesInputPreset(aaudio_performance_mode_t perfMode) {
189     for (aaudio_input_preset_t inputPreset : sInputPresets) {
190         checkAttributes(perfMode,
191                         DONT_SET,
192                         DONT_SET,
193                         inputPreset,
194                         DONT_SET,
195                         DONT_SET,
196                         AAUDIO_DIRECTION_INPUT);
197     }
198 }
199 
checkAttributesAllowedCapturePolicy(aaudio_performance_mode_t perfMode)200 static void checkAttributesAllowedCapturePolicy(aaudio_performance_mode_t perfMode) {
201     for (aaudio_allowed_capture_policy_t policy : sAllowCapturePolicies) {
202         checkAttributes(perfMode,
203                         DONT_SET,
204                         DONT_SET,
205                         DONT_SET,
206                         policy,
207                         AAUDIO_DIRECTION_INPUT);
208     }
209 }
210 
checkAttributesPrivacySensitive(aaudio_performance_mode_t perfMode)211 static void checkAttributesPrivacySensitive(aaudio_performance_mode_t perfMode) {
212     for (int privacyMode : sPrivacyModes) {
213         checkAttributes(perfMode,
214                         DONT_SET,
215                         DONT_SET,
216                         DONT_SET,
217                         DONT_SET,
218                         privacyMode,
219                         AAUDIO_DIRECTION_INPUT);
220     }
221 }
222 
TEST(test_attributes,aaudio_usage_perfnone)223 TEST(test_attributes, aaudio_usage_perfnone) {
224     checkAttributesUsage(AAUDIO_PERFORMANCE_MODE_NONE);
225 }
226 
TEST(test_attributes,aaudio_content_type_perfnone)227 TEST(test_attributes, aaudio_content_type_perfnone) {
228     checkAttributesContentType(AAUDIO_PERFORMANCE_MODE_NONE);
229 }
230 
TEST(test_attributes,aaudio_input_preset_perfnone)231 TEST(test_attributes, aaudio_input_preset_perfnone) {
232     checkAttributesInputPreset(AAUDIO_PERFORMANCE_MODE_NONE);
233 }
234 
TEST(test_attributes,aaudio_allowed_capture_policy_perfnone)235 TEST(test_attributes, aaudio_allowed_capture_policy_perfnone) {
236     checkAttributesAllowedCapturePolicy(AAUDIO_PERFORMANCE_MODE_NONE);
237 }
238 
TEST(test_attributes,aaudio_usage_lowlat)239 TEST(test_attributes, aaudio_usage_lowlat) {
240     checkAttributesUsage(AAUDIO_PERFORMANCE_MODE_LOW_LATENCY);
241 }
242 
TEST(test_attributes,aaudio_content_type_lowlat)243 TEST(test_attributes, aaudio_content_type_lowlat) {
244     checkAttributesContentType(AAUDIO_PERFORMANCE_MODE_LOW_LATENCY);
245 }
246 
TEST(test_attributes,aaudio_input_preset_lowlat)247 TEST(test_attributes, aaudio_input_preset_lowlat) {
248     checkAttributesInputPreset(AAUDIO_PERFORMANCE_MODE_LOW_LATENCY);
249 }
250 
TEST(test_attributes,aaudio_allowed_capture_policy_lowlat)251 TEST(test_attributes, aaudio_allowed_capture_policy_lowlat) {
252     checkAttributesAllowedCapturePolicy(AAUDIO_PERFORMANCE_MODE_LOW_LATENCY);
253 }
254 
TEST(test_attributes,aaudio_allowed_privacy_sensitive_lowlat)255 TEST(test_attributes, aaudio_allowed_privacy_sensitive_lowlat) {
256     checkAttributesPrivacySensitive(AAUDIO_PERFORMANCE_MODE_LOW_LATENCY);
257 }
258