sles_allinclusive.h revision f156301680273e71e56e898f98798f5b5b2431f6
1193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi/* 2193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project 3193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * 4193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 5193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * you may not use this file except in compliance with the License. 6193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * You may obtain a copy of the License at 7193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * 8193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 9193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * 10193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 11193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 12193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * See the License for the specific language governing permissions and 14193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * limitations under the License. 15193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi */ 16193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 17193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "OpenSLES.h" 18193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <stddef.h> // offsetof 19193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <stdlib.h> // malloc 20193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <string.h> // memcmp 21193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <stdio.h> // debugging 22193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <assert.h> // debugging 23193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <pthread.h> 24d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten#include <unistd.h> // usleep 25437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten#include <errno.h> 26193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 27193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "MPH.h" 28193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "MPH_to.h" 2982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten#include "devices.h" 30437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten#include "ThreadPool.h" 31193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 324c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kastentypedef struct CAudioPlayer_struct CAudioPlayer; 33ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kastentypedef struct C3DGroup_struct C3DGroup; 3415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kastentypedef struct COutputMix_struct COutputMix; 354c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten 36193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_SNDFILE 37193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <sndfile.h> 38aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten#include "SLSndFile.h" 39193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif // USE_SNDFILE 40193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 41193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_SDL 42193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <SDL/SDL_audio.h> 43193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif // USE_SDL 44193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 459db8335361c67c4ed877f68218835df96ce43a4bJean-Michel Trivi#ifdef ANDROID 46ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#include "OpenSLES_Android.h" 47193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "media/AudioSystem.h" 48193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "media/AudioTrack.h" 49193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "media/mediaplayer.h" 500263d22efc4ad9420b367ec61b5a1d1ec72cebb9Jean-Michel Trivi#include <utils/String8.h> 518a307c7272108766eebabc7fa7044d7510d65f77Jean-Michel Trivi#define ANDROID_SL_MILLIBEL_MAX 0 52f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten#include <binder/ProcessState.h> 535d9e8432d0217fe139987703b8e1f129296171ffJean-Michel Trivi#include "android_SfPlayer.h" 54193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 55193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 5615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#define STEREO_CHANNELS 2 5715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten 58193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 59193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "OutputMixExt.h" 60193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 61193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 62193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// Hook functions 63193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 64193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivitypedef void (*VoidHook)(void *self); 65193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivitypedef SLresult (*StatusHook)(void *self); 668a47ad52488855f50b95da649744dde3a254698bJean-Michel Trivitypedef SLresult (*AsyncHook)(void *self, SLboolean async); 674cf440cd9f6106db00571345af7aa02529c9a10aJean-Michel Trivi 68193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// Describes how an interface is related to a given class 69193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 70193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_IMPLICIT 0 71193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_EXPLICIT 1 72193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_OPTIONAL 2 73193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_DYNAMIC 3 74f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten#define INTERFACE_UNAVAILABLE 4 75193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_DYNAMIC_GAME INTERFACE_DYNAMIC 76193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC INTERFACE_DYNAMIC 77193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC_GAME INTERFACE_DYNAMIC 78193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_EXPLICIT_GAME INTERFACE_EXPLICIT 79193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_GAME INTERFACE_OPTIONAL 80193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_GAME_MUSIC INTERFACE_OPTIONAL 81193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_MUSIC_GAME INTERFACE_OPTIONAL 82193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_OPTIONAL_DYNAMIC INTERFACE_DYNAMIC 83193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_PHONE_GAME INTERFACE_OPTIONAL 84193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_TBD INTERFACE_IMPLICIT 85193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 86bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten// Describes how an interface is related to a given object 87bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten 88bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_UNINITIALIZED 1 // not requested at object creation time 89bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_EXPOSED 2 // requested at object creation time 90bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_ADDING_1 3 // part 1 of asynchronous AddInterface, pending 91bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_ADDING_2 4 // synchronous AddInterface, or part 2 of asynchronous 92bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_ADDED 5 // AddInterface has completed 93bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_REMOVING 6 // unlocked phase of (synchronous) RemoveInterface 94bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_SUSPENDING 7 // suspend in progress 95bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_SUSPENDED 8 // suspend has completed 96bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_RESUMING_1 9 // part 1 of asynchronous ResumeInterface, pending 97bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_RESUMING_2 10 // synchronous ResumeInterface, or part 2 of asynchronous 98bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_ADDING_1A 11 // part 1 of asynchronous AddInterface, aborted 99bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_RESUMING_1A 12 // part 1 of asynchronous ResumeInterface, aborted 100bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten 101193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// Maps an interface ID to its offset within the class that exposes it 102193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 103193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivistruct iid_vtable { 104193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi unsigned char mMPH; 105193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi unsigned char mInterface; // relationship 106193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi /*size_t*/ unsigned short mOffset; 107193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi}; 108193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 109193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// Per-class const data shared by all instances of the same class 110193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 111903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 112193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct iid_vtable *mInterfaces; 113bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint32 mInterfaceCount; // number of possible interfaces 114193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const signed char *mMPH_to_index; 115193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // FIXME not yet used 116ee35e132113602e20012829377d16f0572c61195Glenn Kasten const char * const mName; 117193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi size_t mSize; 118193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mObjectID; 119bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten // hooks 1208a47ad52488855f50b95da649744dde3a254698bJean-Michel Trivi AsyncHook mRealize; 121bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten AsyncHook mResume; 122193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi VoidHook mDestroy; 123903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} ClassTable; 124193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 125193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// BufferHeader describes each element of a BufferQueue, other than the data 126193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 127437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastentypedef struct { 128193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const void *mBuffer; 129193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mSize; 130437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten} BufferHeader; 131193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 132193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 133193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 134193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// stereo is a frame consisting of a pair of 16-bit PCM samples 135193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 136193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivitypedef struct { 137193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi short left; 138193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi short right; 139193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi} stereo; 140193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 141193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 142193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 143aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten#ifdef __cplusplus 144aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten#define this this_ 145aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten#endif 146aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten 147193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_SNDFILE 148193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 149ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten#define SndFile_BUFSIZE 512 // in 16-bit samples 150ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten#define SndFile_NUMBUFS 2 151ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten 152193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivistruct SndFile { 153193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // save URI also? 154193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLchar *mPathname; 155193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SNDFILE *mSNDFILE; 15615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten pthread_mutex_t mMutex; // protects mSNDFILE only 15715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLboolean mEOF; // sf_read returned zero sample frames 158193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // These are used when Enqueue returns SL_RESULT_BUFFER_INSUFFICIENT 159193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const void *mRetryBuffer; 160193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mRetrySize; 161ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten SLuint32 mWhich; // which buffer to use next 162ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten short mBuffer[SndFile_BUFSIZE * SndFile_NUMBUFS]; 163193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi}; 164193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 165193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif // USE_SNDFILE 166193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 1674c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten/* Our own merged version of SLDataSource and SLDataSink */ 1684c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten 1694c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kastentypedef union { 1704c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLuint32 mLocatorType; 1714c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataLocator_Address mAddress; 1724c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataLocator_BufferQueue mBufferQueue; 1734c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataLocator_IODevice mIODevice; 1744c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataLocator_MIDIBufferQueue mMIDIBufferQueue; 1754c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataLocator_OutputMix mOutputMix; 1764c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataLocator_URI mURI; 177c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#ifdef ANDROID 178c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLDataLocator_AndroidFD mFD; 179c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#endif 1804c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten} DataLocator; 1814c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten 1824c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kastentypedef union { 1834c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLuint32 mFormatType; 1844c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataFormat_PCM mPCM; 1854c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataFormat_MIME mMIME; 1864c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten} DataFormat; 1874c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten 1884c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kastentypedef struct { 1894c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten union { 1904c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataSource mSource; 1914c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataSink mSink; 1924c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten struct { 1934c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten DataLocator *pLocator; 1944c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten DataFormat *pFormat; 1954c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten } mNeutral; 1964c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten } u; 1974c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten DataLocator mLocator; 1984c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten DataFormat mFormat; 1994c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten} DataLocatorFormat; 2004c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten 201193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi/* Interface structures */ 202193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 203903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct Object_interface { 20415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten const struct SLObjectItf_ *mItf; // const 20532a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten // field mThis would be redundant within an IObject, so we substitute mEngine 20615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten struct Engine_interface *mEngine; // const 20715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten const ClassTable *mClass; // const 20815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLuint32 mInstanceID; // const for debugger and for RPC 209903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten slObjectCallback mCallback; 210903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten void *mContext; 211bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten unsigned mGottenMask; // interfaces which are exposed or added, and then gotten 212903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten unsigned mLossOfControlMask; // interfaces with loss of control enabled 21315f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten unsigned mAttributesMask; // attributes which have changed since last sync 214903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten SLint32 mPriority; 215903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten pthread_mutex_t mMutex; 216903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten pthread_cond_t mCond; 217bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mState; // really SLuint32, but SLuint8 to save space 218bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mPreemptable; // really SLboolean, but SLuint8 to save space 219bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten // for best alignment, do not add any fields here 220bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_Default 2 221bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates[INTERFACES_Default]; // state of each of interface 22215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten // do not add any fields here 223903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IObject; 224903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten 22582b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten#include "locks.h" 22682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 227903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 228903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten const struct SL3DCommitItf_ *mItf; 229903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 230193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mDeferred; 231d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten SLuint32 mGeneration; // incremented each master clock cycle 232c37c934e00a96afe18aaadd9f9a1863c721bf8eaGlenn Kasten SLuint32 mWaiting; // number of threads waiting in Commit 233903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DCommit; 234193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 235d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kastenenum CartesianSphericalActive { 236d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten CARTESIAN_COMPUTED_SPHERICAL_SET, 237d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten CARTESIAN_REQUESTED_SPHERICAL_SET, 238d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten CARTESIAN_UNKNOWN_SPHERICAL_SET, 239d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten CARTESIAN_SET_SPHERICAL_COMPUTED, // not in 1.0.1 240d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten CARTESIAN_SET_SPHERICAL_REQUESTED, // not in 1.0.1 241d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten CARTESIAN_SET_SPHERICAL_UNKNOWN 242d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten}; 243d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten 244903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 245193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SL3DDopplerItf_ *mItf; 246903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 247d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // The API allows client to specify either Cartesian and spherical velocities. 248d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // But an implementation will likely prefer one or the other. So for 249d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // maximum portablity, we maintain both units and an indication of which 250d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // unit was set most recently. In addition, we keep a flag saying whether 251d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // the other unit has been derived yet. It can take significant time 252d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // to compute the other unit, so this may be deferred to another thread. 253d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // For this reason we also keep an indication of whether the secondary 254d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // has been computed yet, and its accuracy. 255d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // Though only one unit is primary at a time, a union is inappropriate: 256d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // the application might read in both units (not in 1.0.1), 257d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // and due to multi-threading concerns. 258d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mVelocityCartesian; 259d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten struct { 260d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten SLmillidegree mAzimuth; 261d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten SLmillidegree mElevation; 262d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten SLmillidegree mSpeed; 263d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten } mVelocitySpherical; 264d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten enum CartesianSphericalActive mVelocityActive; 265193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mDopplerFactor; 266903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DDoppler; 267193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 268903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 269193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SL3DGroupingItf_ *mItf; 270903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 271ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten C3DGroup *mGroup; // link to associated group or NULL 272903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DGrouping; 273193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 274d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kastenenum AnglesVectorsActive { 275d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten ANGLES_COMPUTED_VECTORS_SET, // not in 1.0.1 276d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten ANGLES_REQUESTED_VECTORS_SET, // not in 1.0.1 277d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten ANGLES_UNKNOWN_VECTORS_SET, 278d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten ANGLES_SET_VECTORS_COMPUTED, 279d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten ANGLES_SET_VECTORS_REQUESTED, 280d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten ANGLES_SET_VECTORS_UNKNOWN 281d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten}; 282d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten 283903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 284193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SL3DLocationItf_ *mItf; 285903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 286d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mLocationCartesian; 287d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten struct { 288d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mAzimuth; 289d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mElevation; 290d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillimeter mDistance; 291d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten } mLocationSpherical; 292d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten enum CartesianSphericalActive mLocationActive; 293d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten struct { 294d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mHeading; 295d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mPitch; 296d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mRoll; 297d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten } mOrientationAngles; 298d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten struct { 299d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mFront; 300d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mAbove; 301d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mUp; 302d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten } mOrientationVectors; 303d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten enum AnglesVectorsActive mOrientationActive; 304d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // Rotations can be slow, so are deferred. 305d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mTheta; 306d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mAxis; 307d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLboolean mRotatePending; 308903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DLocation; 309193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 310903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 311193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SL3DMacroscopicItf_ *mItf; 312903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 313193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi struct { 314193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mWidth; 315193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mHeight; 316193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mDepth; 317193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi } mSize; 318193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi struct { 319193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mHeading; 320193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mPitch; 321193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mRoll; 322193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi } mOrientationAngles; 323193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi struct { 324193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLVec3D mFront; 325f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten SLVec3D mAbove; 326193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLVec3D mUp; 327193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi } mOrientationVectors; 328d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten enum AnglesVectorsActive mOrientationActive; 329d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // Rotations can be slow, so are deferred. 330d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mTheta; 331d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mAxis; 332d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLboolean mRotatePending; 333903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DMacroscopic; 334193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 335903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 336193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SL3DSourceItf_ *mItf; 337903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 338193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mHeadRelative; 339193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mRolloffMaxDistanceMute; 340193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mMaxDistance; 341193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mMinDistance; 342d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mConeInnerAngle; 343d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mConeOuterAngle; 344193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillibel mConeOuterLevel; 345193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mRolloffFactor; 346193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mRoomRolloffFactor; 347193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint8 mDistanceModel; 348903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DSource; 349193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 350903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 351193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLAudioDecoderCapabilitiesItf_ *mItf; 352903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 353903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IAudioDecoderCapabilities; 354193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 355903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 356193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLAudioEncoderItf_ *mItf; 357903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 358193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLAudioEncoderSettings mSettings; 359903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IAudioEncoder; 360193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 361903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 362193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLAudioEncoderCapabilitiesItf_ *mItf; 363903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 364903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IAudioEncoderCapabilities; 365193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 366903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 367193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLAudioIODeviceCapabilitiesItf_ *mItf; 368903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 369d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten slAvailableAudioInputsChangedCallback mAvailableAudioInputsChangedCallback; 370d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten void *mAvailableAudioInputsChangedContext; 371d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten slAvailableAudioOutputsChangedCallback mAvailableAudioOutputsChangedCallback; 372d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten void *mAvailableAudioOutputsChangedContext; 373d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten slDefaultDeviceIDMapChangedCallback mDefaultDeviceIDMapChangedCallback; 374d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten void *mDefaultDeviceIDMapChangedContext; 375903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IAudioIODeviceCapabilities; 376193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 377903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 378193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLBassBoostItf_ *mItf; 379903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 380193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mEnabled; 381193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mStrength; 382903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IBassBoost; 383193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 384903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct BufferQueue_interface { 385193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLBufferQueueItf_ *mItf; 386903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 38709f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten SLBufferQueueState mState; 388193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slBufferQueueCallback mCallback; 389193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mContext; 390193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mNumBuffers; 391437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten BufferHeader *mArray; 392437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten BufferHeader *mFront, *mRear; 39315005fc0b676f8b4091528b8a9eb2705dd3820c2Jean-Michel Trivi SLuint32 mSizeConsumed; 394193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // saves a malloc in the typical case 395193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define BUFFER_HEADER_TYPICAL 4 396437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten BufferHeader mTypical[BUFFER_HEADER_TYPICAL+1]; 397903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IBufferQueue; 398193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 3997e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten#define MAX_DEVICE 2 4007e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten 401903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 402193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLDeviceVolumeItf_ *mItf; 403903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 4047e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten SLint32 mVolume[MAX_DEVICE]; // FIXME Hard-coded for default in/out 405903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IDeviceVolume; 406193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 407903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 408193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLDynamicInterfaceManagementItf_ *mItf; 409903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 410193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slDynamicInterfaceManagementCallback mCallback; 411193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mContext; 412903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IDynamicInterfaceManagement; 413193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 414903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 415193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLDynamicSourceItf_ *mItf; 416903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 417193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLDataSource *mDataSource; 418903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IDynamicSource; 419193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 420193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// private 421193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 422193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivistruct EnableLevel { 423193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mEnable; 424193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillibel mSendLevel; 425193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi}; 426193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 427bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten// indexes into IEffectSend.mEnableLevels 428bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten 429bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define AUX_ENVIRONMENTALREVERB 0 430bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define AUX_PRESETREVERB 1 431bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define AUX_MAX 2 432bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten 433903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 434193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLEffectSendItf_ *mItf; 435903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 43615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten COutputMix *mOutputMix; // which output mix this effect send is attached to 43715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLmillibel mDirectLevel; // dry volume 43815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten struct EnableLevel mEnableLevels[AUX_MAX]; // wet enable and volume per effect type 439903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEffectSend; 440903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten 441d55d250a016c1400cc00b5e1ac5baaa095702585Glenn Kastentypedef struct Engine_interface { 442193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLEngineItf_ *mItf; 443903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 444193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mLossOfControlGlobal; 44599cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kasten#ifdef USE_SDL 44615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten COutputMix *mOutputMix; // SDL pulls PCM from an arbitrary IOutputMixExt 44799cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kasten#endif 448193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // Each engine is its own universe. 449903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten SLuint32 mInstanceCount; 45032a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten unsigned mInstanceMask; // 1 bit per active object 45115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten unsigned mChangedMask; // objects which have changed since last sync 45232a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten#define MAX_INSTANCE 32 // see mInstanceMask 45332a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten IObject *mInstances[MAX_INSTANCE]; 454437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten SLboolean mShutdown; 45515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLboolean mShutdownAck; 45615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten pthread_cond_t mShutdownCond; 457437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten ThreadPool mThreadPool; // for asynchronous operations 458903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEngine; 459193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 460903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 461193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLEngineCapabilitiesItf_ *mItf; 462903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 463193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mThreadSafe; 4647e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten // const 4657e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten SLuint32 mMaxIndexLED; 4667e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten SLuint32 mMaxIndexVibra; 467903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEngineCapabilities; 468193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 469903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 470193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLEnvironmentalReverbItf_ *mItf; 471903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 472193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLEnvironmentalReverbSettings mProperties; 473903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEnvironmentalReverb; 474193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 475193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivistruct EqualizerBand { 476193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmilliHertz mMin; 477193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmilliHertz mCenter; 4784c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten SLmilliHertz mMax; 479193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi}; 480193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 48109f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten#define MAX_EQ_BANDS 4 // compile-time limit, runtime limit may be smaller 48209f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten 483903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 484193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLEqualizerItf_ *mItf; 485903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 486193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mEnabled; 487193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mPreset; 48809f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten SLmillibel mLevels[MAX_EQ_BANDS]; 48909f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten // const to end of struct 490193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mNumPresets; 491193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mNumBands; 4924c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten const struct EqualizerBand *mBands; 49309f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten const struct EqualizerPreset *mPresets; 4944c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten SLmillibel mBandLevelRangeMin; 4954c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten SLmillibel mBandLevelRangeMax; 496903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEqualizer; 497193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 49809f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten#define MAX_LED_COUNT 32 49909f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten 500903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 501193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLLEDArrayItf_ *mItf; 502903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 503193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mLightMask; 50409f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten SLHSL mColors[MAX_LED_COUNT]; 505193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // const 506193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint8 mCount; 507903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} ILEDArray; 508193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 509903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 510193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMetadataExtractionItf_ *mItf; 511903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 512193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mKeySize; 513193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const void *mKey; 514193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mKeyEncoding; 515193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const SLchar *mValueLangCountry; 516193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mValueEncoding; 517193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint8 mFilterMask; 518ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten int mKeyFilter; 519903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMetadataExtraction; 520193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 521903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 522193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMetadataTraversalItf_ *mItf; 523903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 524193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mIndex; 525193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mMode; 526193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mCount; 527193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mSize; 528903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMetadataTraversal; 529193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 530903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 531193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMIDIMessageItf_ *mItf; 532903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 533193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slMetaEventCallback mMetaEventCallback; 534193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mMetaEventContext; 535193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slMIDIMessageCallback mMessageCallback; 536193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mMessageContext; 5374c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten SLuint8 mMessageTypes; 538903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMIDIMessage; 539193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 540903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 541193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMIDIMuteSoloItf_ *mItf; 542903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 543193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mChannelMuteMask; 544193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mChannelSoloMask; 545193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mTrackMuteMask; 546193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mTrackSoloMask; 547437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten // const 548193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mTrackCount; 549903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMIDIMuteSolo; 550193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 551903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 552193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMIDITempoItf_ *mItf; 553903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 554193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mTicksPerQuarterNote; 555193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mMicrosecondsPerQuarterNote; 556903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMIDITempo; 557193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 558903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 559193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMIDITimeItf_ *mItf; 560903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 561193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mDuration; 562193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mPosition; 563193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mStartTick; 564193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mNumTicks; 565903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMIDITime; 566193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 567903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 568193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMuteSoloItf_ *mItf; 569903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 5709c2a7b1e9f8203bf9de26efca0f1f805038b1f2bGlenn Kasten // fields that were formerly here are now at CAudioPlayer 571903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMuteSolo; 572193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 57332a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten#define MAX_TRACK 32 // see mActiveMask 57432a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten 575903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 576193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLOutputMixItf_ *mItf; 577903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 578d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten slMixDeviceChangeCallback mCallback; 579d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten void *mContext; 580193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 581193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi unsigned mActiveMask; // 1 bit per active track 58232a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten struct Track mTracks[MAX_TRACK]; 583193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 584903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IOutputMix; 585193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 586193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 587903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 588193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLOutputMixExtItf_ *mItf; 589903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 590903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IOutputMixExt; 591193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 592193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 593903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 594193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLPitchItf_ *mItf; 595903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 596193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mPitch; 597193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // const 598193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mMinPitch; 599193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mMaxPitch; 600903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPitch; 601193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 602903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct Play_interface { 603193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLPlayItf_ *mItf; 604903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 60509f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten SLuint32 mState; 60615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten // next 2 fields are read-only to application 607193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mDuration; 608193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mPosition; 609193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slPlayCallback mCallback; 610193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mContext; 611193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mEventFlags; 61215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten // the ISeek trick of using a distinct value doesn't work here because it's readable by app 613193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mMarkerPosition; 61415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLboolean mMarkerIsSet; 615193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mPositionUpdatePeriod; 616903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPlay; 617193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 618903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 619193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLPlaybackRateItf_ *mItf; 620903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 621193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mRate; 622193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mProperties; 6234c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten // const 624193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mMinRate; 625193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mMaxRate; 626193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mStepSize; 627193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mCapabilities; 628903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPlaybackRate; 629193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 630903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 631193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLPrefetchStatusItf_ *mItf; 632903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 633193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mStatus; 634193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mLevel; 635193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slPrefetchCallback mCallback; 636193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mContext; 637193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mCallbackEventsMask; 638193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mFillUpdatePeriod; 639903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPrefetchStatus; 640193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 641903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 642193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLPresetReverbItf_ *mItf; 643903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 644193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mPreset; 645903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPresetReverb; 646193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 647903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 648193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLRatePitchItf_ *mItf; 649903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 650193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mRate; 6514c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten // const 652193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mMinRate; 653193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mMaxRate; 654903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IRatePitch; 655193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 656903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 657193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLRecordItf_ *mItf; 658903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 659193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mState; 660193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mDurationLimit; 661193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mPosition; 662193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slRecordCallback mCallback; 663193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mContext; 664193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mCallbackEventsMask; 665193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mMarkerPosition; 666193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mPositionUpdatePeriod; 667903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IRecord; 668193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 669903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 670193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLSeekItf_ *mItf; 671903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 67215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLmillisecond mPos; // mPos != SL_TIME_UNKNOWN means pending seek request 673193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mLoopEnabled; 674193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mStartPos; 675193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mEndPos; 676903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} ISeek; 677193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 678903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 679193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLThreadSyncItf_ *mItf; 680903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 681193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mInCriticalSection; 68215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLuint32 mWaiting; // number of threads waiting 683193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi pthread_t mOwner; 684903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IThreadSync; 685193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 686903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 687193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLVibraItf_ *mItf; 688903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 689193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mVibrate; 690193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmilliHertz mFrequency; 691193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mIntensity; 692903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IVibra; 693193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 694903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 695193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLVirtualizerItf_ *mItf; 696903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 697193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mEnabled; 698193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mStrength; 699903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IVirtualizer; 700193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 701903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 702193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLVisualizationItf_ *mItf; 703903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 704193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slVisualizationCallback mCallback; 705193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mContext; 706193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmilliHertz mRate; 707903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IVisualization; 708193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 70915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kastentypedef struct /*Volume_interface*/ { 710193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLVolumeItf_ *mItf; 711903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 71215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten // Values as specified by the application 713193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillibel mLevel; 714193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mStereoPosition; 71515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLuint8 /*SLboolean*/ mMute; // FIXME move inside each object that supports the interface 71615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLuint8 /*SLboolean*/ mEnableStereoPosition; 717903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IVolume; 718193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 719193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi/* Class structures */ 720193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 721ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten/*typedef*/ struct C3DGroup_struct { 722903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 723bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_3DGroup 6 // see MPH_to_3DGroup in MPH_to.c for list of interfaces 724bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_3DGroup - INTERFACES_Default]; 725903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 726903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DLocation m3DLocation; 727903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DDoppler m3DDoppler; 728903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DSource m3DSource; 729903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DMacroscopic m3DMacroscopic; 730ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten unsigned mMemberMask; // set of member objects 731ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten} /*C3DGroup*/; 732193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 733b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi#ifdef ANDROID 734ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivitypedef struct { 735ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi const struct SLAndroidStreamTypeItf_ *mItf; 736ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi IObject *mThis; 737ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi SLuint32 mStreamType; 738ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi} IAndroidStreamType; 739ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 740193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi/* 741193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * Used to define the mapping from an OpenSL ES audio player to an Android 742193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * media framework object 743193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi */ 744193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivienum AndroidObject_type { 745f2a9b6c9fc2e5a35fd5dc19e82729eb3f894534aJean-Michel Trivi INVALID_TYPE =-1, 746193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi MEDIAPLAYER = 0, 747193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi AUDIOTRACK_PUSH = 1, 748193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi AUDIOTRACK_PULL = 2, 749193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi NUM_AUDIOPLAYER_MAP_TYPES 750193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi}; 751226ce6a635c4a333a66b8e0ea28316a6d405ee33Jean-Michel Trivi 752b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivienum AndroidObject_state { 753b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi ANDROID_UNINITIALIZED = -1, 754b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi ANDROID_PREPARING, 755b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi ANDROID_PREPARED, 756b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi ANDROID_PREFETCHING, 757b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi ANDROID_READY, 758b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi NUM_ANDROID_STATES 759b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi}; 760ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#endif //ifdef ANDROID 761ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 762193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 7634c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten/*typedef*/ struct CAudioPlayer_struct { 764903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 765ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#ifdef ANDROID 766ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#define INTERFACES_AudioPlayer 27 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces 767ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#else 768bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_AudioPlayer 26 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces 769ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#endif 770bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_AudioPlayer - INTERFACES_Default]; 771903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 772903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPlay mPlay; 773903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DDoppler m3DDoppler; 774903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DGrouping m3DGrouping; 775903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DLocation m3DLocation; 776903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DSource m3DSource; 777903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IBufferQueue mBufferQueue; 778903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEffectSend mEffectSend; 779903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMetadataExtraction mMetadataExtraction; 780903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMetadataTraversal mMetadataTraversal; 781903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPrefetchStatus mPrefetchStatus; 782903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IRatePitch mRatePitch; 783903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten ISeek mSeek; 784903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVolume mVolume; 78515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten IMuteSolo mMuteSolo; 786ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#ifdef ANDROID 787ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi IAndroidStreamType mAndroidStreamType; 788ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#endif 789193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // optional interfaces 790903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DMacroscopic m3DMacroscopic; 791903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IBassBoost mBassBoost; 792903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicSource mDynamicSource; 793903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 794903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEqualizer mEqualizer; 795903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPitch mPitch; 796903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPresetReverb mPresetReverb; 797903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPlaybackRate mPlaybackRate; 798903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVirtualizer mVirtualizer; 799903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVisualization mVisualization; 800193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // rest of fields are not related to the interfaces 8014c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten DataLocatorFormat mDataSource; 8024c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten DataLocatorFormat mDataSink; 803da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi // cached data for this instance 80415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLuint8 /*SLboolean*/ mMute; 8059c2a7b1e9f8203bf9de26efca0f1f805038b1f2bGlenn Kasten // Formerly at IMuteSolo 8069c2a7b1e9f8203bf9de26efca0f1f805038b1f2bGlenn Kasten SLuint8 mMuteMask; // Mask for which channels are muted: bit 0=left, 1=right 8079c2a7b1e9f8203bf9de26efca0f1f805038b1f2bGlenn Kasten SLuint8 mSoloMask; // Mask for which channels are soloed: bit 0=left, 1=right 8089c2a7b1e9f8203bf9de26efca0f1f805038b1f2bGlenn Kasten SLuint8 mNumChannels; // 0 means unknown, then const once it is known, range 1 <= x <= 8 8094bdead9570d01cd53a45ad1e0f6f94196d0e6058Jean-Michel Trivi SLuint32 mSampleRateMilliHz;// 0 means unknown, then const once it is known 810da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi // implementation-specific data for this instance 81115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#ifdef USE_OUTPUTMIXEXT 81215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten struct Track *mTrack; 81315f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#endif 814193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_SNDFILE 815193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi struct SndFile mSndFile; 816193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif // USE_SNDFILE 817b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi#ifdef ANDROID 818060adae7c9af5b1470ca12f44d8f36a27987efcbJean-Michel Trivi android::Mutex *mpLock; 819193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi enum AndroidObject_type mAndroidObjType; 820b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi enum AndroidObject_state mAndroidObjState; 821474bc3d17dc75cbaf3f553d16fe21ef35071ddadJean-Michel Trivi android::AudioTrack *mAudioTrack; 8225d9e8432d0217fe139987703b8e1f129296171ffJean-Michel Trivi android::sp<android::SfPlayer> mSfPlayer; 8235d9e8432d0217fe139987703b8e1f129296171ffJean-Michel Trivi android::sp<android::ALooper> mRenderLooper; 82415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten /** 82515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten * Amplification (can be attenuation) factor derived for the VolumeLevel 82615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten */ 82715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten float mAmplFromVolLevel; 82815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten /** 82915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten * Left/right amplification (can be attenuations) factors derived for the StereoPosition 83015f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten */ 83115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten float mAmplFromStereoPos[STEREO_CHANNELS]; 832193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 8334c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten} /*CAudioPlayer*/; 834193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 835903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 836193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 837903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 838bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_AudioRecorder 9 // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces 839bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceContinued[INTERFACES_AudioRecorder - INTERFACES_Default]; 840903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 841903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IRecord mRecord; 842903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IAudioEncoder mAudioEncoder; 843193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // optional interfaces 844903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IBassBoost mBassBoost; 845903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicSource mDynamicSource; 846903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEqualizer mEqualizer; 847903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVisualization mVisualization; 848903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVolume mVolume; 849d55d250a016c1400cc00b5e1ac5baaa095702585Glenn Kasten // rest of fields are not related to the interfaces 850d55d250a016c1400cc00b5e1ac5baaa095702585Glenn Kasten DataLocatorFormat mDataSource; 851d55d250a016c1400cc00b5e1ac5baaa095702585Glenn Kasten DataLocatorFormat mDataSink; 852903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CAudioRecorder; 853193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 854903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 855193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated implicit interfaces 856903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 857bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_Engine 10 // see MPH_to_Engine in MPH_to.c for list of interfaces 858bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_Engine - INTERFACES_Default]; 859903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 860903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEngine mEngine; 861903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEngineCapabilities mEngineCapabilities; 862903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IThreadSync mThreadSync; 863193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated explicit interfaces 864903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IAudioIODeviceCapabilities mAudioIODeviceCapabilities; 865903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IAudioDecoderCapabilities mAudioDecoderCapabilities; 866903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IAudioEncoderCapabilities mAudioEncoderCapabilities; 867903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DCommit m3DCommit; 868193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // optional interfaces 869903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDeviceVolume mDeviceVolume; 870188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kasten pthread_t mSyncThread; 871903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CEngine; 872193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 873903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 874193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 875903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 876bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_LEDDevice 3 // see MPH_to_LEDDevice in MPH_to.c for list of interfaces 877bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_LEDDevice - INTERFACES_Default]; 878903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 879903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten ILEDArray mLEDArray; 880193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mDeviceID; 881903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CLEDDevice; 882193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 883903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 884193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 885903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 886bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_Listener 4 // see MPH_to_Listener in MPH_to.c for list of interfaces 887bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_Listener - INTERFACES_Default]; 888903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 889903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DDoppler m3DDoppler; 890903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DLocation m3DLocation; 891903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CListener; 892193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 893903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 894193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 895903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 89615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#define INTERFACES_MetadataExtractor 5 // see MPH_to_MetadataExtractor in MPH_to.c for list of 89715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten // interfaces 898bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_MetadataExtractor - INTERFACES_Default]; 899903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 900903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicSource mDynamicSource; 901903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMetadataExtraction mMetadataExtraction; 902903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMetadataTraversal mMetadataTraversal; 903903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CMetadataExtractor; 904193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 905903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 906193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 907903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 908ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#ifdef ANDROID 909ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#define INTERFACES_MidiPlayer 30 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces 910ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#else 911bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_MidiPlayer 29 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces 912ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#endif 913bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_MidiPlayer - INTERFACES_Default]; 914903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 915903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPlay mPlay; 916903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DDoppler m3DDoppler; 917903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DGrouping m3DGrouping; 918903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DLocation m3DLocation; 919903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DSource m3DSource; 920903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IBufferQueue mBufferQueue; 921903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEffectSend mEffectSend; 922903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMetadataExtraction mMetadataExtraction; 923903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMetadataTraversal mMetadataTraversal; 924903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMIDIMessage mMIDIMessage; 925903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMIDITime mMIDITime; 926903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMIDITempo mMIDITempo; 927903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMIDIMuteSolo mMIDIMuteSolo; 928903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPrefetchStatus mPrefetchStatus; 929903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten ISeek mSeek; 930903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVolume mVolume; 93115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten IMuteSolo mMuteSolo; 932c37c934e00a96afe18aaadd9f9a1863c721bf8eaGlenn Kasten#ifdef ANDROID 933ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi IAndroidStreamType mAndroidStreamType; 934c37c934e00a96afe18aaadd9f9a1863c721bf8eaGlenn Kasten#endif 935193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // optional interfaces 936903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DMacroscopic m3DMacroscopic; 937903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IBassBoost mBassBoost; 938903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicSource mDynamicSource; 939903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 940903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEqualizer mEqualizer; 941903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPitch mPitch; 942903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPresetReverb mPresetReverb; 943903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPlaybackRate mPlaybackRate; 944903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVirtualizer mVirtualizer; 945903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVisualization mVisualization; 946903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CMidiPlayer; 947903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten 94815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten/*typedef*/ struct COutputMix_struct { 949193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 950903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 951bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_OutputMix 11 // see MPH_to_OutputMix in MPH_to.c for list of interfaces 952bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_OutputMix - INTERFACES_Default]; 953903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 954903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IOutputMix mOutputMix; 955193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 956903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IOutputMixExt mOutputMixExt; 957193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 958903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 959903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEqualizer mEqualizer; 960903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPresetReverb mPresetReverb; 961903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVirtualizer mVirtualizer; 962903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVolume mVolume; 963193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // optional interfaces 964903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IBassBoost mBassBoost; 965903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVisualization mVisualization; 96615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten} /*COutputMix*/; 967193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 968903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 969193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 970903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 971bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_VibraDevice 3 // see MPH_to_VibraDevice in MPH_to.c for list of interfaces 972bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_VibraDevice - INTERFACES_Default]; 973903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 974903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVibra mVibra; 975193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // 976193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mDeviceID; 977903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CVibraDevice; 97882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 97923b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenstruct MPH_init { 98023b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten // unsigned char mMPH; 98123b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten VoidHook mInit; 982bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten VoidHook mResume; 98323b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten VoidHook mDeinit; 98423b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten}; 98523b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten 98623b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenextern /*static*/ int IID_to_MPH(const SLInterfaceID iid); 98723b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenextern /*static*/ const struct MPH_init MPH_init_table[MPH_MAX]; 988492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kastenextern SLresult checkInterfaces(const ClassTable *class__, 989492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kasten SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds, 990492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kasten const SLboolean *pInterfaceRequired, unsigned *pExposedMask); 991492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kastenextern IObject *construct(const ClassTable *class__, 992492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kasten unsigned exposedMask, SLEngineItf engine); 993492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kastenextern const ClassTable *objectIDtoClass(SLuint32 objectID); 994492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kastenextern const struct SLInterfaceID_ SL_IID_array[MPH_MAX]; 995188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kastenextern SLuint32 IObjectToObjectID(IObject *object); 996188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kasten 99732a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// Map an interface to it's "object ID" (which is really a class ID). 99832a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis. 99932a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// If you have an IObject, then use IObjectToObjectID directly. 1000188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kasten 1001188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kasten#define InterfaceToObjectID(this) IObjectToObjectID((this)->mThis) 1002f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten 100332a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// Map an interface to it's corresponding IObject. 100432a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis. 100532a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// If you have an IObject, then you're done -- you already have what you need. 100632a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten 100732a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten#define InterfaceToIObject(this) ((this)->mThis) 100832a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten 1009da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi#define InterfaceToCAudioPlayer(this) (((CAudioPlayer*)InterfaceToIObject(this))) 1010da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi 10119db8335361c67c4ed877f68218835df96ce43a4bJean-Michel Trivi#ifdef ANDROID 1012f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten#include "sles_to_android.h" 1013f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten#endif 1014f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten 101515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kastenextern SLresult checkDataSource(const SLDataSource *pDataSrc, 101615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten DataLocatorFormat *myDataSourceLocator); 1017f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kastenextern SLresult checkDataSink(const SLDataSink *pDataSink, DataLocatorFormat *myDataSinkLocator); 1018f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kastenextern void freeDataLocatorFormat(DataLocatorFormat *dlf); 101909f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kastenextern SLresult CAudioPlayer_Realize(void *self, SLboolean async); 102009f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kastenextern void CAudioPlayer_Destroy(void *self); 1021437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenextern SLresult CEngine_Realize(void *self, SLboolean async); 1022437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenextern void CEngine_Destroy(void *self); 102399cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kasten#ifdef USE_SDL 102499cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kastenextern void SDL_start(IEngine *thisEngine); 102599cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kasten#endif 1026bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_REALIZING_1 ((SLuint32) 0x4) // async realize on work queue 1027bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_REALIZING_2 ((SLuint32) 0x5) // sync realize, or async realize hook 1028bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_RESUMING_1 ((SLuint32) 0x6) // async resume on work queue 1029bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_RESUMING_2 ((SLuint32) 0x7) // sync resume, or async resume hook 1030bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_SUSPENDING ((SLuint32) 0x8) // suspend in progress 1031bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_REALIZING_1A ((SLuint32) 0x9) // abort while async realize on work queue 1032bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_RESUMING_1A ((SLuint32) 0xA) // abort while async resume on work queue 1033437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenextern void *sync_start(void *arg); 1034437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenextern SLresult err_to_result(int err); 1035277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kasten 1036277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kasten#ifdef __GNUC__ 103732a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten#define ctz __builtin_ctz 1038277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kasten#else 1039277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kastenextern unsigned ctz(unsigned); 1040277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kasten#endif 10417e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kastenextern const char * const interface_names[MPH_MAX]; 104215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#include "platform.h" 104315f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten 104415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten// Attributes 104515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten 104615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#define ATTR_NONE ((unsigned) 0x0) // none 104715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#define ATTR_GAIN ((unsigned) 0x1) // player volume, channel mute, channel solo, 104815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten // player stereo position, player mute 104915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#define ATTR_TRANSPORT ((unsigned) 0x2) // play state, requested position, looping 1050c37c934e00a96afe18aaadd9f9a1863c721bf8eaGlenn Kasten 1051c37c934e00a96afe18aaadd9f9a1863c721bf8eaGlenn Kasten#define SL_DATALOCATOR_NULL 0 // application specified a NULL value for pLocator 1052c37c934e00a96afe18aaadd9f9a1863c721bf8eaGlenn Kasten#define SL_DATAFORMAT_NULL 0 // application specified a NULL or undefined value for pFormat 1053f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 1054f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#ifdef NDEBUG 1055f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#define SL_ENTER_GLOBAL { SLresult result; 1056f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#define SL_LEAVE_GLOBAL return result; } 1057f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#define SL_ENTER_INTERFACE { SLresult result; 1058f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#define SL_LEAVE_INTERFACE return result; } 1059f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#define SL_ENTER_INTERFACE_VOID { 1060f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#define SL_LEAVE_INTERFACE_VOID return; } 1061f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#else 1062f156301680273e71e56e898f98798f5b5b2431f6Glenn Kastenextern void slEnterGlobal(const char *function); 1063f156301680273e71e56e898f98798f5b5b2431f6Glenn Kastenextern void slLeaveGlobal(const char *function, SLresult result); 1064f156301680273e71e56e898f98798f5b5b2431f6Glenn Kastenextern void slEnterInterface(const char *function); 1065f156301680273e71e56e898f98798f5b5b2431f6Glenn Kastenextern void slLeaveInterface(const char *function, SLresult result); 1066f156301680273e71e56e898f98798f5b5b2431f6Glenn Kastenextern void slEnterInterfaceVoid(const char *function); 1067f156301680273e71e56e898f98798f5b5b2431f6Glenn Kastenextern void slLeaveInterfaceVoid(const char *function); 1068f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#define SL_ENTER_GLOBAL { SLresult result; slEnterGlobal(__FUNCTION__); 1069f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#define SL_LEAVE_GLOBAL slLeaveGlobal(__FUNCTION__, result); return result; } 1070f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#define SL_ENTER_INTERFACE { SLresult result; slEnterInterface(__FUNCTION__); 1071f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#define SL_LEAVE_INTERFACE slLeaveInterface(__FUNCTION__, result); return result; } 1072f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#define SL_ENTER_INTERFACE_VOID { slEnterInterfaceVoid(__FUNCTION__); 1073f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#define SL_LEAVE_INTERFACE_VOID slLeaveInterfaceVoid(__FUNCTION__); return; } 1074f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#endif 1075