1*05767d91SRobert Wu /*
2*05767d91SRobert Wu * Copyright 2018 The Android Open Source Project
3*05767d91SRobert Wu *
4*05767d91SRobert Wu * Licensed under the Apache License, Version 2.0 (the "License");
5*05767d91SRobert Wu * you may not use this file except in compliance with the License.
6*05767d91SRobert Wu * You may obtain a copy of the License at
7*05767d91SRobert Wu *
8*05767d91SRobert Wu * http://www.apache.org/licenses/LICENSE-2.0
9*05767d91SRobert Wu *
10*05767d91SRobert Wu * Unless required by applicable law or agreed to in writing, software
11*05767d91SRobert Wu * distributed under the License is distributed on an "AS IS" BASIS,
12*05767d91SRobert Wu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*05767d91SRobert Wu * See the License for the specific language governing permissions and
14*05767d91SRobert Wu * limitations under the License.
15*05767d91SRobert Wu */
16*05767d91SRobert Wu
17*05767d91SRobert Wu #include <gtest/gtest.h>
18*05767d91SRobert Wu
19*05767d91SRobert Wu #include <aaudio/AAudioExtensions.h>
20*05767d91SRobert Wu #include <oboe/Oboe.h>
21*05767d91SRobert Wu
22*05767d91SRobert Wu #include <android/api-level.h>
23*05767d91SRobert Wu #ifndef __ANDROID_API_S__
24*05767d91SRobert Wu #define __ANDROID_API_S__ 31
25*05767d91SRobert Wu #endif
26*05767d91SRobert Wu
27*05767d91SRobert Wu #ifndef __ANDROID_API_S_V2__
28*05767d91SRobert Wu #define __ANDROID_API_S_V2__ 32
29*05767d91SRobert Wu #endif
30*05767d91SRobert Wu
31*05767d91SRobert Wu using namespace oboe;
32*05767d91SRobert Wu
33*05767d91SRobert Wu class CallbackSizeMonitor : public AudioStreamCallback {
34*05767d91SRobert Wu public:
onAudioReady(AudioStream * oboeStream,void * audioData,int32_t numFrames)35*05767d91SRobert Wu DataCallbackResult onAudioReady(AudioStream *oboeStream, void *audioData, int32_t numFrames) override {
36*05767d91SRobert Wu framesPerCallback = numFrames;
37*05767d91SRobert Wu callbackCount++;
38*05767d91SRobert Wu return DataCallbackResult::Continue;
39*05767d91SRobert Wu }
40*05767d91SRobert Wu
41*05767d91SRobert Wu // This is exposed publicly so that the number of frames per callback can be tested.
42*05767d91SRobert Wu std::atomic<int32_t> framesPerCallback{0};
43*05767d91SRobert Wu std::atomic<int32_t> callbackCount{0};
44*05767d91SRobert Wu };
45*05767d91SRobert Wu
46*05767d91SRobert Wu class StreamOpen : public ::testing::Test {
47*05767d91SRobert Wu
48*05767d91SRobert Wu protected:
49*05767d91SRobert Wu
openStream()50*05767d91SRobert Wu bool openStream() {
51*05767d91SRobert Wu EXPECT_EQ(mStream, nullptr);
52*05767d91SRobert Wu Result r = mBuilder.openStream(&mStream);
53*05767d91SRobert Wu EXPECT_EQ(r, Result::OK) << "Failed to open stream " << convertToText(r);
54*05767d91SRobert Wu EXPECT_EQ(0, openCount) << "Should start with a fresh object every time.";
55*05767d91SRobert Wu openCount++;
56*05767d91SRobert Wu return (r == Result::OK);
57*05767d91SRobert Wu }
58*05767d91SRobert Wu
closeStream()59*05767d91SRobert Wu bool closeStream() {
60*05767d91SRobert Wu if (mStream != nullptr){
61*05767d91SRobert Wu Result r = mStream->close();
62*05767d91SRobert Wu EXPECT_EQ(r, Result::OK) << "Failed to close stream. " << convertToText(r);
63*05767d91SRobert Wu usleep(500 * 1000); // give previous stream time to settle
64*05767d91SRobert Wu mStream = nullptr;
65*05767d91SRobert Wu return (r == Result::OK);
66*05767d91SRobert Wu } else {
67*05767d91SRobert Wu return true;
68*05767d91SRobert Wu }
69*05767d91SRobert Wu }
70*05767d91SRobert Wu
checkSampleRateConversionAdvancing(Direction direction)71*05767d91SRobert Wu void checkSampleRateConversionAdvancing(Direction direction) {
72*05767d91SRobert Wu CallbackSizeMonitor callback;
73*05767d91SRobert Wu
74*05767d91SRobert Wu mBuilder.setDirection(direction);
75*05767d91SRobert Wu if (mBuilder.isAAudioRecommended()) {
76*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::AAudio);
77*05767d91SRobert Wu }
78*05767d91SRobert Wu mBuilder.setCallback(&callback);
79*05767d91SRobert Wu mBuilder.setPerformanceMode(PerformanceMode::LowLatency);
80*05767d91SRobert Wu mBuilder.setSampleRate(44100);
81*05767d91SRobert Wu mBuilder.setSampleRateConversionQuality(SampleRateConversionQuality::Medium);
82*05767d91SRobert Wu
83*05767d91SRobert Wu ASSERT_TRUE(openStream());
84*05767d91SRobert Wu
85*05767d91SRobert Wu ASSERT_EQ(mStream->requestStart(), Result::OK);
86*05767d91SRobert Wu int timeout = 20;
87*05767d91SRobert Wu while (callback.framesPerCallback == 0 && timeout > 0) {
88*05767d91SRobert Wu usleep(50 * 1000);
89*05767d91SRobert Wu timeout--;
90*05767d91SRobert Wu }
91*05767d91SRobert Wu
92*05767d91SRobert Wu // Catch Issue #1166
93*05767d91SRobert Wu mStream->getTimestamp(CLOCK_MONOTONIC); // should not crash
94*05767d91SRobert Wu mStream->getTimestamp(CLOCK_MONOTONIC, nullptr, nullptr); // should not crash
95*05767d91SRobert Wu
96*05767d91SRobert Wu ASSERT_GT(callback.callbackCount, 0);
97*05767d91SRobert Wu ASSERT_GT(callback.framesPerCallback, 0);
98*05767d91SRobert Wu ASSERT_EQ(mStream->requestStop(), Result::OK);
99*05767d91SRobert Wu
100*05767d91SRobert Wu ASSERT_TRUE(closeStream());
101*05767d91SRobert Wu }
102*05767d91SRobert Wu
103*05767d91SRobert Wu AudioStreamBuilder mBuilder;
104*05767d91SRobert Wu AudioStream *mStream = nullptr;
105*05767d91SRobert Wu int32_t openCount = 0;
106*05767d91SRobert Wu
107*05767d91SRobert Wu };
108*05767d91SRobert Wu
109*05767d91SRobert Wu class StreamOpenOutput : public StreamOpen {};
110*05767d91SRobert Wu class StreamOpenInput : public StreamOpen {};
111*05767d91SRobert Wu
TEST_F(StreamOpenOutput,ForOpenSLESDefaultSampleRateIsUsed)112*05767d91SRobert Wu TEST_F(StreamOpenOutput, ForOpenSLESDefaultSampleRateIsUsed){
113*05767d91SRobert Wu
114*05767d91SRobert Wu DefaultStreamValues::SampleRate = 44100;
115*05767d91SRobert Wu DefaultStreamValues::FramesPerBurst = 192;
116*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::OpenSLES);
117*05767d91SRobert Wu ASSERT_TRUE(openStream());
118*05767d91SRobert Wu ASSERT_EQ(mStream->getSampleRate(), 44100);
119*05767d91SRobert Wu ASSERT_TRUE(closeStream());
120*05767d91SRobert Wu }
121*05767d91SRobert Wu
TEST_F(StreamOpenOutput,ForOpenSLESDefaultFramesPerBurstIsUsed)122*05767d91SRobert Wu TEST_F(StreamOpenOutput, ForOpenSLESDefaultFramesPerBurstIsUsed){
123*05767d91SRobert Wu
124*05767d91SRobert Wu DefaultStreamValues::SampleRate = 48000;
125*05767d91SRobert Wu DefaultStreamValues::FramesPerBurst = 128; // used for low latency
126*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::OpenSLES);
127*05767d91SRobert Wu mBuilder.setPerformanceMode(PerformanceMode::LowLatency);
128*05767d91SRobert Wu ASSERT_TRUE(openStream());
129*05767d91SRobert Wu // Some devices like emulators may not support Low Latency
130*05767d91SRobert Wu if (mStream->getPerformanceMode() == PerformanceMode::LowLatency) {
131*05767d91SRobert Wu ASSERT_EQ(mStream->getFramesPerBurst(), 128);
132*05767d91SRobert Wu }
133*05767d91SRobert Wu ASSERT_TRUE(closeStream());
134*05767d91SRobert Wu }
135*05767d91SRobert Wu
TEST_F(StreamOpenOutput,ForOpenSLESDefaultChannelCountIsUsed)136*05767d91SRobert Wu TEST_F(StreamOpenOutput, ForOpenSLESDefaultChannelCountIsUsed){
137*05767d91SRobert Wu
138*05767d91SRobert Wu DefaultStreamValues::ChannelCount = 1;
139*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::OpenSLES);
140*05767d91SRobert Wu ASSERT_TRUE(openStream());
141*05767d91SRobert Wu ASSERT_EQ(mStream->getChannelCount(), 1);
142*05767d91SRobert Wu ASSERT_TRUE(closeStream());
143*05767d91SRobert Wu }
144*05767d91SRobert Wu
TEST_F(StreamOpenOutput,OutputForOpenSLESPerformanceModeShouldBeNone)145*05767d91SRobert Wu TEST_F(StreamOpenOutput, OutputForOpenSLESPerformanceModeShouldBeNone){
146*05767d91SRobert Wu // We will not get a LowLatency stream if we request 16000 Hz.
147*05767d91SRobert Wu mBuilder.setSampleRate(16000);
148*05767d91SRobert Wu mBuilder.setPerformanceMode(PerformanceMode::LowLatency);
149*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
150*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::OpenSLES);
151*05767d91SRobert Wu ASSERT_TRUE(openStream());
152*05767d91SRobert Wu ASSERT_EQ((int)mStream->getPerformanceMode(), (int)PerformanceMode::None);
153*05767d91SRobert Wu ASSERT_TRUE(closeStream());
154*05767d91SRobert Wu }
155*05767d91SRobert Wu
TEST_F(StreamOpenInput,InputForOpenSLESPerformanceModeShouldBeNone)156*05767d91SRobert Wu TEST_F(StreamOpenInput, InputForOpenSLESPerformanceModeShouldBeNone){
157*05767d91SRobert Wu // We will not get a LowLatency stream if we request 16000 Hz.
158*05767d91SRobert Wu mBuilder.setSampleRate(16000);
159*05767d91SRobert Wu mBuilder.setPerformanceMode(PerformanceMode::LowLatency);
160*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
161*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::OpenSLES);
162*05767d91SRobert Wu ASSERT_TRUE(openStream());
163*05767d91SRobert Wu ASSERT_EQ((int)mStream->getPerformanceMode(), (int)PerformanceMode::None);
164*05767d91SRobert Wu ASSERT_TRUE(closeStream());
165*05767d91SRobert Wu }
166*05767d91SRobert Wu
TEST_F(StreamOpenOutput,ForOpenSlesIllegalFormatRejectedOutput)167*05767d91SRobert Wu TEST_F(StreamOpenOutput, ForOpenSlesIllegalFormatRejectedOutput) {
168*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::OpenSLES);
169*05767d91SRobert Wu mBuilder.setPerformanceMode(PerformanceMode::LowLatency);
170*05767d91SRobert Wu mBuilder.setFormat(static_cast<AudioFormat>(666));
171*05767d91SRobert Wu Result r = mBuilder.openStream(&mStream);
172*05767d91SRobert Wu EXPECT_NE(r, Result::OK) << "Should not open stream " << convertToText(r);
173*05767d91SRobert Wu if (mStream != nullptr) {
174*05767d91SRobert Wu mStream->close(); // just in case it accidentally opened
175*05767d91SRobert Wu }
176*05767d91SRobert Wu }
177*05767d91SRobert Wu
TEST_F(StreamOpenInput,ForOpenSlesIllegalFormatRejectedInput)178*05767d91SRobert Wu TEST_F(StreamOpenInput, ForOpenSlesIllegalFormatRejectedInput) {
179*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::OpenSLES);
180*05767d91SRobert Wu mBuilder.setPerformanceMode(PerformanceMode::LowLatency);
181*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
182*05767d91SRobert Wu mBuilder.setFormat(static_cast<AudioFormat>(666));
183*05767d91SRobert Wu Result r = mBuilder.openStream(&mStream);
184*05767d91SRobert Wu EXPECT_NE(r, Result::OK) << "Should not open stream " << convertToText(r);
185*05767d91SRobert Wu if (mStream != nullptr) {
186*05767d91SRobert Wu mStream->close(); // just in case it accidentally opened
187*05767d91SRobert Wu }
188*05767d91SRobert Wu }
189*05767d91SRobert Wu
190*05767d91SRobert Wu // Make sure the callback is called with the requested FramesPerCallback
TEST_F(StreamOpenOutput,OpenSLESFramesPerCallback)191*05767d91SRobert Wu TEST_F(StreamOpenOutput, OpenSLESFramesPerCallback) {
192*05767d91SRobert Wu const int kRequestedFramesPerCallback = 417;
193*05767d91SRobert Wu CallbackSizeMonitor callback;
194*05767d91SRobert Wu
195*05767d91SRobert Wu DefaultStreamValues::SampleRate = 48000;
196*05767d91SRobert Wu DefaultStreamValues::ChannelCount = 2;
197*05767d91SRobert Wu DefaultStreamValues::FramesPerBurst = 192;
198*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::OpenSLES);
199*05767d91SRobert Wu mBuilder.setFramesPerCallback(kRequestedFramesPerCallback);
200*05767d91SRobert Wu mBuilder.setCallback(&callback);
201*05767d91SRobert Wu ASSERT_TRUE(openStream());
202*05767d91SRobert Wu ASSERT_EQ(mStream->requestStart(), Result::OK);
203*05767d91SRobert Wu int timeout = 20;
204*05767d91SRobert Wu while (callback.framesPerCallback == 0 && timeout > 0) {
205*05767d91SRobert Wu usleep(50 * 1000);
206*05767d91SRobert Wu timeout--;
207*05767d91SRobert Wu }
208*05767d91SRobert Wu ASSERT_EQ(kRequestedFramesPerCallback, callback.framesPerCallback);
209*05767d91SRobert Wu ASSERT_EQ(kRequestedFramesPerCallback, mStream->getFramesPerCallback());
210*05767d91SRobert Wu ASSERT_EQ(mStream->requestStop(), Result::OK);
211*05767d91SRobert Wu ASSERT_TRUE(closeStream());
212*05767d91SRobert Wu }
213*05767d91SRobert Wu
214*05767d91SRobert Wu // Make sure the LowLatency callback has the requested FramesPerCallback.
TEST_F(StreamOpen,AAudioFramesPerCallbackLowLatency)215*05767d91SRobert Wu TEST_F(StreamOpen, AAudioFramesPerCallbackLowLatency) {
216*05767d91SRobert Wu const int kRequestedFramesPerCallback = 192;
217*05767d91SRobert Wu CallbackSizeMonitor callback;
218*05767d91SRobert Wu
219*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::AAudio);
220*05767d91SRobert Wu mBuilder.setFramesPerCallback(kRequestedFramesPerCallback);
221*05767d91SRobert Wu mBuilder.setCallback(&callback);
222*05767d91SRobert Wu mBuilder.setPerformanceMode(PerformanceMode::LowLatency);
223*05767d91SRobert Wu ASSERT_TRUE(openStream());
224*05767d91SRobert Wu ASSERT_EQ(kRequestedFramesPerCallback, mStream->getFramesPerCallback());
225*05767d91SRobert Wu ASSERT_EQ(mStream->requestStart(), Result::OK);
226*05767d91SRobert Wu int timeout = 20;
227*05767d91SRobert Wu while (callback.framesPerCallback == 0 && timeout > 0) {
228*05767d91SRobert Wu usleep(50 * 1000);
229*05767d91SRobert Wu timeout--;
230*05767d91SRobert Wu }
231*05767d91SRobert Wu ASSERT_EQ(kRequestedFramesPerCallback, callback.framesPerCallback);
232*05767d91SRobert Wu ASSERT_EQ(mStream->requestStop(), Result::OK);
233*05767d91SRobert Wu ASSERT_TRUE(closeStream());
234*05767d91SRobert Wu }
235*05767d91SRobert Wu
236*05767d91SRobert Wu // Make sure the regular callback has the requested FramesPerCallback.
TEST_F(StreamOpen,AAudioFramesPerCallbackNone)237*05767d91SRobert Wu TEST_F(StreamOpen, AAudioFramesPerCallbackNone) {
238*05767d91SRobert Wu const int kRequestedFramesPerCallback = 1024;
239*05767d91SRobert Wu CallbackSizeMonitor callback;
240*05767d91SRobert Wu
241*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::AAudio);
242*05767d91SRobert Wu mBuilder.setFramesPerCallback(kRequestedFramesPerCallback);
243*05767d91SRobert Wu mBuilder.setCallback(&callback);
244*05767d91SRobert Wu mBuilder.setPerformanceMode(PerformanceMode::None);
245*05767d91SRobert Wu ASSERT_TRUE(openStream());
246*05767d91SRobert Wu ASSERT_EQ(kRequestedFramesPerCallback, mStream->getFramesPerCallback());
247*05767d91SRobert Wu ASSERT_EQ(mStream->requestStart(), Result::OK);
248*05767d91SRobert Wu int timeout = 20;
249*05767d91SRobert Wu while (callback.framesPerCallback == 0 && timeout > 0) {
250*05767d91SRobert Wu usleep(50 * 1000);
251*05767d91SRobert Wu timeout--;
252*05767d91SRobert Wu }
253*05767d91SRobert Wu ASSERT_EQ(kRequestedFramesPerCallback, callback.framesPerCallback);
254*05767d91SRobert Wu ASSERT_EQ(mStream->requestStop(), Result::OK);
255*05767d91SRobert Wu ASSERT_TRUE(closeStream());
256*05767d91SRobert Wu }
257*05767d91SRobert Wu
TEST_F(StreamOpenInput,RecordingFormatUnspecifiedReturnsI16BeforeMarshmallow)258*05767d91SRobert Wu TEST_F(StreamOpenInput, RecordingFormatUnspecifiedReturnsI16BeforeMarshmallow){
259*05767d91SRobert Wu
260*05767d91SRobert Wu if (getSdkVersion() < __ANDROID_API_M__){
261*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
262*05767d91SRobert Wu mBuilder.setFormat(AudioFormat::Unspecified);
263*05767d91SRobert Wu ASSERT_TRUE(openStream());
264*05767d91SRobert Wu ASSERT_EQ(mStream->getFormat(), AudioFormat::I16);
265*05767d91SRobert Wu ASSERT_TRUE(closeStream());
266*05767d91SRobert Wu }
267*05767d91SRobert Wu }
268*05767d91SRobert Wu
TEST_F(StreamOpenInput,RecordingFormatUnspecifiedReturnsFloatOnMarshmallowAndLater)269*05767d91SRobert Wu TEST_F(StreamOpenInput, RecordingFormatUnspecifiedReturnsFloatOnMarshmallowAndLater){
270*05767d91SRobert Wu
271*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_M__){
272*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
273*05767d91SRobert Wu mBuilder.setFormat(AudioFormat::Unspecified);
274*05767d91SRobert Wu ASSERT_TRUE(openStream());
275*05767d91SRobert Wu ASSERT_EQ(mStream->getFormat(), AudioFormat::Float);
276*05767d91SRobert Wu ASSERT_TRUE(closeStream());
277*05767d91SRobert Wu }
278*05767d91SRobert Wu }
279*05767d91SRobert Wu
TEST_F(StreamOpenInput,RecordingFormatFloatReturnsErrorBeforeMarshmallow)280*05767d91SRobert Wu TEST_F(StreamOpenInput, RecordingFormatFloatReturnsErrorBeforeMarshmallow){
281*05767d91SRobert Wu
282*05767d91SRobert Wu if (getSdkVersion() < __ANDROID_API_M__){
283*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
284*05767d91SRobert Wu mBuilder.setFormat(AudioFormat::Float);
285*05767d91SRobert Wu Result r = mBuilder.openStream(&mStream);
286*05767d91SRobert Wu ASSERT_EQ(r, Result::ErrorInvalidFormat) << convertToText(r);
287*05767d91SRobert Wu ASSERT_TRUE(closeStream());
288*05767d91SRobert Wu }
289*05767d91SRobert Wu }
290*05767d91SRobert Wu
TEST_F(StreamOpenInput,RecordingFormatFloatReturnsFloatOnMarshmallowAndLater)291*05767d91SRobert Wu TEST_F(StreamOpenInput, RecordingFormatFloatReturnsFloatOnMarshmallowAndLater){
292*05767d91SRobert Wu
293*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_M__){
294*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
295*05767d91SRobert Wu mBuilder.setFormat(AudioFormat::Float);
296*05767d91SRobert Wu ASSERT_TRUE(openStream());
297*05767d91SRobert Wu ASSERT_EQ(mStream->getFormat(), AudioFormat::Float);
298*05767d91SRobert Wu ASSERT_TRUE(closeStream());
299*05767d91SRobert Wu }
300*05767d91SRobert Wu }
301*05767d91SRobert Wu
TEST_F(StreamOpenInput,RecordingFormatI16ReturnsI16)302*05767d91SRobert Wu TEST_F(StreamOpenInput, RecordingFormatI16ReturnsI16){
303*05767d91SRobert Wu
304*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
305*05767d91SRobert Wu mBuilder.setFormat(AudioFormat::I16);
306*05767d91SRobert Wu ASSERT_TRUE(openStream());
307*05767d91SRobert Wu ASSERT_EQ(mStream->getFormat(), AudioFormat::I16);
308*05767d91SRobert Wu ASSERT_TRUE(closeStream());
309*05767d91SRobert Wu }
310*05767d91SRobert Wu
TEST_F(StreamOpenOutput,PlaybackFormatUnspecifiedReturnsI16BeforeLollipop)311*05767d91SRobert Wu TEST_F(StreamOpenOutput, PlaybackFormatUnspecifiedReturnsI16BeforeLollipop){
312*05767d91SRobert Wu
313*05767d91SRobert Wu if (getSdkVersion() < __ANDROID_API_L__){
314*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
315*05767d91SRobert Wu mBuilder.setFormat(AudioFormat::Unspecified);
316*05767d91SRobert Wu ASSERT_TRUE(openStream());
317*05767d91SRobert Wu ASSERT_EQ(mStream->getFormat(), AudioFormat::I16);
318*05767d91SRobert Wu ASSERT_TRUE(closeStream());
319*05767d91SRobert Wu }
320*05767d91SRobert Wu }
321*05767d91SRobert Wu
TEST_F(StreamOpenOutput,PlaybackFormatUnspecifiedReturnsFloatOnLollipopAndLater)322*05767d91SRobert Wu TEST_F(StreamOpenOutput, PlaybackFormatUnspecifiedReturnsFloatOnLollipopAndLater){
323*05767d91SRobert Wu
324*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_L__){
325*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
326*05767d91SRobert Wu mBuilder.setFormat(AudioFormat::Unspecified);
327*05767d91SRobert Wu ASSERT_TRUE(openStream());
328*05767d91SRobert Wu ASSERT_EQ(mStream->getFormat(), AudioFormat::Float);
329*05767d91SRobert Wu ASSERT_TRUE(closeStream());
330*05767d91SRobert Wu }
331*05767d91SRobert Wu }
332*05767d91SRobert Wu
TEST_F(StreamOpenOutput,PlaybackFormatFloatReturnsErrorBeforeLollipop)333*05767d91SRobert Wu TEST_F(StreamOpenOutput, PlaybackFormatFloatReturnsErrorBeforeLollipop){
334*05767d91SRobert Wu
335*05767d91SRobert Wu if (getSdkVersion() < __ANDROID_API_L__){
336*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
337*05767d91SRobert Wu mBuilder.setFormat(AudioFormat::Float);
338*05767d91SRobert Wu Result r = mBuilder.openStream(&mStream);
339*05767d91SRobert Wu ASSERT_EQ(r, Result::ErrorInvalidFormat);
340*05767d91SRobert Wu ASSERT_TRUE(closeStream());
341*05767d91SRobert Wu }
342*05767d91SRobert Wu }
343*05767d91SRobert Wu
TEST_F(StreamOpenOutput,PlaybackFormatFloatReturnsFloatWithFormatConversionAllowed)344*05767d91SRobert Wu TEST_F(StreamOpenOutput, PlaybackFormatFloatReturnsFloatWithFormatConversionAllowed){
345*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
346*05767d91SRobert Wu mBuilder.setFormat(AudioFormat::Float);
347*05767d91SRobert Wu mBuilder.setFormatConversionAllowed(true);
348*05767d91SRobert Wu ASSERT_TRUE(openStream());
349*05767d91SRobert Wu ASSERT_EQ(mStream->getFormat(), AudioFormat::Float);
350*05767d91SRobert Wu ASSERT_TRUE(closeStream());
351*05767d91SRobert Wu }
352*05767d91SRobert Wu
TEST_F(StreamOpenOutput,PlaybackFormatFloatReturnsFloatOnLollipopAndLater)353*05767d91SRobert Wu TEST_F(StreamOpenOutput, PlaybackFormatFloatReturnsFloatOnLollipopAndLater){
354*05767d91SRobert Wu
355*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_L__){
356*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
357*05767d91SRobert Wu mBuilder.setFormat(AudioFormat::Float);
358*05767d91SRobert Wu ASSERT_TRUE(openStream());
359*05767d91SRobert Wu ASSERT_EQ(mStream->getFormat(), AudioFormat::Float);
360*05767d91SRobert Wu ASSERT_TRUE(closeStream());
361*05767d91SRobert Wu }
362*05767d91SRobert Wu }
363*05767d91SRobert Wu
TEST_F(StreamOpenOutput,PlaybackFormatI16ReturnsI16)364*05767d91SRobert Wu TEST_F(StreamOpenOutput, PlaybackFormatI16ReturnsI16) {
365*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
366*05767d91SRobert Wu mBuilder.setFormat(AudioFormat::I16);
367*05767d91SRobert Wu ASSERT_TRUE(openStream());
368*05767d91SRobert Wu ASSERT_EQ(mStream->getFormat(), AudioFormat::I16);
369*05767d91SRobert Wu ASSERT_TRUE(closeStream());
370*05767d91SRobert Wu }
371*05767d91SRobert Wu
TEST_F(StreamOpenOutput,OpenCloseLowLatencyStream)372*05767d91SRobert Wu TEST_F(StreamOpenOutput, OpenCloseLowLatencyStream){
373*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
374*05767d91SRobert Wu mBuilder.setPerformanceMode(PerformanceMode::LowLatency);
375*05767d91SRobert Wu float *buf = new float[100];
376*05767d91SRobert Wu ASSERT_TRUE(openStream());
377*05767d91SRobert Wu delete[] buf;
378*05767d91SRobert Wu ASSERT_TRUE(closeStream());
379*05767d91SRobert Wu }
380*05767d91SRobert Wu
TEST_F(StreamOpenOutput,LowLatencyStreamHasSmallBufferSize)381*05767d91SRobert Wu TEST_F(StreamOpenOutput, LowLatencyStreamHasSmallBufferSize){
382*05767d91SRobert Wu
383*05767d91SRobert Wu if (mBuilder.isAAudioRecommended()) {
384*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
385*05767d91SRobert Wu mBuilder.setPerformanceMode(PerformanceMode::LowLatency);
386*05767d91SRobert Wu ASSERT_TRUE(openStream());
387*05767d91SRobert Wu int32_t bufferSize = mStream->getBufferSizeInFrames();
388*05767d91SRobert Wu int32_t burst = mStream->getFramesPerBurst();
389*05767d91SRobert Wu ASSERT_TRUE(closeStream());
390*05767d91SRobert Wu ASSERT_LE(bufferSize, burst * 3);
391*05767d91SRobert Wu }
392*05767d91SRobert Wu }
393*05767d91SRobert Wu
394*05767d91SRobert Wu // Make sure the parameters get copied from the child stream.
TEST_F(StreamOpenOutput,AAudioOutputSampleRate44100FilterConfiguration)395*05767d91SRobert Wu TEST_F(StreamOpenOutput, AAudioOutputSampleRate44100FilterConfiguration) {
396*05767d91SRobert Wu if (mBuilder.isAAudioRecommended()) {
397*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
398*05767d91SRobert Wu mBuilder.setPerformanceMode(PerformanceMode::LowLatency);
399*05767d91SRobert Wu mBuilder.setSharingMode(SharingMode::Exclusive);
400*05767d91SRobert Wu // Try to force the use of a FilterAudioStream by requesting conversion.
401*05767d91SRobert Wu mBuilder.setSampleRate(44100);
402*05767d91SRobert Wu mBuilder.setSampleRateConversionQuality(SampleRateConversionQuality::Medium);
403*05767d91SRobert Wu ASSERT_TRUE(openStream());
404*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_U__) {
405*05767d91SRobert Wu ASSERT_LT(0, mStream->getHardwareSampleRate());
406*05767d91SRobert Wu ASSERT_LT(0, mStream->getHardwareChannelCount());
407*05767d91SRobert Wu ASSERT_LT(0, (int)mStream->getHardwareFormat());
408*05767d91SRobert Wu }
409*05767d91SRobert Wu // If MMAP is not supported then we cannot get an EXCLUSIVE mode stream.
410*05767d91SRobert Wu if (!AAudioExtensions::getInstance().isMMapSupported()) {
411*05767d91SRobert Wu ASSERT_NE(SharingMode::Exclusive, mStream->getSharingMode()); // IMPOSSIBLE
412*05767d91SRobert Wu }
413*05767d91SRobert Wu ASSERT_TRUE(closeStream());
414*05767d91SRobert Wu }
415*05767d91SRobert Wu }
416*05767d91SRobert Wu
417*05767d91SRobert Wu // See if sample rate conversion by Oboe is calling the callback.
TEST_F(StreamOpenOutput,AAudioOutputSampleRate44100)418*05767d91SRobert Wu TEST_F(StreamOpenOutput, AAudioOutputSampleRate44100) {
419*05767d91SRobert Wu checkSampleRateConversionAdvancing(Direction::Output);
420*05767d91SRobert Wu }
421*05767d91SRobert Wu
422*05767d91SRobert Wu // See if sample rate conversion by Oboe is calling the callback.
TEST_F(StreamOpenInput,AAudioInputSampleRate44100)423*05767d91SRobert Wu TEST_F(StreamOpenInput, AAudioInputSampleRate44100) {
424*05767d91SRobert Wu checkSampleRateConversionAdvancing(Direction::Input);
425*05767d91SRobert Wu }
426*05767d91SRobert Wu
TEST_F(StreamOpenOutput,AAudioOutputSetPackageName)427*05767d91SRobert Wu TEST_F(StreamOpenOutput, AAudioOutputSetPackageName){
428*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_S__){
429*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::AAudio);
430*05767d91SRobert Wu mBuilder.setPackageName("com.google.oboe.tests.unittestrunner");
431*05767d91SRobert Wu ASSERT_TRUE(openStream());
432*05767d91SRobert Wu ASSERT_EQ(mStream->requestStart(), Result::OK);
433*05767d91SRobert Wu ASSERT_TRUE(closeStream());
434*05767d91SRobert Wu }
435*05767d91SRobert Wu }
436*05767d91SRobert Wu
TEST_F(StreamOpenInput,AAudioInputSetPackageName)437*05767d91SRobert Wu TEST_F(StreamOpenInput, AAudioInputSetPackageName){
438*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_S__){
439*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
440*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::AAudio);
441*05767d91SRobert Wu mBuilder.setPackageName("com.google.oboe.tests.unittestrunner");
442*05767d91SRobert Wu ASSERT_TRUE(openStream());
443*05767d91SRobert Wu ASSERT_EQ(mStream->requestStart(), Result::OK);
444*05767d91SRobert Wu ASSERT_TRUE(closeStream());
445*05767d91SRobert Wu }
446*05767d91SRobert Wu }
447*05767d91SRobert Wu
TEST_F(StreamOpenOutput,AAudioOutputSetAttributionTag)448*05767d91SRobert Wu TEST_F(StreamOpenOutput, AAudioOutputSetAttributionTag){
449*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_S__){
450*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::AAudio);
451*05767d91SRobert Wu mBuilder.setAttributionTag("TestSetOutputAttributionTag");
452*05767d91SRobert Wu ASSERT_TRUE(openStream());
453*05767d91SRobert Wu ASSERT_EQ(mStream->requestStart(), Result::OK);
454*05767d91SRobert Wu ASSERT_TRUE(closeStream());
455*05767d91SRobert Wu }
456*05767d91SRobert Wu }
457*05767d91SRobert Wu
TEST_F(StreamOpenInput,AAudioInputSetAttributionTag)458*05767d91SRobert Wu TEST_F(StreamOpenInput, AAudioInputSetAttributionTag){
459*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_S__){
460*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
461*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::AAudio);
462*05767d91SRobert Wu mBuilder.setAttributionTag("TestSetInputAttributionTag");
463*05767d91SRobert Wu ASSERT_TRUE(openStream());
464*05767d91SRobert Wu ASSERT_EQ(mStream->requestStart(), Result::OK);
465*05767d91SRobert Wu ASSERT_TRUE(closeStream());
466*05767d91SRobert Wu }
467*05767d91SRobert Wu }
468*05767d91SRobert Wu
TEST_F(StreamOpenInput,AAudioInputSetSpatializationBehavior)469*05767d91SRobert Wu TEST_F(StreamOpenInput, AAudioInputSetSpatializationBehavior) {
470*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
471*05767d91SRobert Wu mBuilder.setSpatializationBehavior(SpatializationBehavior::Auto);
472*05767d91SRobert Wu ASSERT_TRUE(openStream());
473*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_S_V2__){
474*05767d91SRobert Wu ASSERT_EQ(mStream->getSpatializationBehavior(), SpatializationBehavior::Auto);
475*05767d91SRobert Wu } else {
476*05767d91SRobert Wu ASSERT_EQ(mStream->getSpatializationBehavior(), SpatializationBehavior::Never);
477*05767d91SRobert Wu }
478*05767d91SRobert Wu ASSERT_TRUE(closeStream());
479*05767d91SRobert Wu }
480*05767d91SRobert Wu
TEST_F(StreamOpenOutput,AAudioOutputSetSpatializationBehavior)481*05767d91SRobert Wu TEST_F(StreamOpenOutput, AAudioOutputSetSpatializationBehavior) {
482*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
483*05767d91SRobert Wu mBuilder.setSpatializationBehavior(SpatializationBehavior::Never);
484*05767d91SRobert Wu ASSERT_TRUE(openStream());
485*05767d91SRobert Wu ASSERT_EQ(mStream->getSpatializationBehavior(), SpatializationBehavior::Never);
486*05767d91SRobert Wu ASSERT_TRUE(closeStream());
487*05767d91SRobert Wu }
488*05767d91SRobert Wu
TEST_F(StreamOpenOutput,OpenSLESOutputSetSpatializationBehavior)489*05767d91SRobert Wu TEST_F(StreamOpenOutput, OpenSLESOutputSetSpatializationBehavior) {
490*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
491*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::OpenSLES);
492*05767d91SRobert Wu mBuilder.setSpatializationBehavior(SpatializationBehavior::Auto);
493*05767d91SRobert Wu ASSERT_TRUE(openStream());
494*05767d91SRobert Wu ASSERT_EQ(mStream->getSpatializationBehavior(), SpatializationBehavior::Never);
495*05767d91SRobert Wu ASSERT_TRUE(closeStream());
496*05767d91SRobert Wu }
497*05767d91SRobert Wu
TEST_F(StreamOpenInput,AAudioInputSetSpatializationBehaviorUnspecified)498*05767d91SRobert Wu TEST_F(StreamOpenInput, AAudioInputSetSpatializationBehaviorUnspecified) {
499*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
500*05767d91SRobert Wu mBuilder.setSpatializationBehavior(SpatializationBehavior::Unspecified);
501*05767d91SRobert Wu ASSERT_TRUE(openStream());
502*05767d91SRobert Wu ASSERT_EQ(mStream->getSpatializationBehavior(), SpatializationBehavior::Never);
503*05767d91SRobert Wu ASSERT_TRUE(closeStream());
504*05767d91SRobert Wu }
505*05767d91SRobert Wu
TEST_F(StreamOpenOutput,AAudioOutputSetSpatializationBehaviorUnspecified)506*05767d91SRobert Wu TEST_F(StreamOpenOutput, AAudioOutputSetSpatializationBehaviorUnspecified) {
507*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
508*05767d91SRobert Wu mBuilder.setSpatializationBehavior(SpatializationBehavior::Unspecified);
509*05767d91SRobert Wu ASSERT_TRUE(openStream());
510*05767d91SRobert Wu ASSERT_EQ(mStream->getSpatializationBehavior(), SpatializationBehavior::Never);
511*05767d91SRobert Wu ASSERT_TRUE(closeStream());
512*05767d91SRobert Wu }
513*05767d91SRobert Wu
TEST_F(StreamOpenInput,AAudioInputSetIsContentSpatialized)514*05767d91SRobert Wu TEST_F(StreamOpenInput, AAudioInputSetIsContentSpatialized) {
515*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
516*05767d91SRobert Wu mBuilder.setIsContentSpatialized(true);
517*05767d91SRobert Wu ASSERT_TRUE(openStream());
518*05767d91SRobert Wu ASSERT_EQ(mStream->isContentSpatialized(), true);
519*05767d91SRobert Wu ASSERT_TRUE(closeStream());
520*05767d91SRobert Wu }
521*05767d91SRobert Wu
TEST_F(StreamOpenOutput,AAudioOutputSetIsContentSpatialized)522*05767d91SRobert Wu TEST_F(StreamOpenOutput, AAudioOutputSetIsContentSpatialized) {
523*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
524*05767d91SRobert Wu mBuilder.setIsContentSpatialized(true);
525*05767d91SRobert Wu ASSERT_TRUE(openStream());
526*05767d91SRobert Wu ASSERT_EQ(mStream->isContentSpatialized(), true);
527*05767d91SRobert Wu ASSERT_TRUE(closeStream());
528*05767d91SRobert Wu }
529*05767d91SRobert Wu
TEST_F(StreamOpenOutput,OpenSLESOutputSetIsContentSpatialized)530*05767d91SRobert Wu TEST_F(StreamOpenOutput, OpenSLESOutputSetIsContentSpatialized) {
531*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
532*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::OpenSLES);
533*05767d91SRobert Wu mBuilder.setIsContentSpatialized(true);
534*05767d91SRobert Wu ASSERT_TRUE(openStream());
535*05767d91SRobert Wu ASSERT_EQ(mStream->isContentSpatialized(), true);
536*05767d91SRobert Wu ASSERT_TRUE(closeStream());
537*05767d91SRobert Wu }
538*05767d91SRobert Wu
TEST_F(StreamOpenOutput,AAudioOutputSetIsContentSpatializedFalse)539*05767d91SRobert Wu TEST_F(StreamOpenOutput, AAudioOutputSetIsContentSpatializedFalse) {
540*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
541*05767d91SRobert Wu mBuilder.setIsContentSpatialized(false);
542*05767d91SRobert Wu ASSERT_TRUE(openStream());
543*05767d91SRobert Wu ASSERT_EQ(mStream->isContentSpatialized(), false);
544*05767d91SRobert Wu ASSERT_TRUE(closeStream());
545*05767d91SRobert Wu }
546*05767d91SRobert Wu
TEST_F(StreamOpenOutput,AAudioOutputSetIsContentSpatializedUnspecified)547*05767d91SRobert Wu TEST_F(StreamOpenOutput, AAudioOutputSetIsContentSpatializedUnspecified) {
548*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
549*05767d91SRobert Wu ASSERT_TRUE(openStream());
550*05767d91SRobert Wu ASSERT_EQ(mStream->isContentSpatialized(), false);
551*05767d91SRobert Wu ASSERT_TRUE(closeStream());
552*05767d91SRobert Wu }
553*05767d91SRobert Wu
TEST_F(StreamOpenInput,AAudioInputSetIsContentSpatializedUnspecified)554*05767d91SRobert Wu TEST_F(StreamOpenInput, AAudioInputSetIsContentSpatializedUnspecified) {
555*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
556*05767d91SRobert Wu ASSERT_TRUE(openStream());
557*05767d91SRobert Wu ASSERT_EQ(mStream->isContentSpatialized(), false);
558*05767d91SRobert Wu ASSERT_TRUE(closeStream());
559*05767d91SRobert Wu }
560*05767d91SRobert Wu
TEST_F(StreamOpenOutput,OutputForOpenSLESPerformanceModeNoneGetBufferSizeInFrames)561*05767d91SRobert Wu TEST_F(StreamOpenOutput, OutputForOpenSLESPerformanceModeNoneGetBufferSizeInFrames){
562*05767d91SRobert Wu mBuilder.setPerformanceMode(PerformanceMode::None);
563*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::OpenSLES);
564*05767d91SRobert Wu ASSERT_TRUE(openStream());
565*05767d91SRobert Wu EXPECT_GT(mStream->getBufferSizeInFrames(), 0);
566*05767d91SRobert Wu ASSERT_TRUE(closeStream());
567*05767d91SRobert Wu }
568*05767d91SRobert Wu
TEST_F(StreamOpenOutput,OboeExtensions)569*05767d91SRobert Wu TEST_F(StreamOpenOutput, OboeExtensions){
570*05767d91SRobert Wu if (OboeExtensions::isMMapSupported()) {
571*05767d91SRobert Wu ASSERT_EQ(OboeExtensions::setMMapEnabled(true), 0);
572*05767d91SRobert Wu ASSERT_TRUE(OboeExtensions::isMMapEnabled());
573*05767d91SRobert Wu
574*05767d91SRobert Wu ASSERT_EQ(OboeExtensions::setMMapEnabled(false), 0);
575*05767d91SRobert Wu ASSERT_FALSE(OboeExtensions::isMMapEnabled());
576*05767d91SRobert Wu ASSERT_TRUE(openStream());
577*05767d91SRobert Wu EXPECT_FALSE(OboeExtensions::isMMapUsed(mStream));
578*05767d91SRobert Wu ASSERT_TRUE(closeStream());
579*05767d91SRobert Wu
580*05767d91SRobert Wu ASSERT_EQ(OboeExtensions::setMMapEnabled(true), 0);
581*05767d91SRobert Wu ASSERT_TRUE(OboeExtensions::isMMapEnabled());
582*05767d91SRobert Wu }
583*05767d91SRobert Wu }
584*05767d91SRobert Wu
TEST_F(StreamOpenInput,AAudioInputSetPrivacySensitiveModeUnspecifiedUnprocessed)585*05767d91SRobert Wu TEST_F(StreamOpenInput, AAudioInputSetPrivacySensitiveModeUnspecifiedUnprocessed){
586*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_R__){
587*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
588*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::AAudio);
589*05767d91SRobert Wu mBuilder.setInputPreset(InputPreset::Unprocessed);
590*05767d91SRobert Wu ASSERT_TRUE(openStream());
591*05767d91SRobert Wu ASSERT_EQ(mStream->getPrivacySensitiveMode(), PrivacySensitiveMode::Disabled);
592*05767d91SRobert Wu ASSERT_TRUE(closeStream());
593*05767d91SRobert Wu }
594*05767d91SRobert Wu }
595*05767d91SRobert Wu
TEST_F(StreamOpenInput,AAudioInputSetPrivacySensitiveModeUnspecifiedVoiceCommunication)596*05767d91SRobert Wu TEST_F(StreamOpenInput, AAudioInputSetPrivacySensitiveModeUnspecifiedVoiceCommunication){
597*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_R__){
598*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
599*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::AAudio);
600*05767d91SRobert Wu mBuilder.setInputPreset(InputPreset::VoiceCommunication);
601*05767d91SRobert Wu ASSERT_TRUE(openStream());
602*05767d91SRobert Wu ASSERT_EQ(mStream->getPrivacySensitiveMode(), PrivacySensitiveMode::Enabled);
603*05767d91SRobert Wu ASSERT_TRUE(closeStream());
604*05767d91SRobert Wu }
605*05767d91SRobert Wu }
606*05767d91SRobert Wu
TEST_F(StreamOpenInput,AAudioInputSetPrivacySensitiveModeVoiceDisabled)607*05767d91SRobert Wu TEST_F(StreamOpenInput, AAudioInputSetPrivacySensitiveModeVoiceDisabled){
608*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_R__){
609*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
610*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::AAudio);
611*05767d91SRobert Wu mBuilder.setInputPreset(InputPreset::VoiceCommunication);
612*05767d91SRobert Wu mBuilder.setPrivacySensitiveMode(PrivacySensitiveMode::Disabled);
613*05767d91SRobert Wu ASSERT_TRUE(openStream());
614*05767d91SRobert Wu ASSERT_EQ(mStream->getPrivacySensitiveMode(), PrivacySensitiveMode::Disabled);
615*05767d91SRobert Wu ASSERT_TRUE(closeStream());
616*05767d91SRobert Wu }
617*05767d91SRobert Wu }
618*05767d91SRobert Wu
TEST_F(StreamOpenInput,AAudioInputSetPrivacySensitiveModeUnprocessedEnabled)619*05767d91SRobert Wu TEST_F(StreamOpenInput, AAudioInputSetPrivacySensitiveModeUnprocessedEnabled){
620*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_R__){
621*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
622*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::AAudio);
623*05767d91SRobert Wu mBuilder.setInputPreset(InputPreset::Unprocessed);
624*05767d91SRobert Wu mBuilder.setPrivacySensitiveMode(PrivacySensitiveMode::Enabled);
625*05767d91SRobert Wu ASSERT_TRUE(openStream());
626*05767d91SRobert Wu ASSERT_EQ(mStream->getPrivacySensitiveMode(), PrivacySensitiveMode::Enabled);
627*05767d91SRobert Wu ASSERT_TRUE(closeStream());
628*05767d91SRobert Wu }
629*05767d91SRobert Wu }
630*05767d91SRobert Wu
TEST_F(StreamOpenOutput,AAudioOutputSetPrivacySensitiveModeGetsUnspecified)631*05767d91SRobert Wu TEST_F(StreamOpenOutput, AAudioOutputSetPrivacySensitiveModeGetsUnspecified){
632*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_R__){
633*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
634*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::AAudio);
635*05767d91SRobert Wu mBuilder.setPrivacySensitiveMode(PrivacySensitiveMode::Enabled);
636*05767d91SRobert Wu ASSERT_TRUE(openStream());
637*05767d91SRobert Wu ASSERT_EQ(mStream->getPrivacySensitiveMode(), PrivacySensitiveMode::Unspecified);
638*05767d91SRobert Wu ASSERT_TRUE(closeStream());
639*05767d91SRobert Wu }
640*05767d91SRobert Wu }
641*05767d91SRobert Wu
TEST_F(StreamOpenInput,OpenSLESInputSetPrivacySensitiveModeDoesNotCrash)642*05767d91SRobert Wu TEST_F(StreamOpenInput, OpenSLESInputSetPrivacySensitiveModeDoesNotCrash){
643*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
644*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::OpenSLES);
645*05767d91SRobert Wu mBuilder.setInputPreset(InputPreset::Unprocessed);
646*05767d91SRobert Wu mBuilder.setPrivacySensitiveMode(PrivacySensitiveMode::Enabled);
647*05767d91SRobert Wu ASSERT_TRUE(openStream());
648*05767d91SRobert Wu ASSERT_EQ(mStream->getPrivacySensitiveMode(), PrivacySensitiveMode::Unspecified);
649*05767d91SRobert Wu ASSERT_TRUE(closeStream());
650*05767d91SRobert Wu }
651*05767d91SRobert Wu
TEST_F(StreamOpenInput,OldAndroidVersionInputSetPrivacySensitiveModeDoesNotCrash)652*05767d91SRobert Wu TEST_F(StreamOpenInput, OldAndroidVersionInputSetPrivacySensitiveModeDoesNotCrash){
653*05767d91SRobert Wu if (getSdkVersion() < __ANDROID_API_R__) {
654*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
655*05767d91SRobert Wu mBuilder.setInputPreset(InputPreset::Unprocessed);
656*05767d91SRobert Wu mBuilder.setPrivacySensitiveMode(PrivacySensitiveMode::Enabled);
657*05767d91SRobert Wu ASSERT_TRUE(openStream());
658*05767d91SRobert Wu ASSERT_EQ(mStream->getPrivacySensitiveMode(), PrivacySensitiveMode::Unspecified);
659*05767d91SRobert Wu ASSERT_TRUE(closeStream());
660*05767d91SRobert Wu }
661*05767d91SRobert Wu }
662*05767d91SRobert Wu
TEST_F(StreamOpenOutput,AAudioOutputSetAllowedCapturePolicyUnspecifiedGetsAll)663*05767d91SRobert Wu TEST_F(StreamOpenOutput, AAudioOutputSetAllowedCapturePolicyUnspecifiedGetsAll){
664*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_Q__){
665*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
666*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::AAudio);
667*05767d91SRobert Wu mBuilder.setAllowedCapturePolicy(AllowedCapturePolicy::Unspecified);
668*05767d91SRobert Wu ASSERT_TRUE(openStream());
669*05767d91SRobert Wu ASSERT_EQ(mStream->getAllowedCapturePolicy(), AllowedCapturePolicy::All);
670*05767d91SRobert Wu ASSERT_TRUE(closeStream());
671*05767d91SRobert Wu }
672*05767d91SRobert Wu }
673*05767d91SRobert Wu
TEST_F(StreamOpenOutput,AAudioOutputSetAllowedCapturePolicyAll)674*05767d91SRobert Wu TEST_F(StreamOpenOutput, AAudioOutputSetAllowedCapturePolicyAll){
675*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_Q__){
676*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
677*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::AAudio);
678*05767d91SRobert Wu mBuilder.setAllowedCapturePolicy(AllowedCapturePolicy::All);
679*05767d91SRobert Wu ASSERT_TRUE(openStream());
680*05767d91SRobert Wu ASSERT_EQ(mStream->getAllowedCapturePolicy(), AllowedCapturePolicy::All);
681*05767d91SRobert Wu ASSERT_TRUE(closeStream());
682*05767d91SRobert Wu }
683*05767d91SRobert Wu }
684*05767d91SRobert Wu
TEST_F(StreamOpenOutput,AAudioOutputSetAllowedCapturePolicySystem)685*05767d91SRobert Wu TEST_F(StreamOpenOutput, AAudioOutputSetAllowedCapturePolicySystem){
686*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_Q__){
687*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
688*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::AAudio);
689*05767d91SRobert Wu mBuilder.setAllowedCapturePolicy(AllowedCapturePolicy::System);
690*05767d91SRobert Wu ASSERT_TRUE(openStream());
691*05767d91SRobert Wu ASSERT_EQ(mStream->getAllowedCapturePolicy(), AllowedCapturePolicy::System);
692*05767d91SRobert Wu ASSERT_TRUE(closeStream());
693*05767d91SRobert Wu }
694*05767d91SRobert Wu }
695*05767d91SRobert Wu
TEST_F(StreamOpenOutput,AAudioOutputSetAllowedCapturePolicyNone)696*05767d91SRobert Wu TEST_F(StreamOpenOutput, AAudioOutputSetAllowedCapturePolicyNone){
697*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_Q__){
698*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
699*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::AAudio);
700*05767d91SRobert Wu mBuilder.setAllowedCapturePolicy(AllowedCapturePolicy::None);
701*05767d91SRobert Wu ASSERT_TRUE(openStream());
702*05767d91SRobert Wu ASSERT_EQ(mStream->getAllowedCapturePolicy(), AllowedCapturePolicy::None);
703*05767d91SRobert Wu ASSERT_TRUE(closeStream());
704*05767d91SRobert Wu }
705*05767d91SRobert Wu }
706*05767d91SRobert Wu
TEST_F(StreamOpenOutput,AAudioOutputDoNotSetAllowedCapturePolicy)707*05767d91SRobert Wu TEST_F(StreamOpenOutput, AAudioOutputDoNotSetAllowedCapturePolicy){
708*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
709*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::AAudio);
710*05767d91SRobert Wu ASSERT_TRUE(openStream());
711*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_Q__){
712*05767d91SRobert Wu ASSERT_EQ(mStream->getAllowedCapturePolicy(), AllowedCapturePolicy::All);
713*05767d91SRobert Wu } else {
714*05767d91SRobert Wu ASSERT_EQ(mStream->getAllowedCapturePolicy(), AllowedCapturePolicy::Unspecified);
715*05767d91SRobert Wu }
716*05767d91SRobert Wu ASSERT_TRUE(closeStream());
717*05767d91SRobert Wu }
718*05767d91SRobert Wu
TEST_F(StreamOpenOutput,OpenSLESOutputSetAllowedCapturePolicyAllGetsUnspecified)719*05767d91SRobert Wu TEST_F(StreamOpenOutput, OpenSLESOutputSetAllowedCapturePolicyAllGetsUnspecified){
720*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
721*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::OpenSLES);
722*05767d91SRobert Wu mBuilder.setAllowedCapturePolicy(AllowedCapturePolicy::All);
723*05767d91SRobert Wu ASSERT_TRUE(openStream());
724*05767d91SRobert Wu ASSERT_EQ(mStream->getAllowedCapturePolicy(), AllowedCapturePolicy::Unspecified);
725*05767d91SRobert Wu ASSERT_TRUE(closeStream());
726*05767d91SRobert Wu }
727*05767d91SRobert Wu
TEST_F(StreamOpenOutput,AAudioBeforeQOutputSetAllowedCapturePolicyAllGetsUnspecified)728*05767d91SRobert Wu TEST_F(StreamOpenOutput, AAudioBeforeQOutputSetAllowedCapturePolicyAllGetsUnspecified){
729*05767d91SRobert Wu if (getSdkVersion() < __ANDROID_API_Q__){
730*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
731*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::AAudio);
732*05767d91SRobert Wu mBuilder.setAllowedCapturePolicy(AllowedCapturePolicy::All);
733*05767d91SRobert Wu ASSERT_TRUE(openStream());
734*05767d91SRobert Wu ASSERT_EQ(mStream->getAllowedCapturePolicy(), AllowedCapturePolicy::Unspecified);
735*05767d91SRobert Wu ASSERT_TRUE(closeStream());
736*05767d91SRobert Wu }
737*05767d91SRobert Wu }
738*05767d91SRobert Wu
TEST_F(StreamOpenInput,AAudioInputSetAllowedCapturePolicyAllGetsUnspecified)739*05767d91SRobert Wu TEST_F(StreamOpenInput, AAudioInputSetAllowedCapturePolicyAllGetsUnspecified){
740*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
741*05767d91SRobert Wu mBuilder.setAllowedCapturePolicy(AllowedCapturePolicy::All);
742*05767d91SRobert Wu ASSERT_TRUE(openStream());
743*05767d91SRobert Wu ASSERT_EQ(mStream->getAllowedCapturePolicy(), AllowedCapturePolicy::Unspecified);
744*05767d91SRobert Wu ASSERT_TRUE(closeStream());
745*05767d91SRobert Wu }
746