sles_allinclusive.h revision daf661248ff6ea2e21799e5114c78b7c1d49630e
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 25773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 26773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "MPH.h" 27773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "MPH_to.h" 28a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "devices.h" 29773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 30773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE 31773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <sndfile.h> 32daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#include "SndFile.h" 33773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE 34773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 35773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SDL 36773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <SDL/SDL_audio.h> 37773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SDL 38773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 39daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#ifdef USE_ANDROID 40773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/AudioSystem.h" 41773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/AudioTrack.h" 42773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/mediaplayer.h" 436fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi#include <utils/String8.h> 44b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi#define ANDROID_SL_MILLIBEL_MAX 0 45daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#include <binder/ProcessState.h> 46773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 47773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 48773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 49773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "OutputMixExt.h" 50773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 51773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 52773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Hook functions 53773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 54773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef void (*VoidHook)(void *self); 55773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef SLresult (*StatusHook)(void *self); 563d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivitypedef SLresult (*AsyncHook)(void *self, SLboolean async); 57b90cb3de9b67383be4e077d807464044f6f18f7aJean-Michel Trivi 58773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Describes how an interface is related to a given class 59773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 60773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_IMPLICIT 0 61773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_EXPLICIT 1 62773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_OPTIONAL 2 63773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC 3 64daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#define INTERFACE_UNAVAILABLE 4 65773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_GAME INTERFACE_DYNAMIC 66773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC INTERFACE_DYNAMIC 67773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC_GAME INTERFACE_DYNAMIC 68773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_EXPLICIT_GAME INTERFACE_EXPLICIT 69773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_GAME INTERFACE_OPTIONAL 70773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_GAME_MUSIC INTERFACE_OPTIONAL 71773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_MUSIC_GAME INTERFACE_OPTIONAL 72773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_OPTIONAL_DYNAMIC INTERFACE_DYNAMIC 73773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_PHONE_GAME INTERFACE_OPTIONAL 74773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_TBD INTERFACE_IMPLICIT 75773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 76773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Maps an interface ID to its offset within the class that exposes it 77773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 78773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct iid_vtable { 79773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi unsigned char mMPH; 80773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi unsigned char mInterface; // relationship 81773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi /*size_t*/ unsigned short mOffset; 82773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 83773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 84773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Per-class const data shared by all instances of the same class 85773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 8672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 87773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // needed by all classes (class class, the superclass of all classes) 88773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct iid_vtable *mInterfaces; 89773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mInterfaceCount; 90773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const signed char *mMPH_to_index; 91773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // FIXME not yet used 9276dde6cd71bdb39459f38218e8aa2b7c19e790dbGlenn Kasten const char * const mName; 93773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi size_t mSize; 94773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mObjectID; 953d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivi AsyncHook mRealize; 963d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivi AsyncHook mResume; 97773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi VoidHook mDestroy; 98773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // append per-class data here 9972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ClassTable; 100773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 101773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// BufferHeader describes each element of a BufferQueue, other than the data 102773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 103773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct BufferHeader { 104773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const void *mBuffer; 105773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mSize; 106773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 107773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 108773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 109773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 110773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// stereo is a frame consisting of a pair of 16-bit PCM samples 111773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 112773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef struct { 113773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi short left; 114773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi short right; 115773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi} stereo; 116773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 117773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 118773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 119773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE 120773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 121773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct SndFile { 122773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // save URI also? 123773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLchar *mPathname; 124773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SNDFILE *mSNDFILE; 125773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // These are used when Enqueue returns SL_RESULT_BUFFER_INSUFFICIENT 126773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const void *mRetryBuffer; 127773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mRetrySize; 128773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mIs0; // which buffer to use next 129773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // FIXME magic numbers 130773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi short mBuffer0[512]; 131773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi short mBuffer1[512]; 132773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 133773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 134773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE 135773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 136a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#ifdef __cplusplus 137a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#define this this_ 138a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#endif 139773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 140773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Interface structures */ 141773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 14272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Object_interface { 14372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten const struct SLObjectItf_ *mItf; 14472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten // FIXME probably not needed for an Object, as it is always first, 14572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten // but look for lingering code that assumes it is here before deleting 146773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct Object_interface *mThis; 14772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten const ClassTable *mClass; 14872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten volatile SLuint32 mState; 14972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten slObjectCallback mCallback; 15072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten void *mContext; 15172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten unsigned mExposedMask; // exposed interfaces 15272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten unsigned mLossOfControlMask; // interfaces with loss of control enabled 15372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten SLint32 mPriority; 15472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten SLboolean mPreemptable; 15572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten pthread_mutex_t mMutex; 15672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten pthread_cond_t mCond; 15772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten // FIXME also an object ID for RPC 15872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten // FIXME and a human-readable name for debugging 15972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IObject; 16072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten 161a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "locks.h" 162a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 16372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 16472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten const struct SL3DCommitItf_ *mItf; 16572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 166773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mDeferred; 16732918086b694fc383c8c2d590ac45492801676f7Glenn Kasten SLuint32 mGeneration; // incremented each master clock cycle 16872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DCommit; 169773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 1707754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten// FIXME move 1717754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum CartesianSphericalActive { 1727754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_COMPUTED_SPHERICAL_SET, 1737754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_REQUESTED_SPHERICAL_SET, 1747754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_UNKNOWN_SPHERICAL_SET, 1757754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_SET_SPHERICAL_COMPUTED, // not in 1.0.1 1767754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_SET_SPHERICAL_REQUESTED, // not in 1.0.1 1777754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_SET_SPHERICAL_UNKNOWN 1787754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten}; 1797754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten 18072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 181773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DDopplerItf_ *mItf; 18272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 1837754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // The API allows client to specify either Cartesian and spherical velocities. 1847754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // But an implementation will likely prefer one or the other. So for 1857754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // maximum portablity, we maintain both units and an indication of which 1867754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // unit was set most recently. In addition, we keep a flag saying whether 1877754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // the other unit has been derived yet. It can take significant time 1887754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // to compute the other unit, so this may be deferred to another thread. 1897754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // For this reason we also keep an indication of whether the secondary 1907754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // has been computed yet, and its accuracy. 1917754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // Though only one unit is primary at a time, a union is inappropriate: 1927754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // the application might read in both units (not in 1.0.1), 1937754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // and due to multi-threading concerns. 1947754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mVelocityCartesian; 19532918086b694fc383c8c2d590ac45492801676f7Glenn Kasten struct { 19632918086b694fc383c8c2d590ac45492801676f7Glenn Kasten SLmillidegree mAzimuth; 19732918086b694fc383c8c2d590ac45492801676f7Glenn Kasten SLmillidegree mElevation; 19832918086b694fc383c8c2d590ac45492801676f7Glenn Kasten SLmillidegree mSpeed; 1997754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten } mVelocitySpherical; 2007754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten enum CartesianSphericalActive mVelocityActive; 201773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mDopplerFactor; 20272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DDoppler; 203773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 20472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 205773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DGroupingItf_ *mItf; 20672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 207773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLObjectItf mGroup; 2080b167267bda99b68346045ccab14e810121d5de4Glenn Kasten // FIXME link to group's set 20972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DGrouping; 210773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 2117754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten// FIXME move 2127754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum AnglesVectorsActive { 2137754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_COMPUTED_VECTORS_SET, // not in 1.0.1 2147754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_REQUESTED_VECTORS_SET, // not in 1.0.1 2157754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_UNKNOWN_VECTORS_SET, 2167754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_SET_VECTORS_COMPUTED, 2177754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_SET_VECTORS_REQUESTED, 2187754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_SET_VECTORS_UNKNOWN 2197754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten}; 2207754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten 22172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 222773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DLocationItf_ *mItf; 22372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 2247754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mLocationCartesian; 2257754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten struct { 2267754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mAzimuth; 2277754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mElevation; 2287754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillimeter mDistance; 2297754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten } mLocationSpherical; 2307754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten enum CartesianSphericalActive mLocationActive; 2317754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten struct { 2327754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mHeading; 2337754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mPitch; 2347754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mRoll; 2357754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten } mOrientationAngles; 2367754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten struct { 2377754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mFront; 2387754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mAbove; 2397754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mUp; 2407754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten } mOrientationVectors; 2417754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten enum AnglesVectorsActive mOrientationActive; 2427754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // Rotations can be slow, so are deferred. 2437754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mTheta; 2447754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mAxis; 2457754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLboolean mRotatePending; 24672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DLocation; 247773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 24872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 249773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DMacroscopicItf_ *mItf; 25072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 251773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct { 252773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mWidth; 253773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mHeight; 254773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mDepth; 255773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi } mSize; 256773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct { 257773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mHeading; 258773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mPitch; 259773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mRoll; 260773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi } mOrientationAngles; 261773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct { 262773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLVec3D mFront; 263773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLVec3D mUp; 264773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi } mOrientationVectors; 2657754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten enum AnglesVectorsActive mOrientationActive; 2667754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // FIXME no longer needed? was for optimization 2677754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // SLuint32 mGeneration; 2687754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // Rotations can be slow, so are deferred. 2697754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mTheta; 2707754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mAxis; 2717754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLboolean mRotatePending; 27272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DMacroscopic; 273773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 27472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 275773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DSourceItf_ *mItf; 27672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 277773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mHeadRelative; 278773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mRolloffMaxDistanceMute; 279773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mMaxDistance; 280773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mMinDistance; 2817754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mConeInnerAngle; 2827754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mConeOuterAngle; 283773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillibel mConeOuterLevel; 284773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mRolloffFactor; 285773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mRoomRolloffFactor; 286773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint8 mDistanceModel; 28772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DSource; 288773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 28972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 290773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLAudioDecoderCapabilitiesItf_ *mItf; 29172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 29272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioDecoderCapabilities; 293773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 29472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 295773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLAudioEncoderItf_ *mItf; 29672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 297773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLAudioEncoderSettings mSettings; 29872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoder; 299773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 30072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 301773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLAudioEncoderCapabilitiesItf_ *mItf; 30272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 30372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoderCapabilities; 304773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 30572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 306773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLAudioIODeviceCapabilitiesItf_ *mItf; 30772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 3087754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten slAvailableAudioInputsChangedCallback mAvailableAudioInputsChangedCallback; 3097754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten void *mAvailableAudioInputsChangedContext; 3107754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten slAvailableAudioOutputsChangedCallback mAvailableAudioOutputsChangedCallback; 3117754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten void *mAvailableAudioOutputsChangedContext; 3127754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten slDefaultDeviceIDMapChangedCallback mDefaultDeviceIDMapChangedCallback; 3137754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten void *mDefaultDeviceIDMapChangedContext; 31472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioIODeviceCapabilities; 315773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 31672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 317773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLBassBoostItf_ *mItf; 31872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 319773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mEnabled; 320773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mStrength; 32172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBassBoost; 322773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 32372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct BufferQueue_interface { 324773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLBufferQueueItf_ *mItf; 32572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 326773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi volatile SLBufferQueueState mState; 327773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slBufferQueueCallback mCallback; 328773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 329773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mNumBuffers; 330773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct BufferHeader *mArray; 331773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct BufferHeader *mFront, *mRear; 3321ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi SLuint32 mSizeConsumed; 333773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // saves a malloc in the typical case 334773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define BUFFER_HEADER_TYPICAL 4 335773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct BufferHeader mTypical[BUFFER_HEADER_TYPICAL+1]; 33672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBufferQueue; 337773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 33872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 339773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLDeviceVolumeItf_ *mItf; 34072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 341773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLint32 mVolume[2]; // FIXME Hard-coded for default in/out 34272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDeviceVolume; 343773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 34472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 345773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLDynamicInterfaceManagementItf_ *mItf; 34672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 347773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi unsigned mAddedMask; // added interfaces, a subset of exposed interfaces 348773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slDynamicInterfaceManagementCallback mCallback; 349773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 35072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicInterfaceManagement; 351773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 35272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 353773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLDynamicSourceItf_ *mItf; 35472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 355773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLDataSource *mDataSource; 35672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicSource; 357773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 358773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// FIXME Move this elsewhere 359773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 360773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define AUX_ENVIRONMENTALREVERB 0 361773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define AUX_PRESETREVERB 1 362773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define AUX_MAX 2 363773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 364773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#if 0 365773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistatic const unsigned char AUX_to_MPH[AUX_MAX] = { 366773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi MPH_ENVIRONMENTALREVERB, 367773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi MPH_PRESETREVERB 368773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 369773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 370773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 371773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// private 372773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 373773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EnableLevel { 374773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mEnable; 375773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillibel mSendLevel; 376773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 377773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 37872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 379773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEffectSendItf_ *mItf; 38072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 381773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct OutputMix_class *mOutputMix; 382773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillibel mDirectLevel; 383773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct EnableLevel mEnableLevels[AUX_MAX]; 38472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEffectSend; 38572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten 38672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten// private 387773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 38872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 389773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEngineItf_ *mItf; 39072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 391773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mLossOfControlGlobal; 392773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // FIXME Per-class non-const data such as vector of created objects. 393773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // Each engine is its own universe. 39472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten SLuint32 mInstanceCount; 395773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // Vector<Type> instances; 39672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten // FIXME set of objects 39772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten#define INSTANCE_MAX 32 // FIXME no magic numbers 39872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mInstances[INSTANCE_MAX]; 39972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngine; 400773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 40172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 402773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEngineCapabilitiesItf_ *mItf; 40372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 404773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mThreadSafe; 40572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngineCapabilities; 406773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 40772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 408773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEnvironmentalReverbItf_ *mItf; 40972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 410773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLEnvironmentalReverbSettings mProperties; 41172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEnvironmentalReverb; 412773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 413773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// FIXME move 414773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EqualizerBand { 415773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmilliHertz mMin; 416773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmilliHertz mCenter; 4170b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLmilliHertz mMax; 418773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 419773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 42072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 421773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEqualizerItf_ *mItf; 42272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 423773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mEnabled; 424773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mPreset; 4250b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLmillibel *mLevels; 426773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // const 427773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mNumPresets; 428773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mNumBands; 4290b167267bda99b68346045ccab14e810121d5de4Glenn Kasten const struct EqualizerBand *mBands; 430773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const SLchar * const *mPresetNames; 4310b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLmillibel mBandLevelRangeMin; 4320b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLmillibel mBandLevelRangeMax; 43372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEqualizer; 434773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 43572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 436773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLLEDArrayItf_ *mItf; 43772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 438773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mLightMask; 439773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLHSL *mColor; 440773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // const 441773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint8 mCount; 44272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ILEDArray; 443773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 4440b167267bda99b68346045ccab14e810121d5de4Glenn Kasten// FIXME sort: MIDI goes here 4450b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 44672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 447773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMetadataExtractionItf_ *mItf; 44872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 449773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mKeySize; 450773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const void *mKey; 451773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mKeyEncoding; 452773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const SLchar *mValueLangCountry; 453773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mValueEncoding; 454773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint8 mFilterMask; 455773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi /*FIXME*/ int mKeyFilter; 45672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataExtraction; 457773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 45872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 459773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMetadataTraversalItf_ *mItf; 46072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 461773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mIndex; 462773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mMode; 463773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mCount; 464773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mSize; 46572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataTraversal; 466773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 46772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 468773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMIDIMessageItf_ *mItf; 46972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 470773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slMetaEventCallback mMetaEventCallback; 471773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mMetaEventContext; 472773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slMIDIMessageCallback mMessageCallback; 473773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mMessageContext; 4740b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLuint8 mMessageTypes; 47572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMessage; 476773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 47772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 478773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMIDIMuteSoloItf_ *mItf; 47972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 480773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mChannelMuteMask; 481773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mChannelSoloMask; 482773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mTrackMuteMask; 483773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mTrackSoloMask; 484773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // const ? 485773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mTrackCount; 48672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMuteSolo; 487773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 48872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 489773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMIDITempoItf_ *mItf; 49072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 491773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mTicksPerQuarterNote; 492773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mMicrosecondsPerQuarterNote; 49372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITempo; 494773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 49572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 496773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMIDITimeItf_ *mItf; 49772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 498773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mDuration; 499773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mPosition; 500773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mStartTick; 501773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mNumTicks; 50272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITime; 503773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 50472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 505773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMuteSoloItf_ *mItf; 50672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 507773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mMuteMask; 508773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mSoloMask; 509773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // const 510773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint8 mNumChannels; 51172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMuteSolo; 512773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 51372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 514773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLOutputMixItf_ *mItf; 51572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 5167754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten slMixDeviceChangeCallback mCallback; 5177754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten void *mContext; 518773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 519773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi unsigned mActiveMask; // 1 bit per active track 5200b167267bda99b68346045ccab14e810121d5de4Glenn Kasten struct Track mTracks[32]; // FIXME magic 521773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 52272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMix; 523773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 524773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 52572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 526773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLOutputMixExtItf_ *mItf; 52772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 52872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMixExt; 529773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 530773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 53172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 532773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPitchItf_ *mItf; 53372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 534773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mPitch; 535773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // const 536773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMinPitch; 537773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMaxPitch; 53872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPitch; 539773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 54072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Play_interface { 541773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPlayItf_ *mItf; 54272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 543773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi volatile SLuint32 mState; 544773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mDuration; 545773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mPosition; 546773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // unsigned mPositionSamples; // position in sample units 547773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slPlayCallback mCallback; 548773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 549773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mEventFlags; 550773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mMarkerPosition; 551773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mPositionUpdatePeriod; 55272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlay; 553773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 55472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 555773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPlaybackRateItf_ *mItf; 55672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 557773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mRate; 558773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mProperties; 5590b167267bda99b68346045ccab14e810121d5de4Glenn Kasten // const 560773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMinRate; 561773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMaxRate; 562773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mStepSize; 563773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mCapabilities; 56472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlaybackRate; 565773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 56672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 567773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPrefetchStatusItf_ *mItf; 56872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 569773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mStatus; 570773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mLevel; 571773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slPrefetchCallback mCallback; 572773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 573773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mCallbackEventsMask; 574773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mFillUpdatePeriod; 57572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPrefetchStatus; 576773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 57772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 578773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPresetReverbItf_ *mItf; 57972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 580773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mPreset; 58172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPresetReverb; 582773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 58372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 584773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLRatePitchItf_ *mItf; 58572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 586773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mRate; 5870b167267bda99b68346045ccab14e810121d5de4Glenn Kasten // const 588773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMinRate; 589773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMaxRate; 59072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRatePitch; 591773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 59272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 593773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLRecordItf_ *mItf; 59472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 595773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mState; 596773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mDurationLimit; 597773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mPosition; 598773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slRecordCallback mCallback; 599773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 600773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mCallbackEventsMask; 601773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mMarkerPosition; 602773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mPositionUpdatePeriod; 60372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRecord; 604773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 60572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 606773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLSeekItf_ *mItf; 60772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 608773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mPos; 609773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mLoopEnabled; 610773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mStartPos; 611773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mEndPos; 61272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ISeek; 613773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 61472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 615773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLThreadSyncItf_ *mItf; 61672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 617773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mInCriticalSection; 618773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mWaiting; 619773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi pthread_t mOwner; 62072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IThreadSync; 621773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 62272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 623773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLVibraItf_ *mItf; 62472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 625773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mVibrate; 626773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmilliHertz mFrequency; 627773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mIntensity; 62872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVibra; 629773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 63072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 631773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLVirtualizerItf_ *mItf; 63272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 633773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mEnabled; 634773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mStrength; 63572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVirtualizer; 636773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 63772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 638773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLVisualizationItf_ *mItf; 63972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 640773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slVisualizationCallback mCallback; 641773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 642773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmilliHertz mRate; 64372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVisualization; 644773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 64572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 646773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLVolumeItf_ *mItf; 64772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 648773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillibel mLevel; 649773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mMute; 650773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mEnableStereoPosition; 651773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mStereoPosition; 6526a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi#ifdef USE_ANDROID 6536a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi /** 6546a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi * Amplification (can be attenuation) factor derived for the VolumeLevel 6556a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi */ 6566a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi float mAmplFromVolLevel; 6576a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi /** 6586a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi * Left/right amplification (can be attenuations) factors derived for the StereoPosition 6596a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi */ 6606a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi float mAmplFromStereoPos[2]; 6616a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi /** 6626a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi * Channel mask for which channels are muted 6636a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi */ 6646a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi int mChannelMutes; 6656a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi /** 6666a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi * Channel mask for which channels are solo'ed 6676a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi */ 6686a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi int mChannelSolos; 6696a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi#endif 67072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVolume; 671773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 672773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Class structures */ 673773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 67472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 67572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 67672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 67772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DLocation m3DLocation; 67872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DDoppler m3DDoppler; 67972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DSource m3DSource; 68072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DMacroscopic m3DMacroscopic; 68172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten // FIXME set of objects 68272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} C3DGroup; 683773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 684773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_ANDROID 685773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* 686773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Used to define the mapping from an OpenSL ES audio player to an Android 687773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * media framework object 688773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi */ 689773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivienum AndroidObject_type { 690c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi INVALID_TYPE =-1, 691773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi MEDIAPLAYER = 0, 692773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi AUDIOTRACK_PUSH = 1, 693773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi AUDIOTRACK_PULL = 2, 694773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi NUM_AUDIOPLAYER_MAP_TYPES 695773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 696773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 697773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 69872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 69972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 70072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 70172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPlay mPlay; 70272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DDoppler m3DDoppler; 70372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DGrouping m3DGrouping; 70472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DLocation m3DLocation; 70572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DSource m3DSource; 70672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBufferQueue mBufferQueue; 70772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEffectSend mEffectSend; 70872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMuteSolo mMuteSolo; 70972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataExtraction mMetadataExtraction; 71072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataTraversal mMetadataTraversal; 71172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPrefetchStatus mPrefetchStatus; 71272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IRatePitch mRatePitch; 71372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten ISeek mSeek; 71472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVolume mVolume; 715773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 71672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DMacroscopic m3DMacroscopic; 71772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBassBoost mBassBoost; 71872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicSource mDynamicSource; 71972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 72072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEqualizer mEqualizer; 72172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPitch mPitch; 72272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPresetReverb mPresetReverb; 72372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPlaybackRate mPlaybackRate; 72472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVirtualizer mVirtualizer; 72572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVisualization mVisualization; 726773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // rest of fields are not related to the interfaces 727773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE 728773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct SndFile mSndFile; 729773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE 730773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_ANDROID 731773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi enum AndroidObject_type mAndroidObjType; 732773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi union { 733773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi android::AudioTrack *mAudioTrack; 734773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi android::MediaPlayer *mMediaPlayer; 735773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi }; 7366fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi char* mUri;// FIXME temporary storage before we handle that correctly 7376fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi pthread_t mThread; 738773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 73972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CAudioPlayer; 740773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 74172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 742773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 74372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 74472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 74572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IRecord mRecord; 74672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IAudioEncoder mAudioEncoder; 747773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 74872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBassBoost mBassBoost; 74972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicSource mDynamicSource; 75072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEqualizer mEqualizer; 75172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVisualization mVisualization; 75272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVolume mVolume; 75372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CAudioRecorder; 754773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 75572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 756773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated implicit interfaces 75772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 75872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 75972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEngine mEngine; 76072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEngineCapabilities mEngineCapabilities; 76172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IThreadSync mThreadSync; 762773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated explicit interfaces 76372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IAudioIODeviceCapabilities mAudioIODeviceCapabilities; 76472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IAudioDecoderCapabilities mAudioDecoderCapabilities; 76572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IAudioEncoderCapabilities mAudioEncoderCapabilities; 76672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DCommit m3DCommit; 767773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 76872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDeviceVolume mDeviceVolume; 769b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten pthread_t mSyncThread; 77072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CEngine; 771773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 77272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 773773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 77472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 77572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 77672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten ILEDArray mLEDArray; 777773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mDeviceID; 77872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CLEDDevice; 779773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 78072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 781773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 78272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 78372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 78472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DDoppler m3DDoppler; 78572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DLocation m3DLocation; 78672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CListener; 787773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 78872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 789773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 79072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 79172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 79272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicSource mDynamicSource; 79372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataExtraction mMetadataExtraction; 79472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataTraversal mMetadataTraversal; 79572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMetadataExtractor; 796773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 79772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 798773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 79972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 80072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 80172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPlay mPlay; 80272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DDoppler m3DDoppler; 80372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DGrouping m3DGrouping; 80472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DLocation m3DLocation; 80572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DSource m3DSource; 80672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBufferQueue mBufferQueue; 80772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEffectSend mEffectSend; 80872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMuteSolo mMuteSolo; 80972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataExtraction mMetadataExtraction; 81072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataTraversal mMetadataTraversal; 81172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMIDIMessage mMIDIMessage; 81272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMIDITime mMIDITime; 81372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMIDITempo mMIDITempo; 81472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMIDIMuteSolo mMIDIMuteSolo; 81572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPrefetchStatus mPrefetchStatus; 81672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten ISeek mSeek; 81772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVolume mVolume; 818773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 81972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DMacroscopic m3DMacroscopic; 82072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBassBoost mBassBoost; 82172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicSource mDynamicSource; 82272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 82372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEqualizer mEqualizer; 82472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPitch mPitch; 82572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPresetReverb mPresetReverb; 82672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPlaybackRate mPlaybackRate; 82772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVirtualizer mVirtualizer; 82872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVisualization mVisualization; 82972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMidiPlayer; 83072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten 83172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct OutputMix_class { 832773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 83372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 83472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 83572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IOutputMix mOutputMix; 836773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 83772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IOutputMixExt mOutputMixExt; 838773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 83972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 84072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEqualizer mEqualizer; 84172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPresetReverb mPresetReverb; 84272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVirtualizer mVirtualizer; 84372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVolume mVolume; 844773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 84572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBassBoost mBassBoost; 84672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVisualization mVisualization; 84772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} COutputMix; 848773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 84972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 850773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 85172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 85272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 85372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVibra mVibra; 854773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // 855773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mDeviceID; 85672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CVibraDevice; 857a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 85861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstruct MPH_init { 85961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten // unsigned char mMPH; 86061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten VoidHook mInit; 86161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten VoidHook mDeinit; 86261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}; 86361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 86461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenextern /*static*/ int IID_to_MPH(const SLInterfaceID iid); 86561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenextern /*static*/ const struct MPH_init MPH_init_table[MPH_MAX]; 866979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern SLresult checkInterfaces(const ClassTable *class__, 867979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds, 868979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten const SLboolean *pInterfaceRequired, unsigned *pExposedMask); 869979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern IObject *construct(const ClassTable *class__, 870979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten unsigned exposedMask, SLEngineItf engine); 871979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern const ClassTable *objectIDtoClass(SLuint32 objectID); 872979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern const struct SLInterfaceID_ SL_IID_array[MPH_MAX]; 873b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kastenextern SLuint32 IObjectToObjectID(IObject *object); 874b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten 875b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten// Map an interface to it's "object ID" (which is really a class ID) 876b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten 877b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten#define InterfaceToObjectID(this) IObjectToObjectID((this)->mThis) 878daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten 879daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#ifdef USE_ANDROID 880daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#include "sles_to_android.h" 881daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#endif 882daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten 883daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastentypedef union { 884daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten SLuint32 mLocatorType; 885daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten SLDataLocator_Address mAddress; 886daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten SLDataLocator_BufferQueue mBufferQueue; 887daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten SLDataLocator_IODevice mIODevice; 888daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten SLDataLocator_MIDIBufferQueue mMIDIBufferQueue; 889daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten SLDataLocator_OutputMix mOutputMix; 890daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten SLDataLocator_URI mURI; 891daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten} DataLocator; 892daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten 893daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastentypedef union { 894daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten SLuint32 mFormatType; 895daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten SLDataFormat_PCM mPCM; 896daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten SLDataFormat_MIME mMIME; 897daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten} DataFormat; 898daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten 899daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastentypedef struct { 900daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten DataLocator mLocator; 901daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten DataFormat mFormat; 902daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten} DataLocatorFormat; 903daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten 904daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenextern SLresult checkDataSource(const SLDataSource *pDataSrc, DataLocatorFormat *myDataSourceLocator); 905daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenextern SLresult checkDataSink(const SLDataSink *pDataSink, DataLocatorFormat *myDataSinkLocator); 906daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenextern void freeDataLocatorFormat(DataLocatorFormat *dlf); 907