• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016 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 #ifndef OBOE_AAUDIO_LOADER_H_
18 #define OBOE_AAUDIO_LOADER_H_
19 
20 #include <unistd.h>
21 #include "oboe/Definitions.h"
22 
23 // If the NDK is before O then define this in your build
24 // so that AAudio.h will not be included.
25 #ifdef OBOE_NO_INCLUDE_AAUDIO
26 
27 // Define missing types from AAudio.h
28 typedef int32_t aaudio_stream_state_t;
29 typedef int32_t aaudio_direction_t;
30 typedef int32_t aaudio_format_t;
31 typedef int32_t aaudio_data_callback_result_t;
32 typedef int32_t aaudio_result_t;
33 typedef int32_t aaudio_sharing_mode_t;
34 typedef int32_t aaudio_performance_mode_t;
35 
36 typedef struct AAudioStreamStruct         AAudioStream;
37 typedef struct AAudioStreamBuilderStruct  AAudioStreamBuilder;
38 
39 typedef aaudio_data_callback_result_t (*AAudioStream_dataCallback)(
40         AAudioStream *stream,
41         void *userData,
42         void *audioData,
43         int32_t numFrames);
44 
45 typedef void (*AAudioStream_errorCallback)(
46         AAudioStream *stream,
47         void *userData,
48         aaudio_result_t error);
49 
50 // These were defined in P
51 typedef int32_t aaudio_usage_t;
52 typedef int32_t aaudio_content_type_t;
53 typedef int32_t aaudio_input_preset_t;
54 typedef int32_t aaudio_session_id_t;
55 #else
56 #include <aaudio/AAudio.h>
57 #include <android/ndk-version.h>
58 #endif
59 
60 #ifndef __NDK_MAJOR__
61 #define __NDK_MAJOR__ 0
62 #endif
63 
64 namespace oboe {
65 
66 
67 /**
68  * The AAudio API was not available in early versions of Android.
69  * To avoid linker errors, we dynamically link with the functions by name using dlsym().
70  * On older versions this linkage will safely fail.
71  */
72 class AAudioLoader {
73   public:
74     // Use signatures for common functions.
75     // Key to letter abbreviations.
76     // S = Stream
77     // B = Builder
78     // I = int32_t
79     // L = int64_t
80     // T = sTate
81     // K = clocKid_t
82     // P = Pointer to following data type
83     // C = Const prefix
84     // H = cHar
85     typedef int32_t  (*signature_I_PPB)(AAudioStreamBuilder **builder);
86 
87     typedef const char * (*signature_CPH_I)(int32_t);
88 
89     typedef int32_t (*signature_I_PBPPS)(AAudioStreamBuilder *,
90                                       AAudioStream **stream);  // AAudioStreamBuilder_open()
91 
92     typedef int32_t (*signature_I_PB)(AAudioStreamBuilder *);  // AAudioStreamBuilder_delete()
93     // AAudioStreamBuilder_setSampleRate()
94     typedef void    (*signature_V_PBI)(AAudioStreamBuilder *, int32_t);
95 
96     typedef int32_t (*signature_I_PS)(AAudioStream *);  // AAudioStream_getSampleRate()
97     typedef int64_t (*signature_L_PS)(AAudioStream *);  // AAudioStream_getFramesRead()
98     // AAudioStream_setBufferSizeInFrames()
99     typedef int32_t (*signature_I_PSI)(AAudioStream *, int32_t);
100 
101     typedef void    (*signature_V_PBPDPV)(AAudioStreamBuilder *,
102                                           AAudioStream_dataCallback,
103                                           void *);
104 
105     typedef void    (*signature_V_PBPEPV)(AAudioStreamBuilder *,
106                                           AAudioStream_errorCallback,
107                                           void *);
108 
109     typedef aaudio_format_t (*signature_F_PS)(AAudioStream *stream);
110 
111     typedef int32_t (*signature_I_PSPVIL)(AAudioStream *, void *, int32_t, int64_t);
112     typedef int32_t (*signature_I_PSCPVIL)(AAudioStream *, const void *, int32_t, int64_t);
113 
114     typedef int32_t (*signature_I_PSTPTL)(AAudioStream *,
115                                           aaudio_stream_state_t,
116                                           aaudio_stream_state_t *,
117                                           int64_t);
118 
119     typedef int32_t (*signature_I_PSKPLPL)(AAudioStream *, clockid_t, int64_t *, int64_t *);
120 
121     typedef bool    (*signature_B_PS)(AAudioStream *);
122 
123     static AAudioLoader* getInstance(); // singleton
124 
125     /**
126      * Open the AAudio shared library and load the function pointers.
127      * This can be called multiple times.
128      * It should only be called from one thread.
129      *
130      * The destructor will clean up after the open.
131      *
132      * @return 0 if successful or negative error.
133      */
134     int open();
135 
136     // Function pointers into the AAudio shared library.
137     signature_I_PPB   createStreamBuilder = nullptr;
138 
139     signature_I_PBPPS builder_openStream = nullptr;
140 
141     signature_V_PBI builder_setBufferCapacityInFrames = nullptr;
142     signature_V_PBI builder_setChannelCount = nullptr;
143     signature_V_PBI builder_setDeviceId = nullptr;
144     signature_V_PBI builder_setDirection = nullptr;
145     signature_V_PBI builder_setFormat = nullptr;
146     signature_V_PBI builder_setFramesPerDataCallback = nullptr;
147     signature_V_PBI builder_setPerformanceMode = nullptr;
148     signature_V_PBI builder_setSampleRate = nullptr;
149     signature_V_PBI builder_setSharingMode = nullptr;
150 
151     signature_V_PBI builder_setUsage = nullptr;
152     signature_V_PBI builder_setContentType = nullptr;
153     signature_V_PBI builder_setInputPreset = nullptr;
154     signature_V_PBI builder_setSessionId = nullptr;
155 
156     signature_V_PBPDPV  builder_setDataCallback = nullptr;
157     signature_V_PBPEPV  builder_setErrorCallback = nullptr;
158 
159     signature_I_PB      builder_delete = nullptr;
160 
161     signature_F_PS      stream_getFormat = nullptr;
162 
163     signature_I_PSPVIL  stream_read = nullptr;
164     signature_I_PSCPVIL stream_write = nullptr;
165 
166     signature_I_PSTPTL  stream_waitForStateChange = nullptr;
167 
168     signature_I_PSKPLPL stream_getTimestamp = nullptr;
169 
170     signature_B_PS      stream_isMMapUsed = nullptr;
171 
172     signature_I_PS   stream_close = nullptr;
173 
174     signature_I_PS   stream_getChannelCount = nullptr;
175     signature_I_PS   stream_getDeviceId = nullptr;
176 
177     signature_I_PS   stream_getBufferSize = nullptr;
178     signature_I_PS   stream_getBufferCapacity = nullptr;
179     signature_I_PS   stream_getFramesPerBurst = nullptr;
180     signature_I_PS   stream_getState = nullptr;
181     signature_I_PS   stream_getPerformanceMode = nullptr;
182     signature_I_PS   stream_getSampleRate = nullptr;
183     signature_I_PS   stream_getSharingMode = nullptr;
184     signature_I_PS   stream_getXRunCount = nullptr;
185 
186     signature_I_PSI  stream_setBufferSize = nullptr;
187     signature_I_PS   stream_requestStart = nullptr;
188     signature_I_PS   stream_requestPause = nullptr;
189     signature_I_PS   stream_requestFlush = nullptr;
190     signature_I_PS   stream_requestStop = nullptr;
191 
192     signature_L_PS   stream_getFramesRead = nullptr;
193     signature_L_PS   stream_getFramesWritten = nullptr;
194 
195     signature_CPH_I  convertResultToText = nullptr;
196 
197     signature_I_PS   stream_getUsage = nullptr;
198     signature_I_PS   stream_getContentType = nullptr;
199     signature_I_PS   stream_getInputPreset = nullptr;
200     signature_I_PS   stream_getSessionId = nullptr;
201 
202   private:
AAudioLoader()203     AAudioLoader() {}
204     ~AAudioLoader();
205 
206     // Load function pointers for specific signatures.
207     signature_I_PPB     load_I_PPB(const char *name);
208     signature_CPH_I     load_CPH_I(const char *name);
209     signature_V_PBI     load_V_PBI(const char *name);
210     signature_V_PBPDPV  load_V_PBPDPV(const char *name);
211     signature_V_PBPEPV  load_V_PBPEPV(const char *name);
212     signature_I_PB      load_I_PB(const char *name);
213     signature_I_PBPPS   load_I_PBPPS(const char *name);
214     signature_I_PS      load_I_PS(const char *name);
215     signature_L_PS      load_L_PS(const char *name);
216     signature_F_PS      load_F_PS(const char *name);
217     signature_B_PS      load_B_PS(const char *name);
218     signature_I_PSI     load_I_PSI(const char *name);
219     signature_I_PSPVIL  load_I_PSPVIL(const char *name);
220     signature_I_PSCPVIL load_I_PSCPVIL(const char *name);
221     signature_I_PSTPTL  load_I_PSTPTL(const char *name);
222     signature_I_PSKPLPL load_I_PSKPLPL(const char *name);
223 
224     void *mLibHandle = nullptr;
225 };
226 
227 } // namespace oboe
228 
229 #endif //OBOE_AAUDIO_LOADER_H_
230