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 56 // There are a few definitions used by Oboe. 57 #define AAUDIO_OK static_cast<aaudio_result_t>(Result::OK) 58 #define AAUDIO_ERROR_TIMEOUT static_cast<aaudio_result_t>(Result::ErrorTimeout) 59 #define AAUDIO_STREAM_STATE_STARTING static_cast<aaudio_stream_state_t>(StreamState::Starting) 60 #define AAUDIO_STREAM_STATE_STARTED static_cast<aaudio_stream_state_t>(StreamState::Started) 61 #else 62 #include <aaudio/AAudio.h> 63 #endif 64 65 #ifndef __NDK_MAJOR__ 66 #define __NDK_MAJOR__ 0 67 #endif 68 69 #ifndef __ANDROID_API_S__ 70 #define __ANDROID_API_S__ 31 71 #endif 72 73 namespace oboe { 74 75 /** 76 * The AAudio API was not available in early versions of Android. 77 * To avoid linker errors, we dynamically link with the functions by name using dlsym(). 78 * On older versions this linkage will safely fail. 79 */ 80 class AAudioLoader { 81 public: 82 // Use signatures for common functions. 83 // Key to letter abbreviations. 84 // S = Stream 85 // B = Builder 86 // I = int32_t 87 // L = int64_t 88 // T = sTate 89 // K = clocKid_t 90 // P = Pointer to following data type 91 // C = Const prefix 92 // H = cHar 93 typedef int32_t (*signature_I_PPB)(AAudioStreamBuilder **builder); 94 95 typedef const char * (*signature_CPH_I)(int32_t); 96 97 typedef int32_t (*signature_I_PBPPS)(AAudioStreamBuilder *, 98 AAudioStream **stream); // AAudioStreamBuilder_open() 99 100 typedef int32_t (*signature_I_PB)(AAudioStreamBuilder *); // AAudioStreamBuilder_delete() 101 // AAudioStreamBuilder_setSampleRate() 102 typedef void (*signature_V_PBI)(AAudioStreamBuilder *, int32_t); 103 104 typedef void (*signature_V_PBCPH)(AAudioStreamBuilder *, const char *); 105 106 typedef int32_t (*signature_I_PS)(AAudioStream *); // AAudioStream_getSampleRate() 107 typedef int64_t (*signature_L_PS)(AAudioStream *); // AAudioStream_getFramesRead() 108 // AAudioStream_setBufferSizeInFrames() 109 typedef int32_t (*signature_I_PSI)(AAudioStream *, int32_t); 110 111 typedef void (*signature_V_PBPDPV)(AAudioStreamBuilder *, 112 AAudioStream_dataCallback, 113 void *); 114 115 typedef void (*signature_V_PBPEPV)(AAudioStreamBuilder *, 116 AAudioStream_errorCallback, 117 void *); 118 119 typedef aaudio_format_t (*signature_F_PS)(AAudioStream *stream); 120 121 typedef int32_t (*signature_I_PSPVIL)(AAudioStream *, void *, int32_t, int64_t); 122 typedef int32_t (*signature_I_PSCPVIL)(AAudioStream *, const void *, int32_t, int64_t); 123 124 typedef int32_t (*signature_I_PSTPTL)(AAudioStream *, 125 aaudio_stream_state_t, 126 aaudio_stream_state_t *, 127 int64_t); 128 129 typedef int32_t (*signature_I_PSKPLPL)(AAudioStream *, clockid_t, int64_t *, int64_t *); 130 131 typedef bool (*signature_B_PS)(AAudioStream *); 132 133 static AAudioLoader* getInstance(); // singleton 134 135 /** 136 * Open the AAudio shared library and load the function pointers. 137 * This can be called multiple times. 138 * It should only be called from one thread. 139 * 140 * The destructor will clean up after the open. 141 * 142 * @return 0 if successful or negative error. 143 */ 144 int open(); 145 getLibHandle()146 void *getLibHandle() const { return mLibHandle; } 147 148 // Function pointers into the AAudio shared library. 149 signature_I_PPB createStreamBuilder = nullptr; 150 151 signature_I_PBPPS builder_openStream = nullptr; 152 153 signature_V_PBI builder_setBufferCapacityInFrames = nullptr; 154 signature_V_PBI builder_setChannelCount = nullptr; 155 signature_V_PBI builder_setDeviceId = nullptr; 156 signature_V_PBI builder_setDirection = nullptr; 157 signature_V_PBI builder_setFormat = nullptr; 158 signature_V_PBI builder_setFramesPerDataCallback = nullptr; 159 signature_V_PBI builder_setPerformanceMode = nullptr; 160 signature_V_PBI builder_setSampleRate = nullptr; 161 signature_V_PBI builder_setSharingMode = nullptr; 162 163 signature_V_PBI builder_setUsage = nullptr; 164 signature_V_PBI builder_setContentType = nullptr; 165 signature_V_PBI builder_setInputPreset = nullptr; 166 signature_V_PBI builder_setSessionId = nullptr; 167 168 signature_V_PBCPH builder_setPackageName = nullptr; 169 signature_V_PBCPH builder_setAttributionTag = nullptr; 170 171 signature_V_PBPDPV builder_setDataCallback = nullptr; 172 signature_V_PBPEPV builder_setErrorCallback = nullptr; 173 174 signature_I_PB builder_delete = nullptr; 175 176 signature_F_PS stream_getFormat = nullptr; 177 178 signature_I_PSPVIL stream_read = nullptr; 179 signature_I_PSCPVIL stream_write = nullptr; 180 181 signature_I_PSTPTL stream_waitForStateChange = nullptr; 182 183 signature_I_PSKPLPL stream_getTimestamp = nullptr; 184 185 signature_I_PS stream_close = nullptr; 186 187 signature_I_PS stream_getChannelCount = nullptr; 188 signature_I_PS stream_getDeviceId = nullptr; 189 190 signature_I_PS stream_getBufferSize = nullptr; 191 signature_I_PS stream_getBufferCapacity = nullptr; 192 signature_I_PS stream_getFramesPerBurst = nullptr; 193 signature_I_PS stream_getState = nullptr; 194 signature_I_PS stream_getPerformanceMode = nullptr; 195 signature_I_PS stream_getSampleRate = nullptr; 196 signature_I_PS stream_getSharingMode = nullptr; 197 signature_I_PS stream_getXRunCount = nullptr; 198 199 signature_I_PSI stream_setBufferSize = nullptr; 200 signature_I_PS stream_requestStart = nullptr; 201 signature_I_PS stream_requestPause = nullptr; 202 signature_I_PS stream_requestFlush = nullptr; 203 signature_I_PS stream_requestStop = nullptr; 204 205 signature_L_PS stream_getFramesRead = nullptr; 206 signature_L_PS stream_getFramesWritten = nullptr; 207 208 signature_CPH_I convertResultToText = nullptr; 209 210 signature_I_PS stream_getUsage = nullptr; 211 signature_I_PS stream_getContentType = nullptr; 212 signature_I_PS stream_getInputPreset = nullptr; 213 signature_I_PS stream_getSessionId = nullptr; 214 215 private: AAudioLoader()216 AAudioLoader() {} 217 ~AAudioLoader(); 218 219 // Load function pointers for specific signatures. 220 signature_I_PPB load_I_PPB(const char *name); 221 signature_CPH_I load_CPH_I(const char *name); 222 signature_V_PBI load_V_PBI(const char *name); 223 signature_V_PBCPH load_V_PBCPH(const char *name); 224 signature_V_PBPDPV load_V_PBPDPV(const char *name); 225 signature_V_PBPEPV load_V_PBPEPV(const char *name); 226 signature_I_PB load_I_PB(const char *name); 227 signature_I_PBPPS load_I_PBPPS(const char *name); 228 signature_I_PS load_I_PS(const char *name); 229 signature_L_PS load_L_PS(const char *name); 230 signature_F_PS load_F_PS(const char *name); 231 signature_B_PS load_B_PS(const char *name); 232 signature_I_PSI load_I_PSI(const char *name); 233 signature_I_PSPVIL load_I_PSPVIL(const char *name); 234 signature_I_PSCPVIL load_I_PSCPVIL(const char *name); 235 signature_I_PSTPTL load_I_PSTPTL(const char *name); 236 signature_I_PSKPLPL load_I_PSKPLPL(const char *name); 237 238 void *mLibHandle = nullptr; 239 }; 240 241 } // namespace oboe 242 243 #endif //OBOE_AAUDIO_LOADER_H_ 244