sles_allinclusive.h revision 15f9f5e609265dff9d6036af38bea084c42a702a
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 46193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "media/AudioSystem.h" 47193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "media/AudioTrack.h" 48193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "media/mediaplayer.h" 490263d22efc4ad9420b367ec61b5a1d1ec72cebb9Jean-Michel Trivi#include <utils/String8.h> 508a307c7272108766eebabc7fa7044d7510d65f77Jean-Michel Trivi#define ANDROID_SL_MILLIBEL_MAX 0 51f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten#include <binder/ProcessState.h> 525d9e8432d0217fe139987703b8e1f129296171ffJean-Michel Trivi#include "android_SfPlayer.h" 53193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 54193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 5515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#define STEREO_CHANNELS 2 5615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten 57193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 58193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "OutputMixExt.h" 59193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 60193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 61193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// Hook functions 62193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 63193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivitypedef void (*VoidHook)(void *self); 64193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivitypedef SLresult (*StatusHook)(void *self); 658a47ad52488855f50b95da649744dde3a254698bJean-Michel Trivitypedef SLresult (*AsyncHook)(void *self, SLboolean async); 664cf440cd9f6106db00571345af7aa02529c9a10aJean-Michel Trivi 67193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// Describes how an interface is related to a given class 68193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 69193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_IMPLICIT 0 70193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_EXPLICIT 1 71193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_OPTIONAL 2 72193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_DYNAMIC 3 73f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten#define INTERFACE_UNAVAILABLE 4 74193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_DYNAMIC_GAME INTERFACE_DYNAMIC 75193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC INTERFACE_DYNAMIC 76193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC_GAME INTERFACE_DYNAMIC 77193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_EXPLICIT_GAME INTERFACE_EXPLICIT 78193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_GAME INTERFACE_OPTIONAL 79193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_GAME_MUSIC INTERFACE_OPTIONAL 80193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_MUSIC_GAME INTERFACE_OPTIONAL 81193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_OPTIONAL_DYNAMIC INTERFACE_DYNAMIC 82193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_PHONE_GAME INTERFACE_OPTIONAL 83193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_TBD INTERFACE_IMPLICIT 84193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 85bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten// Describes how an interface is related to a given object 86bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten 87bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_UNINITIALIZED 1 // not requested at object creation time 88bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_EXPOSED 2 // requested at object creation time 89bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_ADDING_1 3 // part 1 of asynchronous AddInterface, pending 90bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_ADDING_2 4 // synchronous AddInterface, or part 2 of asynchronous 91bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_ADDED 5 // AddInterface has completed 92bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_REMOVING 6 // unlocked phase of (synchronous) RemoveInterface 93bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_SUSPENDING 7 // suspend in progress 94bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_SUSPENDED 8 // suspend has completed 95bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_RESUMING_1 9 // part 1 of asynchronous ResumeInterface, pending 96bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_RESUMING_2 10 // synchronous ResumeInterface, or part 2 of asynchronous 97bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_ADDING_1A 11 // part 1 of asynchronous AddInterface, aborted 98bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_RESUMING_1A 12 // part 1 of asynchronous ResumeInterface, aborted 99bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten 100193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// Maps an interface ID to its offset within the class that exposes it 101193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 102193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivistruct iid_vtable { 103193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi unsigned char mMPH; 104193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi unsigned char mInterface; // relationship 105193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi /*size_t*/ unsigned short mOffset; 106193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi}; 107193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 108193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// Per-class const data shared by all instances of the same class 109193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 110903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 111193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct iid_vtable *mInterfaces; 112bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint32 mInterfaceCount; // number of possible interfaces 113193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const signed char *mMPH_to_index; 114193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // FIXME not yet used 115ee35e132113602e20012829377d16f0572c61195Glenn Kasten const char * const mName; 116193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi size_t mSize; 117193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mObjectID; 118bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten // hooks 1198a47ad52488855f50b95da649744dde3a254698bJean-Michel Trivi AsyncHook mRealize; 120bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten AsyncHook mResume; 121193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi VoidHook mDestroy; 122903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} ClassTable; 123193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 124193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// BufferHeader describes each element of a BufferQueue, other than the data 125193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 126437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastentypedef struct { 127193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const void *mBuffer; 128193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mSize; 129437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten} BufferHeader; 130193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 131193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 132193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 133193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// stereo is a frame consisting of a pair of 16-bit PCM samples 134193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 135193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivitypedef struct { 136193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi short left; 137193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi short right; 138193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi} stereo; 139193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 140193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 141193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 142aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten#ifdef __cplusplus 143aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten#define this this_ 144aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten#endif 145aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten 146193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_SNDFILE 147193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 148ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten#define SndFile_BUFSIZE 512 // in 16-bit samples 149ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten#define SndFile_NUMBUFS 2 150ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten 151193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivistruct SndFile { 152193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // save URI also? 153193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLchar *mPathname; 154193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SNDFILE *mSNDFILE; 15515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten pthread_mutex_t mMutex; // protects mSNDFILE only 15615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLboolean mEOF; // sf_read returned zero sample frames 157193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // These are used when Enqueue returns SL_RESULT_BUFFER_INSUFFICIENT 158193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const void *mRetryBuffer; 159193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mRetrySize; 160ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten SLuint32 mWhich; // which buffer to use next 161ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten short mBuffer[SndFile_BUFSIZE * SndFile_NUMBUFS]; 162193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi}; 163193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 164193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif // USE_SNDFILE 165193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 1664c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten/* Our own merged version of SLDataSource and SLDataSink */ 1674c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten 1684c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kastentypedef union { 1694c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLuint32 mLocatorType; 1704c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataLocator_Address mAddress; 1714c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataLocator_BufferQueue mBufferQueue; 1724c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataLocator_IODevice mIODevice; 1734c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataLocator_MIDIBufferQueue mMIDIBufferQueue; 1744c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataLocator_OutputMix mOutputMix; 1754c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataLocator_URI mURI; 1764c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten} DataLocator; 1774c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten 1784c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kastentypedef union { 1794c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLuint32 mFormatType; 1804c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataFormat_PCM mPCM; 1814c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataFormat_MIME mMIME; 1824c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten} DataFormat; 1834c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten 1844c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kastentypedef struct { 1854c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten union { 1864c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataSource mSource; 1874c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataSink mSink; 1884c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten struct { 1894c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten DataLocator *pLocator; 1904c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten DataFormat *pFormat; 1914c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten } mNeutral; 1924c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten } u; 1934c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten DataLocator mLocator; 1944c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten DataFormat mFormat; 1954c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten} DataLocatorFormat; 1964c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten 197193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi/* Interface structures */ 198193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 199903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct Object_interface { 20015f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten const struct SLObjectItf_ *mItf; // const 20132a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten // field mThis would be redundant within an IObject, so we substitute mEngine 20215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten struct Engine_interface *mEngine; // const 20315f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten const ClassTable *mClass; // const 20415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLuint32 mInstanceID; // const for debugger and for RPC 205903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten slObjectCallback mCallback; 206903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten void *mContext; 207bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten unsigned mGottenMask; // interfaces which are exposed or added, and then gotten 208903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten unsigned mLossOfControlMask; // interfaces with loss of control enabled 20915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten unsigned mAttributesMask; // attributes which have changed since last sync 210903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten SLint32 mPriority; 211903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten pthread_mutex_t mMutex; 212903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten pthread_cond_t mCond; 213bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mState; // really SLuint32, but SLuint8 to save space 214bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mPreemptable; // really SLboolean, but SLuint8 to save space 215bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten // for best alignment, do not add any fields here 216bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_Default 2 217bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates[INTERFACES_Default]; // state of each of interface 21815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten // do not add any fields here 219903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IObject; 220903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten 22182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten#include "locks.h" 22282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 223903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 224903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten const struct SL3DCommitItf_ *mItf; 225903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 226193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mDeferred; 227d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten SLuint32 mGeneration; // incremented each master clock cycle 228903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DCommit; 229193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 230d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kastenenum CartesianSphericalActive { 231d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten CARTESIAN_COMPUTED_SPHERICAL_SET, 232d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten CARTESIAN_REQUESTED_SPHERICAL_SET, 233d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten CARTESIAN_UNKNOWN_SPHERICAL_SET, 234d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten CARTESIAN_SET_SPHERICAL_COMPUTED, // not in 1.0.1 235d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten CARTESIAN_SET_SPHERICAL_REQUESTED, // not in 1.0.1 236d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten CARTESIAN_SET_SPHERICAL_UNKNOWN 237d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten}; 238d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten 239903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 240193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SL3DDopplerItf_ *mItf; 241903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 242d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // The API allows client to specify either Cartesian and spherical velocities. 243d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // But an implementation will likely prefer one or the other. So for 244d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // maximum portablity, we maintain both units and an indication of which 245d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // unit was set most recently. In addition, we keep a flag saying whether 246d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // the other unit has been derived yet. It can take significant time 247d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // to compute the other unit, so this may be deferred to another thread. 248d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // For this reason we also keep an indication of whether the secondary 249d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // has been computed yet, and its accuracy. 250d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // Though only one unit is primary at a time, a union is inappropriate: 251d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // the application might read in both units (not in 1.0.1), 252d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // and due to multi-threading concerns. 253d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mVelocityCartesian; 254d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten struct { 255d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten SLmillidegree mAzimuth; 256d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten SLmillidegree mElevation; 257d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten SLmillidegree mSpeed; 258d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten } mVelocitySpherical; 259d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten enum CartesianSphericalActive mVelocityActive; 260193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mDopplerFactor; 261903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DDoppler; 262193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 263903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 264193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SL3DGroupingItf_ *mItf; 265903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 266ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten C3DGroup *mGroup; // link to associated group or NULL 267903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DGrouping; 268193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 269d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kastenenum AnglesVectorsActive { 270d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten ANGLES_COMPUTED_VECTORS_SET, // not in 1.0.1 271d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten ANGLES_REQUESTED_VECTORS_SET, // not in 1.0.1 272d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten ANGLES_UNKNOWN_VECTORS_SET, 273d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten ANGLES_SET_VECTORS_COMPUTED, 274d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten ANGLES_SET_VECTORS_REQUESTED, 275d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten ANGLES_SET_VECTORS_UNKNOWN 276d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten}; 277d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten 278903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 279193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SL3DLocationItf_ *mItf; 280903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 281d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mLocationCartesian; 282d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten struct { 283d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mAzimuth; 284d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mElevation; 285d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillimeter mDistance; 286d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten } mLocationSpherical; 287d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten enum CartesianSphericalActive mLocationActive; 288d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten struct { 289d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mHeading; 290d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mPitch; 291d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mRoll; 292d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten } mOrientationAngles; 293d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten struct { 294d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mFront; 295d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mAbove; 296d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mUp; 297d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten } mOrientationVectors; 298d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten enum AnglesVectorsActive mOrientationActive; 299d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // Rotations can be slow, so are deferred. 300d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mTheta; 301d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mAxis; 302d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLboolean mRotatePending; 303903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DLocation; 304193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 305903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 306193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SL3DMacroscopicItf_ *mItf; 307903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 308193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi struct { 309193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mWidth; 310193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mHeight; 311193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mDepth; 312193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi } mSize; 313193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi struct { 314193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mHeading; 315193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mPitch; 316193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mRoll; 317193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi } mOrientationAngles; 318193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi struct { 319193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLVec3D mFront; 320193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLVec3D mUp; 321193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi } mOrientationVectors; 322d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten enum AnglesVectorsActive mOrientationActive; 323d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // Rotations can be slow, so are deferred. 324d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mTheta; 325d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mAxis; 326d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLboolean mRotatePending; 327903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DMacroscopic; 328193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 329903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 330193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SL3DSourceItf_ *mItf; 331903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 332193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mHeadRelative; 333193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mRolloffMaxDistanceMute; 334193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mMaxDistance; 335193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mMinDistance; 336d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mConeInnerAngle; 337d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mConeOuterAngle; 338193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillibel mConeOuterLevel; 339193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mRolloffFactor; 340193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mRoomRolloffFactor; 341193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint8 mDistanceModel; 342903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DSource; 343193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 344903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 345193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLAudioDecoderCapabilitiesItf_ *mItf; 346903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 347903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IAudioDecoderCapabilities; 348193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 349903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 350193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLAudioEncoderItf_ *mItf; 351903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 352193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLAudioEncoderSettings mSettings; 353903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IAudioEncoder; 354193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 355903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 356193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLAudioEncoderCapabilitiesItf_ *mItf; 357903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 358903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IAudioEncoderCapabilities; 359193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 360903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 361193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLAudioIODeviceCapabilitiesItf_ *mItf; 362903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 363d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten slAvailableAudioInputsChangedCallback mAvailableAudioInputsChangedCallback; 364d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten void *mAvailableAudioInputsChangedContext; 365d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten slAvailableAudioOutputsChangedCallback mAvailableAudioOutputsChangedCallback; 366d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten void *mAvailableAudioOutputsChangedContext; 367d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten slDefaultDeviceIDMapChangedCallback mDefaultDeviceIDMapChangedCallback; 368d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten void *mDefaultDeviceIDMapChangedContext; 369903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IAudioIODeviceCapabilities; 370193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 371903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 372193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLBassBoostItf_ *mItf; 373903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 374193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mEnabled; 375193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mStrength; 376903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IBassBoost; 377193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 378903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct BufferQueue_interface { 379193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLBufferQueueItf_ *mItf; 380903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 38109f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten SLBufferQueueState mState; 382193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slBufferQueueCallback mCallback; 383193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mContext; 384193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mNumBuffers; 385437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten BufferHeader *mArray; 386437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten BufferHeader *mFront, *mRear; 38715005fc0b676f8b4091528b8a9eb2705dd3820c2Jean-Michel Trivi SLuint32 mSizeConsumed; 388193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // saves a malloc in the typical case 389193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define BUFFER_HEADER_TYPICAL 4 390437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten BufferHeader mTypical[BUFFER_HEADER_TYPICAL+1]; 391903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IBufferQueue; 392193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 3937e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten#define MAX_DEVICE 2 3947e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten 395903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 396193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLDeviceVolumeItf_ *mItf; 397903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 3987e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten SLint32 mVolume[MAX_DEVICE]; // FIXME Hard-coded for default in/out 399903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IDeviceVolume; 400193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 401903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 402193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLDynamicInterfaceManagementItf_ *mItf; 403903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 404193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slDynamicInterfaceManagementCallback mCallback; 405193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mContext; 406903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IDynamicInterfaceManagement; 407193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 408903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 409193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLDynamicSourceItf_ *mItf; 410903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 411193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLDataSource *mDataSource; 412903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IDynamicSource; 413193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 414193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// private 415193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 416193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivistruct EnableLevel { 417193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mEnable; 418193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillibel mSendLevel; 419193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi}; 420193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 421bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten// indexes into IEffectSend.mEnableLevels 422bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten 423bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define AUX_ENVIRONMENTALREVERB 0 424bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define AUX_PRESETREVERB 1 425bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define AUX_MAX 2 426bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten 427903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 428193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLEffectSendItf_ *mItf; 429903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 43015f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten COutputMix *mOutputMix; // which output mix this effect send is attached to 43115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLmillibel mDirectLevel; // dry volume 43215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten struct EnableLevel mEnableLevels[AUX_MAX]; // wet enable and volume per effect type 433903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEffectSend; 434903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten 435d55d250a016c1400cc00b5e1ac5baaa095702585Glenn Kastentypedef struct Engine_interface { 436193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLEngineItf_ *mItf; 437903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 438193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mLossOfControlGlobal; 43999cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kasten#ifdef USE_SDL 44015f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten COutputMix *mOutputMix; // SDL pulls PCM from an arbitrary IOutputMixExt 44199cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kasten#endif 442193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // Each engine is its own universe. 443903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten SLuint32 mInstanceCount; 44432a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten unsigned mInstanceMask; // 1 bit per active object 44515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten unsigned mChangedMask; // objects which have changed since last sync 44632a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten#define MAX_INSTANCE 32 // see mInstanceMask 44732a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten IObject *mInstances[MAX_INSTANCE]; 448437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten SLboolean mShutdown; 44915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLboolean mShutdownAck; 45015f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten pthread_cond_t mShutdownCond; 451437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten ThreadPool mThreadPool; // for asynchronous operations 452903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEngine; 453193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 454903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 455193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLEngineCapabilitiesItf_ *mItf; 456903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 457193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mThreadSafe; 4587e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten // const 4597e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten SLuint32 mMaxIndexLED; 4607e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten SLuint32 mMaxIndexVibra; 461903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEngineCapabilities; 462193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 463903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 464193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLEnvironmentalReverbItf_ *mItf; 465903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 466193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLEnvironmentalReverbSettings mProperties; 467903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEnvironmentalReverb; 468193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 469193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivistruct EqualizerBand { 470193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmilliHertz mMin; 471193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmilliHertz mCenter; 4724c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten SLmilliHertz mMax; 473193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi}; 474193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 47509f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten#define MAX_EQ_BANDS 4 // compile-time limit, runtime limit may be smaller 47609f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten 477903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 478193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLEqualizerItf_ *mItf; 479903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 480193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mEnabled; 481193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mPreset; 48209f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten SLmillibel mLevels[MAX_EQ_BANDS]; 48309f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten // const to end of struct 484193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mNumPresets; 485193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mNumBands; 4864c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten const struct EqualizerBand *mBands; 48709f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten const struct EqualizerPreset *mPresets; 4884c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten SLmillibel mBandLevelRangeMin; 4894c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten SLmillibel mBandLevelRangeMax; 490903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEqualizer; 491193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 49209f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten#define MAX_LED_COUNT 32 49309f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten 494903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 495193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLLEDArrayItf_ *mItf; 496903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 497193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mLightMask; 49809f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten SLHSL mColors[MAX_LED_COUNT]; 499193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // const 500193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint8 mCount; 501903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} ILEDArray; 502193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 503903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 504193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMetadataExtractionItf_ *mItf; 505903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 506193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mKeySize; 507193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const void *mKey; 508193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mKeyEncoding; 509193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const SLchar *mValueLangCountry; 510193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mValueEncoding; 511193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint8 mFilterMask; 512ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten int mKeyFilter; 513903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMetadataExtraction; 514193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 515903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 516193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMetadataTraversalItf_ *mItf; 517903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 518193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mIndex; 519193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mMode; 520193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mCount; 521193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mSize; 522903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMetadataTraversal; 523193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 524903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 525193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMIDIMessageItf_ *mItf; 526903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 527193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slMetaEventCallback mMetaEventCallback; 528193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mMetaEventContext; 529193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slMIDIMessageCallback mMessageCallback; 530193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mMessageContext; 5314c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten SLuint8 mMessageTypes; 532903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMIDIMessage; 533193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 534903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 535193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMIDIMuteSoloItf_ *mItf; 536903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 537193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mChannelMuteMask; 538193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mChannelSoloMask; 539193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mTrackMuteMask; 540193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mTrackSoloMask; 541437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten // const 542193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mTrackCount; 543903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMIDIMuteSolo; 544193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 545903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 546193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMIDITempoItf_ *mItf; 547903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 548193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mTicksPerQuarterNote; 549193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mMicrosecondsPerQuarterNote; 550903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMIDITempo; 551193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 552903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 553193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMIDITimeItf_ *mItf; 554903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 555193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mDuration; 556193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mPosition; 557193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mStartTick; 558193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mNumTicks; 559903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMIDITime; 560193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 561903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 562193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMuteSoloItf_ *mItf; 563903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 56415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLuint8 mMuteMask; // Mask for which channels are muted: bit 0=left, 1=right 56515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLuint8 mSoloMask; // Mask for which channels are soloed: bit 0=left, 1=right 56615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLuint8 mNumChannels; // 0 means unknown, then const once it is known, range 1 <= x <= 8 567903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMuteSolo; 568193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 56932a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten#define MAX_TRACK 32 // see mActiveMask 57032a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten 571903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 572193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLOutputMixItf_ *mItf; 573903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 574d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten slMixDeviceChangeCallback mCallback; 575d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten void *mContext; 576193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 577193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi unsigned mActiveMask; // 1 bit per active track 57832a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten struct Track mTracks[MAX_TRACK]; 579193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 580903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IOutputMix; 581193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 582193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 583903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 584193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLOutputMixExtItf_ *mItf; 585903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 586903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IOutputMixExt; 587193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 588193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 589903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 590193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLPitchItf_ *mItf; 591903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 592193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mPitch; 593193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // const 594193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mMinPitch; 595193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mMaxPitch; 596903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPitch; 597193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 598903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct Play_interface { 599193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLPlayItf_ *mItf; 600903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 60109f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten SLuint32 mState; 60215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten // next 2 fields are read-only to application 603193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mDuration; 604193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mPosition; 605193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slPlayCallback mCallback; 606193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mContext; 607193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mEventFlags; 60815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten // the ISeek trick of using a distinct value doesn't work here because it's readable by app 609193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mMarkerPosition; 61015f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLboolean mMarkerIsSet; 611193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mPositionUpdatePeriod; 612903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPlay; 613193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 614903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 615193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLPlaybackRateItf_ *mItf; 616903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 617193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mRate; 618193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mProperties; 6194c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten // const 620193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mMinRate; 621193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mMaxRate; 622193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mStepSize; 623193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mCapabilities; 624903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPlaybackRate; 625193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 626903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 627193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLPrefetchStatusItf_ *mItf; 628903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 629193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mStatus; 630193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mLevel; 631193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slPrefetchCallback mCallback; 632193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mContext; 633193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mCallbackEventsMask; 634193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mFillUpdatePeriod; 635903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPrefetchStatus; 636193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 637903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 638193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLPresetReverbItf_ *mItf; 639903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 640193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mPreset; 641903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPresetReverb; 642193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 643903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 644193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLRatePitchItf_ *mItf; 645903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 646193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mRate; 6474c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten // const 648193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mMinRate; 649193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mMaxRate; 650903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IRatePitch; 651193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 652903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 653193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLRecordItf_ *mItf; 654903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 655193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mState; 656193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mDurationLimit; 657193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mPosition; 658193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slRecordCallback mCallback; 659193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mContext; 660193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mCallbackEventsMask; 661193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mMarkerPosition; 662193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mPositionUpdatePeriod; 663903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IRecord; 664193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 665903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 666193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLSeekItf_ *mItf; 667903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 66815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLmillisecond mPos; // mPos != SL_TIME_UNKNOWN means pending seek request 669193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mLoopEnabled; 670193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mStartPos; 671193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mEndPos; 672903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} ISeek; 673193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 674903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 675193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLThreadSyncItf_ *mItf; 676903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 677193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mInCriticalSection; 67815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLuint32 mWaiting; // number of threads waiting 679193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi pthread_t mOwner; 680903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IThreadSync; 681193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 682903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 683193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLVibraItf_ *mItf; 684903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 685193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mVibrate; 686193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmilliHertz mFrequency; 687193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mIntensity; 688903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IVibra; 689193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 690903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 691193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLVirtualizerItf_ *mItf; 692903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 693193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mEnabled; 694193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mStrength; 695903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IVirtualizer; 696193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 697903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 698193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLVisualizationItf_ *mItf; 699903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 700193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slVisualizationCallback mCallback; 701193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mContext; 702193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmilliHertz mRate; 703903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IVisualization; 704193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 70515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kastentypedef struct /*Volume_interface*/ { 706193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLVolumeItf_ *mItf; 707903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 70815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten // Values as specified by the application 709193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillibel mLevel; 710193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mStereoPosition; 71115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLuint8 /*SLboolean*/ mMute; // FIXME move inside each object that supports the interface 71215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLuint8 /*SLboolean*/ mEnableStereoPosition; 713903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IVolume; 714193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 715193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi/* Class structures */ 716193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 717ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten/*typedef*/ struct C3DGroup_struct { 718903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 719bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_3DGroup 6 // see MPH_to_3DGroup in MPH_to.c for list of interfaces 720bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_3DGroup - INTERFACES_Default]; 721903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 722903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DLocation m3DLocation; 723903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DDoppler m3DDoppler; 724903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DSource m3DSource; 725903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DMacroscopic m3DMacroscopic; 726ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten unsigned mMemberMask; // set of member objects 727ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten} /*C3DGroup*/; 728193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 729b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi#ifdef ANDROID 730193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi/* 731193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * Used to define the mapping from an OpenSL ES audio player to an Android 732193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * media framework object 733193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi */ 734193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivienum AndroidObject_type { 735f2a9b6c9fc2e5a35fd5dc19e82729eb3f894534aJean-Michel Trivi INVALID_TYPE =-1, 736193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi MEDIAPLAYER = 0, 737193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi AUDIOTRACK_PUSH = 1, 738193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi AUDIOTRACK_PULL = 2, 739193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi NUM_AUDIOPLAYER_MAP_TYPES 740193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi}; 741226ce6a635c4a333a66b8e0ea28316a6d405ee33Jean-Michel Trivi 742b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivienum AndroidObject_state { 743b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi ANDROID_UNINITIALIZED = -1, 744b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi ANDROID_PREPARING, 745b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi ANDROID_PREPARED, 746b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi ANDROID_PREFETCHING, 747b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi ANDROID_READY, 748b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi NUM_ANDROID_STATES 749b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi}; 750193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 751193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 7524c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten/*typedef*/ struct CAudioPlayer_struct { 753903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 754bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_AudioPlayer 26 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces 755bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_AudioPlayer - INTERFACES_Default]; 756903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 757903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPlay mPlay; 758903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DDoppler m3DDoppler; 759903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DGrouping m3DGrouping; 760903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DLocation m3DLocation; 761903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DSource m3DSource; 762903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IBufferQueue mBufferQueue; 763903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEffectSend mEffectSend; 764903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMetadataExtraction mMetadataExtraction; 765903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMetadataTraversal mMetadataTraversal; 766903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPrefetchStatus mPrefetchStatus; 767903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IRatePitch mRatePitch; 768903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten ISeek mSeek; 769903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVolume mVolume; 77015f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten IMuteSolo mMuteSolo; 771193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // optional interfaces 772903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DMacroscopic m3DMacroscopic; 773903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IBassBoost mBassBoost; 774903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicSource mDynamicSource; 775903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 776903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEqualizer mEqualizer; 777903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPitch mPitch; 778903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPresetReverb mPresetReverb; 779903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPlaybackRate mPlaybackRate; 780903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVirtualizer mVirtualizer; 781903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVisualization mVisualization; 782193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // rest of fields are not related to the interfaces 7834c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten DataLocatorFormat mDataSource; 7844c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten DataLocatorFormat mDataSink; 785da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi // cached data for this instance 786da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi SLuint8 mNumChannels; 78715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLuint8 /*SLboolean*/ mMute; 788da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi // implementation-specific data for this instance 78915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#ifdef USE_OUTPUTMIXEXT 79015f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten struct Track *mTrack; 79115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#endif 792193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_SNDFILE 793193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi struct SndFile mSndFile; 794193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif // USE_SNDFILE 795b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi#ifdef ANDROID 796060adae7c9af5b1470ca12f44d8f36a27987efcbJean-Michel Trivi android::Mutex *mpLock; 797193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi enum AndroidObject_type mAndroidObjType; 798b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi enum AndroidObject_state mAndroidObjState; 799474bc3d17dc75cbaf3f553d16fe21ef35071ddadJean-Michel Trivi android::AudioTrack *mAudioTrack; 8005d9e8432d0217fe139987703b8e1f129296171ffJean-Michel Trivi android::sp<android::SfPlayer> mSfPlayer; 8015d9e8432d0217fe139987703b8e1f129296171ffJean-Michel Trivi android::sp<android::ALooper> mRenderLooper; 80215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten /** 80315f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten * Amplification (can be attenuation) factor derived for the VolumeLevel 80415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten */ 80515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten float mAmplFromVolLevel; 80615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten /** 80715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten * Left/right amplification (can be attenuations) factors derived for the StereoPosition 80815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten */ 80915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten float mAmplFromStereoPos[STEREO_CHANNELS]; 810193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 8114c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten} /*CAudioPlayer*/; 812193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 813903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 814193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 815903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 816bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_AudioRecorder 9 // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces 817bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceContinued[INTERFACES_AudioRecorder - INTERFACES_Default]; 818903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 819903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IRecord mRecord; 820903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IAudioEncoder mAudioEncoder; 821193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // optional interfaces 822903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IBassBoost mBassBoost; 823903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicSource mDynamicSource; 824903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEqualizer mEqualizer; 825903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVisualization mVisualization; 826903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVolume mVolume; 827d55d250a016c1400cc00b5e1ac5baaa095702585Glenn Kasten // rest of fields are not related to the interfaces 828d55d250a016c1400cc00b5e1ac5baaa095702585Glenn Kasten DataLocatorFormat mDataSource; 829d55d250a016c1400cc00b5e1ac5baaa095702585Glenn Kasten DataLocatorFormat mDataSink; 830903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CAudioRecorder; 831193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 832903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 833193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated implicit interfaces 834903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 835bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_Engine 10 // see MPH_to_Engine in MPH_to.c for list of interfaces 836bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_Engine - INTERFACES_Default]; 837903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 838903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEngine mEngine; 839903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEngineCapabilities mEngineCapabilities; 840903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IThreadSync mThreadSync; 841193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated explicit interfaces 842903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IAudioIODeviceCapabilities mAudioIODeviceCapabilities; 843903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IAudioDecoderCapabilities mAudioDecoderCapabilities; 844903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IAudioEncoderCapabilities mAudioEncoderCapabilities; 845903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DCommit m3DCommit; 846193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // optional interfaces 847903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDeviceVolume mDeviceVolume; 848188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kasten pthread_t mSyncThread; 849903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CEngine; 850193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 851903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 852193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 853903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 854bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_LEDDevice 3 // see MPH_to_LEDDevice in MPH_to.c for list of interfaces 855bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_LEDDevice - INTERFACES_Default]; 856903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 857903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten ILEDArray mLEDArray; 858193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mDeviceID; 859903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CLEDDevice; 860193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 861903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 862193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 863903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 864bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_Listener 4 // see MPH_to_Listener in MPH_to.c for list of interfaces 865bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_Listener - INTERFACES_Default]; 866903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 867903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DDoppler m3DDoppler; 868903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DLocation m3DLocation; 869903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CListener; 870193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 871903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 872193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 873903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 87415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#define INTERFACES_MetadataExtractor 5 // see MPH_to_MetadataExtractor in MPH_to.c for list of 87515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten // interfaces 876bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_MetadataExtractor - INTERFACES_Default]; 877903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 878903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicSource mDynamicSource; 879903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMetadataExtraction mMetadataExtraction; 880903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMetadataTraversal mMetadataTraversal; 881903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CMetadataExtractor; 882193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 883903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 884193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 885903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 886bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_MidiPlayer 29 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces 887bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_MidiPlayer - INTERFACES_Default]; 888903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 889903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPlay mPlay; 890903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DDoppler m3DDoppler; 891903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DGrouping m3DGrouping; 892903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DLocation m3DLocation; 893903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DSource m3DSource; 894903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IBufferQueue mBufferQueue; 895903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEffectSend mEffectSend; 896903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMetadataExtraction mMetadataExtraction; 897903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMetadataTraversal mMetadataTraversal; 898903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMIDIMessage mMIDIMessage; 899903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMIDITime mMIDITime; 900903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMIDITempo mMIDITempo; 901903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMIDIMuteSolo mMIDIMuteSolo; 902903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPrefetchStatus mPrefetchStatus; 903903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten ISeek mSeek; 904903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVolume mVolume; 90515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten IMuteSolo mMuteSolo; 906193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // optional interfaces 907903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DMacroscopic m3DMacroscopic; 908903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IBassBoost mBassBoost; 909903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicSource mDynamicSource; 910903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 911903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEqualizer mEqualizer; 912903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPitch mPitch; 913903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPresetReverb mPresetReverb; 914903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPlaybackRate mPlaybackRate; 915903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVirtualizer mVirtualizer; 916903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVisualization mVisualization; 917903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CMidiPlayer; 918903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten 91915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten/*typedef*/ struct COutputMix_struct { 920193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 921903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 922bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_OutputMix 11 // see MPH_to_OutputMix in MPH_to.c for list of interfaces 923bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_OutputMix - INTERFACES_Default]; 924903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 925903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IOutputMix mOutputMix; 926193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 927903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IOutputMixExt mOutputMixExt; 928193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 929903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 930903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEqualizer mEqualizer; 931903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPresetReverb mPresetReverb; 932903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVirtualizer mVirtualizer; 933903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVolume mVolume; 934193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // optional interfaces 935903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IBassBoost mBassBoost; 936903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVisualization mVisualization; 93715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten} /*COutputMix*/; 938193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 939903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 940193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 941903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 942bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_VibraDevice 3 // see MPH_to_VibraDevice in MPH_to.c for list of interfaces 943bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_VibraDevice - INTERFACES_Default]; 944903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 945903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVibra mVibra; 946193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // 947193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mDeviceID; 948903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CVibraDevice; 94982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 95023b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenstruct MPH_init { 95123b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten // unsigned char mMPH; 95223b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten VoidHook mInit; 953bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten VoidHook mResume; 95423b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten VoidHook mDeinit; 95523b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten}; 95623b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten 95723b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenextern /*static*/ int IID_to_MPH(const SLInterfaceID iid); 95823b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenextern /*static*/ const struct MPH_init MPH_init_table[MPH_MAX]; 959492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kastenextern SLresult checkInterfaces(const ClassTable *class__, 960492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kasten SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds, 961492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kasten const SLboolean *pInterfaceRequired, unsigned *pExposedMask); 962492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kastenextern IObject *construct(const ClassTable *class__, 963492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kasten unsigned exposedMask, SLEngineItf engine); 964492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kastenextern const ClassTable *objectIDtoClass(SLuint32 objectID); 965492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kastenextern const struct SLInterfaceID_ SL_IID_array[MPH_MAX]; 966188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kastenextern SLuint32 IObjectToObjectID(IObject *object); 967188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kasten 96832a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// Map an interface to it's "object ID" (which is really a class ID). 96932a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis. 97032a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// If you have an IObject, then use IObjectToObjectID directly. 971188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kasten 972188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kasten#define InterfaceToObjectID(this) IObjectToObjectID((this)->mThis) 973f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten 97432a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// Map an interface to it's corresponding IObject. 97532a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis. 97632a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// If you have an IObject, then you're done -- you already have what you need. 97732a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten 97832a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten#define InterfaceToIObject(this) ((this)->mThis) 97932a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten 980da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi#define InterfaceToCAudioPlayer(this) (((CAudioPlayer*)InterfaceToIObject(this))) 981da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi 9829db8335361c67c4ed877f68218835df96ce43a4bJean-Michel Trivi#ifdef ANDROID 983f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten#include "sles_to_android.h" 984f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten#endif 985f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten 98615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kastenextern SLresult checkDataSource(const SLDataSource *pDataSrc, 98715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten DataLocatorFormat *myDataSourceLocator); 988f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kastenextern SLresult checkDataSink(const SLDataSink *pDataSink, DataLocatorFormat *myDataSinkLocator); 989f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kastenextern void freeDataLocatorFormat(DataLocatorFormat *dlf); 99009f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kastenextern SLresult CAudioPlayer_Realize(void *self, SLboolean async); 99109f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kastenextern void CAudioPlayer_Destroy(void *self); 992437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenextern SLresult CEngine_Realize(void *self, SLboolean async); 993437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenextern void CEngine_Destroy(void *self); 99499cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kasten#ifdef USE_SDL 99599cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kastenextern void SDL_start(IEngine *thisEngine); 99699cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kasten#endif 997bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_REALIZING_1 ((SLuint32) 0x4) // async realize on work queue 998bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_REALIZING_2 ((SLuint32) 0x5) // sync realize, or async realize hook 999bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_RESUMING_1 ((SLuint32) 0x6) // async resume on work queue 1000bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_RESUMING_2 ((SLuint32) 0x7) // sync resume, or async resume hook 1001bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_SUSPENDING ((SLuint32) 0x8) // suspend in progress 1002bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_REALIZING_1A ((SLuint32) 0x9) // abort while async realize on work queue 1003bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_RESUMING_1A ((SLuint32) 0xA) // abort while async resume on work queue 1004437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenextern void *sync_start(void *arg); 1005437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenextern SLresult err_to_result(int err); 1006277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kasten 1007277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kasten#ifdef __GNUC__ 100832a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten#define ctz __builtin_ctz 1009277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kasten#else 1010277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kastenextern unsigned ctz(unsigned); 1011277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kasten#endif 10127e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kastenextern const char * const interface_names[MPH_MAX]; 101315f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#include "platform.h" 101415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten 101515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten// Attributes 101615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten 101715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#define ATTR_NONE ((unsigned) 0x0) // none 101815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#define ATTR_GAIN ((unsigned) 0x1) // player volume, channel mute, channel solo, 101915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten // player stereo position, player mute 102015f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#define ATTR_TRANSPORT ((unsigned) 0x2) // play state, requested position, looping 1021