sles_allinclusive.h revision 40d1c40832a448e23d0bb37512aee53222575c2e
1773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* 2773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project 3773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * 4773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 5773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * you may not use this file except in compliance with the License. 6773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * You may obtain a copy of the License at 7773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * 8773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 9773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * 10773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 11773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 12773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * See the License for the specific language governing permissions and 14773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * limitations under the License. 15773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi */ 16773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 17773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "OpenSLES.h" 18773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <stddef.h> // offsetof 19773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <stdlib.h> // malloc 20773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <string.h> // memcmp 21773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <stdio.h> // debugging 22773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <assert.h> // debugging 23773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <pthread.h> 2432918086b694fc383c8c2d590ac45492801676f7Glenn Kasten#include <unistd.h> // usleep 25d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten#include <errno.h> 26773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 27773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "MPH.h" 28773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "MPH_to.h" 29a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "devices.h" 30d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten#include "ThreadPool.h" 31773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 32acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef struct CAudioPlayer_struct CAudioPlayer; 336a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kastentypedef struct C3DGroup_struct C3DGroup; 34acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten 35773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE 36773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <sndfile.h> 377324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#include "SLSndFile.h" 38773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE 39773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 40773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SDL 41773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <SDL/SDL_audio.h> 42773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SDL 43773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 44ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID 45773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/AudioSystem.h" 46773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/AudioTrack.h" 47773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/mediaplayer.h" 486fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi#include <utils/String8.h> 49b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi#define ANDROID_SL_MILLIBEL_MAX 0 50daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#include <binder/ProcessState.h> 51773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 52773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 53773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 54773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "OutputMixExt.h" 55773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 56773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 57773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Hook functions 58773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 59773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef void (*VoidHook)(void *self); 60773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef SLresult (*StatusHook)(void *self); 613d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivitypedef SLresult (*AsyncHook)(void *self, SLboolean async); 62b90cb3de9b67383be4e077d807464044f6f18f7aJean-Michel Trivi 63773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Describes how an interface is related to a given class 64773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 65773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_IMPLICIT 0 66773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_EXPLICIT 1 67773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_OPTIONAL 2 68773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC 3 69daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#define INTERFACE_UNAVAILABLE 4 70773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_GAME INTERFACE_DYNAMIC 71773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC INTERFACE_DYNAMIC 72773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC_GAME INTERFACE_DYNAMIC 73773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_EXPLICIT_GAME INTERFACE_EXPLICIT 74773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_GAME INTERFACE_OPTIONAL 75773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_GAME_MUSIC INTERFACE_OPTIONAL 76773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_MUSIC_GAME INTERFACE_OPTIONAL 77773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_OPTIONAL_DYNAMIC INTERFACE_DYNAMIC 78773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_PHONE_GAME INTERFACE_OPTIONAL 79773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_TBD INTERFACE_IMPLICIT 80773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 81510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten// Describes how an interface is related to a given object 82510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten 83510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACE_UNINITIALIZED 1 // not requested at object creation time 84510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACE_EXPOSED 2 // requested at object creation time 85510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACE_ADDING_1 3 // part 1 of asynchronous AddInterface, pending 86510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACE_ADDING_2 4 // synchronous AddInterface, or part 2 of asynchronous 87510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACE_ADDED 5 // AddInterface has completed 88510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACE_REMOVING 6 // unlocked phase of (synchronous) RemoveInterface 89510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACE_SUSPENDING 7 // suspend in progress 90510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACE_SUSPENDED 8 // suspend has completed 91510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACE_RESUMING_1 9 // part 1 of asynchronous ResumeInterface, pending 92510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACE_RESUMING_2 10 // synchronous ResumeInterface, or part 2 of asynchronous 93510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACE_ADDING_1A 11 // part 1 of asynchronous AddInterface, aborted 94510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACE_RESUMING_1A 12 // part 1 of asynchronous ResumeInterface, aborted 95510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten 96773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Maps an interface ID to its offset within the class that exposes it 97773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 98773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct iid_vtable { 99773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi unsigned char mMPH; 100773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi unsigned char mInterface; // relationship 101773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi /*size_t*/ unsigned short mOffset; 102773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 103773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 104773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Per-class const data shared by all instances of the same class 105773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 10672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 107773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct iid_vtable *mInterfaces; 108510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint32 mInterfaceCount; // number of possible interfaces 109773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const signed char *mMPH_to_index; 110773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // FIXME not yet used 11176dde6cd71bdb39459f38218e8aa2b7c19e790dbGlenn Kasten const char * const mName; 112773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi size_t mSize; 113773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mObjectID; 114510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten // hooks 1153d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivi AsyncHook mRealize; 116510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten AsyncHook mResume; 117773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi VoidHook mDestroy; 11872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ClassTable; 119773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 120773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// BufferHeader describes each element of a BufferQueue, other than the data 121773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 122d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastentypedef struct { 123773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const void *mBuffer; 124773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mSize; 125d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten} BufferHeader; 126773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 127773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 128773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 129773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// stereo is a frame consisting of a pair of 16-bit PCM samples 130773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 131773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef struct { 132773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi short left; 133773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi short right; 134773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi} stereo; 135773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 136773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 137773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 1387324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#ifdef __cplusplus 1397324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#define this this_ 1407324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#endif 1417324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten 142773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE 143773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 1446a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten#define SndFile_BUFSIZE 512 // in 16-bit samples 1456a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten#define SndFile_NUMBUFS 2 1466a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten 147773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct SndFile { 148773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // save URI also? 149773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLchar *mPathname; 150773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SNDFILE *mSNDFILE; 151773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // These are used when Enqueue returns SL_RESULT_BUFFER_INSUFFICIENT 152773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const void *mRetryBuffer; 153773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mRetrySize; 1546a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten SLuint32 mWhich; // which buffer to use next 1556a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten short mBuffer[SndFile_BUFSIZE * SndFile_NUMBUFS]; 156773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 157773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 158773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE 159773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 160acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten/* Our own merged version of SLDataSource and SLDataSink */ 161acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten 162acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef union { 163acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLuint32 mLocatorType; 164acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataLocator_Address mAddress; 165acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataLocator_BufferQueue mBufferQueue; 166acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataLocator_IODevice mIODevice; 167acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataLocator_MIDIBufferQueue mMIDIBufferQueue; 168acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataLocator_OutputMix mOutputMix; 169acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataLocator_URI mURI; 170acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} DataLocator; 171acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten 172acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef union { 173acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLuint32 mFormatType; 174acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataFormat_PCM mPCM; 175acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataFormat_MIME mMIME; 176acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} DataFormat; 177acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten 178acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef struct { 179acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten union { 180acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataSource mSource; 181acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataSink mSink; 182acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten struct { 183acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten DataLocator *pLocator; 184acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten DataFormat *pFormat; 185acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten } mNeutral; 186acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten } u; 187acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten DataLocator mLocator; 188acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten DataFormat mFormat; 189acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} DataLocatorFormat; 190acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten 191773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Interface structures */ 192773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 19372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Object_interface { 19472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten const struct SLObjectItf_ *mItf; 195d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten // field mThis would be redundant within an IObject, so we substitute mEngine 196ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten struct Engine_interface *mEngine; 197d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten const ClassTable *mClass; 198d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten SLuint32 mInstanceID; // for debugger and for RPC 19972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten slObjectCallback mCallback; 20072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten void *mContext; 201510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten unsigned mGottenMask; // interfaces which are exposed or added, and then gotten 20272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten unsigned mLossOfControlMask; // interfaces with loss of control enabled 20372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten SLint32 mPriority; 20472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten pthread_mutex_t mMutex; 20572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten pthread_cond_t mCond; 206510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mState; // really SLuint32, but SLuint8 to save space 207510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mPreemptable; // really SLboolean, but SLuint8 to save space 208510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten // for best alignment, do not add any fields here 209510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_Default 2 210510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates[INTERFACES_Default]; // state of each of interface 21172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IObject; 21272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten 213a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "locks.h" 214a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 21572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 21672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten const struct SL3DCommitItf_ *mItf; 21772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 218773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mDeferred; 21932918086b694fc383c8c2d590ac45492801676f7Glenn Kasten SLuint32 mGeneration; // incremented each master clock cycle 22072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DCommit; 221773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 2227754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum CartesianSphericalActive { 2237754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_COMPUTED_SPHERICAL_SET, 2247754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_REQUESTED_SPHERICAL_SET, 2257754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_UNKNOWN_SPHERICAL_SET, 2267754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_SET_SPHERICAL_COMPUTED, // not in 1.0.1 2277754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_SET_SPHERICAL_REQUESTED, // not in 1.0.1 2287754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_SET_SPHERICAL_UNKNOWN 2297754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten}; 2307754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten 23172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 232773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DDopplerItf_ *mItf; 23372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 2347754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // The API allows client to specify either Cartesian and spherical velocities. 2357754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // But an implementation will likely prefer one or the other. So for 2367754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // maximum portablity, we maintain both units and an indication of which 2377754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // unit was set most recently. In addition, we keep a flag saying whether 2387754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // the other unit has been derived yet. It can take significant time 2397754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // to compute the other unit, so this may be deferred to another thread. 2407754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // For this reason we also keep an indication of whether the secondary 2417754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // has been computed yet, and its accuracy. 2427754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // Though only one unit is primary at a time, a union is inappropriate: 2437754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // the application might read in both units (not in 1.0.1), 2447754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // and due to multi-threading concerns. 2457754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mVelocityCartesian; 24632918086b694fc383c8c2d590ac45492801676f7Glenn Kasten struct { 24732918086b694fc383c8c2d590ac45492801676f7Glenn Kasten SLmillidegree mAzimuth; 24832918086b694fc383c8c2d590ac45492801676f7Glenn Kasten SLmillidegree mElevation; 24932918086b694fc383c8c2d590ac45492801676f7Glenn Kasten SLmillidegree mSpeed; 2507754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten } mVelocitySpherical; 2517754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten enum CartesianSphericalActive mVelocityActive; 252773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mDopplerFactor; 25372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DDoppler; 254773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 25572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 256773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DGroupingItf_ *mItf; 25772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 2586a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten C3DGroup *mGroup; // link to associated group or NULL 25972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DGrouping; 260773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 2617754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum AnglesVectorsActive { 2627754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_COMPUTED_VECTORS_SET, // not in 1.0.1 2637754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_REQUESTED_VECTORS_SET, // not in 1.0.1 2647754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_UNKNOWN_VECTORS_SET, 2657754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_SET_VECTORS_COMPUTED, 2667754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_SET_VECTORS_REQUESTED, 2677754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_SET_VECTORS_UNKNOWN 2687754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten}; 2697754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten 27072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 271773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DLocationItf_ *mItf; 27272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 2737754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mLocationCartesian; 2747754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten struct { 2757754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mAzimuth; 2767754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mElevation; 2777754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillimeter mDistance; 2787754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten } mLocationSpherical; 2797754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten enum CartesianSphericalActive mLocationActive; 2807754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten struct { 2817754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mHeading; 2827754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mPitch; 2837754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mRoll; 2847754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten } mOrientationAngles; 2857754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten struct { 2867754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mFront; 2877754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mAbove; 2887754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mUp; 2897754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten } mOrientationVectors; 2907754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten enum AnglesVectorsActive mOrientationActive; 2917754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // Rotations can be slow, so are deferred. 2927754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mTheta; 2937754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mAxis; 2947754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLboolean mRotatePending; 29572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DLocation; 296773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 29772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 298773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DMacroscopicItf_ *mItf; 29972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 300773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct { 301773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mWidth; 302773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mHeight; 303773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mDepth; 304773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi } mSize; 305773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct { 306773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mHeading; 307773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mPitch; 308773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mRoll; 309773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi } mOrientationAngles; 310773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct { 311773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLVec3D mFront; 312773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLVec3D mUp; 313773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi } mOrientationVectors; 3147754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten enum AnglesVectorsActive mOrientationActive; 3157754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // Rotations can be slow, so are deferred. 3167754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mTheta; 3177754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mAxis; 3187754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLboolean mRotatePending; 31972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DMacroscopic; 320773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 32172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 322773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DSourceItf_ *mItf; 32372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 324773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mHeadRelative; 325773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mRolloffMaxDistanceMute; 326773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mMaxDistance; 327773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mMinDistance; 3287754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mConeInnerAngle; 3297754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mConeOuterAngle; 330773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillibel mConeOuterLevel; 331773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mRolloffFactor; 332773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mRoomRolloffFactor; 333773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint8 mDistanceModel; 33472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DSource; 335773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 33672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 337773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLAudioDecoderCapabilitiesItf_ *mItf; 33872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 33972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioDecoderCapabilities; 340773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 34172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 342773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLAudioEncoderItf_ *mItf; 34372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 344773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLAudioEncoderSettings mSettings; 34572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoder; 346773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 34772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 348773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLAudioEncoderCapabilitiesItf_ *mItf; 34972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 35072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoderCapabilities; 351773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 35272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 353773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLAudioIODeviceCapabilitiesItf_ *mItf; 35472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 3557754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten slAvailableAudioInputsChangedCallback mAvailableAudioInputsChangedCallback; 3567754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten void *mAvailableAudioInputsChangedContext; 3577754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten slAvailableAudioOutputsChangedCallback mAvailableAudioOutputsChangedCallback; 3587754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten void *mAvailableAudioOutputsChangedContext; 3597754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten slDefaultDeviceIDMapChangedCallback mDefaultDeviceIDMapChangedCallback; 3607754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten void *mDefaultDeviceIDMapChangedContext; 36172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioIODeviceCapabilities; 362773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 36372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 364773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLBassBoostItf_ *mItf; 36572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 366773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mEnabled; 367773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mStrength; 36872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBassBoost; 369773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 37072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct BufferQueue_interface { 371773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLBufferQueueItf_ *mItf; 37272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 3733a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten SLBufferQueueState mState; 374773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slBufferQueueCallback mCallback; 375773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 376773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mNumBuffers; 377d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten BufferHeader *mArray; 378d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten BufferHeader *mFront, *mRear; 3791ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi SLuint32 mSizeConsumed; 380773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // saves a malloc in the typical case 381773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define BUFFER_HEADER_TYPICAL 4 382d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten BufferHeader mTypical[BUFFER_HEADER_TYPICAL+1]; 38372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBufferQueue; 384773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 38540d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten#define MAX_DEVICE 2 38640d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten 38772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 388773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLDeviceVolumeItf_ *mItf; 38972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 39040d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten SLint32 mVolume[MAX_DEVICE]; // FIXME Hard-coded for default in/out 39172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDeviceVolume; 392773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 39372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 394773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLDynamicInterfaceManagementItf_ *mItf; 39572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 396773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slDynamicInterfaceManagementCallback mCallback; 397773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 39872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicInterfaceManagement; 399773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 40072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 401773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLDynamicSourceItf_ *mItf; 40272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 403773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLDataSource *mDataSource; 40472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicSource; 405773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 406773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// private 407773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 408773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EnableLevel { 409773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mEnable; 410773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillibel mSendLevel; 411773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 412773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 413510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten// indexes into IEffectSend.mEnableLevels 414510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten 415510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define AUX_ENVIRONMENTALREVERB 0 416510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define AUX_PRESETREVERB 1 417510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define AUX_MAX 2 418510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten 41972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 420773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEffectSendItf_ *mItf; 42172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 422773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct OutputMix_class *mOutputMix; 423773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillibel mDirectLevel; 424773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct EnableLevel mEnableLevels[AUX_MAX]; 42572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEffectSend; 42672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten 42772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten// private 428773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 429ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kastentypedef struct Engine_interface { 430773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEngineItf_ *mItf; 43172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 432773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mLossOfControlGlobal; 43300d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#ifdef USE_SDL 43400d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten struct OutputMix_class *mOutputMix; // SDL pulls PCM from an arbitrary OutputMixExt 43500d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#endif 436773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // Each engine is its own universe. 43772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten SLuint32 mInstanceCount; 438d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten unsigned mInstanceMask; // 1 bit per active object 439d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define MAX_INSTANCE 32 // see mInstanceMask 440d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten IObject *mInstances[MAX_INSTANCE]; 441d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten SLboolean mShutdown; 442d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten ThreadPool mThreadPool; // for asynchronous operations 44372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngine; 444773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 44572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 446773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEngineCapabilitiesItf_ *mItf; 44772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 448773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mThreadSafe; 44940d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten // const 45040d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten SLuint32 mMaxIndexLED; 45140d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten SLuint32 mMaxIndexVibra; 45272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngineCapabilities; 453773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 45472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 455773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEnvironmentalReverbItf_ *mItf; 45672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 457773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLEnvironmentalReverbSettings mProperties; 45872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEnvironmentalReverb; 459773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 460773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EqualizerBand { 461773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmilliHertz mMin; 462773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmilliHertz mCenter; 4630b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLmilliHertz mMax; 464773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 465773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 4663a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten#define MAX_EQ_BANDS 4 // compile-time limit, runtime limit may be smaller 4673a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten 46872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 469773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEqualizerItf_ *mItf; 47072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 471773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mEnabled; 472773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mPreset; 4733a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten SLmillibel mLevels[MAX_EQ_BANDS]; 4743a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten // const to end of struct 475773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mNumPresets; 476773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mNumBands; 4770b167267bda99b68346045ccab14e810121d5de4Glenn Kasten const struct EqualizerBand *mBands; 4783a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten const struct EqualizerPreset *mPresets; 4790b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLmillibel mBandLevelRangeMin; 4800b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLmillibel mBandLevelRangeMax; 48172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEqualizer; 482773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 4833a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten#define MAX_LED_COUNT 32 4843a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten 48572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 486773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLLEDArrayItf_ *mItf; 48772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 488773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mLightMask; 4893a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten SLHSL mColors[MAX_LED_COUNT]; 490773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // const 491773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint8 mCount; 49272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ILEDArray; 493773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 49472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 495773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMetadataExtractionItf_ *mItf; 49672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 497773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mKeySize; 498773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const void *mKey; 499773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mKeyEncoding; 500773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const SLchar *mValueLangCountry; 501773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mValueEncoding; 502773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint8 mFilterMask; 5036a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten int mKeyFilter; 50472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataExtraction; 505773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 50672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 507773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMetadataTraversalItf_ *mItf; 50872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 509773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mIndex; 510773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mMode; 511773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mCount; 512773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mSize; 51372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataTraversal; 514773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 51572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 516773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMIDIMessageItf_ *mItf; 51772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 518773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slMetaEventCallback mMetaEventCallback; 519773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mMetaEventContext; 520773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slMIDIMessageCallback mMessageCallback; 521773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mMessageContext; 5220b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLuint8 mMessageTypes; 52372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMessage; 524773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 52572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 526773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMIDIMuteSoloItf_ *mItf; 52772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 528773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mChannelMuteMask; 529773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mChannelSoloMask; 530773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mTrackMuteMask; 531773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mTrackSoloMask; 532d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten // const 533773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mTrackCount; 53472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMuteSolo; 535773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 53672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 537773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMIDITempoItf_ *mItf; 53872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 539773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mTicksPerQuarterNote; 540773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mMicrosecondsPerQuarterNote; 54172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITempo; 542773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 54372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 544773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMIDITimeItf_ *mItf; 54572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 546773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mDuration; 547773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mPosition; 548773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mStartTick; 549773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mNumTicks; 55072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITime; 551773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 55272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 553773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMuteSoloItf_ *mItf; 55472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 555773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mMuteMask; 556773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mSoloMask; 557773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // const 558773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint8 mNumChannels; 55972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMuteSolo; 560773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 561d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define MAX_TRACK 32 // see mActiveMask 562d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten 56372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 564773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLOutputMixItf_ *mItf; 56572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 5667754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten slMixDeviceChangeCallback mCallback; 5677754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten void *mContext; 568773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 569773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi unsigned mActiveMask; // 1 bit per active track 570d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten struct Track mTracks[MAX_TRACK]; 571773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 57272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMix; 573773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 574773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 57572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 576773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLOutputMixExtItf_ *mItf; 57772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 57872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMixExt; 579773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 580773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 58172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 582773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPitchItf_ *mItf; 58372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 584773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mPitch; 585773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // const 586773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMinPitch; 587773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMaxPitch; 58872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPitch; 589773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 59072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Play_interface { 591773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPlayItf_ *mItf; 59272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 5933a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten SLuint32 mState; 594773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mDuration; 595773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mPosition; 596773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // unsigned mPositionSamples; // position in sample units 597773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slPlayCallback mCallback; 598773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 599773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mEventFlags; 600773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mMarkerPosition; 601773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mPositionUpdatePeriod; 60272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlay; 603773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 60472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 605773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPlaybackRateItf_ *mItf; 60672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 607773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mRate; 608773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mProperties; 6090b167267bda99b68346045ccab14e810121d5de4Glenn Kasten // const 610773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMinRate; 611773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMaxRate; 612773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mStepSize; 613773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mCapabilities; 61472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlaybackRate; 615773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 61672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 617773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPrefetchStatusItf_ *mItf; 61872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 619773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mStatus; 620773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mLevel; 621773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slPrefetchCallback mCallback; 622773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 623773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mCallbackEventsMask; 624773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mFillUpdatePeriod; 62572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPrefetchStatus; 626773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 62772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 628773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPresetReverbItf_ *mItf; 62972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 630773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mPreset; 63172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPresetReverb; 632773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 63372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 634773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLRatePitchItf_ *mItf; 63572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 636773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mRate; 6370b167267bda99b68346045ccab14e810121d5de4Glenn Kasten // const 638773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMinRate; 639773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMaxRate; 64072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRatePitch; 641773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 64272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 643773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLRecordItf_ *mItf; 64472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 645773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mState; 646773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mDurationLimit; 647773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mPosition; 648773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slRecordCallback mCallback; 649773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 650773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mCallbackEventsMask; 651773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mMarkerPosition; 652773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mPositionUpdatePeriod; 65372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRecord; 654773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 65572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 656773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLSeekItf_ *mItf; 65772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 658773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mPos; 659773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mLoopEnabled; 660773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mStartPos; 661773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mEndPos; 66272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ISeek; 663773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 66472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 665773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLThreadSyncItf_ *mItf; 66672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 667773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mInCriticalSection; 668773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mWaiting; 669773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi pthread_t mOwner; 67072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IThreadSync; 671773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 67272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 673773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLVibraItf_ *mItf; 67472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 675773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mVibrate; 676773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmilliHertz mFrequency; 677773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mIntensity; 67872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVibra; 679773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 68072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 681773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLVirtualizerItf_ *mItf; 68272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 683773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mEnabled; 684773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mStrength; 68572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVirtualizer; 686773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 68772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 688773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLVisualizationItf_ *mItf; 68972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 690773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slVisualizationCallback mCallback; 691773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 692773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmilliHertz mRate; 69372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVisualization; 694773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 69572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 696773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLVolumeItf_ *mItf; 69772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 698773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillibel mLevel; 699773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mMute; 700773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mEnableStereoPosition; 701773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mStereoPosition; 702ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID 7036a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi /** 7046a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi * Amplification (can be attenuation) factor derived for the VolumeLevel 7056a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi */ 7066a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi float mAmplFromVolLevel; 7076a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi /** 7086a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi * Left/right amplification (can be attenuations) factors derived for the StereoPosition 7096a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi */ 7106a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi float mAmplFromStereoPos[2]; 7116a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi /** 7126a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi * Channel mask for which channels are muted 7136a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi */ 7146a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi int mChannelMutes; 7156a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi /** 7166a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi * Channel mask for which channels are solo'ed 7176a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi */ 7186a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi int mChannelSolos; 7196a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi#endif 72072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVolume; 721773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 722773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Class structures */ 723773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 7246a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten/*typedef*/ struct C3DGroup_struct { 72572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 726510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_3DGroup 6 // see MPH_to_3DGroup in MPH_to.c for list of interfaces 727510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_3DGroup - INTERFACES_Default]; 72872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 72972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DLocation m3DLocation; 73072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DDoppler m3DDoppler; 73172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DSource m3DSource; 73272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DMacroscopic m3DMacroscopic; 7336a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten unsigned mMemberMask; // set of member objects 7346a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten} /*C3DGroup*/; 735773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 73680ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi#ifdef ANDROID 737773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* 738773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Used to define the mapping from an OpenSL ES audio player to an Android 739773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * media framework object 740773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi */ 741773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivienum AndroidObject_type { 742c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi INVALID_TYPE =-1, 743773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi MEDIAPLAYER = 0, 744773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi AUDIOTRACK_PUSH = 1, 745773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi AUDIOTRACK_PULL = 2, 746773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi NUM_AUDIOPLAYER_MAP_TYPES 747773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 748f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi 74980ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivienum AndroidObject_state { 75080ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi ANDROID_UNINITIALIZED = -1, 75180ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi ANDROID_PREPARING, 75280ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi ANDROID_PREPARED, 75380ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi ANDROID_PREFETCHING, 75480ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi ANDROID_READY, 75580ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi NUM_ANDROID_STATES 75680ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi}; 75780ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi 758f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivitypedef struct { 759f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi android::AudioTrack *mAudioTrack; 760f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi} AudioTrackData; 761f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi 762f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivitypedef struct { 763f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi android::MediaPlayer *mMediaPlayer; 764f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi} MediaPlayerData; 765f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi 766773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 767773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 768acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten/*typedef*/ struct CAudioPlayer_struct { 76972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 770510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_AudioPlayer 26 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces 771510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_AudioPlayer - INTERFACES_Default]; 77272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 77372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPlay mPlay; 77472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DDoppler m3DDoppler; 77572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DGrouping m3DGrouping; 77672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DLocation m3DLocation; 77772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DSource m3DSource; 77872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBufferQueue mBufferQueue; 77972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEffectSend mEffectSend; 78072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMuteSolo mMuteSolo; 78172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataExtraction mMetadataExtraction; 78272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataTraversal mMetadataTraversal; 78372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPrefetchStatus mPrefetchStatus; 78472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IRatePitch mRatePitch; 78572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten ISeek mSeek; 78672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVolume mVolume; 787773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 78872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DMacroscopic m3DMacroscopic; 78972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBassBoost mBassBoost; 79072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicSource mDynamicSource; 79172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 79272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEqualizer mEqualizer; 79372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPitch mPitch; 79472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPresetReverb mPresetReverb; 79572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPlaybackRate mPlaybackRate; 79672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVirtualizer mVirtualizer; 79772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVisualization mVisualization; 798773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // rest of fields are not related to the interfaces 799acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten DataLocatorFormat mDataSource; 800acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten DataLocatorFormat mDataSink; 801773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE 802773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct SndFile mSndFile; 803773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE 80480ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi#ifdef ANDROID 80506a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi android::Mutex *mpLock; 806773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi enum AndroidObject_type mAndroidObjType; 80780ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi enum AndroidObject_state mAndroidObjState; 808773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi union { 80906a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi AudioTrackData mAudioTrackData; 81006a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi MediaPlayerData mMediaPlayerData; 811773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi }; 812773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 813acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} /*CAudioPlayer*/; 814773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 81572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 816773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 81772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 818510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_AudioRecorder 9 // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces 819510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceContinued[INTERFACES_AudioRecorder - INTERFACES_Default]; 82072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 82172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IRecord mRecord; 82272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IAudioEncoder mAudioEncoder; 823773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 82472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBassBoost mBassBoost; 82572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicSource mDynamicSource; 82672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEqualizer mEqualizer; 82772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVisualization mVisualization; 82872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVolume mVolume; 829ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten // rest of fields are not related to the interfaces 830ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten DataLocatorFormat mDataSource; 831ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten DataLocatorFormat mDataSink; 83272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CAudioRecorder; 833773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 83472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 835773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated implicit interfaces 83672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 837510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_Engine 10 // see MPH_to_Engine in MPH_to.c for list of interfaces 838510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_Engine - INTERFACES_Default]; 83972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 84072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEngine mEngine; 84172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEngineCapabilities mEngineCapabilities; 84272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IThreadSync mThreadSync; 843773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated explicit interfaces 84472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IAudioIODeviceCapabilities mAudioIODeviceCapabilities; 84572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IAudioDecoderCapabilities mAudioDecoderCapabilities; 84672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IAudioEncoderCapabilities mAudioEncoderCapabilities; 84772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DCommit m3DCommit; 848773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 84972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDeviceVolume mDeviceVolume; 850b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten pthread_t mSyncThread; 85172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CEngine; 852773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 85372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 854773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 85572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 856510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_LEDDevice 3 // see MPH_to_LEDDevice in MPH_to.c for list of interfaces 857510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_LEDDevice - INTERFACES_Default]; 85872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 85972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten ILEDArray mLEDArray; 860773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mDeviceID; 86172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CLEDDevice; 862773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 86372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 864773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 86572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 866510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_Listener 4 // see MPH_to_Listener in MPH_to.c for list of interfaces 867510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_Listener - INTERFACES_Default]; 86872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 86972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DDoppler m3DDoppler; 87072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DLocation m3DLocation; 87172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CListener; 872773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 87372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 874773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 87572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 876510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_MetadataExtractor 5 // see MPH_to_MetadataExtractor in MPH_to.c for list of interfaces 877510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_MetadataExtractor - INTERFACES_Default]; 87872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 87972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicSource mDynamicSource; 88072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataExtraction mMetadataExtraction; 88172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataTraversal mMetadataTraversal; 88272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMetadataExtractor; 883773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 88472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 885773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 88672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 887510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_MidiPlayer 29 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces 888510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_MidiPlayer - INTERFACES_Default]; 88972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 89072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPlay mPlay; 89172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DDoppler m3DDoppler; 89272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DGrouping m3DGrouping; 89372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DLocation m3DLocation; 89472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DSource m3DSource; 89572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBufferQueue mBufferQueue; 89672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEffectSend mEffectSend; 89772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMuteSolo mMuteSolo; 89872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataExtraction mMetadataExtraction; 89972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataTraversal mMetadataTraversal; 90072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMIDIMessage mMIDIMessage; 90172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMIDITime mMIDITime; 90272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMIDITempo mMIDITempo; 90372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMIDIMuteSolo mMIDIMuteSolo; 90472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPrefetchStatus mPrefetchStatus; 90572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten ISeek mSeek; 90672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVolume mVolume; 907773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 90872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DMacroscopic m3DMacroscopic; 90972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBassBoost mBassBoost; 91072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicSource mDynamicSource; 91172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 91272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEqualizer mEqualizer; 91372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPitch mPitch; 91472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPresetReverb mPresetReverb; 91572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPlaybackRate mPlaybackRate; 91672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVirtualizer mVirtualizer; 91772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVisualization mVisualization; 91872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMidiPlayer; 91972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten 92072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct OutputMix_class { 921773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 92272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 923510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_OutputMix 11 // see MPH_to_OutputMix in MPH_to.c for list of interfaces 924510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_OutputMix - INTERFACES_Default]; 92572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 92672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IOutputMix mOutputMix; 927773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 92872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IOutputMixExt mOutputMixExt; 929773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 93072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 93172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEqualizer mEqualizer; 93272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPresetReverb mPresetReverb; 93372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVirtualizer mVirtualizer; 93472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVolume mVolume; 935773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 93672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBassBoost mBassBoost; 93772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVisualization mVisualization; 93872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} COutputMix; 939773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 94072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 941773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 94272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 943510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_VibraDevice 3 // see MPH_to_VibraDevice in MPH_to.c for list of interfaces 944510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_VibraDevice - INTERFACES_Default]; 94572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 94672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVibra mVibra; 947773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // 948773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mDeviceID; 94972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CVibraDevice; 950a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 95161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstruct MPH_init { 95261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten // unsigned char mMPH; 95361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten VoidHook mInit; 954510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten VoidHook mResume; 95561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten VoidHook mDeinit; 95661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}; 95761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 95861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenextern /*static*/ int IID_to_MPH(const SLInterfaceID iid); 95961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenextern /*static*/ const struct MPH_init MPH_init_table[MPH_MAX]; 960979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern SLresult checkInterfaces(const ClassTable *class__, 961979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds, 962979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten const SLboolean *pInterfaceRequired, unsigned *pExposedMask); 963979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern IObject *construct(const ClassTable *class__, 964979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten unsigned exposedMask, SLEngineItf engine); 965979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern const ClassTable *objectIDtoClass(SLuint32 objectID); 966979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern const struct SLInterfaceID_ SL_IID_array[MPH_MAX]; 967b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kastenextern SLuint32 IObjectToObjectID(IObject *object); 968b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten 969d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Map an interface to it's "object ID" (which is really a class ID). 970d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis. 971d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// If you have an IObject, then use IObjectToObjectID directly. 972b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten 973b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten#define InterfaceToObjectID(this) IObjectToObjectID((this)->mThis) 974daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten 975d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Map an interface to it's corresponding IObject. 976d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis. 977d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// If you have an IObject, then you're done -- you already have what you need. 978d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten 979d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define InterfaceToIObject(this) ((this)->mThis) 980d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten 981ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID 982daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#include "sles_to_android.h" 983daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#endif 984daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten 985daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenextern SLresult checkDataSource(const SLDataSource *pDataSrc, DataLocatorFormat *myDataSourceLocator); 986daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenextern SLresult checkDataSink(const SLDataSink *pDataSink, DataLocatorFormat *myDataSinkLocator); 987daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenextern void freeDataLocatorFormat(DataLocatorFormat *dlf); 9883a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenextern SLresult CAudioPlayer_Realize(void *self, SLboolean async); 9893a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenextern void CAudioPlayer_Destroy(void *self); 990d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern SLresult CEngine_Realize(void *self, SLboolean async); 991d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern void CEngine_Destroy(void *self); 99200d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#ifdef USE_SDL 99300d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kastenextern void SDL_start(IEngine *thisEngine); 99400d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#endif 995510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_REALIZING_1 ((SLuint32) 0x4) // async realize on work queue 996510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_REALIZING_2 ((SLuint32) 0x5) // sync realize, or async realize hook 997510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_RESUMING_1 ((SLuint32) 0x6) // async resume on work queue 998510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_RESUMING_2 ((SLuint32) 0x7) // sync resume, or async resume hook 999510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_SUSPENDING ((SLuint32) 0x8) // suspend in progress 1000510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_REALIZING_1A ((SLuint32) 0x9) // abort while async realize on work queue 1001510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_RESUMING_1A ((SLuint32) 0xA) // abort while async resume on work queue 1002d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern void *sync_start(void *arg); 1003d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern SLresult err_to_result(int err); 10047245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten 10057245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten#ifdef __GNUC__ 1006d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define ctz __builtin_ctz 10077245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten#else 10087245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kastenextern unsigned ctz(unsigned); 10097245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten#endif 101040d1c40832a448e23d0bb37512aee53222575c2eGlenn Kastenextern const char * const interface_names[MPH_MAX]; 1011