blob: de386daba9fb3e51b025b7932603244d0572b3d8 [file] [log] [blame]
Phil Burk9a9e6002017-11-17 12:17:37 -08001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17// Test various AAudio features including AAudioStream_setBufferSizeInFrames().
18
19#include <stdio.h>
20//#include <stdlib.h>
21//#include <math.h>
22
23#include <android-base/macros.h>
24#include <aaudio/AAudio.h>
25
26#include <gtest/gtest.h>
27
28// Callback function that does nothing.
29aaudio_data_callback_result_t MyDataCallbackProc(
30 AAudioStream *stream,
31 void *userData,
32 void *audioData,
33 int32_t numFrames
34) {
35 (void) stream;
36 (void) userData;
37 (void) audioData;
38 (void) numFrames;
39 return AAUDIO_CALLBACK_RESULT_CONTINUE;
40}
41
42// Test AAudioStream_setBufferSizeInFrames()
43
Phil Burk0c15f4f2017-11-28 15:46:15 -080044constexpr int64_t NANOS_PER_MILLISECOND = 1000 * 1000;
45
46//int foo() { // To fix Android Studio formatting when editing.
47TEST(test_various, aaudio_stop_when_open) {
48 AAudioStreamBuilder *aaudioBuilder = nullptr;
49 AAudioStream *aaudioStream = nullptr;
50
51// Use an AAudioStreamBuilder to contain requested parameters.
52 ASSERT_EQ(AAUDIO_OK, AAudio_createStreamBuilder(&aaudioBuilder));
53
54// Request stream properties.
55 AAudioStreamBuilder_setDataCallback(aaudioBuilder, MyDataCallbackProc, nullptr);
56 AAudioStreamBuilder_setPerformanceMode(aaudioBuilder, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY);
57
58// Create an AAudioStream using the Builder.
59 EXPECT_EQ(AAUDIO_OK, AAudioStreamBuilder_openStream(aaudioBuilder, &aaudioStream));
60
61
62 aaudio_stream_state_t state = AAUDIO_STREAM_STATE_UNKNOWN;
63 EXPECT_EQ(AAUDIO_OK, AAudioStream_waitForStateChange(aaudioStream,
64 AAUDIO_STREAM_STATE_UNKNOWN, &state,
65 1000 * NANOS_PER_MILLISECOND));
66 EXPECT_EQ(AAUDIO_STREAM_STATE_OPEN, state);
67
68 EXPECT_EQ(AAUDIO_OK, AAudioStream_requestStop(aaudioStream));
69
70 state = AAUDIO_STREAM_STATE_UNKNOWN;
71 EXPECT_EQ(AAUDIO_OK, AAudioStream_waitForStateChange(aaudioStream,
72 AAUDIO_STREAM_STATE_UNKNOWN, &state, 0));
73 EXPECT_EQ(AAUDIO_STREAM_STATE_OPEN, state);
74
75 AAudioStream_close(aaudioStream);
76 AAudioStreamBuilder_delete(aaudioBuilder);
77}
78
79//int boo() { // To fix Android Studio formatting when editing.
80TEST(test_various, aaudio_flush_when_started) {
81 AAudioStreamBuilder *aaudioBuilder = nullptr;
82 AAudioStream *aaudioStream = nullptr;
83
84// Use an AAudioStreamBuilder to contain requested parameters.
85 ASSERT_EQ(AAUDIO_OK, AAudio_createStreamBuilder(&aaudioBuilder));
86
87// Request stream properties.
88 AAudioStreamBuilder_setDataCallback(aaudioBuilder, MyDataCallbackProc, nullptr);
89 AAudioStreamBuilder_setPerformanceMode(aaudioBuilder, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY);
90
91// Create an AAudioStream using the Builder.
92 EXPECT_EQ(AAUDIO_OK, AAudioStreamBuilder_openStream(aaudioBuilder, &aaudioStream));
93 EXPECT_EQ(AAUDIO_OK, AAudioStream_requestStart(aaudioStream));
94
95 aaudio_stream_state_t state = AAUDIO_STREAM_STATE_UNKNOWN;
96 EXPECT_EQ(AAUDIO_OK, AAudioStream_waitForStateChange(aaudioStream,
97 AAUDIO_STREAM_STATE_STARTING, &state,
98 1000 * NANOS_PER_MILLISECOND));
99 EXPECT_EQ(AAUDIO_STREAM_STATE_STARTED, state);
100
101 EXPECT_EQ(AAUDIO_ERROR_INVALID_STATE, AAudioStream_requestFlush(aaudioStream));
102
103 state = AAUDIO_STREAM_STATE_UNKNOWN;
104 EXPECT_EQ(AAUDIO_OK, AAudioStream_waitForStateChange(aaudioStream,
105 AAUDIO_STREAM_STATE_UNKNOWN, &state, 0));
106 EXPECT_EQ(AAUDIO_STREAM_STATE_STARTED, state);
107
108 AAudioStream_close(aaudioStream);
109 AAudioStreamBuilder_delete(aaudioBuilder);
110}
111
Phil Burk9a9e6002017-11-17 12:17:37 -0800112//int main() { // To fix Android Studio formatting when editing.
113TEST(test_various, aaudio_set_buffer_size) {
Phil Burk9a9e6002017-11-17 12:17:37 -0800114 int32_t bufferCapacity;
115 int32_t framesPerBurst = 0;
116 int32_t actualSize = 0;
117
118 AAudioStreamBuilder *aaudioBuilder = nullptr;
119 AAudioStream *aaudioStream = nullptr;
120
121 // Use an AAudioStreamBuilder to contain requested parameters.
122 ASSERT_EQ(AAUDIO_OK, AAudio_createStreamBuilder(&aaudioBuilder));
123
124 // Request stream properties.
125 AAudioStreamBuilder_setDataCallback(aaudioBuilder, MyDataCallbackProc, nullptr);
126 AAudioStreamBuilder_setPerformanceMode(aaudioBuilder, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY);
127
128 // Create an AAudioStream using the Builder.
129 EXPECT_EQ(AAUDIO_OK, AAudioStreamBuilder_openStream(aaudioBuilder, &aaudioStream));
130
131 // This is the number of frames that are read in one chunk by a DMA controller
132 // or a DSP or a mixer.
133 framesPerBurst = AAudioStream_getFramesPerBurst(aaudioStream);
134 bufferCapacity = AAudioStream_getBufferCapacityInFrames(aaudioStream);
135 printf(" bufferCapacity = %d, remainder = %d\n",
136 bufferCapacity, bufferCapacity % framesPerBurst);
137
138 actualSize = AAudioStream_setBufferSizeInFrames(aaudioStream, 0);
139 EXPECT_GT(actualSize, 0);
140 EXPECT_LE(actualSize, bufferCapacity);
141
142 actualSize = AAudioStream_setBufferSizeInFrames(aaudioStream, 2 * framesPerBurst);
143 EXPECT_GT(actualSize, framesPerBurst);
144 EXPECT_LE(actualSize, bufferCapacity);
145
146 actualSize = AAudioStream_setBufferSizeInFrames(aaudioStream, bufferCapacity - 1);
147 EXPECT_GT(actualSize, framesPerBurst);
148 EXPECT_LE(actualSize, bufferCapacity);
149
150 actualSize = AAudioStream_setBufferSizeInFrames(aaudioStream, bufferCapacity);
151 EXPECT_GT(actualSize, framesPerBurst);
152 EXPECT_LE(actualSize, bufferCapacity);
153
154 actualSize = AAudioStream_setBufferSizeInFrames(aaudioStream, bufferCapacity + 1);
155 EXPECT_GT(actualSize, framesPerBurst);
156 EXPECT_LE(actualSize, bufferCapacity);
157
158 actualSize = AAudioStream_setBufferSizeInFrames(aaudioStream, 1234567);
159 EXPECT_GT(actualSize, framesPerBurst);
160 EXPECT_LE(actualSize, bufferCapacity);
161
162 actualSize = AAudioStream_setBufferSizeInFrames(aaudioStream, INT32_MAX);
163 EXPECT_GT(actualSize, framesPerBurst);
164 EXPECT_LE(actualSize, bufferCapacity);
165
166 actualSize = AAudioStream_setBufferSizeInFrames(aaudioStream, INT32_MIN);
167 EXPECT_GT(actualSize, 0);
168 EXPECT_LE(actualSize, bufferCapacity);
169
170 AAudioStream_close(aaudioStream);
171 AAudioStreamBuilder_delete(aaudioBuilder);
Phil Burk9a9e6002017-11-17 12:17:37 -0800172}