1*05767d91SRobert Wu /*
2*05767d91SRobert Wu * Copyright 2016 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 <dlfcn.h>
18*05767d91SRobert Wu #include <oboe/Utilities.h>
19*05767d91SRobert Wu #include "common/OboeDebug.h"
20*05767d91SRobert Wu #include "AAudioLoader.h"
21*05767d91SRobert Wu
22*05767d91SRobert Wu #define LIB_AAUDIO_NAME "libaaudio.so"
23*05767d91SRobert Wu
24*05767d91SRobert Wu namespace oboe {
25*05767d91SRobert Wu
~AAudioLoader()26*05767d91SRobert Wu AAudioLoader::~AAudioLoader() {
27*05767d91SRobert Wu // Issue 360: thread_local variables with non-trivial destructors
28*05767d91SRobert Wu // will cause segfaults if the containing library is dlclose()ed on
29*05767d91SRobert Wu // devices running M or newer, or devices before M when using a static STL.
30*05767d91SRobert Wu // The simple workaround is to not call dlclose.
31*05767d91SRobert Wu // https://github.com/android/ndk/wiki/Changelog-r22#known-issues
32*05767d91SRobert Wu //
33*05767d91SRobert Wu // The libaaudio and libaaudioclient do not use thread_local.
34*05767d91SRobert Wu // But, to be safe, we should avoid dlclose() if possible.
35*05767d91SRobert Wu // Because AAudioLoader is a static Singleton, we can safely skip
36*05767d91SRobert Wu // calling dlclose() without causing a resource leak.
37*05767d91SRobert Wu LOGI("%s() dlclose(%s) not called, OK", __func__, LIB_AAUDIO_NAME);
38*05767d91SRobert Wu }
39*05767d91SRobert Wu
getInstance()40*05767d91SRobert Wu AAudioLoader* AAudioLoader::getInstance() {
41*05767d91SRobert Wu static AAudioLoader instance;
42*05767d91SRobert Wu return &instance;
43*05767d91SRobert Wu }
44*05767d91SRobert Wu
open()45*05767d91SRobert Wu int AAudioLoader::open() {
46*05767d91SRobert Wu if (mLibHandle != nullptr) {
47*05767d91SRobert Wu return 0;
48*05767d91SRobert Wu }
49*05767d91SRobert Wu
50*05767d91SRobert Wu // Use RTLD_NOW to avoid the unpredictable behavior that RTLD_LAZY can cause.
51*05767d91SRobert Wu // Also resolving all the links now will prevent a run-time penalty later.
52*05767d91SRobert Wu mLibHandle = dlopen(LIB_AAUDIO_NAME, RTLD_NOW);
53*05767d91SRobert Wu if (mLibHandle == nullptr) {
54*05767d91SRobert Wu LOGI("AAudioLoader::open() could not find " LIB_AAUDIO_NAME);
55*05767d91SRobert Wu return -1; // TODO review return code
56*05767d91SRobert Wu } else {
57*05767d91SRobert Wu LOGD("AAudioLoader(): dlopen(%s) returned %p", LIB_AAUDIO_NAME, mLibHandle);
58*05767d91SRobert Wu }
59*05767d91SRobert Wu
60*05767d91SRobert Wu // Load all the function pointers.
61*05767d91SRobert Wu createStreamBuilder = load_I_PPB("AAudio_createStreamBuilder");
62*05767d91SRobert Wu builder_openStream = load_I_PBPPS("AAudioStreamBuilder_openStream");
63*05767d91SRobert Wu
64*05767d91SRobert Wu builder_setChannelCount = load_V_PBI("AAudioStreamBuilder_setChannelCount");
65*05767d91SRobert Wu if (builder_setChannelCount == nullptr) {
66*05767d91SRobert Wu // Use old deprecated alias if needed.
67*05767d91SRobert Wu builder_setChannelCount = load_V_PBI("AAudioStreamBuilder_setSamplesPerFrame");
68*05767d91SRobert Wu }
69*05767d91SRobert Wu
70*05767d91SRobert Wu builder_setBufferCapacityInFrames = load_V_PBI("AAudioStreamBuilder_setBufferCapacityInFrames");
71*05767d91SRobert Wu builder_setDeviceId = load_V_PBI("AAudioStreamBuilder_setDeviceId");
72*05767d91SRobert Wu builder_setDirection = load_V_PBI("AAudioStreamBuilder_setDirection");
73*05767d91SRobert Wu builder_setFormat = load_V_PBI("AAudioStreamBuilder_setFormat");
74*05767d91SRobert Wu builder_setFramesPerDataCallback = load_V_PBI("AAudioStreamBuilder_setFramesPerDataCallback");
75*05767d91SRobert Wu builder_setSharingMode = load_V_PBI("AAudioStreamBuilder_setSharingMode");
76*05767d91SRobert Wu builder_setPerformanceMode = load_V_PBI("AAudioStreamBuilder_setPerformanceMode");
77*05767d91SRobert Wu builder_setSampleRate = load_V_PBI("AAudioStreamBuilder_setSampleRate");
78*05767d91SRobert Wu
79*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_P__){
80*05767d91SRobert Wu builder_setUsage = load_V_PBI("AAudioStreamBuilder_setUsage");
81*05767d91SRobert Wu builder_setContentType = load_V_PBI("AAudioStreamBuilder_setContentType");
82*05767d91SRobert Wu builder_setInputPreset = load_V_PBI("AAudioStreamBuilder_setInputPreset");
83*05767d91SRobert Wu builder_setSessionId = load_V_PBI("AAudioStreamBuilder_setSessionId");
84*05767d91SRobert Wu }
85*05767d91SRobert Wu
86*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_Q__){
87*05767d91SRobert Wu builder_setAllowedCapturePolicy = load_V_PBI("AAudioStreamBuilder_setAllowedCapturePolicy");
88*05767d91SRobert Wu }
89*05767d91SRobert Wu
90*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_R__){
91*05767d91SRobert Wu builder_setPrivacySensitive = load_V_PBO("AAudioStreamBuilder_setPrivacySensitive");
92*05767d91SRobert Wu }
93*05767d91SRobert Wu
94*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_S__){
95*05767d91SRobert Wu builder_setPackageName = load_V_PBCPH("AAudioStreamBuilder_setPackageName");
96*05767d91SRobert Wu builder_setAttributionTag = load_V_PBCPH("AAudioStreamBuilder_setAttributionTag");
97*05767d91SRobert Wu }
98*05767d91SRobert Wu
99*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_S_V2__) {
100*05767d91SRobert Wu builder_setChannelMask = load_V_PBU("AAudioStreamBuilder_setChannelMask");
101*05767d91SRobert Wu builder_setIsContentSpatialized = load_V_PBO("AAudioStreamBuilder_setIsContentSpatialized");
102*05767d91SRobert Wu builder_setSpatializationBehavior = load_V_PBI("AAudioStreamBuilder_setSpatializationBehavior");
103*05767d91SRobert Wu }
104*05767d91SRobert Wu
105*05767d91SRobert Wu builder_delete = load_I_PB("AAudioStreamBuilder_delete");
106*05767d91SRobert Wu
107*05767d91SRobert Wu
108*05767d91SRobert Wu builder_setDataCallback = load_V_PBPDPV("AAudioStreamBuilder_setDataCallback");
109*05767d91SRobert Wu builder_setErrorCallback = load_V_PBPEPV("AAudioStreamBuilder_setErrorCallback");
110*05767d91SRobert Wu
111*05767d91SRobert Wu stream_read = load_I_PSPVIL("AAudioStream_read");
112*05767d91SRobert Wu
113*05767d91SRobert Wu stream_write = load_I_PSCPVIL("AAudioStream_write");
114*05767d91SRobert Wu
115*05767d91SRobert Wu stream_waitForStateChange = load_I_PSTPTL("AAudioStream_waitForStateChange");
116*05767d91SRobert Wu
117*05767d91SRobert Wu stream_getTimestamp = load_I_PSKPLPL("AAudioStream_getTimestamp");
118*05767d91SRobert Wu
119*05767d91SRobert Wu stream_getChannelCount = load_I_PS("AAudioStream_getChannelCount");
120*05767d91SRobert Wu if (stream_getChannelCount == nullptr) {
121*05767d91SRobert Wu // Use old alias if needed.
122*05767d91SRobert Wu stream_getChannelCount = load_I_PS("AAudioStream_getSamplesPerFrame");
123*05767d91SRobert Wu }
124*05767d91SRobert Wu
125*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_R__) {
126*05767d91SRobert Wu stream_release = load_I_PS("AAudioStream_release");
127*05767d91SRobert Wu }
128*05767d91SRobert Wu
129*05767d91SRobert Wu stream_close = load_I_PS("AAudioStream_close");
130*05767d91SRobert Wu
131*05767d91SRobert Wu stream_getBufferSize = load_I_PS("AAudioStream_getBufferSizeInFrames");
132*05767d91SRobert Wu stream_getDeviceId = load_I_PS("AAudioStream_getDeviceId");
133*05767d91SRobert Wu stream_getBufferCapacity = load_I_PS("AAudioStream_getBufferCapacityInFrames");
134*05767d91SRobert Wu stream_getFormat = load_F_PS("AAudioStream_getFormat");
135*05767d91SRobert Wu stream_getFramesPerBurst = load_I_PS("AAudioStream_getFramesPerBurst");
136*05767d91SRobert Wu stream_getFramesRead = load_L_PS("AAudioStream_getFramesRead");
137*05767d91SRobert Wu stream_getFramesWritten = load_L_PS("AAudioStream_getFramesWritten");
138*05767d91SRobert Wu stream_getPerformanceMode = load_I_PS("AAudioStream_getPerformanceMode");
139*05767d91SRobert Wu stream_getSampleRate = load_I_PS("AAudioStream_getSampleRate");
140*05767d91SRobert Wu stream_getSharingMode = load_I_PS("AAudioStream_getSharingMode");
141*05767d91SRobert Wu stream_getState = load_I_PS("AAudioStream_getState");
142*05767d91SRobert Wu stream_getXRunCount = load_I_PS("AAudioStream_getXRunCount");
143*05767d91SRobert Wu
144*05767d91SRobert Wu stream_requestStart = load_I_PS("AAudioStream_requestStart");
145*05767d91SRobert Wu stream_requestPause = load_I_PS("AAudioStream_requestPause");
146*05767d91SRobert Wu stream_requestFlush = load_I_PS("AAudioStream_requestFlush");
147*05767d91SRobert Wu stream_requestStop = load_I_PS("AAudioStream_requestStop");
148*05767d91SRobert Wu
149*05767d91SRobert Wu stream_setBufferSize = load_I_PSI("AAudioStream_setBufferSizeInFrames");
150*05767d91SRobert Wu
151*05767d91SRobert Wu convertResultToText = load_CPH_I("AAudio_convertResultToText");
152*05767d91SRobert Wu
153*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_P__){
154*05767d91SRobert Wu stream_getUsage = load_I_PS("AAudioStream_getUsage");
155*05767d91SRobert Wu stream_getContentType = load_I_PS("AAudioStream_getContentType");
156*05767d91SRobert Wu stream_getInputPreset = load_I_PS("AAudioStream_getInputPreset");
157*05767d91SRobert Wu stream_getSessionId = load_I_PS("AAudioStream_getSessionId");
158*05767d91SRobert Wu }
159*05767d91SRobert Wu
160*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_Q__){
161*05767d91SRobert Wu stream_getAllowedCapturePolicy = load_I_PS("AAudioStream_getAllowedCapturePolicy");
162*05767d91SRobert Wu }
163*05767d91SRobert Wu
164*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_R__){
165*05767d91SRobert Wu stream_isPrivacySensitive = load_O_PS("AAudioStream_isPrivacySensitive");
166*05767d91SRobert Wu }
167*05767d91SRobert Wu
168*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_S_V2__) {
169*05767d91SRobert Wu stream_getChannelMask = load_U_PS("AAudioStream_getChannelMask");
170*05767d91SRobert Wu stream_isContentSpatialized = load_O_PS("AAudioStream_isContentSpatialized");
171*05767d91SRobert Wu stream_getSpatializationBehavior = load_I_PS("AAudioStream_getSpatializationBehavior");
172*05767d91SRobert Wu }
173*05767d91SRobert Wu
174*05767d91SRobert Wu if (getSdkVersion() >= __ANDROID_API_U__) {
175*05767d91SRobert Wu stream_getHardwareChannelCount = load_I_PS("AAudioStream_getHardwareChannelCount");
176*05767d91SRobert Wu stream_getHardwareSampleRate = load_I_PS("AAudioStream_getHardwareSampleRate");
177*05767d91SRobert Wu stream_getHardwareFormat = load_F_PS("AAudioStream_getHardwareFormat");
178*05767d91SRobert Wu }
179*05767d91SRobert Wu
180*05767d91SRobert Wu return 0;
181*05767d91SRobert Wu }
182*05767d91SRobert Wu
AAudioLoader_check(void * proc,const char * functionName)183*05767d91SRobert Wu static void AAudioLoader_check(void *proc, const char *functionName) {
184*05767d91SRobert Wu if (proc == nullptr) {
185*05767d91SRobert Wu LOGW("AAudioLoader could not find %s", functionName);
186*05767d91SRobert Wu }
187*05767d91SRobert Wu }
188*05767d91SRobert Wu
load_I_PPB(const char * functionName)189*05767d91SRobert Wu AAudioLoader::signature_I_PPB AAudioLoader::load_I_PPB(const char *functionName) {
190*05767d91SRobert Wu void *proc = dlsym(mLibHandle, functionName);
191*05767d91SRobert Wu AAudioLoader_check(proc, functionName);
192*05767d91SRobert Wu return reinterpret_cast<signature_I_PPB>(proc);
193*05767d91SRobert Wu }
194*05767d91SRobert Wu
load_CPH_I(const char * functionName)195*05767d91SRobert Wu AAudioLoader::signature_CPH_I AAudioLoader::load_CPH_I(const char *functionName) {
196*05767d91SRobert Wu void *proc = dlsym(mLibHandle, functionName);
197*05767d91SRobert Wu AAudioLoader_check(proc, functionName);
198*05767d91SRobert Wu return reinterpret_cast<signature_CPH_I>(proc);
199*05767d91SRobert Wu }
200*05767d91SRobert Wu
load_V_PBI(const char * functionName)201*05767d91SRobert Wu AAudioLoader::signature_V_PBI AAudioLoader::load_V_PBI(const char *functionName) {
202*05767d91SRobert Wu void *proc = dlsym(mLibHandle, functionName);
203*05767d91SRobert Wu AAudioLoader_check(proc, functionName);
204*05767d91SRobert Wu return reinterpret_cast<signature_V_PBI>(proc);
205*05767d91SRobert Wu }
206*05767d91SRobert Wu
load_V_PBCPH(const char * functionName)207*05767d91SRobert Wu AAudioLoader::signature_V_PBCPH AAudioLoader::load_V_PBCPH(const char *functionName) {
208*05767d91SRobert Wu void *proc = dlsym(mLibHandle, functionName);
209*05767d91SRobert Wu AAudioLoader_check(proc, functionName);
210*05767d91SRobert Wu return reinterpret_cast<signature_V_PBCPH>(proc);
211*05767d91SRobert Wu }
212*05767d91SRobert Wu
load_V_PBPDPV(const char * functionName)213*05767d91SRobert Wu AAudioLoader::signature_V_PBPDPV AAudioLoader::load_V_PBPDPV(const char *functionName) {
214*05767d91SRobert Wu void *proc = dlsym(mLibHandle, functionName);
215*05767d91SRobert Wu AAudioLoader_check(proc, functionName);
216*05767d91SRobert Wu return reinterpret_cast<signature_V_PBPDPV>(proc);
217*05767d91SRobert Wu }
218*05767d91SRobert Wu
load_V_PBPEPV(const char * functionName)219*05767d91SRobert Wu AAudioLoader::signature_V_PBPEPV AAudioLoader::load_V_PBPEPV(const char *functionName) {
220*05767d91SRobert Wu void *proc = dlsym(mLibHandle, functionName);
221*05767d91SRobert Wu AAudioLoader_check(proc, functionName);
222*05767d91SRobert Wu return reinterpret_cast<signature_V_PBPEPV>(proc);
223*05767d91SRobert Wu }
224*05767d91SRobert Wu
load_I_PSI(const char * functionName)225*05767d91SRobert Wu AAudioLoader::signature_I_PSI AAudioLoader::load_I_PSI(const char *functionName) {
226*05767d91SRobert Wu void *proc = dlsym(mLibHandle, functionName);
227*05767d91SRobert Wu AAudioLoader_check(proc, functionName);
228*05767d91SRobert Wu return reinterpret_cast<signature_I_PSI>(proc);
229*05767d91SRobert Wu }
230*05767d91SRobert Wu
load_I_PS(const char * functionName)231*05767d91SRobert Wu AAudioLoader::signature_I_PS AAudioLoader::load_I_PS(const char *functionName) {
232*05767d91SRobert Wu void *proc = dlsym(mLibHandle, functionName);
233*05767d91SRobert Wu AAudioLoader_check(proc, functionName);
234*05767d91SRobert Wu return reinterpret_cast<signature_I_PS>(proc);
235*05767d91SRobert Wu }
236*05767d91SRobert Wu
load_L_PS(const char * functionName)237*05767d91SRobert Wu AAudioLoader::signature_L_PS AAudioLoader::load_L_PS(const char *functionName) {
238*05767d91SRobert Wu void *proc = dlsym(mLibHandle, functionName);
239*05767d91SRobert Wu AAudioLoader_check(proc, functionName);
240*05767d91SRobert Wu return reinterpret_cast<signature_L_PS>(proc);
241*05767d91SRobert Wu }
242*05767d91SRobert Wu
load_F_PS(const char * functionName)243*05767d91SRobert Wu AAudioLoader::signature_F_PS AAudioLoader::load_F_PS(const char *functionName) {
244*05767d91SRobert Wu void *proc = dlsym(mLibHandle, functionName);
245*05767d91SRobert Wu AAudioLoader_check(proc, functionName);
246*05767d91SRobert Wu return reinterpret_cast<signature_F_PS>(proc);
247*05767d91SRobert Wu }
248*05767d91SRobert Wu
load_O_PS(const char * functionName)249*05767d91SRobert Wu AAudioLoader::signature_O_PS AAudioLoader::load_O_PS(const char *functionName) {
250*05767d91SRobert Wu void *proc = dlsym(mLibHandle, functionName);
251*05767d91SRobert Wu AAudioLoader_check(proc, functionName);
252*05767d91SRobert Wu return reinterpret_cast<signature_O_PS>(proc);
253*05767d91SRobert Wu }
254*05767d91SRobert Wu
load_I_PB(const char * functionName)255*05767d91SRobert Wu AAudioLoader::signature_I_PB AAudioLoader::load_I_PB(const char *functionName) {
256*05767d91SRobert Wu void *proc = dlsym(mLibHandle, functionName);
257*05767d91SRobert Wu AAudioLoader_check(proc, functionName);
258*05767d91SRobert Wu return reinterpret_cast<signature_I_PB>(proc);
259*05767d91SRobert Wu }
260*05767d91SRobert Wu
load_I_PBPPS(const char * functionName)261*05767d91SRobert Wu AAudioLoader::signature_I_PBPPS AAudioLoader::load_I_PBPPS(const char *functionName) {
262*05767d91SRobert Wu void *proc = dlsym(mLibHandle, functionName);
263*05767d91SRobert Wu AAudioLoader_check(proc, functionName);
264*05767d91SRobert Wu return reinterpret_cast<signature_I_PBPPS>(proc);
265*05767d91SRobert Wu }
266*05767d91SRobert Wu
load_I_PSCPVIL(const char * functionName)267*05767d91SRobert Wu AAudioLoader::signature_I_PSCPVIL AAudioLoader::load_I_PSCPVIL(const char *functionName) {
268*05767d91SRobert Wu void *proc = dlsym(mLibHandle, functionName);
269*05767d91SRobert Wu AAudioLoader_check(proc, functionName);
270*05767d91SRobert Wu return reinterpret_cast<signature_I_PSCPVIL>(proc);
271*05767d91SRobert Wu }
272*05767d91SRobert Wu
load_I_PSPVIL(const char * functionName)273*05767d91SRobert Wu AAudioLoader::signature_I_PSPVIL AAudioLoader::load_I_PSPVIL(const char *functionName) {
274*05767d91SRobert Wu void *proc = dlsym(mLibHandle, functionName);
275*05767d91SRobert Wu AAudioLoader_check(proc, functionName);
276*05767d91SRobert Wu return reinterpret_cast<signature_I_PSPVIL>(proc);
277*05767d91SRobert Wu }
278*05767d91SRobert Wu
load_I_PSTPTL(const char * functionName)279*05767d91SRobert Wu AAudioLoader::signature_I_PSTPTL AAudioLoader::load_I_PSTPTL(const char *functionName) {
280*05767d91SRobert Wu void *proc = dlsym(mLibHandle, functionName);
281*05767d91SRobert Wu AAudioLoader_check(proc, functionName);
282*05767d91SRobert Wu return reinterpret_cast<signature_I_PSTPTL>(proc);
283*05767d91SRobert Wu }
284*05767d91SRobert Wu
load_I_PSKPLPL(const char * functionName)285*05767d91SRobert Wu AAudioLoader::signature_I_PSKPLPL AAudioLoader::load_I_PSKPLPL(const char *functionName) {
286*05767d91SRobert Wu void *proc = dlsym(mLibHandle, functionName);
287*05767d91SRobert Wu AAudioLoader_check(proc, functionName);
288*05767d91SRobert Wu return reinterpret_cast<signature_I_PSKPLPL>(proc);
289*05767d91SRobert Wu }
290*05767d91SRobert Wu
load_V_PBU(const char * functionName)291*05767d91SRobert Wu AAudioLoader::signature_V_PBU AAudioLoader::load_V_PBU(const char *functionName) {
292*05767d91SRobert Wu void *proc = dlsym(mLibHandle, functionName);
293*05767d91SRobert Wu AAudioLoader_check(proc, functionName);
294*05767d91SRobert Wu return reinterpret_cast<signature_V_PBU>(proc);
295*05767d91SRobert Wu }
296*05767d91SRobert Wu
load_U_PS(const char * functionName)297*05767d91SRobert Wu AAudioLoader::signature_U_PS AAudioLoader::load_U_PS(const char *functionName) {
298*05767d91SRobert Wu void *proc = dlsym(mLibHandle, functionName);
299*05767d91SRobert Wu AAudioLoader_check(proc, functionName);
300*05767d91SRobert Wu return reinterpret_cast<signature_U_PS>(proc);
301*05767d91SRobert Wu }
302*05767d91SRobert Wu
load_V_PBO(const char * functionName)303*05767d91SRobert Wu AAudioLoader::signature_V_PBO AAudioLoader::load_V_PBO(const char *functionName) {
304*05767d91SRobert Wu void *proc = dlsym(mLibHandle, functionName);
305*05767d91SRobert Wu AAudioLoader_check(proc, functionName);
306*05767d91SRobert Wu return reinterpret_cast<signature_V_PBO>(proc);
307*05767d91SRobert Wu }
308*05767d91SRobert Wu
309*05767d91SRobert Wu // Ensure that all AAudio primitive data types are int32_t
310*05767d91SRobert Wu #define ASSERT_INT32(type) static_assert(std::is_same<int32_t, type>::value, \
311*05767d91SRobert Wu #type" must be int32_t")
312*05767d91SRobert Wu
313*05767d91SRobert Wu // Ensure that all AAudio primitive data types are uint32_t
314*05767d91SRobert Wu #define ASSERT_UINT32(type) static_assert(std::is_same<uint32_t, type>::value, \
315*05767d91SRobert Wu #type" must be uint32_t")
316*05767d91SRobert Wu
317*05767d91SRobert Wu #define ERRMSG "Oboe constants must match AAudio constants."
318*05767d91SRobert Wu
319*05767d91SRobert Wu // These asserts help verify that the Oboe definitions match the equivalent AAudio definitions.
320*05767d91SRobert Wu // This code is in this .cpp file so it only gets tested once.
321*05767d91SRobert Wu #ifdef AAUDIO_AAUDIO_H
322*05767d91SRobert Wu
323*05767d91SRobert Wu ASSERT_INT32(aaudio_stream_state_t);
324*05767d91SRobert Wu ASSERT_INT32(aaudio_direction_t);
325*05767d91SRobert Wu ASSERT_INT32(aaudio_format_t);
326*05767d91SRobert Wu ASSERT_INT32(aaudio_data_callback_result_t);
327*05767d91SRobert Wu ASSERT_INT32(aaudio_result_t);
328*05767d91SRobert Wu ASSERT_INT32(aaudio_sharing_mode_t);
329*05767d91SRobert Wu ASSERT_INT32(aaudio_performance_mode_t);
330*05767d91SRobert Wu
331*05767d91SRobert Wu static_assert((int32_t)StreamState::Uninitialized == AAUDIO_STREAM_STATE_UNINITIALIZED, ERRMSG);
332*05767d91SRobert Wu static_assert((int32_t)StreamState::Unknown == AAUDIO_STREAM_STATE_UNKNOWN, ERRMSG);
333*05767d91SRobert Wu static_assert((int32_t)StreamState::Open == AAUDIO_STREAM_STATE_OPEN, ERRMSG);
334*05767d91SRobert Wu static_assert((int32_t)StreamState::Starting == AAUDIO_STREAM_STATE_STARTING, ERRMSG);
335*05767d91SRobert Wu static_assert((int32_t)StreamState::Started == AAUDIO_STREAM_STATE_STARTED, ERRMSG);
336*05767d91SRobert Wu static_assert((int32_t)StreamState::Pausing == AAUDIO_STREAM_STATE_PAUSING, ERRMSG);
337*05767d91SRobert Wu static_assert((int32_t)StreamState::Paused == AAUDIO_STREAM_STATE_PAUSED, ERRMSG);
338*05767d91SRobert Wu static_assert((int32_t)StreamState::Flushing == AAUDIO_STREAM_STATE_FLUSHING, ERRMSG);
339*05767d91SRobert Wu static_assert((int32_t)StreamState::Flushed == AAUDIO_STREAM_STATE_FLUSHED, ERRMSG);
340*05767d91SRobert Wu static_assert((int32_t)StreamState::Stopping == AAUDIO_STREAM_STATE_STOPPING, ERRMSG);
341*05767d91SRobert Wu static_assert((int32_t)StreamState::Stopped == AAUDIO_STREAM_STATE_STOPPED, ERRMSG);
342*05767d91SRobert Wu static_assert((int32_t)StreamState::Closing == AAUDIO_STREAM_STATE_CLOSING, ERRMSG);
343*05767d91SRobert Wu static_assert((int32_t)StreamState::Closed == AAUDIO_STREAM_STATE_CLOSED, ERRMSG);
344*05767d91SRobert Wu static_assert((int32_t)StreamState::Disconnected == AAUDIO_STREAM_STATE_DISCONNECTED, ERRMSG);
345*05767d91SRobert Wu
346*05767d91SRobert Wu static_assert((int32_t)Direction::Output == AAUDIO_DIRECTION_OUTPUT, ERRMSG);
347*05767d91SRobert Wu static_assert((int32_t)Direction::Input == AAUDIO_DIRECTION_INPUT, ERRMSG);
348*05767d91SRobert Wu
349*05767d91SRobert Wu static_assert((int32_t)AudioFormat::Invalid == AAUDIO_FORMAT_INVALID, ERRMSG);
350*05767d91SRobert Wu static_assert((int32_t)AudioFormat::Unspecified == AAUDIO_FORMAT_UNSPECIFIED, ERRMSG);
351*05767d91SRobert Wu static_assert((int32_t)AudioFormat::I16 == AAUDIO_FORMAT_PCM_I16, ERRMSG);
352*05767d91SRobert Wu static_assert((int32_t)AudioFormat::Float == AAUDIO_FORMAT_PCM_FLOAT, ERRMSG);
353*05767d91SRobert Wu
354*05767d91SRobert Wu static_assert((int32_t)DataCallbackResult::Continue == AAUDIO_CALLBACK_RESULT_CONTINUE, ERRMSG);
355*05767d91SRobert Wu static_assert((int32_t)DataCallbackResult::Stop == AAUDIO_CALLBACK_RESULT_STOP, ERRMSG);
356*05767d91SRobert Wu
357*05767d91SRobert Wu static_assert((int32_t)Result::OK == AAUDIO_OK, ERRMSG);
358*05767d91SRobert Wu static_assert((int32_t)Result::ErrorBase == AAUDIO_ERROR_BASE, ERRMSG);
359*05767d91SRobert Wu static_assert((int32_t)Result::ErrorDisconnected == AAUDIO_ERROR_DISCONNECTED, ERRMSG);
360*05767d91SRobert Wu static_assert((int32_t)Result::ErrorIllegalArgument == AAUDIO_ERROR_ILLEGAL_ARGUMENT, ERRMSG);
361*05767d91SRobert Wu static_assert((int32_t)Result::ErrorInternal == AAUDIO_ERROR_INTERNAL, ERRMSG);
362*05767d91SRobert Wu static_assert((int32_t)Result::ErrorInvalidState == AAUDIO_ERROR_INVALID_STATE, ERRMSG);
363*05767d91SRobert Wu static_assert((int32_t)Result::ErrorInvalidHandle == AAUDIO_ERROR_INVALID_HANDLE, ERRMSG);
364*05767d91SRobert Wu static_assert((int32_t)Result::ErrorUnimplemented == AAUDIO_ERROR_UNIMPLEMENTED, ERRMSG);
365*05767d91SRobert Wu static_assert((int32_t)Result::ErrorUnavailable == AAUDIO_ERROR_UNAVAILABLE, ERRMSG);
366*05767d91SRobert Wu static_assert((int32_t)Result::ErrorNoFreeHandles == AAUDIO_ERROR_NO_FREE_HANDLES, ERRMSG);
367*05767d91SRobert Wu static_assert((int32_t)Result::ErrorNoMemory == AAUDIO_ERROR_NO_MEMORY, ERRMSG);
368*05767d91SRobert Wu static_assert((int32_t)Result::ErrorNull == AAUDIO_ERROR_NULL, ERRMSG);
369*05767d91SRobert Wu static_assert((int32_t)Result::ErrorTimeout == AAUDIO_ERROR_TIMEOUT, ERRMSG);
370*05767d91SRobert Wu static_assert((int32_t)Result::ErrorWouldBlock == AAUDIO_ERROR_WOULD_BLOCK, ERRMSG);
371*05767d91SRobert Wu static_assert((int32_t)Result::ErrorInvalidFormat == AAUDIO_ERROR_INVALID_FORMAT, ERRMSG);
372*05767d91SRobert Wu static_assert((int32_t)Result::ErrorOutOfRange == AAUDIO_ERROR_OUT_OF_RANGE, ERRMSG);
373*05767d91SRobert Wu static_assert((int32_t)Result::ErrorNoService == AAUDIO_ERROR_NO_SERVICE, ERRMSG);
374*05767d91SRobert Wu static_assert((int32_t)Result::ErrorInvalidRate == AAUDIO_ERROR_INVALID_RATE, ERRMSG);
375*05767d91SRobert Wu
376*05767d91SRobert Wu static_assert((int32_t)SharingMode::Exclusive == AAUDIO_SHARING_MODE_EXCLUSIVE, ERRMSG);
377*05767d91SRobert Wu static_assert((int32_t)SharingMode::Shared == AAUDIO_SHARING_MODE_SHARED, ERRMSG);
378*05767d91SRobert Wu
379*05767d91SRobert Wu static_assert((int32_t)PerformanceMode::None == AAUDIO_PERFORMANCE_MODE_NONE, ERRMSG);
380*05767d91SRobert Wu static_assert((int32_t)PerformanceMode::PowerSaving
381*05767d91SRobert Wu == AAUDIO_PERFORMANCE_MODE_POWER_SAVING, ERRMSG);
382*05767d91SRobert Wu static_assert((int32_t)PerformanceMode::LowLatency
383*05767d91SRobert Wu == AAUDIO_PERFORMANCE_MODE_LOW_LATENCY, ERRMSG);
384*05767d91SRobert Wu
385*05767d91SRobert Wu // The aaudio_ usage, content and input_preset types were added in NDK 17,
386*05767d91SRobert Wu // which is the first version to support Android Pie (API 28).
387*05767d91SRobert Wu #if __NDK_MAJOR__ >= 17
388*05767d91SRobert Wu
389*05767d91SRobert Wu ASSERT_INT32(aaudio_usage_t);
390*05767d91SRobert Wu ASSERT_INT32(aaudio_content_type_t);
391*05767d91SRobert Wu ASSERT_INT32(aaudio_input_preset_t);
392*05767d91SRobert Wu
393*05767d91SRobert Wu static_assert((int32_t)Usage::Media == AAUDIO_USAGE_MEDIA, ERRMSG);
394*05767d91SRobert Wu static_assert((int32_t)Usage::VoiceCommunication == AAUDIO_USAGE_VOICE_COMMUNICATION, ERRMSG);
395*05767d91SRobert Wu static_assert((int32_t)Usage::VoiceCommunicationSignalling
396*05767d91SRobert Wu == AAUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING, ERRMSG);
397*05767d91SRobert Wu static_assert((int32_t)Usage::Alarm == AAUDIO_USAGE_ALARM, ERRMSG);
398*05767d91SRobert Wu static_assert((int32_t)Usage::Notification == AAUDIO_USAGE_NOTIFICATION, ERRMSG);
399*05767d91SRobert Wu static_assert((int32_t)Usage::NotificationRingtone == AAUDIO_USAGE_NOTIFICATION_RINGTONE, ERRMSG);
400*05767d91SRobert Wu static_assert((int32_t)Usage::NotificationEvent == AAUDIO_USAGE_NOTIFICATION_EVENT, ERRMSG);
401*05767d91SRobert Wu static_assert((int32_t)Usage::AssistanceAccessibility == AAUDIO_USAGE_ASSISTANCE_ACCESSIBILITY, ERRMSG);
402*05767d91SRobert Wu static_assert((int32_t)Usage::AssistanceNavigationGuidance
403*05767d91SRobert Wu == AAUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE, ERRMSG);
404*05767d91SRobert Wu static_assert((int32_t)Usage::AssistanceSonification == AAUDIO_USAGE_ASSISTANCE_SONIFICATION, ERRMSG);
405*05767d91SRobert Wu static_assert((int32_t)Usage::Game == AAUDIO_USAGE_GAME, ERRMSG);
406*05767d91SRobert Wu static_assert((int32_t)Usage::Assistant == AAUDIO_USAGE_ASSISTANT, ERRMSG);
407*05767d91SRobert Wu
408*05767d91SRobert Wu static_assert((int32_t)ContentType::Speech == AAUDIO_CONTENT_TYPE_SPEECH, ERRMSG);
409*05767d91SRobert Wu static_assert((int32_t)ContentType::Music == AAUDIO_CONTENT_TYPE_MUSIC, ERRMSG);
410*05767d91SRobert Wu static_assert((int32_t)ContentType::Movie == AAUDIO_CONTENT_TYPE_MOVIE, ERRMSG);
411*05767d91SRobert Wu static_assert((int32_t)ContentType::Sonification == AAUDIO_CONTENT_TYPE_SONIFICATION, ERRMSG);
412*05767d91SRobert Wu
413*05767d91SRobert Wu static_assert((int32_t)InputPreset::Generic == AAUDIO_INPUT_PRESET_GENERIC, ERRMSG);
414*05767d91SRobert Wu static_assert((int32_t)InputPreset::Camcorder == AAUDIO_INPUT_PRESET_CAMCORDER, ERRMSG);
415*05767d91SRobert Wu static_assert((int32_t)InputPreset::VoiceRecognition == AAUDIO_INPUT_PRESET_VOICE_RECOGNITION, ERRMSG);
416*05767d91SRobert Wu static_assert((int32_t)InputPreset::VoiceCommunication
417*05767d91SRobert Wu == AAUDIO_INPUT_PRESET_VOICE_COMMUNICATION, ERRMSG);
418*05767d91SRobert Wu static_assert((int32_t)InputPreset::Unprocessed == AAUDIO_INPUT_PRESET_UNPROCESSED, ERRMSG);
419*05767d91SRobert Wu
420*05767d91SRobert Wu static_assert((int32_t)SessionId::None == AAUDIO_SESSION_ID_NONE, ERRMSG);
421*05767d91SRobert Wu static_assert((int32_t)SessionId::Allocate == AAUDIO_SESSION_ID_ALLOCATE, ERRMSG);
422*05767d91SRobert Wu
423*05767d91SRobert Wu #endif // __NDK_MAJOR__ >= 17
424*05767d91SRobert Wu
425*05767d91SRobert Wu // aaudio_allowed_capture_policy_t was added in NDK 20,
426*05767d91SRobert Wu // which is the first version to support Android Q (API 29).
427*05767d91SRobert Wu #if __NDK_MAJOR__ >= 20
428*05767d91SRobert Wu
429*05767d91SRobert Wu ASSERT_INT32(aaudio_allowed_capture_policy_t);
430*05767d91SRobert Wu
431*05767d91SRobert Wu static_assert((int32_t)AllowedCapturePolicy::Unspecified == AAUDIO_UNSPECIFIED, ERRMSG);
432*05767d91SRobert Wu static_assert((int32_t)AllowedCapturePolicy::All == AAUDIO_ALLOW_CAPTURE_BY_ALL, ERRMSG);
433*05767d91SRobert Wu static_assert((int32_t)AllowedCapturePolicy::System == AAUDIO_ALLOW_CAPTURE_BY_SYSTEM, ERRMSG);
434*05767d91SRobert Wu static_assert((int32_t)AllowedCapturePolicy::None == AAUDIO_ALLOW_CAPTURE_BY_NONE, ERRMSG);
435*05767d91SRobert Wu
436*05767d91SRobert Wu #endif // __NDK_MAJOR__ >= 20
437*05767d91SRobert Wu
438*05767d91SRobert Wu // The aaudio channel masks and spatialization behavior were added in NDK 24,
439*05767d91SRobert Wu // which is the first version to support Android SC_V2 (API 32).
440*05767d91SRobert Wu #if __NDK_MAJOR__ >= 24
441*05767d91SRobert Wu
442*05767d91SRobert Wu ASSERT_UINT32(aaudio_channel_mask_t);
443*05767d91SRobert Wu
444*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::FrontLeft == AAUDIO_CHANNEL_FRONT_LEFT, ERRMSG);
445*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::FrontRight == AAUDIO_CHANNEL_FRONT_RIGHT, ERRMSG);
446*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::FrontCenter == AAUDIO_CHANNEL_FRONT_CENTER, ERRMSG);
447*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::LowFrequency == AAUDIO_CHANNEL_LOW_FREQUENCY, ERRMSG);
448*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::BackLeft == AAUDIO_CHANNEL_BACK_LEFT, ERRMSG);
449*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::BackRight == AAUDIO_CHANNEL_BACK_RIGHT, ERRMSG);
450*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::FrontLeftOfCenter == AAUDIO_CHANNEL_FRONT_LEFT_OF_CENTER, ERRMSG);
451*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::FrontRightOfCenter == AAUDIO_CHANNEL_FRONT_RIGHT_OF_CENTER, ERRMSG);
452*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::BackCenter == AAUDIO_CHANNEL_BACK_CENTER, ERRMSG);
453*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::SideLeft == AAUDIO_CHANNEL_SIDE_LEFT, ERRMSG);
454*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::SideRight == AAUDIO_CHANNEL_SIDE_RIGHT, ERRMSG);
455*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::TopCenter == AAUDIO_CHANNEL_TOP_CENTER, ERRMSG);
456*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::TopFrontLeft == AAUDIO_CHANNEL_TOP_FRONT_LEFT, ERRMSG);
457*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::TopFrontCenter == AAUDIO_CHANNEL_TOP_FRONT_CENTER, ERRMSG);
458*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::TopFrontRight == AAUDIO_CHANNEL_TOP_FRONT_RIGHT, ERRMSG);
459*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::TopBackLeft == AAUDIO_CHANNEL_TOP_BACK_LEFT, ERRMSG);
460*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::TopBackCenter == AAUDIO_CHANNEL_TOP_BACK_CENTER, ERRMSG);
461*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::TopBackRight == AAUDIO_CHANNEL_TOP_BACK_RIGHT, ERRMSG);
462*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::TopSideLeft == AAUDIO_CHANNEL_TOP_SIDE_LEFT, ERRMSG);
463*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::TopSideRight == AAUDIO_CHANNEL_TOP_SIDE_RIGHT, ERRMSG);
464*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::BottomFrontLeft == AAUDIO_CHANNEL_BOTTOM_FRONT_LEFT, ERRMSG);
465*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::BottomFrontCenter == AAUDIO_CHANNEL_BOTTOM_FRONT_CENTER, ERRMSG);
466*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::BottomFrontRight == AAUDIO_CHANNEL_BOTTOM_FRONT_RIGHT, ERRMSG);
467*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::LowFrequency2 == AAUDIO_CHANNEL_LOW_FREQUENCY_2, ERRMSG);
468*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::FrontWideLeft == AAUDIO_CHANNEL_FRONT_WIDE_LEFT, ERRMSG);
469*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::FrontWideRight == AAUDIO_CHANNEL_FRONT_WIDE_RIGHT, ERRMSG);
470*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::Mono == AAUDIO_CHANNEL_MONO, ERRMSG);
471*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::Stereo == AAUDIO_CHANNEL_STEREO, ERRMSG);
472*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::CM2Point1 == AAUDIO_CHANNEL_2POINT1, ERRMSG);
473*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::Tri == AAUDIO_CHANNEL_TRI, ERRMSG);
474*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::TriBack == AAUDIO_CHANNEL_TRI_BACK, ERRMSG);
475*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::CM3Point1 == AAUDIO_CHANNEL_3POINT1, ERRMSG);
476*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::CM2Point0Point2 == AAUDIO_CHANNEL_2POINT0POINT2, ERRMSG);
477*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::CM2Point1Point2 == AAUDIO_CHANNEL_2POINT1POINT2, ERRMSG);
478*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::CM3Point0Point2 == AAUDIO_CHANNEL_3POINT0POINT2, ERRMSG);
479*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::CM3Point1Point2 == AAUDIO_CHANNEL_3POINT1POINT2, ERRMSG);
480*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::Quad == AAUDIO_CHANNEL_QUAD, ERRMSG);
481*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::QuadSide == AAUDIO_CHANNEL_QUAD_SIDE, ERRMSG);
482*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::Surround == AAUDIO_CHANNEL_SURROUND, ERRMSG);
483*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::Penta == AAUDIO_CHANNEL_PENTA, ERRMSG);
484*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::CM5Point1 == AAUDIO_CHANNEL_5POINT1, ERRMSG);
485*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::CM5Point1Side == AAUDIO_CHANNEL_5POINT1_SIDE, ERRMSG);
486*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::CM6Point1 == AAUDIO_CHANNEL_6POINT1, ERRMSG);
487*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::CM7Point1 == AAUDIO_CHANNEL_7POINT1, ERRMSG);
488*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::CM5Point1Point2 == AAUDIO_CHANNEL_5POINT1POINT2, ERRMSG);
489*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::CM5Point1Point4 == AAUDIO_CHANNEL_5POINT1POINT4, ERRMSG);
490*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::CM7Point1Point2 == AAUDIO_CHANNEL_7POINT1POINT2, ERRMSG);
491*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::CM7Point1Point4 == AAUDIO_CHANNEL_7POINT1POINT4, ERRMSG);
492*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::CM9Point1Point4 == AAUDIO_CHANNEL_9POINT1POINT4, ERRMSG);
493*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::CM9Point1Point6 == AAUDIO_CHANNEL_9POINT1POINT6, ERRMSG);
494*05767d91SRobert Wu static_assert((uint32_t)ChannelMask::FrontBack == AAUDIO_CHANNEL_FRONT_BACK, ERRMSG);
495*05767d91SRobert Wu
496*05767d91SRobert Wu ASSERT_INT32(aaudio_spatialization_behavior_t);
497*05767d91SRobert Wu
498*05767d91SRobert Wu static_assert((int32_t)SpatializationBehavior::Unspecified == AAUDIO_UNSPECIFIED, ERRMSG);
499*05767d91SRobert Wu static_assert((int32_t)SpatializationBehavior::Auto == AAUDIO_SPATIALIZATION_BEHAVIOR_AUTO, ERRMSG);
500*05767d91SRobert Wu static_assert((int32_t)SpatializationBehavior::Never == AAUDIO_SPATIALIZATION_BEHAVIOR_NEVER, ERRMSG);
501*05767d91SRobert Wu
502*05767d91SRobert Wu #endif
503*05767d91SRobert Wu
504*05767d91SRobert Wu #endif // AAUDIO_AAUDIO_H
505*05767d91SRobert Wu
506*05767d91SRobert Wu } // namespace oboe
507