xref: /aosp_15_r20/external/oboe/src/aaudio/AAudioLoader.h (revision 05767d913155b055644481607e6fa1e35e2fe72c)
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 #ifndef OBOE_AAUDIO_LOADER_H_
18*05767d91SRobert Wu #define OBOE_AAUDIO_LOADER_H_
19*05767d91SRobert Wu 
20*05767d91SRobert Wu #include <unistd.h>
21*05767d91SRobert Wu #include "oboe/Definitions.h"
22*05767d91SRobert Wu 
23*05767d91SRobert Wu // If the NDK is before O then define this in your build
24*05767d91SRobert Wu // so that AAudio.h will not be included.
25*05767d91SRobert Wu #ifdef OBOE_NO_INCLUDE_AAUDIO
26*05767d91SRobert Wu 
27*05767d91SRobert Wu // Define missing types from AAudio.h
28*05767d91SRobert Wu typedef int32_t aaudio_stream_state_t;
29*05767d91SRobert Wu typedef int32_t aaudio_direction_t;
30*05767d91SRobert Wu typedef int32_t aaudio_format_t;
31*05767d91SRobert Wu typedef int32_t aaudio_data_callback_result_t;
32*05767d91SRobert Wu typedef int32_t aaudio_result_t;
33*05767d91SRobert Wu typedef int32_t aaudio_sharing_mode_t;
34*05767d91SRobert Wu typedef int32_t aaudio_performance_mode_t;
35*05767d91SRobert Wu 
36*05767d91SRobert Wu typedef struct AAudioStreamStruct         AAudioStream;
37*05767d91SRobert Wu typedef struct AAudioStreamBuilderStruct  AAudioStreamBuilder;
38*05767d91SRobert Wu 
39*05767d91SRobert Wu typedef aaudio_data_callback_result_t (*AAudioStream_dataCallback)(
40*05767d91SRobert Wu         AAudioStream *stream,
41*05767d91SRobert Wu         void *userData,
42*05767d91SRobert Wu         void *audioData,
43*05767d91SRobert Wu         int32_t numFrames);
44*05767d91SRobert Wu 
45*05767d91SRobert Wu typedef void (*AAudioStream_errorCallback)(
46*05767d91SRobert Wu         AAudioStream *stream,
47*05767d91SRobert Wu         void *userData,
48*05767d91SRobert Wu         aaudio_result_t error);
49*05767d91SRobert Wu 
50*05767d91SRobert Wu // These were defined in P
51*05767d91SRobert Wu typedef int32_t aaudio_usage_t;
52*05767d91SRobert Wu typedef int32_t aaudio_content_type_t;
53*05767d91SRobert Wu typedef int32_t aaudio_input_preset_t;
54*05767d91SRobert Wu typedef int32_t aaudio_session_id_t;
55*05767d91SRobert Wu 
56*05767d91SRobert Wu // There are a few definitions used by Oboe.
57*05767d91SRobert Wu #define AAUDIO_OK                      static_cast<aaudio_result_t>(Result::OK)
58*05767d91SRobert Wu #define AAUDIO_ERROR_TIMEOUT           static_cast<aaudio_result_t>(Result::ErrorTimeout)
59*05767d91SRobert Wu #define AAUDIO_STREAM_STATE_STARTING   static_cast<aaudio_stream_state_t>(StreamState::Starting)
60*05767d91SRobert Wu #define AAUDIO_STREAM_STATE_STARTED    static_cast<aaudio_stream_state_t>(StreamState::Started)
61*05767d91SRobert Wu #else
62*05767d91SRobert Wu #include <aaudio/AAudio.h>
63*05767d91SRobert Wu #endif
64*05767d91SRobert Wu 
65*05767d91SRobert Wu #ifndef __NDK_MAJOR__
66*05767d91SRobert Wu #define __NDK_MAJOR__ 0
67*05767d91SRobert Wu #endif
68*05767d91SRobert Wu 
69*05767d91SRobert Wu #if __NDK_MAJOR__ < 24
70*05767d91SRobert Wu // Defined in SC_V2
71*05767d91SRobert Wu typedef uint32_t aaudio_channel_mask_t;
72*05767d91SRobert Wu typedef int32_t aaudio_spatialization_behavior_t;
73*05767d91SRobert Wu #endif
74*05767d91SRobert Wu 
75*05767d91SRobert Wu #ifndef __ANDROID_API_Q__
76*05767d91SRobert Wu #define __ANDROID_API_Q__ 29
77*05767d91SRobert Wu #endif
78*05767d91SRobert Wu 
79*05767d91SRobert Wu #ifndef __ANDROID_API_R__
80*05767d91SRobert Wu #define __ANDROID_API_R__ 30
81*05767d91SRobert Wu #endif
82*05767d91SRobert Wu 
83*05767d91SRobert Wu #ifndef __ANDROID_API_S__
84*05767d91SRobert Wu #define __ANDROID_API_S__ 31
85*05767d91SRobert Wu #endif
86*05767d91SRobert Wu 
87*05767d91SRobert Wu #ifndef __ANDROID_API_S_V2__
88*05767d91SRobert Wu #define __ANDROID_API_S_V2__ 32
89*05767d91SRobert Wu #endif
90*05767d91SRobert Wu 
91*05767d91SRobert Wu #ifndef __ANDROID_API_U__
92*05767d91SRobert Wu #define __ANDROID_API_U__ 34
93*05767d91SRobert Wu #endif
94*05767d91SRobert Wu 
95*05767d91SRobert Wu namespace oboe {
96*05767d91SRobert Wu 
97*05767d91SRobert Wu /**
98*05767d91SRobert Wu  * The AAudio API was not available in early versions of Android.
99*05767d91SRobert Wu  * To avoid linker errors, we dynamically link with the functions by name using dlsym().
100*05767d91SRobert Wu  * On older versions this linkage will safely fail.
101*05767d91SRobert Wu  */
102*05767d91SRobert Wu class AAudioLoader {
103*05767d91SRobert Wu   public:
104*05767d91SRobert Wu     // Use signatures for common functions.
105*05767d91SRobert Wu     // Key to letter abbreviations.
106*05767d91SRobert Wu     // S = Stream
107*05767d91SRobert Wu     // B = Builder
108*05767d91SRobert Wu     // I = int32_t
109*05767d91SRobert Wu     // L = int64_t
110*05767d91SRobert Wu     // T = sTate
111*05767d91SRobert Wu     // K = clocKid_t
112*05767d91SRobert Wu     // P = Pointer to following data type
113*05767d91SRobert Wu     // C = Const prefix
114*05767d91SRobert Wu     // H = cHar
115*05767d91SRobert Wu     // U = uint32_t
116*05767d91SRobert Wu     // O = bOol
117*05767d91SRobert Wu 
118*05767d91SRobert Wu     typedef int32_t  (*signature_I_PPB)(AAudioStreamBuilder **builder);
119*05767d91SRobert Wu 
120*05767d91SRobert Wu     typedef const char * (*signature_CPH_I)(int32_t);
121*05767d91SRobert Wu 
122*05767d91SRobert Wu     typedef int32_t (*signature_I_PBPPS)(AAudioStreamBuilder *,
123*05767d91SRobert Wu                                       AAudioStream **stream);  // AAudioStreamBuilder_open()
124*05767d91SRobert Wu 
125*05767d91SRobert Wu     typedef int32_t (*signature_I_PB)(AAudioStreamBuilder *);  // AAudioStreamBuilder_delete()
126*05767d91SRobert Wu     // AAudioStreamBuilder_setSampleRate()
127*05767d91SRobert Wu     typedef void    (*signature_V_PBI)(AAudioStreamBuilder *, int32_t);
128*05767d91SRobert Wu 
129*05767d91SRobert Wu     // AAudioStreamBuilder_setChannelMask()
130*05767d91SRobert Wu     typedef void    (*signature_V_PBU)(AAudioStreamBuilder *, uint32_t);
131*05767d91SRobert Wu 
132*05767d91SRobert Wu     typedef void    (*signature_V_PBCPH)(AAudioStreamBuilder *, const char *);
133*05767d91SRobert Wu 
134*05767d91SRobert Wu     // AAudioStreamBuilder_setPrivacySensitive
135*05767d91SRobert Wu     typedef void    (*signature_V_PBO)(AAudioStreamBuilder *, bool);
136*05767d91SRobert Wu 
137*05767d91SRobert Wu     typedef int32_t (*signature_I_PS)(AAudioStream *);  // AAudioStream_getSampleRate()
138*05767d91SRobert Wu     typedef int64_t (*signature_L_PS)(AAudioStream *);  // AAudioStream_getFramesRead()
139*05767d91SRobert Wu     // AAudioStream_setBufferSizeInFrames()
140*05767d91SRobert Wu     typedef int32_t (*signature_I_PSI)(AAudioStream *, int32_t);
141*05767d91SRobert Wu 
142*05767d91SRobert Wu     typedef void    (*signature_V_PBPDPV)(AAudioStreamBuilder *,
143*05767d91SRobert Wu                                           AAudioStream_dataCallback,
144*05767d91SRobert Wu                                           void *);
145*05767d91SRobert Wu 
146*05767d91SRobert Wu     typedef void    (*signature_V_PBPEPV)(AAudioStreamBuilder *,
147*05767d91SRobert Wu                                           AAudioStream_errorCallback,
148*05767d91SRobert Wu                                           void *);
149*05767d91SRobert Wu 
150*05767d91SRobert Wu     typedef aaudio_format_t (*signature_F_PS)(AAudioStream *stream);
151*05767d91SRobert Wu 
152*05767d91SRobert Wu     typedef int32_t (*signature_I_PSPVIL)(AAudioStream *, void *, int32_t, int64_t);
153*05767d91SRobert Wu     typedef int32_t (*signature_I_PSCPVIL)(AAudioStream *, const void *, int32_t, int64_t);
154*05767d91SRobert Wu 
155*05767d91SRobert Wu     typedef int32_t (*signature_I_PSTPTL)(AAudioStream *,
156*05767d91SRobert Wu                                           aaudio_stream_state_t,
157*05767d91SRobert Wu                                           aaudio_stream_state_t *,
158*05767d91SRobert Wu                                           int64_t);
159*05767d91SRobert Wu 
160*05767d91SRobert Wu     typedef int32_t (*signature_I_PSKPLPL)(AAudioStream *, clockid_t, int64_t *, int64_t *);
161*05767d91SRobert Wu 
162*05767d91SRobert Wu     typedef bool    (*signature_O_PS)(AAudioStream *);
163*05767d91SRobert Wu 
164*05767d91SRobert Wu     typedef uint32_t (*signature_U_PS)(AAudioStream *);
165*05767d91SRobert Wu 
166*05767d91SRobert Wu     static AAudioLoader* getInstance(); // singleton
167*05767d91SRobert Wu 
168*05767d91SRobert Wu     /**
169*05767d91SRobert Wu      * Open the AAudio shared library and load the function pointers.
170*05767d91SRobert Wu      * This can be called multiple times.
171*05767d91SRobert Wu      * It should only be called from one thread.
172*05767d91SRobert Wu      *
173*05767d91SRobert Wu      * The destructor will clean up after the open.
174*05767d91SRobert Wu      *
175*05767d91SRobert Wu      * @return 0 if successful or negative error.
176*05767d91SRobert Wu      */
177*05767d91SRobert Wu     int open();
178*05767d91SRobert Wu 
getLibHandle()179*05767d91SRobert Wu     void *getLibHandle() const { return mLibHandle; }
180*05767d91SRobert Wu 
181*05767d91SRobert Wu     // Function pointers into the AAudio shared library.
182*05767d91SRobert Wu     signature_I_PPB   createStreamBuilder = nullptr;
183*05767d91SRobert Wu 
184*05767d91SRobert Wu     signature_I_PBPPS builder_openStream = nullptr;
185*05767d91SRobert Wu 
186*05767d91SRobert Wu     signature_V_PBI builder_setBufferCapacityInFrames = nullptr;
187*05767d91SRobert Wu     signature_V_PBI builder_setChannelCount = nullptr;
188*05767d91SRobert Wu     signature_V_PBI builder_setDeviceId = nullptr;
189*05767d91SRobert Wu     signature_V_PBI builder_setDirection = nullptr;
190*05767d91SRobert Wu     signature_V_PBI builder_setFormat = nullptr;
191*05767d91SRobert Wu     signature_V_PBI builder_setFramesPerDataCallback = nullptr;
192*05767d91SRobert Wu     signature_V_PBI builder_setPerformanceMode = nullptr;
193*05767d91SRobert Wu     signature_V_PBI builder_setSampleRate = nullptr;
194*05767d91SRobert Wu     signature_V_PBI builder_setSharingMode = nullptr;
195*05767d91SRobert Wu     signature_V_PBU builder_setChannelMask = nullptr;
196*05767d91SRobert Wu 
197*05767d91SRobert Wu     signature_V_PBI builder_setUsage = nullptr;
198*05767d91SRobert Wu     signature_V_PBI builder_setContentType = nullptr;
199*05767d91SRobert Wu     signature_V_PBI builder_setInputPreset = nullptr;
200*05767d91SRobert Wu     signature_V_PBI builder_setSessionId = nullptr;
201*05767d91SRobert Wu 
202*05767d91SRobert Wu     signature_V_PBO builder_setPrivacySensitive = nullptr;
203*05767d91SRobert Wu     signature_V_PBI builder_setAllowedCapturePolicy = nullptr;
204*05767d91SRobert Wu 
205*05767d91SRobert Wu     signature_V_PBCPH builder_setPackageName = nullptr;
206*05767d91SRobert Wu     signature_V_PBCPH builder_setAttributionTag = nullptr;
207*05767d91SRobert Wu 
208*05767d91SRobert Wu     signature_V_PBO builder_setIsContentSpatialized = nullptr;
209*05767d91SRobert Wu     signature_V_PBI builder_setSpatializationBehavior = nullptr;
210*05767d91SRobert Wu 
211*05767d91SRobert Wu     signature_V_PBPDPV  builder_setDataCallback = nullptr;
212*05767d91SRobert Wu     signature_V_PBPEPV  builder_setErrorCallback = nullptr;
213*05767d91SRobert Wu 
214*05767d91SRobert Wu     signature_I_PB      builder_delete = nullptr;
215*05767d91SRobert Wu 
216*05767d91SRobert Wu     signature_F_PS      stream_getFormat = nullptr;
217*05767d91SRobert Wu 
218*05767d91SRobert Wu     signature_I_PSPVIL  stream_read = nullptr;
219*05767d91SRobert Wu     signature_I_PSCPVIL stream_write = nullptr;
220*05767d91SRobert Wu 
221*05767d91SRobert Wu     signature_I_PSTPTL  stream_waitForStateChange = nullptr;
222*05767d91SRobert Wu 
223*05767d91SRobert Wu     signature_I_PSKPLPL stream_getTimestamp = nullptr;
224*05767d91SRobert Wu 
225*05767d91SRobert Wu     signature_I_PS   stream_release = nullptr;
226*05767d91SRobert Wu     signature_I_PS   stream_close = nullptr;
227*05767d91SRobert Wu 
228*05767d91SRobert Wu     signature_I_PS   stream_getChannelCount = nullptr;
229*05767d91SRobert Wu     signature_I_PS   stream_getDeviceId = nullptr;
230*05767d91SRobert Wu 
231*05767d91SRobert Wu     signature_I_PS   stream_getBufferSize = nullptr;
232*05767d91SRobert Wu     signature_I_PS   stream_getBufferCapacity = nullptr;
233*05767d91SRobert Wu     signature_I_PS   stream_getFramesPerBurst = nullptr;
234*05767d91SRobert Wu     signature_I_PS   stream_getState = nullptr;
235*05767d91SRobert Wu     signature_I_PS   stream_getPerformanceMode = nullptr;
236*05767d91SRobert Wu     signature_I_PS   stream_getSampleRate = nullptr;
237*05767d91SRobert Wu     signature_I_PS   stream_getSharingMode = nullptr;
238*05767d91SRobert Wu     signature_I_PS   stream_getXRunCount = nullptr;
239*05767d91SRobert Wu 
240*05767d91SRobert Wu     signature_I_PSI  stream_setBufferSize = nullptr;
241*05767d91SRobert Wu     signature_I_PS   stream_requestStart = nullptr;
242*05767d91SRobert Wu     signature_I_PS   stream_requestPause = nullptr;
243*05767d91SRobert Wu     signature_I_PS   stream_requestFlush = nullptr;
244*05767d91SRobert Wu     signature_I_PS   stream_requestStop = nullptr;
245*05767d91SRobert Wu 
246*05767d91SRobert Wu     signature_L_PS   stream_getFramesRead = nullptr;
247*05767d91SRobert Wu     signature_L_PS   stream_getFramesWritten = nullptr;
248*05767d91SRobert Wu 
249*05767d91SRobert Wu     signature_CPH_I  convertResultToText = nullptr;
250*05767d91SRobert Wu 
251*05767d91SRobert Wu     signature_I_PS   stream_getUsage = nullptr;
252*05767d91SRobert Wu     signature_I_PS   stream_getContentType = nullptr;
253*05767d91SRobert Wu     signature_I_PS   stream_getInputPreset = nullptr;
254*05767d91SRobert Wu     signature_I_PS   stream_getSessionId = nullptr;
255*05767d91SRobert Wu 
256*05767d91SRobert Wu     signature_O_PS   stream_isPrivacySensitive = nullptr;
257*05767d91SRobert Wu     signature_I_PS   stream_getAllowedCapturePolicy = nullptr;
258*05767d91SRobert Wu 
259*05767d91SRobert Wu     signature_U_PS   stream_getChannelMask = nullptr;
260*05767d91SRobert Wu 
261*05767d91SRobert Wu     signature_O_PS   stream_isContentSpatialized = nullptr;
262*05767d91SRobert Wu     signature_I_PS   stream_getSpatializationBehavior = nullptr;
263*05767d91SRobert Wu 
264*05767d91SRobert Wu     signature_I_PS   stream_getHardwareChannelCount = nullptr;
265*05767d91SRobert Wu     signature_I_PS   stream_getHardwareSampleRate = nullptr;
266*05767d91SRobert Wu     signature_F_PS   stream_getHardwareFormat = nullptr;
267*05767d91SRobert Wu 
268*05767d91SRobert Wu   private:
AAudioLoader()269*05767d91SRobert Wu     AAudioLoader() {}
270*05767d91SRobert Wu     ~AAudioLoader();
271*05767d91SRobert Wu 
272*05767d91SRobert Wu     // Load function pointers for specific signatures.
273*05767d91SRobert Wu     signature_I_PPB     load_I_PPB(const char *name);
274*05767d91SRobert Wu     signature_CPH_I     load_CPH_I(const char *name);
275*05767d91SRobert Wu     signature_V_PBI     load_V_PBI(const char *name);
276*05767d91SRobert Wu     signature_V_PBCPH   load_V_PBCPH(const char *name);
277*05767d91SRobert Wu     signature_V_PBPDPV  load_V_PBPDPV(const char *name);
278*05767d91SRobert Wu     signature_V_PBPEPV  load_V_PBPEPV(const char *name);
279*05767d91SRobert Wu     signature_I_PB      load_I_PB(const char *name);
280*05767d91SRobert Wu     signature_I_PBPPS   load_I_PBPPS(const char *name);
281*05767d91SRobert Wu     signature_I_PS      load_I_PS(const char *name);
282*05767d91SRobert Wu     signature_L_PS      load_L_PS(const char *name);
283*05767d91SRobert Wu     signature_F_PS      load_F_PS(const char *name);
284*05767d91SRobert Wu     signature_O_PS      load_O_PS(const char *name);
285*05767d91SRobert Wu     signature_I_PSI     load_I_PSI(const char *name);
286*05767d91SRobert Wu     signature_I_PSPVIL  load_I_PSPVIL(const char *name);
287*05767d91SRobert Wu     signature_I_PSCPVIL load_I_PSCPVIL(const char *name);
288*05767d91SRobert Wu     signature_I_PSTPTL  load_I_PSTPTL(const char *name);
289*05767d91SRobert Wu     signature_I_PSKPLPL load_I_PSKPLPL(const char *name);
290*05767d91SRobert Wu     signature_V_PBU     load_V_PBU(const char *name);
291*05767d91SRobert Wu     signature_U_PS      load_U_PS(const char *name);
292*05767d91SRobert Wu     signature_V_PBO     load_V_PBO(const char *name);
293*05767d91SRobert Wu 
294*05767d91SRobert Wu     void *mLibHandle = nullptr;
295*05767d91SRobert Wu };
296*05767d91SRobert Wu 
297*05767d91SRobert Wu } // namespace oboe
298*05767d91SRobert Wu 
299*05767d91SRobert Wu #endif //OBOE_AAUDIO_LOADER_H_
300