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