1*bebae9c0SAndroid Build Coastguard Worker /* 2*bebae9c0SAndroid Build Coastguard Worker * Copyright (C) 2010 The Android Open Source Project 3*bebae9c0SAndroid Build Coastguard Worker * 4*bebae9c0SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*bebae9c0SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*bebae9c0SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*bebae9c0SAndroid Build Coastguard Worker * 8*bebae9c0SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*bebae9c0SAndroid Build Coastguard Worker * 10*bebae9c0SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*bebae9c0SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*bebae9c0SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*bebae9c0SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*bebae9c0SAndroid Build Coastguard Worker * limitations under the License. 15*bebae9c0SAndroid Build Coastguard Worker */ 16*bebae9c0SAndroid Build Coastguard Worker 17*bebae9c0SAndroid Build Coastguard Worker /** \file sles_allinclusive.h Everything including the kitchen sink */ 18*bebae9c0SAndroid Build Coastguard Worker 19*bebae9c0SAndroid Build Coastguard Worker #include "Configuration.h" 20*bebae9c0SAndroid Build Coastguard Worker #include <SLES/OpenSLES.h> 21*bebae9c0SAndroid Build Coastguard Worker #include <OMXAL/OpenMAXAL.h> 22*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID 23*bebae9c0SAndroid Build Coastguard Worker #include <SLES/OpenSLES_Android.h> 24*bebae9c0SAndroid Build Coastguard Worker #include <OMXAL/OpenMAXAL_Android.h> 25*bebae9c0SAndroid Build Coastguard Worker #endif 26*bebae9c0SAndroid Build Coastguard Worker #include <stddef.h> // offsetof 27*bebae9c0SAndroid Build Coastguard Worker #include <stdlib.h> // malloc 28*bebae9c0SAndroid Build Coastguard Worker #include <string.h> // memcmp 29*bebae9c0SAndroid Build Coastguard Worker #include <strings.h> 30*bebae9c0SAndroid Build Coastguard Worker #include <stdio.h> // debugging 31*bebae9c0SAndroid Build Coastguard Worker #include <assert.h> // debugging 32*bebae9c0SAndroid Build Coastguard Worker #include <pthread.h> 33*bebae9c0SAndroid Build Coastguard Worker #include <unistd.h> // usleep 34*bebae9c0SAndroid Build Coastguard Worker #include <errno.h> 35*bebae9c0SAndroid Build Coastguard Worker 36*bebae9c0SAndroid Build Coastguard Worker #ifndef __cplusplus 37*bebae9c0SAndroid Build Coastguard Worker typedef int bool; 38*bebae9c0SAndroid Build Coastguard Worker #ifndef false 39*bebae9c0SAndroid Build Coastguard Worker #define false 0 40*bebae9c0SAndroid Build Coastguard Worker #endif 41*bebae9c0SAndroid Build Coastguard Worker #ifndef true 42*bebae9c0SAndroid Build Coastguard Worker #define true 1 43*bebae9c0SAndroid Build Coastguard Worker #endif 44*bebae9c0SAndroid Build Coastguard Worker #endif 45*bebae9c0SAndroid Build Coastguard Worker 46*bebae9c0SAndroid Build Coastguard Worker // The OpenSLES.h definitions of SL_PROFILES_... have casts, so are unusable by preprocessor 47*bebae9c0SAndroid Build Coastguard Worker #define USE_PROFILES_PHONE 0x1 // == SL_PROFILES_PHONE 48*bebae9c0SAndroid Build Coastguard Worker #define USE_PROFILES_MUSIC 0x2 // == SL_PROFILES_MUSIC 49*bebae9c0SAndroid Build Coastguard Worker #define USE_PROFILES_GAME 0x4 // == SL_PROFILES_GAME 50*bebae9c0SAndroid Build Coastguard Worker // Pseudo profiles, used to decide whether to include code for incomplete or untested features 51*bebae9c0SAndroid Build Coastguard Worker // Features that are not in union of all profiles: audio recorder, LED, Vibra 52*bebae9c0SAndroid Build Coastguard Worker #define USE_PROFILES_OPTIONAL 0x8 53*bebae9c0SAndroid Build Coastguard Worker // Features that are in the intersection of all profiles: 54*bebae9c0SAndroid Build Coastguard Worker // object priorities, preemption, loss of control, device configuration 55*bebae9c0SAndroid Build Coastguard Worker #define USE_PROFILES_BASE 0x10 56*bebae9c0SAndroid Build Coastguard Worker 57*bebae9c0SAndroid Build Coastguard Worker #include "MPH.h" 58*bebae9c0SAndroid Build Coastguard Worker #include "MPH_to.h" 59*bebae9c0SAndroid Build Coastguard Worker #include "devices.h" 60*bebae9c0SAndroid Build Coastguard Worker #include "ut/OpenSLESUT.h" 61*bebae9c0SAndroid Build Coastguard Worker #include "ThreadPool.h" 62*bebae9c0SAndroid Build Coastguard Worker 63*bebae9c0SAndroid Build Coastguard Worker typedef struct CEngine_struct CEngine; 64*bebae9c0SAndroid Build Coastguard Worker typedef struct CAudioPlayer_struct CAudioPlayer; 65*bebae9c0SAndroid Build Coastguard Worker typedef struct CAudioRecorder_struct CAudioRecorder; 66*bebae9c0SAndroid Build Coastguard Worker typedef struct C3DGroup_struct C3DGroup; 67*bebae9c0SAndroid Build Coastguard Worker typedef struct COutputMix_struct COutputMix; 68*bebae9c0SAndroid Build Coastguard Worker 69*bebae9c0SAndroid Build Coastguard Worker #ifdef USE_SNDFILE 70*bebae9c0SAndroid Build Coastguard Worker #include <sndfile.h> 71*bebae9c0SAndroid Build Coastguard Worker #include "desktop/SLSndFile.h" 72*bebae9c0SAndroid Build Coastguard Worker #endif // USE_SNDFILE 73*bebae9c0SAndroid Build Coastguard Worker 74*bebae9c0SAndroid Build Coastguard Worker #ifdef USE_SDL 75*bebae9c0SAndroid Build Coastguard Worker #include <SDL/SDL_audio.h> 76*bebae9c0SAndroid Build Coastguard Worker #endif // USE_SDL 77*bebae9c0SAndroid Build Coastguard Worker 78*bebae9c0SAndroid Build Coastguard Worker #define STEREO_CHANNELS 2 79*bebae9c0SAndroid Build Coastguard Worker 80*bebae9c0SAndroid Build Coastguard Worker /** 81*bebae9c0SAndroid Build Coastguard Worker * Constants to define unknown property values 82*bebae9c0SAndroid Build Coastguard Worker */ 83*bebae9c0SAndroid Build Coastguard Worker #define UNKNOWN_NUMCHANNELS 0 84*bebae9c0SAndroid Build Coastguard Worker #define UNKNOWN_SAMPLERATE 0 85*bebae9c0SAndroid Build Coastguard Worker 86*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID 87*bebae9c0SAndroid Build Coastguard Worker #include <utils/Log.h> 88*bebae9c0SAndroid Build Coastguard Worker #include <utils/KeyedVector.h> 89*bebae9c0SAndroid Build Coastguard Worker #include "media/AudioSystem.h" 90*bebae9c0SAndroid Build Coastguard Worker #include "media/mediarecorder.h" 91*bebae9c0SAndroid Build Coastguard Worker #include "media/AudioRecord.h" 92*bebae9c0SAndroid Build Coastguard Worker #include "media/AudioTrack.h" 93*bebae9c0SAndroid Build Coastguard Worker #include "media/mediaplayer.h" 94*bebae9c0SAndroid Build Coastguard Worker #include <utils/String8.h> 95*bebae9c0SAndroid Build Coastguard Worker #define ANDROID_SL_MILLIBEL_MAX 0 96*bebae9c0SAndroid Build Coastguard Worker #include "android/android_sles_conversions.h" 97*bebae9c0SAndroid Build Coastguard Worker #include "android/android_defs.h" 98*bebae9c0SAndroid Build Coastguard Worker #endif 99*bebae9c0SAndroid Build Coastguard Worker 100*bebae9c0SAndroid Build Coastguard Worker #ifdef USE_OUTPUTMIXEXT 101*bebae9c0SAndroid Build Coastguard Worker #include "desktop/OutputMixExt.h" 102*bebae9c0SAndroid Build Coastguard Worker #endif 103*bebae9c0SAndroid Build Coastguard Worker 104*bebae9c0SAndroid Build Coastguard Worker #include "sllog.h" 105*bebae9c0SAndroid Build Coastguard Worker 106*bebae9c0SAndroid Build Coastguard Worker typedef enum { 107*bebae9c0SAndroid Build Coastguard Worker predestroy_error, // Application should not be calling destroy now 108*bebae9c0SAndroid Build Coastguard Worker predestroy_ok, // OK to destroy object now 109*bebae9c0SAndroid Build Coastguard Worker predestroy_again // Application did nothing wrong, but should destroy again to be effective 110*bebae9c0SAndroid Build Coastguard Worker } predestroy_t; 111*bebae9c0SAndroid Build Coastguard Worker 112*bebae9c0SAndroid Build Coastguard Worker // Hook functions 113*bebae9c0SAndroid Build Coastguard Worker 114*bebae9c0SAndroid Build Coastguard Worker typedef void (*VoidHook)(void *self); 115*bebae9c0SAndroid Build Coastguard Worker //typedef SLresult (*ResultHook)(void *self); 116*bebae9c0SAndroid Build Coastguard Worker typedef SLresult (*AsyncHook)(void *self, SLboolean async); 117*bebae9c0SAndroid Build Coastguard Worker typedef bool (*BoolHook)(void *self); 118*bebae9c0SAndroid Build Coastguard Worker typedef predestroy_t (*PreDestroyHook)(void *self); 119*bebae9c0SAndroid Build Coastguard Worker 120*bebae9c0SAndroid Build Coastguard Worker // Describes how an interface is related to a given class, used in iid_vtable::mInterface 121*bebae9c0SAndroid Build Coastguard Worker 122*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_IMPLICIT 0 // no need for application to request prior to GetInterface 123*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_EXPLICIT 1 // must be requested explicitly during object creation 124*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_DYNAMIC 2 // can be requested after object creation 125*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_UNAVAILABLE 3 // this interface is not available on objects of this class 126*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_IMPLICIT_PREREALIZE 4 // implicit, and can call GetInterface before Realize 127*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_EXPLICIT_PREREALIZE 5 // explicit, and can call GetInterface before Realize 128*bebae9c0SAndroid Build Coastguard Worker // 6 and 7 are reserved for the meaningless DYNAMIC_PREREALIZE and UNAVAILABLE_PREREALIZE 129*bebae9c0SAndroid Build Coastguard Worker // note that INTERFACE_OPTIONAL is always re-mapped to one of the above 130*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_PREREALIZE 4 // bit-mask to test for calling GetInterface before Realize 131*bebae9c0SAndroid Build Coastguard Worker 132*bebae9c0SAndroid Build Coastguard Worker // Profile-specific interfaces 133*bebae9c0SAndroid Build Coastguard Worker 134*bebae9c0SAndroid Build Coastguard Worker #if USE_PROFILES & USE_PROFILES_BASE 135*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_IMPLICIT_BASE INTERFACE_IMPLICIT 136*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_EXPLICIT_BASE INTERFACE_EXPLICIT 137*bebae9c0SAndroid Build Coastguard Worker #else 138*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_IMPLICIT_BASE INTERFACE_UNAVAILABLE 139*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_EXPLICIT_BASE INTERFACE_UNAVAILABLE 140*bebae9c0SAndroid Build Coastguard Worker #endif 141*bebae9c0SAndroid Build Coastguard Worker 142*bebae9c0SAndroid Build Coastguard Worker #if USE_PROFILES & USE_PROFILES_GAME 143*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_DYNAMIC_GAME INTERFACE_DYNAMIC 144*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_EXPLICIT_GAME INTERFACE_EXPLICIT 145*bebae9c0SAndroid Build Coastguard Worker #else 146*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_DYNAMIC_GAME INTERFACE_OPTIONAL 147*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_EXPLICIT_GAME INTERFACE_OPTIONAL 148*bebae9c0SAndroid Build Coastguard Worker #endif 149*bebae9c0SAndroid Build Coastguard Worker 150*bebae9c0SAndroid Build Coastguard Worker #if USE_PROFILES & USE_PROFILES_MUSIC 151*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_DYNAMIC_MUSIC INTERFACE_DYNAMIC 152*bebae9c0SAndroid Build Coastguard Worker #else 153*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_DYNAMIC_MUSIC INTERFACE_OPTIONAL 154*bebae9c0SAndroid Build Coastguard Worker #endif 155*bebae9c0SAndroid Build Coastguard Worker 156*bebae9c0SAndroid Build Coastguard Worker #if USE_PROFILES & (USE_PROFILES_GAME | USE_PROFILES_MUSIC) 157*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_DYNAMIC_GAME_MUSIC INTERFACE_DYNAMIC 158*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_EXPLICIT_GAME_MUSIC INTERFACE_EXPLICIT 159*bebae9c0SAndroid Build Coastguard Worker #else 160*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_DYNAMIC_GAME_MUSIC INTERFACE_OPTIONAL 161*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_EXPLICIT_GAME_MUSIC INTERFACE_OPTIONAL 162*bebae9c0SAndroid Build Coastguard Worker #endif 163*bebae9c0SAndroid Build Coastguard Worker 164*bebae9c0SAndroid Build Coastguard Worker #if USE_PROFILES & (USE_PROFILES_GAME | USE_PROFILES_PHONE) 165*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_EXPLICIT_GAME_PHONE INTERFACE_EXPLICIT 166*bebae9c0SAndroid Build Coastguard Worker #else 167*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_EXPLICIT_GAME_PHONE INTERFACE_OPTIONAL 168*bebae9c0SAndroid Build Coastguard Worker #endif 169*bebae9c0SAndroid Build Coastguard Worker 170*bebae9c0SAndroid Build Coastguard Worker #if USE_PROFILES & USE_PROFILES_OPTIONAL 171*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_OPTIONAL INTERFACE_EXPLICIT 172*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_DYNAMIC_OPTIONAL INTERFACE_DYNAMIC 173*bebae9c0SAndroid Build Coastguard Worker #else 174*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_OPTIONAL INTERFACE_UNAVAILABLE 175*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_DYNAMIC_OPTIONAL INTERFACE_UNAVAILABLE 176*bebae9c0SAndroid Build Coastguard Worker #endif 177*bebae9c0SAndroid Build Coastguard Worker 178*bebae9c0SAndroid Build Coastguard Worker // Describes how an interface is related to a given object 179*bebae9c0SAndroid Build Coastguard Worker 180*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_UNINITIALIZED 0 ///< not available 181*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_INITIALIZED 1 ///< not requested at object creation time 182*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_EXPOSED 2 ///< requested at object creation time 183*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_ADDING_1 3 ///< part 1 of asynchronous AddInterface, pending 184*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_ADDING_2 4 ///< synchronous AddInterface, or part 2 of asynchronous 185*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_ADDED 5 ///< AddInterface has completed 186*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_REMOVING 6 ///< unlocked phase of (synchronous) RemoveInterface 187*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_SUSPENDING 7 ///< suspend in progress 188*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_SUSPENDED 8 ///< suspend has completed 189*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_RESUMING_1 9 ///< part 1 of asynchronous ResumeInterface, pending 190*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_RESUMING_2 10 ///< synchronous ResumeInterface, or part 2 of asynchronous 191*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_ADDING_1A 11 ///< part 1 of asynchronous AddInterface, aborted 192*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_RESUMING_1A 12 ///< part 1 of asynchronous ResumeInterface, aborted 193*bebae9c0SAndroid Build Coastguard Worker 194*bebae9c0SAndroid Build Coastguard Worker 195*bebae9c0SAndroid Build Coastguard Worker // Maps an interface ID to its offset within the class that exposes it 196*bebae9c0SAndroid Build Coastguard Worker 197*bebae9c0SAndroid Build Coastguard Worker struct iid_vtable { 198*bebae9c0SAndroid Build Coastguard Worker unsigned char mMPH; // primary MPH for this interface, does not include any aliases 199*bebae9c0SAndroid Build Coastguard Worker unsigned char mInterface; // relationship of interface to this class 200*bebae9c0SAndroid Build Coastguard Worker /*size_t*/ unsigned short mOffset; 201*bebae9c0SAndroid Build Coastguard Worker }; 202*bebae9c0SAndroid Build Coastguard Worker 203*bebae9c0SAndroid Build Coastguard Worker // Per-class const data shared by all instances of the same class 204*bebae9c0SAndroid Build Coastguard Worker 205*bebae9c0SAndroid Build Coastguard Worker typedef struct { 206*bebae9c0SAndroid Build Coastguard Worker const struct iid_vtable *mInterfaces; // maps interface index to info about that interface 207*bebae9c0SAndroid Build Coastguard Worker SLuint32 mInterfaceCount; // number of possible interfaces 208*bebae9c0SAndroid Build Coastguard Worker const signed char *mMPH_to_index; 209*bebae9c0SAndroid Build Coastguard Worker const char * const mName; 210*bebae9c0SAndroid Build Coastguard Worker size_t mSize; 211*bebae9c0SAndroid Build Coastguard Worker // OpenSL ES and OpenMAX AL object IDs come from different ranges, and some objects such as 212*bebae9c0SAndroid Build Coastguard Worker // Engine, Output Mix, LED, and Vibra belong to both APIs, so we keep both object IDs 213*bebae9c0SAndroid Build Coastguard Worker SLuint16 mSLObjectID; // OpenSL ES object ID 214*bebae9c0SAndroid Build Coastguard Worker XAuint16 mXAObjectID; // OpenMAX AL object ID 215*bebae9c0SAndroid Build Coastguard Worker // hooks 216*bebae9c0SAndroid Build Coastguard Worker AsyncHook mRealize; // called with mutex locked; can temporarily unlock mutex (for async) 217*bebae9c0SAndroid Build Coastguard Worker AsyncHook mResume; // called with mutex locked; can temporarily unlock mutex (for async) 218*bebae9c0SAndroid Build Coastguard Worker VoidHook mDestroy; // called with mutex locked and must keep mutex locked throughout 219*bebae9c0SAndroid Build Coastguard Worker PreDestroyHook mPreDestroy; // called with mutex locked; can temporarily unlock mutex (for wait) 220*bebae9c0SAndroid Build Coastguard Worker } ClassTable; 221*bebae9c0SAndroid Build Coastguard Worker 222*bebae9c0SAndroid Build Coastguard Worker // BufferHeader describes each element of a BufferQueue, other than the data 223*bebae9c0SAndroid Build Coastguard Worker typedef struct { 224*bebae9c0SAndroid Build Coastguard Worker const void *mBuffer; 225*bebae9c0SAndroid Build Coastguard Worker SLuint32 mSize; 226*bebae9c0SAndroid Build Coastguard Worker } BufferHeader; 227*bebae9c0SAndroid Build Coastguard Worker 228*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID 229*bebae9c0SAndroid Build Coastguard Worker // Holds information about all commands that can be passed alongside an MPEG-2 TS buffer 230*bebae9c0SAndroid Build Coastguard Worker // Is used with buffers of type kAndroidBufferTypeMpeg2Ts 231*bebae9c0SAndroid Build Coastguard Worker typedef struct { 232*bebae9c0SAndroid Build Coastguard Worker SLuint32 mTsCmdCode; 233*bebae9c0SAndroid Build Coastguard Worker SLAuint64 mPts; 234*bebae9c0SAndroid Build Coastguard Worker } Mpeg2TsCommands; 235*bebae9c0SAndroid Build Coastguard Worker 236*bebae9c0SAndroid Build Coastguard Worker // Holds information about all commands that can be passed alongside an AAC ADTS buffer 237*bebae9c0SAndroid Build Coastguard Worker // Is used with buffers of type kAndroidBufferTypeAacadts 238*bebae9c0SAndroid Build Coastguard Worker typedef struct { 239*bebae9c0SAndroid Build Coastguard Worker SLuint32 mAdtsCmdCode; 240*bebae9c0SAndroid Build Coastguard Worker } AdtsCommands; 241*bebae9c0SAndroid Build Coastguard Worker 242*bebae9c0SAndroid Build Coastguard Worker // Union of the different structures to hold items stored in an AdvancedBufferHeader 243*bebae9c0SAndroid Build Coastguard Worker // when an item comes from an AndroidBufferQueue as the data source, it's a command 244*bebae9c0SAndroid Build Coastguard Worker // when an item is output to an AndroidBufferQueue as the data sink, it's a message (or metadata) 245*bebae9c0SAndroid Build Coastguard Worker typedef union { 246*bebae9c0SAndroid Build Coastguard Worker Mpeg2TsCommands mTsCmdData; 247*bebae9c0SAndroid Build Coastguard Worker AdtsCommands mAdtsCmdData; 248*bebae9c0SAndroid Build Coastguard Worker } AdvancedBufferItems; 249*bebae9c0SAndroid Build Coastguard Worker 250*bebae9c0SAndroid Build Coastguard Worker // AdvancedBufferHeader describes each element of an AndroidBufferQueue, other than the data 251*bebae9c0SAndroid Build Coastguard Worker // and associated messages 252*bebae9c0SAndroid Build Coastguard Worker typedef struct { 253*bebae9c0SAndroid Build Coastguard Worker const void *mDataBuffer; 254*bebae9c0SAndroid Build Coastguard Worker SLuint32 mDataSize; 255*bebae9c0SAndroid Build Coastguard Worker SLuint32 mDataSizeConsumed; 256*bebae9c0SAndroid Build Coastguard Worker AdvancedBufferItems mItems; 257*bebae9c0SAndroid Build Coastguard Worker const void *mBufferContext; 258*bebae9c0SAndroid Build Coastguard Worker // mBufferState will be used for the other ABQ events we'll support in the future 259*bebae9c0SAndroid Build Coastguard Worker // SLuint32 mBufferState; 260*bebae9c0SAndroid Build Coastguard Worker } AdvancedBufferHeader; 261*bebae9c0SAndroid Build Coastguard Worker #endif 262*bebae9c0SAndroid Build Coastguard Worker 263*bebae9c0SAndroid Build Coastguard Worker #ifdef USE_SNDFILE 264*bebae9c0SAndroid Build Coastguard Worker 265*bebae9c0SAndroid Build Coastguard Worker #define SndFile_BUFSIZE 512 // in 16-bit samples 266*bebae9c0SAndroid Build Coastguard Worker #define SndFile_NUMBUFS 2 267*bebae9c0SAndroid Build Coastguard Worker 268*bebae9c0SAndroid Build Coastguard Worker struct SndFile { 269*bebae9c0SAndroid Build Coastguard Worker // save URI also? 270*bebae9c0SAndroid Build Coastguard Worker SLchar *mPathname; 271*bebae9c0SAndroid Build Coastguard Worker SNDFILE *mSNDFILE; 272*bebae9c0SAndroid Build Coastguard Worker SF_INFO mSfInfo; 273*bebae9c0SAndroid Build Coastguard Worker pthread_mutex_t mMutex; // protects mSNDFILE only 274*bebae9c0SAndroid Build Coastguard Worker SLboolean mEOF; // sf_read returned zero sample frames 275*bebae9c0SAndroid Build Coastguard Worker SLuint32 mWhich; // which buffer to use next 276*bebae9c0SAndroid Build Coastguard Worker short mBuffer[SndFile_BUFSIZE * SndFile_NUMBUFS]; 277*bebae9c0SAndroid Build Coastguard Worker }; 278*bebae9c0SAndroid Build Coastguard Worker 279*bebae9c0SAndroid Build Coastguard Worker #endif // USE_SNDFILE 280*bebae9c0SAndroid Build Coastguard Worker 281*bebae9c0SAndroid Build Coastguard Worker #include "data.h" 282*bebae9c0SAndroid Build Coastguard Worker #include "itfstruct.h" 283*bebae9c0SAndroid Build Coastguard Worker #include "classes.h" 284*bebae9c0SAndroid Build Coastguard Worker 285*bebae9c0SAndroid Build Coastguard Worker struct MPH_init { 286*bebae9c0SAndroid Build Coastguard Worker VoidHook mInit; // called first to initialize the interface, right after object is allocated 287*bebae9c0SAndroid Build Coastguard Worker // Each interface is initialized regardless whether it is exposed to application. 288*bebae9c0SAndroid Build Coastguard Worker VoidHook mResume; // called to resume interface after suspension, not currently used 289*bebae9c0SAndroid Build Coastguard Worker VoidHook mDeinit; // called last when object is about to be destroyed 290*bebae9c0SAndroid Build Coastguard Worker BoolHook mExpose; // called after initialization, only if interface is exposed to application 291*bebae9c0SAndroid Build Coastguard Worker VoidHook mRemove; // called by DynamicInterfaceManager::RemoveInterface, and prior to mDeinit 292*bebae9c0SAndroid Build Coastguard Worker // will need a suspend hook when suspend is implemented 293*bebae9c0SAndroid Build Coastguard Worker }; 294*bebae9c0SAndroid Build Coastguard Worker 295*bebae9c0SAndroid Build Coastguard Worker extern /*static*/ int IID_to_MPH(const SLInterfaceID iid); 296*bebae9c0SAndroid Build Coastguard Worker extern /*static*/ const struct MPH_init MPH_init_table[MPH_MAX]; 297*bebae9c0SAndroid Build Coastguard Worker extern SLresult checkInterfaces(const ClassTable *clazz, 298*bebae9c0SAndroid Build Coastguard Worker SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds, 299*bebae9c0SAndroid Build Coastguard Worker const SLboolean *pInterfaceRequired, unsigned *pExposedMask, unsigned *pRequiredMask); 300*bebae9c0SAndroid Build Coastguard Worker extern IObject *construct(const ClassTable *clazz, 301*bebae9c0SAndroid Build Coastguard Worker unsigned exposedMask, SLEngineItf engine); 302*bebae9c0SAndroid Build Coastguard Worker extern const ClassTable *objectIDtoClass(SLuint32 objectID); 303*bebae9c0SAndroid Build Coastguard Worker extern const struct SLInterfaceID_ SL_IID_array[MPH_MAX]; 304*bebae9c0SAndroid Build Coastguard Worker extern SLuint32 IObjectToObjectID(IObject *object); 305*bebae9c0SAndroid Build Coastguard Worker extern void IObject_Publish(IObject *thiz); 306*bebae9c0SAndroid Build Coastguard Worker extern void IObject_Destroy(SLObjectItf self); 307*bebae9c0SAndroid Build Coastguard Worker 308*bebae9c0SAndroid Build Coastguard Worker // Map an interface to it's "object ID" (which is really a class ID). 309*bebae9c0SAndroid Build Coastguard Worker // Note: this operation is undefined on IObject, as it lacks an mThis. 310*bebae9c0SAndroid Build Coastguard Worker // If you have an IObject, then use IObjectToObjectID directly. 311*bebae9c0SAndroid Build Coastguard Worker 312*bebae9c0SAndroid Build Coastguard Worker #define InterfaceToObjectID(thiz) IObjectToObjectID((thiz)->mThis) 313*bebae9c0SAndroid Build Coastguard Worker 314*bebae9c0SAndroid Build Coastguard Worker // Map an interface to it's corresponding IObject. 315*bebae9c0SAndroid Build Coastguard Worker // Note: this operation is undefined on IObject, as it lacks an mThis. 316*bebae9c0SAndroid Build Coastguard Worker // If you have an IObject, then you're done -- you already have what you need. 317*bebae9c0SAndroid Build Coastguard Worker 318*bebae9c0SAndroid Build Coastguard Worker #define InterfaceToIObject(thiz) ((thiz)->mThis) 319*bebae9c0SAndroid Build Coastguard Worker 320*bebae9c0SAndroid Build Coastguard Worker #define InterfaceToCAudioPlayer(thiz) (((CAudioPlayer*)InterfaceToIObject(thiz))) 321*bebae9c0SAndroid Build Coastguard Worker 322*bebae9c0SAndroid Build Coastguard Worker #define InterfaceToCAudioRecorder(thiz) (((CAudioRecorder*)InterfaceToIObject(thiz))) 323*bebae9c0SAndroid Build Coastguard Worker 324*bebae9c0SAndroid Build Coastguard Worker #define InterfaceToCAudioRecorder(thiz) (((CAudioRecorder*)InterfaceToIObject(thiz))) 325*bebae9c0SAndroid Build Coastguard Worker 326*bebae9c0SAndroid Build Coastguard Worker #define InterfaceToCMediaPlayer(thiz) (((CMediaPlayer*)InterfaceToIObject(thiz))) 327*bebae9c0SAndroid Build Coastguard Worker 328*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID 329*bebae9c0SAndroid Build Coastguard Worker #include "android/MediaPlayer_to_android.h" 330*bebae9c0SAndroid Build Coastguard Worker #include "android/OutputMix_to_android.h" 331*bebae9c0SAndroid Build Coastguard Worker #include "android/AudioPlayer_to_android.h" 332*bebae9c0SAndroid Build Coastguard Worker #include "android/AudioRecorder_to_android.h" 333*bebae9c0SAndroid Build Coastguard Worker #endif 334*bebae9c0SAndroid Build Coastguard Worker 335*bebae9c0SAndroid Build Coastguard Worker extern predestroy_t C3DGroup_PreDestroy(void *self); 336*bebae9c0SAndroid Build Coastguard Worker 337*bebae9c0SAndroid Build Coastguard Worker extern SLresult CAudioPlayer_Realize(void *self, SLboolean async); 338*bebae9c0SAndroid Build Coastguard Worker extern SLresult CAudioPlayer_Resume(void *self, SLboolean async); 339*bebae9c0SAndroid Build Coastguard Worker extern void CAudioPlayer_Destroy(void *self); 340*bebae9c0SAndroid Build Coastguard Worker extern predestroy_t CAudioPlayer_PreDestroy(void *self); 341*bebae9c0SAndroid Build Coastguard Worker 342*bebae9c0SAndroid Build Coastguard Worker extern SLresult CAudioRecorder_Realize(void *self, SLboolean async); 343*bebae9c0SAndroid Build Coastguard Worker extern SLresult CAudioRecorder_Resume(void *self, SLboolean async); 344*bebae9c0SAndroid Build Coastguard Worker extern void CAudioRecorder_Destroy(void *self); 345*bebae9c0SAndroid Build Coastguard Worker extern predestroy_t CAudioRecorder_PreDestroy(void *self); 346*bebae9c0SAndroid Build Coastguard Worker 347*bebae9c0SAndroid Build Coastguard Worker extern SLresult CEngine_Realize(void *self, SLboolean async); 348*bebae9c0SAndroid Build Coastguard Worker extern SLresult CEngine_Resume(void *self, SLboolean async); 349*bebae9c0SAndroid Build Coastguard Worker extern void CEngine_Destroy(void *self); 350*bebae9c0SAndroid Build Coastguard Worker extern predestroy_t CEngine_PreDestroy(void *self); 351*bebae9c0SAndroid Build Coastguard Worker extern void CEngine_Destroyed(CEngine *self); 352*bebae9c0SAndroid Build Coastguard Worker 353*bebae9c0SAndroid Build Coastguard Worker extern SLresult COutputMix_Realize(void *self, SLboolean async); 354*bebae9c0SAndroid Build Coastguard Worker extern SLresult COutputMix_Resume(void *self, SLboolean async); 355*bebae9c0SAndroid Build Coastguard Worker extern void COutputMix_Destroy(void *self); 356*bebae9c0SAndroid Build Coastguard Worker extern predestroy_t COutputMix_PreDestroy(void *self); 357*bebae9c0SAndroid Build Coastguard Worker 358*bebae9c0SAndroid Build Coastguard Worker extern SLresult CMediaPlayer_Realize(void *self, SLboolean async); 359*bebae9c0SAndroid Build Coastguard Worker extern SLresult CMediaPlayer_Resume(void *self, SLboolean async); 360*bebae9c0SAndroid Build Coastguard Worker extern void CMediaPlayer_Destroy(void *self); 361*bebae9c0SAndroid Build Coastguard Worker extern predestroy_t CMediaPlayer_PreDestroy(void *self); 362*bebae9c0SAndroid Build Coastguard Worker 363*bebae9c0SAndroid Build Coastguard Worker #ifdef USE_SDL 364*bebae9c0SAndroid Build Coastguard Worker extern void SDL_open(IEngine *thisEngine); 365*bebae9c0SAndroid Build Coastguard Worker extern void SDL_close(void); 366*bebae9c0SAndroid Build Coastguard Worker #endif 367*bebae9c0SAndroid Build Coastguard Worker 368*bebae9c0SAndroid Build Coastguard Worker #define SL_OBJECT_STATE_REALIZING_1 ((SLuint32) 0x4) // async realize on work queue 369*bebae9c0SAndroid Build Coastguard Worker #define SL_OBJECT_STATE_REALIZING_2 ((SLuint32) 0x5) // sync realize, or async realize hook 370*bebae9c0SAndroid Build Coastguard Worker #define SL_OBJECT_STATE_RESUMING_1 ((SLuint32) 0x6) // async resume on work queue 371*bebae9c0SAndroid Build Coastguard Worker #define SL_OBJECT_STATE_RESUMING_2 ((SLuint32) 0x7) // sync resume, or async resume hook 372*bebae9c0SAndroid Build Coastguard Worker #define SL_OBJECT_STATE_SUSPENDING ((SLuint32) 0x8) // suspend in progress 373*bebae9c0SAndroid Build Coastguard Worker #define SL_OBJECT_STATE_REALIZING_1A ((SLuint32) 0x9) // abort while async realize on work queue 374*bebae9c0SAndroid Build Coastguard Worker #define SL_OBJECT_STATE_RESUMING_1A ((SLuint32) 0xA) // abort while async resume on work queue 375*bebae9c0SAndroid Build Coastguard Worker #define SL_OBJECT_STATE_DESTROYING ((SLuint32) 0xB) // destroy object when no strong references 376*bebae9c0SAndroid Build Coastguard Worker 377*bebae9c0SAndroid Build Coastguard Worker #ifdef USE_OUTPUTMIXEXT 378*bebae9c0SAndroid Build Coastguard Worker #define SL_PLAYSTATE_STOPPING ((SLuint32) 0x4) // Play::Stop while PLAYING 379*bebae9c0SAndroid Build Coastguard Worker // If we needed it, could have PLAYING mean mixer is currently reading from front buffer, 380*bebae9c0SAndroid Build Coastguard Worker // while PLAYABLE would mean application requested PLAYING, but buffer queue is empty 381*bebae9c0SAndroid Build Coastguard Worker #endif 382*bebae9c0SAndroid Build Coastguard Worker 383*bebae9c0SAndroid Build Coastguard Worker #ifndef ANDROID 384*bebae9c0SAndroid Build Coastguard Worker extern void *sync_start(void *arg); 385*bebae9c0SAndroid Build Coastguard Worker #endif 386*bebae9c0SAndroid Build Coastguard Worker extern SLresult err_to_result(int err); 387*bebae9c0SAndroid Build Coastguard Worker 388*bebae9c0SAndroid Build Coastguard Worker #ifdef __GNUC__ 389*bebae9c0SAndroid Build Coastguard Worker #define ctz __builtin_ctz 390*bebae9c0SAndroid Build Coastguard Worker #else 391*bebae9c0SAndroid Build Coastguard Worker extern unsigned ctz(unsigned); 392*bebae9c0SAndroid Build Coastguard Worker #endif 393*bebae9c0SAndroid Build Coastguard Worker extern const char * const interface_names[MPH_MAX]; 394*bebae9c0SAndroid Build Coastguard Worker #include "platform.h" 395*bebae9c0SAndroid Build Coastguard Worker #include "attr.h" 396*bebae9c0SAndroid Build Coastguard Worker #include "handlers.h" 397*bebae9c0SAndroid Build Coastguard Worker #include "trace.h" 398*bebae9c0SAndroid Build Coastguard Worker 399*bebae9c0SAndroid Build Coastguard Worker #ifdef USE_SNDFILE 400*bebae9c0SAndroid Build Coastguard Worker extern void audioPlayerTransportUpdate(CAudioPlayer *audioPlayer); 401*bebae9c0SAndroid Build Coastguard Worker #endif 402*bebae9c0SAndroid Build Coastguard Worker 403*bebae9c0SAndroid Build Coastguard Worker #ifndef FALLTHROUGH_INTENDED 404*bebae9c0SAndroid Build Coastguard Worker #ifdef __clang__ 405*bebae9c0SAndroid Build Coastguard Worker #define FALLTHROUGH_INTENDED [[clang::fallthrough]] 406*bebae9c0SAndroid Build Coastguard Worker #else 407*bebae9c0SAndroid Build Coastguard Worker #define FALLTHROUGH_INTENDED 408*bebae9c0SAndroid Build Coastguard Worker #endif // __clang__ 409*bebae9c0SAndroid Build Coastguard Worker #endif // FALLTHROUGH_INTENDED 410*bebae9c0SAndroid Build Coastguard Worker 411*bebae9c0SAndroid Build Coastguard Worker extern SLresult IBufferQueue_Enqueue(SLBufferQueueItf self, const void *pBuffer, SLuint32 size); 412*bebae9c0SAndroid Build Coastguard Worker extern SLresult IBufferQueue_Clear(SLBufferQueueItf self); 413*bebae9c0SAndroid Build Coastguard Worker extern SLresult IBufferQueue_RegisterCallback(SLBufferQueueItf self, 414*bebae9c0SAndroid Build Coastguard Worker slBufferQueueCallback callback, void *pContext); 415*bebae9c0SAndroid Build Coastguard Worker 416*bebae9c0SAndroid Build Coastguard Worker extern bool IsInterfaceInitialized(IObject *thiz, unsigned MPH); 417*bebae9c0SAndroid Build Coastguard Worker extern SLresult AcquireStrongRef(IObject *object, SLuint32 expectedObjectID); 418*bebae9c0SAndroid Build Coastguard Worker extern void ReleaseStrongRef(IObject *object); 419*bebae9c0SAndroid Build Coastguard Worker extern void ReleaseStrongRefAndUnlockExclusive(IObject *object); 420*bebae9c0SAndroid Build Coastguard Worker 421*bebae9c0SAndroid Build Coastguard Worker extern COutputMix *CAudioPlayer_GetOutputMix(CAudioPlayer *audioPlayer); 422*bebae9c0SAndroid Build Coastguard Worker extern SLresult IEngineCapabilities_QueryLEDCapabilities(SLEngineCapabilitiesItf self, 423*bebae9c0SAndroid Build Coastguard Worker SLuint32 *pIndex, SLuint32 *pLEDDeviceID, SLLEDDescriptor *pDescriptor); 424*bebae9c0SAndroid Build Coastguard Worker extern SLresult IEngineCapabilities_QueryVibraCapabilities(SLEngineCapabilitiesItf self, 425*bebae9c0SAndroid Build Coastguard Worker SLuint32 *pIndex, SLuint32 *pVibraDeviceID, SLVibraDescriptor *pDescriptor); 426*bebae9c0SAndroid Build Coastguard Worker 427*bebae9c0SAndroid Build Coastguard Worker extern CEngine *theOneTrueEngine; 428*bebae9c0SAndroid Build Coastguard Worker extern pthread_mutex_t theOneTrueMutex; 429*bebae9c0SAndroid Build Coastguard Worker extern unsigned theOneTrueRefCount; 430*bebae9c0SAndroid Build Coastguard Worker 431*bebae9c0SAndroid Build Coastguard Worker extern LI_API SLresult liCreateEngine(SLObjectItf *pEngine, SLuint32 numOptions, 432*bebae9c0SAndroid Build Coastguard Worker const SLEngineOption *pEngineOptions, SLuint32 numInterfaces, 433*bebae9c0SAndroid Build Coastguard Worker const SLInterfaceID *pInterfaceIds, const SLboolean *pInterfaceRequired, 434*bebae9c0SAndroid Build Coastguard Worker const ClassTable *pCEngine_class); 435*bebae9c0SAndroid Build Coastguard Worker extern LI_API SLresult liQueryNumSupportedInterfaces(SLuint32 *pNumSupportedInterfaces, 436*bebae9c0SAndroid Build Coastguard Worker const ClassTable *clazz); 437*bebae9c0SAndroid Build Coastguard Worker extern LI_API SLresult liQuerySupportedInterfaces(SLuint32 index, SLInterfaceID *pInterfaceId, 438*bebae9c0SAndroid Build Coastguard Worker const ClassTable *clazz); 439*bebae9c0SAndroid Build Coastguard Worker 440*bebae9c0SAndroid Build Coastguard Worker // The EnqueueAsyncCallback macros provide a safe way to asynchronously call an application-level 441*bebae9c0SAndroid Build Coastguard Worker // callback handler that is permitted to do almost anything, including block. This is intended 442*bebae9c0SAndroid Build Coastguard Worker // primarily for "notification" callbacks such as play head progress. Do not use for callbacks 443*bebae9c0SAndroid Build Coastguard Worker // which must be synchronous, such as buffer queue completions. The enqueue may fail if 444*bebae9c0SAndroid Build Coastguard Worker // the callback queue is full. This almost always indicates an application error such as blocking 445*bebae9c0SAndroid Build Coastguard Worker // for an excessive time within a callback handler or requesting too frequent callbacks. The 446*bebae9c0SAndroid Build Coastguard Worker // recommended recovery is to either retry later, or log a warning or error as appropriate. 447*bebae9c0SAndroid Build Coastguard Worker // If the callback absolutely must be called, then you should be calling it directly instead. 448*bebae9c0SAndroid Build Coastguard Worker // Example usage: 449*bebae9c0SAndroid Build Coastguard Worker // CAudioPlayer *ap; 450*bebae9c0SAndroid Build Coastguard Worker // SLresult result = EnqueueAsyncCallback_ppi(ap, playCallback, &ap->mPlay.mItf, playContext, 451*bebae9c0SAndroid Build Coastguard Worker // SL_PLAYEVENT_HEADATEND); 452*bebae9c0SAndroid Build Coastguard Worker // if (SL_RESULT_SUCCESS != result) { 453*bebae9c0SAndroid Build Coastguard Worker // ALOGW("Callback %p(%p, %p, SL_PLAYEVENT_HEADATEND) dropped", playCallback, &ap->mPlay.mItf, 454*bebae9c0SAndroid Build Coastguard Worker // playContext); 455*bebae9c0SAndroid Build Coastguard Worker // } 456*bebae9c0SAndroid Build Coastguard Worker // which replaces: 457*bebae9c0SAndroid Build Coastguard Worker // (*playCallback)(&ap->mPlay.mItf, playContext, SL_PLAYEVENT_HEADATEND); 458*bebae9c0SAndroid Build Coastguard Worker #define EnqueueAsyncCallback_ppi(object, handler, p1, p2, i1) \ 459*bebae9c0SAndroid Build Coastguard Worker ThreadPool_add_ppi(&(object)->mObject.mEngine->mThreadPool, \ 460*bebae9c0SAndroid Build Coastguard Worker (ClosureHandler_ppi) (handler), (p1), (p2), (i1)) 461*bebae9c0SAndroid Build Coastguard Worker #define EnqueueAsyncCallback_ppii(object, handler, p1, p2, i1, i2) \ 462*bebae9c0SAndroid Build Coastguard Worker ThreadPool_add_ppii(&(object)->mObject.mEngine->mThreadPool, \ 463*bebae9c0SAndroid Build Coastguard Worker (ClosureHandler_ppii) (handler), (p1), (p2), (i1), (i2)) 464*bebae9c0SAndroid Build Coastguard Worker #define EnqueueAsyncCallback_piipp(object, handler, p1, i1, i2, p2, p3) \ 465*bebae9c0SAndroid Build Coastguard Worker ThreadPool_add_piipp(&(object)->mObject.mEngine->mThreadPool, \ 466*bebae9c0SAndroid Build Coastguard Worker (ClosureHandler_piipp) (handler), (p1), (i1), (i2), (p2), (p3)) 467*bebae9c0SAndroid Build Coastguard Worker 468*bebae9c0SAndroid Build Coastguard Worker #define SL_PREFETCHEVENT_NONE ((SLuint32) 0) // placeholder for non-existent SL_PREFETCHEVENT_* 469