sles_allinclusive.h revision 369f3138f19f7102bf0f98b890ab84c8df633a93
1773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* 2773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project 3773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * 4773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 5773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * you may not use this file except in compliance with the License. 6773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * You may obtain a copy of the License at 7773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * 8773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 9773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * 10773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 11773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 12773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * See the License for the specific language governing permissions and 14773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * limitations under the License. 15773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi */ 16773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 17369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten/** \file sles_allinclusive.h Everything including the kitchen sink */ 18369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten 19773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "OpenSLES.h" 20773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <stddef.h> // offsetof 21773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <stdlib.h> // malloc 22773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <string.h> // memcmp 23773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <stdio.h> // debugging 24773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <assert.h> // debugging 25773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <pthread.h> 2632918086b694fc383c8c2d590ac45492801676f7Glenn Kasten#include <unistd.h> // usleep 27d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten#include <errno.h> 28773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 29773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "MPH.h" 30773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "MPH_to.h" 31a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "devices.h" 327a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#include "OpenSLUT.h" 33d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten#include "ThreadPool.h" 34773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 35acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef struct CAudioPlayer_struct CAudioPlayer; 363af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivitypedef struct CAudioRecorder_struct CAudioRecorder; 376a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kastentypedef struct C3DGroup_struct C3DGroup; 38e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastentypedef struct COutputMix_struct COutputMix; 39acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten 40773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE 41773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <sndfile.h> 427324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#include "SLSndFile.h" 43773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE 44773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 45773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SDL 46773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <SDL/SDL_audio.h> 47773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SDL 48773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 49ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID 507a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#include <utils/Log.h> 5105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#include "OpenSLES_Android.h" 52773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/AudioSystem.h" 533af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#include "media/mediarecorder.h" 543af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#include "media/AudioRecord.h" 55773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/AudioTrack.h" 56773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/mediaplayer.h" 574be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "media/AudioEffect.h" 584be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "media/EffectApi.h" 594be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "media/EffectEqualizerApi.h" 606fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi#include <utils/String8.h> 61b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi#define ANDROID_SL_MILLIBEL_MAX 0 62daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#include <binder/ProcessState.h> 63de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi#include "android_SfPlayer.h" 644be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "android_Effect.h" 653af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#include "android_AudioRecorder.h" 66773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 67773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 68e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#define STEREO_CHANNELS 2 69e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten 70773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 71773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "OutputMixExt.h" 72773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 73773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 74773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Hook functions 75773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 76773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef void (*VoidHook)(void *self); 77773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef SLresult (*StatusHook)(void *self); 783d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivitypedef SLresult (*AsyncHook)(void *self, SLboolean async); 79b90cb3de9b67383be4e077d807464044f6f18f7aJean-Michel Trivi 80773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Describes how an interface is related to a given class 81773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 82773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_IMPLICIT 0 83773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_EXPLICIT 1 84773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_OPTIONAL 2 85773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC 3 86daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#define INTERFACE_UNAVAILABLE 4 87773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_GAME INTERFACE_DYNAMIC 88773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC INTERFACE_DYNAMIC 89773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC_GAME INTERFACE_DYNAMIC 90773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_EXPLICIT_GAME INTERFACE_EXPLICIT 91773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_GAME INTERFACE_OPTIONAL 92773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_GAME_MUSIC INTERFACE_OPTIONAL 93773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_MUSIC_GAME INTERFACE_OPTIONAL 94773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_OPTIONAL_DYNAMIC INTERFACE_DYNAMIC 95773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_PHONE_GAME INTERFACE_OPTIONAL 96773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_TBD INTERFACE_IMPLICIT 97773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 987a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#ifdef USE_CONFORMANCE 997a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#define INTERFACE_IMPLICIT_CT INTERFACE_IMPLICIT 1007a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#define INTERFACE_EXPLICIT_CT INTERFACE_EXPLICIT 1017a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#define INTERFACE_EXPLICIT_GAME_CT INTERFACE_EXPLICIT_GAME 1027a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#define INTERFACE_OPTIONAL_CT INTERFACE_OPTIONAL 1037a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#else 1047a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#define INTERFACE_IMPLICIT_CT INTERFACE_UNAVAILABLE 1057a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#define INTERFACE_EXPLICIT_CT INTERFACE_UNAVAILABLE 1067a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#define INTERFACE_EXPLICIT_GAME_CT INTERFACE_UNAVAILABLE 1077a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#define INTERFACE_OPTIONAL_CT INTERFACE_UNAVAILABLE 1087a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif 1097a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten 110510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten// Describes how an interface is related to a given object 111510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten 112369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_UNINITIALIZED 1 ///< /not requested at object creation time 113369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_EXPOSED 2 ///< /requested at object creation time 114369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_ADDING_1 3 ///< /part 1 of asynchronous AddInterface, pending 115369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_ADDING_2 4 ///< /synchronous AddInterface, or part 2 of asynchronous 116369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_ADDED 5 ///< /AddInterface has completed 117369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_REMOVING 6 ///< /unlocked phase of (synchronous) RemoveInterface 118369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_SUSPENDING 7 ///< /suspend in progress 119369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_SUSPENDED 8 ///< /suspend has completed 120369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_RESUMING_1 9 ///< /part 1 of asynchronous ResumeInterface, pending 121369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_RESUMING_2 10 ///< /synchronous ResumeInterface, or part 2 of asynchronous 122369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_ADDING_1A 11 ///< /part 1 of asynchronous AddInterface, aborted 123369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_RESUMING_1A 12 ///< /part 1 of asynchronous ResumeInterface, aborted 124510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten 125773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Maps an interface ID to its offset within the class that exposes it 126773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 127773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct iid_vtable { 128773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi unsigned char mMPH; 129773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi unsigned char mInterface; // relationship 130773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi /*size_t*/ unsigned short mOffset; 131773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 132773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 133773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Per-class const data shared by all instances of the same class 134773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 13572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 136773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct iid_vtable *mInterfaces; 137510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint32 mInterfaceCount; // number of possible interfaces 138773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const signed char *mMPH_to_index; 13976dde6cd71bdb39459f38218e8aa2b7c19e790dbGlenn Kasten const char * const mName; 140773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi size_t mSize; 141773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mObjectID; 142510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten // hooks 1433d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivi AsyncHook mRealize; 144510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten AsyncHook mResume; 145773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi VoidHook mDestroy; 14672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ClassTable; 147773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 148773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// BufferHeader describes each element of a BufferQueue, other than the data 149773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 150d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastentypedef struct { 151773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const void *mBuffer; 152773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mSize; 153d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten} BufferHeader; 154773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 155773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 156773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 157773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// stereo is a frame consisting of a pair of 16-bit PCM samples 158773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 159773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef struct { 160773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi short left; 161773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi short right; 162773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi} stereo; 163773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 164773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 165773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 1667324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#ifdef __cplusplus 1677324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#define this this_ 1687324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#endif 1697324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten 170773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE 171773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 1726a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten#define SndFile_BUFSIZE 512 // in 16-bit samples 1736a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten#define SndFile_NUMBUFS 2 1746a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten 175773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct SndFile { 176773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // save URI also? 177773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLchar *mPathname; 178773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SNDFILE *mSNDFILE; 1794b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SF_INFO mSfInfo; 180e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten pthread_mutex_t mMutex; // protects mSNDFILE only 181e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLboolean mEOF; // sf_read returned zero sample frames 182773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // These are used when Enqueue returns SL_RESULT_BUFFER_INSUFFICIENT 183773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const void *mRetryBuffer; 184773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mRetrySize; 1856a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten SLuint32 mWhich; // which buffer to use next 1866a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten short mBuffer[SndFile_BUFSIZE * SndFile_NUMBUFS]; 187773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 188773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 189773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE 190773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 191acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten/* Our own merged version of SLDataSource and SLDataSink */ 192acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten 193acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef union { 194acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLuint32 mLocatorType; 195acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataLocator_Address mAddress; 196acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataLocator_BufferQueue mBufferQueue; 197acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataLocator_IODevice mIODevice; 198acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataLocator_MIDIBufferQueue mMIDIBufferQueue; 199acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataLocator_OutputMix mOutputMix; 200acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataLocator_URI mURI; 201989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi#ifdef ANDROID 202989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi SLDataLocator_AndroidFD mFD; 203989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi#endif 204acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} DataLocator; 205acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten 206acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef union { 207acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLuint32 mFormatType; 208acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataFormat_PCM mPCM; 209acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataFormat_MIME mMIME; 210acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} DataFormat; 211acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten 212acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef struct { 213acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten union { 214acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataSource mSource; 215acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataSink mSink; 216acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten struct { 217acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten DataLocator *pLocator; 218acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten DataFormat *pFormat; 219acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten } mNeutral; 220acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten } u; 221acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten DataLocator mLocator; 222acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten DataFormat mFormat; 223acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} DataLocatorFormat; 224acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten 225773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Interface structures */ 226773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 22772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Object_interface { 228e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten const struct SLObjectItf_ *mItf; // const 229d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten // field mThis would be redundant within an IObject, so we substitute mEngine 230e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten struct Engine_interface *mEngine; // const 231e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten const ClassTable *mClass; // const 232e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLuint32 mInstanceID; // const for debugger and for RPC 23372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten slObjectCallback mCallback; 23472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten void *mContext; 235510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten unsigned mGottenMask; // interfaces which are exposed or added, and then gotten 23672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten unsigned mLossOfControlMask; // interfaces with loss of control enabled 237e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten unsigned mAttributesMask; // attributes which have changed since last sync 2387a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#ifdef USE_CONFORMANCE 23972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten SLint32 mPriority; 2407a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif 24172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten pthread_mutex_t mMutex; 24272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten pthread_cond_t mCond; 243510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mState; // really SLuint32, but SLuint8 to save space 2447a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#ifdef USE_CONFORMANCE 245510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mPreemptable; // really SLboolean, but SLuint8 to save space 2467a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#else 2477a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten SLuint8 mPadding; 2487a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif 249510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten // for best alignment, do not add any fields here 250510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_Default 2 251510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates[INTERFACES_Default]; // state of each of interface 252e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // do not add any fields here 25372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IObject; 25472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten 255a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "locks.h" 256a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 25772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 25872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten const struct SL3DCommitItf_ *mItf; 25972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 260773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mDeferred; 26132918086b694fc383c8c2d590ac45492801676f7Glenn Kasten SLuint32 mGeneration; // incremented each master clock cycle 262a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten SLuint32 mWaiting; // number of threads waiting in Commit 26372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DCommit; 264773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 2657754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum CartesianSphericalActive { 2667754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_COMPUTED_SPHERICAL_SET, 2677754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_REQUESTED_SPHERICAL_SET, 2687754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_UNKNOWN_SPHERICAL_SET, 2697754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_SET_SPHERICAL_COMPUTED, // not in 1.0.1 2707754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_SET_SPHERICAL_REQUESTED, // not in 1.0.1 2717754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_SET_SPHERICAL_UNKNOWN 2727754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten}; 2737754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten 27472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 275773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DDopplerItf_ *mItf; 27672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 2777754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // The API allows client to specify either Cartesian and spherical velocities. 2787754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // But an implementation will likely prefer one or the other. So for 2797754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // maximum portablity, we maintain both units and an indication of which 2807754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // unit was set most recently. In addition, we keep a flag saying whether 2817754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // the other unit has been derived yet. It can take significant time 2827754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // to compute the other unit, so this may be deferred to another thread. 2837754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // For this reason we also keep an indication of whether the secondary 2847754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // has been computed yet, and its accuracy. 2857754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // Though only one unit is primary at a time, a union is inappropriate: 2867754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // the application might read in both units (not in 1.0.1), 2877754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // and due to multi-threading concerns. 2887754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mVelocityCartesian; 28932918086b694fc383c8c2d590ac45492801676f7Glenn Kasten struct { 29032918086b694fc383c8c2d590ac45492801676f7Glenn Kasten SLmillidegree mAzimuth; 29132918086b694fc383c8c2d590ac45492801676f7Glenn Kasten SLmillidegree mElevation; 29232918086b694fc383c8c2d590ac45492801676f7Glenn Kasten SLmillidegree mSpeed; 2937754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten } mVelocitySpherical; 2947754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten enum CartesianSphericalActive mVelocityActive; 295773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mDopplerFactor; 29672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DDoppler; 297773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 29872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 299773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DGroupingItf_ *mItf; 30072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 3016a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten C3DGroup *mGroup; // link to associated group or NULL 30272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DGrouping; 303773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 3047754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum AnglesVectorsActive { 3057754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_COMPUTED_VECTORS_SET, // not in 1.0.1 3067754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_REQUESTED_VECTORS_SET, // not in 1.0.1 3077754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_UNKNOWN_VECTORS_SET, 3087754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_SET_VECTORS_COMPUTED, 3097754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_SET_VECTORS_REQUESTED, 3107754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_SET_VECTORS_UNKNOWN 3117754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten}; 3127754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten 31372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 314773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DLocationItf_ *mItf; 31572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 3167754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mLocationCartesian; 3177754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten struct { 3187754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mAzimuth; 3197754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mElevation; 3207754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillimeter mDistance; 3217754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten } mLocationSpherical; 3227754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten enum CartesianSphericalActive mLocationActive; 3237754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten struct { 3247754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mHeading; 3257754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mPitch; 3267754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mRoll; 3277754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten } mOrientationAngles; 3287754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten struct { 3297754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mFront; 3307754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mAbove; 3317754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mUp; 3327754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten } mOrientationVectors; 3337754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten enum AnglesVectorsActive mOrientationActive; 3347754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // Rotations can be slow, so are deferred. 3357754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mTheta; 3367754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mAxis; 3377754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLboolean mRotatePending; 33872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DLocation; 339773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 34072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 341773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DMacroscopicItf_ *mItf; 34272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 343773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct { 344773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mWidth; 345773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mHeight; 346773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mDepth; 347773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi } mSize; 348773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct { 349773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mHeading; 350773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mPitch; 351773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mRoll; 352773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi } mOrientationAngles; 353773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct { 354773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLVec3D mFront; 355ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SLVec3D mAbove; 356773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLVec3D mUp; 357773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi } mOrientationVectors; 3587754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten enum AnglesVectorsActive mOrientationActive; 3597754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // Rotations can be slow, so are deferred. 3607754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mTheta; 3617754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mAxis; 3627754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLboolean mRotatePending; 36372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DMacroscopic; 364773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 36572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 366773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DSourceItf_ *mItf; 36772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 368773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mHeadRelative; 369773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mRolloffMaxDistanceMute; 370773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mMaxDistance; 371773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mMinDistance; 3727754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mConeInnerAngle; 3737754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mConeOuterAngle; 374773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillibel mConeOuterLevel; 375773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mRolloffFactor; 376773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mRoomRolloffFactor; 377773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint8 mDistanceModel; 37872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DSource; 379773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 38072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 381773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLAudioDecoderCapabilitiesItf_ *mItf; 38272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 38372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioDecoderCapabilities; 384773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 38572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 386773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLAudioEncoderItf_ *mItf; 38772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 388773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLAudioEncoderSettings mSettings; 38972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoder; 390773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 39172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 392773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLAudioEncoderCapabilitiesItf_ *mItf; 39372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 39472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoderCapabilities; 395773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 39672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 397773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLAudioIODeviceCapabilitiesItf_ *mItf; 39872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 3997754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten slAvailableAudioInputsChangedCallback mAvailableAudioInputsChangedCallback; 4007754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten void *mAvailableAudioInputsChangedContext; 4017754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten slAvailableAudioOutputsChangedCallback mAvailableAudioOutputsChangedCallback; 4027754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten void *mAvailableAudioOutputsChangedContext; 4037754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten slDefaultDeviceIDMapChangedCallback mDefaultDeviceIDMapChangedCallback; 4047754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten void *mDefaultDeviceIDMapChangedContext; 40572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioIODeviceCapabilities; 406773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 40772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 408773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLBassBoostItf_ *mItf; 40972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 410773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mEnabled; 411773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mStrength; 41272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBassBoost; 413773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 41472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct BufferQueue_interface { 415773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLBufferQueueItf_ *mItf; 41672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 4173a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten SLBufferQueueState mState; 418773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slBufferQueueCallback mCallback; 419773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 4204b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten // originally SLuint32, but range-checked down to SLuint16 4214b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SLuint16 mNumBuffers; 4224b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten /*SLboolean*/ SLuint16 mClearRequested; 423d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten BufferHeader *mArray; 424d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten BufferHeader *mFront, *mRear; 4254b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#ifdef ANDROID 4261ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi SLuint32 mSizeConsumed; 4274b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#endif 428773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // saves a malloc in the typical case 429773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define BUFFER_HEADER_TYPICAL 4 430d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten BufferHeader mTypical[BUFFER_HEADER_TYPICAL+1]; 43172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBufferQueue; 432773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 43340d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten#define MAX_DEVICE 2 43440d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten 43572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 436773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLDeviceVolumeItf_ *mItf; 43772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 4387a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten SLint32 mVolume[MAX_DEVICE]; 43972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDeviceVolume; 440773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 44172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 442773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLDynamicInterfaceManagementItf_ *mItf; 44372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 444773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slDynamicInterfaceManagementCallback mCallback; 445773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 44672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicInterfaceManagement; 447773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 44872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 449773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLDynamicSourceItf_ *mItf; 45072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 451773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLDataSource *mDataSource; 45272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicSource; 453773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 454773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// private 455773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 456773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EnableLevel { 457773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mEnable; 458773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillibel mSendLevel; 459773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 460773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 461510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten// indexes into IEffectSend.mEnableLevels 462510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten 463510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define AUX_ENVIRONMENTALREVERB 0 464510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define AUX_PRESETREVERB 1 465510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define AUX_MAX 2 466510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten 46772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 468773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEffectSendItf_ *mItf; 46972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 470e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten COutputMix *mOutputMix; // which output mix this effect send is attached to 471e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLmillibel mDirectLevel; // dry volume 472e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten struct EnableLevel mEnableLevels[AUX_MAX]; // wet enable and volume per effect type 47372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEffectSend; 47472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten 475ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kastentypedef struct Engine_interface { 476773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEngineItf_ *mItf; 47772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 478773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mLossOfControlGlobal; 47900d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#ifdef USE_SDL 480e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten COutputMix *mOutputMix; // SDL pulls PCM from an arbitrary IOutputMixExt 48100d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#endif 482773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // Each engine is its own universe. 48372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten SLuint32 mInstanceCount; 484d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten unsigned mInstanceMask; // 1 bit per active object 485e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten unsigned mChangedMask; // objects which have changed since last sync 486d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define MAX_INSTANCE 32 // see mInstanceMask 487d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten IObject *mInstances[MAX_INSTANCE]; 488d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten SLboolean mShutdown; 489e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLboolean mShutdownAck; 490e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten pthread_cond_t mShutdownCond; 491d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten ThreadPool mThreadPool; // for asynchronous operations 4924be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#ifdef ANDROID 4934be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi SLuint32 mEqNumPresets; 4944be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi char** mEqPresetNames; 4954be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif 49672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngine; 497773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 49872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 499773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEngineCapabilitiesItf_ *mItf; 50072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 501773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mThreadSafe; 50240d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten // const 50340d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten SLuint32 mMaxIndexLED; 50440d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten SLuint32 mMaxIndexVibra; 50572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngineCapabilities; 506773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 50772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 508773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEnvironmentalReverbItf_ *mItf; 50972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 510773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLEnvironmentalReverbSettings mProperties; 51172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEnvironmentalReverb; 512773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 513773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EqualizerBand { 514773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmilliHertz mMin; 515773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmilliHertz mCenter; 5160b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLmilliHertz mMax; 517773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 518773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 5194be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#ifdef ANDROID 5204be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#define MAX_EQ_BANDS 0 5214be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#else 5223a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten#define MAX_EQ_BANDS 4 // compile-time limit, runtime limit may be smaller 5234be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif 5243a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten 52572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 526773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEqualizerItf_ *mItf; 52772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 528773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mEnabled; 529773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mPreset; 5303a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten SLmillibel mLevels[MAX_EQ_BANDS]; 5313a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten // const to end of struct 532773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mNumPresets; 533773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mNumBands; 5340b167267bda99b68346045ccab14e810121d5de4Glenn Kasten const struct EqualizerBand *mBands; 5353a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten const struct EqualizerPreset *mPresets; 5360b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLmillibel mBandLevelRangeMin; 5370b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLmillibel mBandLevelRangeMax; 5384be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#ifdef ANDROID 5394be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi effect_descriptor_t mEqDescriptor; 5404be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi android::sp<android::AudioEffect> mEqEffect; 5414be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif 54272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEqualizer; 543773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 5443a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten#define MAX_LED_COUNT 32 5453a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten 54672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 547773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLLEDArrayItf_ *mItf; 54872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 549773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mLightMask; 5503a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten SLHSL mColors[MAX_LED_COUNT]; 551773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // const 552773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint8 mCount; 55372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ILEDArray; 554773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 55572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 556773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMetadataExtractionItf_ *mItf; 55772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 558773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mKeySize; 559773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const void *mKey; 560773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mKeyEncoding; 561773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const SLchar *mValueLangCountry; 562773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mValueEncoding; 563773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint8 mFilterMask; 5646a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten int mKeyFilter; 56572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataExtraction; 566773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 56772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 568773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMetadataTraversalItf_ *mItf; 56972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 570773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mIndex; 571773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mMode; 572773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mCount; 573773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mSize; 57472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataTraversal; 575773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 57672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 577773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMIDIMessageItf_ *mItf; 57872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 579773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slMetaEventCallback mMetaEventCallback; 580773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mMetaEventContext; 581773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slMIDIMessageCallback mMessageCallback; 582773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mMessageContext; 5830b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLuint8 mMessageTypes; 58472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMessage; 585773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 58672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 587773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMIDIMuteSoloItf_ *mItf; 58872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 589773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mChannelMuteMask; 590773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mChannelSoloMask; 591773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mTrackMuteMask; 592773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mTrackSoloMask; 593d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten // const 594773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mTrackCount; 59572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMuteSolo; 596773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 59772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 598773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMIDITempoItf_ *mItf; 59972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 600773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mTicksPerQuarterNote; 601773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mMicrosecondsPerQuarterNote; 60272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITempo; 603773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 60472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 605773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMIDITimeItf_ *mItf; 60672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 607773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mDuration; 608773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mPosition; 609773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mStartTick; 610773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mNumTicks; 61172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITime; 612773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 61372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 614773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMuteSoloItf_ *mItf; 61572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 616b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten // fields that were formerly here are now at CAudioPlayer 61772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMuteSolo; 618773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 619d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define MAX_TRACK 32 // see mActiveMask 620d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten 62172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 622773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLOutputMixItf_ *mItf; 62372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 6247754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten slMixDeviceChangeCallback mCallback; 6257754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten void *mContext; 626773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 627773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi unsigned mActiveMask; // 1 bit per active track 628369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten Track mTracks[MAX_TRACK]; 629773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 63072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMix; 631773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 632773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 63372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 634773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLOutputMixExtItf_ *mItf; 63572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 63672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMixExt; 637773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 638773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 63972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 640773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPitchItf_ *mItf; 64172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 642773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mPitch; 643773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // const 644773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMinPitch; 645773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMaxPitch; 64672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPitch; 647773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 64872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Play_interface { 649773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPlayItf_ *mItf; 65072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 6513a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten SLuint32 mState; 652e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // next 2 fields are read-only to application 653773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mDuration; 654773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mPosition; 655773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slPlayCallback mCallback; 656773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 657773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mEventFlags; 658e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // the ISeek trick of using a distinct value doesn't work here because it's readable by app 659773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mMarkerPosition; 660e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLboolean mMarkerIsSet; 661773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mPositionUpdatePeriod; 66272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlay; 663773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 66472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 665773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPlaybackRateItf_ *mItf; 66672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 667773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mRate; 668773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mProperties; 6690b167267bda99b68346045ccab14e810121d5de4Glenn Kasten // const 670773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMinRate; 671773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMaxRate; 672773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mStepSize; 673773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mCapabilities; 67472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlaybackRate; 675773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 67672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 677773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPrefetchStatusItf_ *mItf; 67872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 679773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mStatus; 680773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mLevel; 681773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slPrefetchCallback mCallback; 682773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 683773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mCallbackEventsMask; 684773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mFillUpdatePeriod; 68572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPrefetchStatus; 686773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 68772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 688773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPresetReverbItf_ *mItf; 68972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 690773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mPreset; 69172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPresetReverb; 692773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 69372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 694773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLRatePitchItf_ *mItf; 69572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 696773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mRate; 6970b167267bda99b68346045ccab14e810121d5de4Glenn Kasten // const 698773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMinRate; 699773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMaxRate; 70072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRatePitch; 701773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 70272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 703773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLRecordItf_ *mItf; 70472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 705773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mState; 706773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mDurationLimit; 707773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mPosition; 708773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slRecordCallback mCallback; 709773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 710773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mCallbackEventsMask; 711773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mMarkerPosition; 712773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mPositionUpdatePeriod; 71372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRecord; 714773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 71572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 716773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLSeekItf_ *mItf; 71772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 718e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLmillisecond mPos; // mPos != SL_TIME_UNKNOWN means pending seek request 719773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mLoopEnabled; 720773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mStartPos; 721773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mEndPos; 72272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ISeek; 723773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 72472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 725773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLThreadSyncItf_ *mItf; 72672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 727773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mInCriticalSection; 728e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLuint32 mWaiting; // number of threads waiting 729773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi pthread_t mOwner; 73072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IThreadSync; 731773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 73272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 733773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLVibraItf_ *mItf; 73472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 735773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mVibrate; 736773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmilliHertz mFrequency; 737773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mIntensity; 73872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVibra; 739773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 74072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 741773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLVirtualizerItf_ *mItf; 74272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 743773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mEnabled; 744773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mStrength; 74572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVirtualizer; 746773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 74772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 748773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLVisualizationItf_ *mItf; 74972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 750773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slVisualizationCallback mCallback; 751773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 752773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmilliHertz mRate; 75372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVisualization; 754773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 755e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastentypedef struct /*Volume_interface*/ { 756773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLVolumeItf_ *mItf; 75772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 758e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // Values as specified by the application 759773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillibel mLevel; 760773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mStereoPosition; 7617a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten SLuint8 /*SLboolean*/ mMute; 762e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLuint8 /*SLboolean*/ mEnableStereoPosition; 76372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVolume; 764773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 765773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Class structures */ 766773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 7676a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten/*typedef*/ struct C3DGroup_struct { 76872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 769510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_3DGroup 6 // see MPH_to_3DGroup in MPH_to.c for list of interfaces 770510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_3DGroup - INTERFACES_Default]; 77172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 77272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DLocation m3DLocation; 77372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DDoppler m3DDoppler; 77472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DSource m3DSource; 77572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DMacroscopic m3DMacroscopic; 7766a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten unsigned mMemberMask; // set of member objects 7776a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten} /*C3DGroup*/; 778773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 77980ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi#ifdef ANDROID 78005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivitypedef struct { 78105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi const struct SLAndroidStreamTypeItf_ *mItf; 78205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi IObject *mThis; 78305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi SLuint32 mStreamType; 78405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi} IAndroidStreamType; 78505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi 786773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* 787773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Used to define the mapping from an OpenSL ES audio player to an Android 788773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * media framework object 789773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi */ 790773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivienum AndroidObject_type { 791c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi INVALID_TYPE =-1, 792773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi MEDIAPLAYER = 0, 793773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi AUDIOTRACK_PUSH = 1, 794773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi AUDIOTRACK_PULL = 2, 795773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi NUM_AUDIOPLAYER_MAP_TYPES 796773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 797f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi 79880ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivienum AndroidObject_state { 79980ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi ANDROID_UNINITIALIZED = -1, 80080ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi ANDROID_PREPARING, 80180ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi ANDROID_PREPARED, 80280ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi ANDROID_PREFETCHING, 80380ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi ANDROID_READY, 80480ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi NUM_ANDROID_STATES 80580ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi}; 80605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#endif //ifdef ANDROID 80705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi 808773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 809acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten/*typedef*/ struct CAudioPlayer_struct { 81072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 81105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#ifdef ANDROID 81205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#define INTERFACES_AudioPlayer 27 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces 81305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#else 814510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_AudioPlayer 26 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces 81505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#endif 816510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_AudioPlayer - INTERFACES_Default]; 81772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 81872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPlay mPlay; 81972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DDoppler m3DDoppler; 82072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DGrouping m3DGrouping; 82172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DLocation m3DLocation; 82272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DSource m3DSource; 82372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBufferQueue mBufferQueue; 82472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEffectSend mEffectSend; 82572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataExtraction mMetadataExtraction; 82672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataTraversal mMetadataTraversal; 82772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPrefetchStatus mPrefetchStatus; 82872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IRatePitch mRatePitch; 82972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten ISeek mSeek; 83072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVolume mVolume; 831e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten IMuteSolo mMuteSolo; 83205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#ifdef ANDROID 83305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi IAndroidStreamType mAndroidStreamType; 83405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#endif 835773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 83672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DMacroscopic m3DMacroscopic; 83772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBassBoost mBassBoost; 83872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicSource mDynamicSource; 83972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 84072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEqualizer mEqualizer; 84172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPitch mPitch; 84272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPresetReverb mPresetReverb; 84372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPlaybackRate mPlaybackRate; 84472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVirtualizer mVirtualizer; 84572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVisualization mVisualization; 846773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // rest of fields are not related to the interfaces 847acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten DataLocatorFormat mDataSource; 848acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten DataLocatorFormat mDataSink; 8491fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // cached data for this instance 850e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLuint8 /*SLboolean*/ mMute; 851b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten // Formerly at IMuteSolo 852b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten SLuint8 mMuteMask; // Mask for which channels are muted: bit 0=left, 1=right 853b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten SLuint8 mSoloMask; // Mask for which channels are soloed: bit 0=left, 1=right 854b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten SLuint8 mNumChannels; // 0 means unknown, then const once it is known, range 1 <= x <= 8 855a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi SLuint32 mSampleRateMilliHz;// 0 means unknown, then const once it is known 8561fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // implementation-specific data for this instance 857e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#ifdef USE_OUTPUTMIXEXT 858369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten Track *mTrack; 859e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#endif 860773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE 861773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct SndFile mSndFile; 862773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE 86380ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi#ifdef ANDROID 86406a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi android::Mutex *mpLock; 865773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi enum AndroidObject_type mAndroidObjType; 86680ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi enum AndroidObject_state mAndroidObjState; 8674614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi android::AudioTrack *mAudioTrack; 868de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi android::sp<android::SfPlayer> mSfPlayer; 869de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi android::sp<android::ALooper> mRenderLooper; 870e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten /** 871e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten * Amplification (can be attenuation) factor derived for the VolumeLevel 872e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten */ 873e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten float mAmplFromVolLevel; 874e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten /** 875e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten * Left/right amplification (can be attenuations) factors derived for the StereoPosition 876e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten */ 877e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten float mAmplFromStereoPos[STEREO_CHANNELS]; 878773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 879acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} /*CAudioPlayer*/; 880773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 8813af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi 8823af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi/*typedef*/ struct CAudioRecorder_struct { 883773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 88472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 8853af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#ifdef ANDROID 8863af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#define INTERFACES_AudioRecorder 10 // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces 8873af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#else 8883af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#define INTERFACES_AudioRecorder 9 // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces 8893af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#endif 890510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceContinued[INTERFACES_AudioRecorder - INTERFACES_Default]; 89172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 89272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IRecord mRecord; 89372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IAudioEncoder mAudioEncoder; 894773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 89572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBassBoost mBassBoost; 89672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicSource mDynamicSource; 89772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEqualizer mEqualizer; 89872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVisualization mVisualization; 89972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVolume mVolume; 9003af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#ifdef ANDROID 9013af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi IBufferQueue mBufferQueue; 9023af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#endif 903ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten // rest of fields are not related to the interfaces 904ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten DataLocatorFormat mDataSource; 905ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten DataLocatorFormat mDataSink; 9063af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi // implementation-specific data for this instance 9073af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#ifdef ANDROID 9083af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi android::AudioRecord *mAudioRecord; 9093af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#endif 9103af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi} /*CAudioRecorder*/; 9113af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi 912773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 91372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 914773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated implicit interfaces 91572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 916510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_Engine 10 // see MPH_to_Engine in MPH_to.c for list of interfaces 917510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_Engine - INTERFACES_Default]; 91872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 91972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEngine mEngine; 92072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEngineCapabilities mEngineCapabilities; 92172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IThreadSync mThreadSync; 922773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated explicit interfaces 92372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IAudioIODeviceCapabilities mAudioIODeviceCapabilities; 92472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IAudioDecoderCapabilities mAudioDecoderCapabilities; 92572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IAudioEncoderCapabilities mAudioEncoderCapabilities; 92672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DCommit m3DCommit; 927773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 92872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDeviceVolume mDeviceVolume; 9297a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten // rest of fields are not related to the interfaces 930b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten pthread_t mSyncThread; 93172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CEngine; 932773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 93372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 934773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 93572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 936510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_LEDDevice 3 // see MPH_to_LEDDevice in MPH_to.c for list of interfaces 937510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_LEDDevice - INTERFACES_Default]; 93872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 93972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten ILEDArray mLEDArray; 940773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mDeviceID; 94172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CLEDDevice; 942773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 94372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 944773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 94572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 946510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_Listener 4 // see MPH_to_Listener in MPH_to.c for list of interfaces 947510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_Listener - INTERFACES_Default]; 94872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 94972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DDoppler m3DDoppler; 95072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DLocation m3DLocation; 95172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CListener; 952773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 95372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 954773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 95572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 956e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#define INTERFACES_MetadataExtractor 5 // see MPH_to_MetadataExtractor in MPH_to.c for list of 957e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // interfaces 958510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_MetadataExtractor - INTERFACES_Default]; 95972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 96072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicSource mDynamicSource; 96172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataExtraction mMetadataExtraction; 96272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataTraversal mMetadataTraversal; 96372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMetadataExtractor; 964773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 96572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 966773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 96772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 96805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#ifdef ANDROID 96905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#define INTERFACES_MidiPlayer 30 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces 97005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#else 971510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_MidiPlayer 29 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces 97205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#endif 973510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_MidiPlayer - INTERFACES_Default]; 97472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 97572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPlay mPlay; 97672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DDoppler m3DDoppler; 97772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DGrouping m3DGrouping; 97872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DLocation m3DLocation; 97972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DSource m3DSource; 98072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBufferQueue mBufferQueue; 98172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEffectSend mEffectSend; 98272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataExtraction mMetadataExtraction; 98372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataTraversal mMetadataTraversal; 98472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMIDIMessage mMIDIMessage; 98572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMIDITime mMIDITime; 98672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMIDITempo mMIDITempo; 98772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMIDIMuteSolo mMIDIMuteSolo; 98872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPrefetchStatus mPrefetchStatus; 98972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten ISeek mSeek; 99072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVolume mVolume; 991e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten IMuteSolo mMuteSolo; 992a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten#ifdef ANDROID 99305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi IAndroidStreamType mAndroidStreamType; 994a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten#endif 995773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 99672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DMacroscopic m3DMacroscopic; 99772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBassBoost mBassBoost; 99872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicSource mDynamicSource; 99972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 100072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEqualizer mEqualizer; 100172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPitch mPitch; 100272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPresetReverb mPresetReverb; 100372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPlaybackRate mPlaybackRate; 100472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVirtualizer mVirtualizer; 100572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVisualization mVisualization; 100672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMidiPlayer; 100772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten 1008e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten/*typedef*/ struct COutputMix_struct { 1009773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 101072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 1011510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_OutputMix 11 // see MPH_to_OutputMix in MPH_to.c for list of interfaces 1012510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_OutputMix - INTERFACES_Default]; 101372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 101472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IOutputMix mOutputMix; 1015773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 101672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IOutputMixExt mOutputMixExt; 1017773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 101872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 101972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEqualizer mEqualizer; 102072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPresetReverb mPresetReverb; 102172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVirtualizer mVirtualizer; 102272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVolume mVolume; 1023773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 102472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBassBoost mBassBoost; 102572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVisualization mVisualization; 1026e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten} /*COutputMix*/; 1027773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 102872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 1029773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 103072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 1031510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_VibraDevice 3 // see MPH_to_VibraDevice in MPH_to.c for list of interfaces 1032510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_VibraDevice - INTERFACES_Default]; 103372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 103472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVibra mVibra; 1035773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // 1036773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mDeviceID; 103772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CVibraDevice; 1038a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 103961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstruct MPH_init { 104061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten // unsigned char mMPH; 104161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten VoidHook mInit; 1042510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten VoidHook mResume; 104361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten VoidHook mDeinit; 104461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}; 104561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 104661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenextern /*static*/ int IID_to_MPH(const SLInterfaceID iid); 104761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenextern /*static*/ const struct MPH_init MPH_init_table[MPH_MAX]; 1048979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern SLresult checkInterfaces(const ClassTable *class__, 1049979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds, 1050979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten const SLboolean *pInterfaceRequired, unsigned *pExposedMask); 1051979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern IObject *construct(const ClassTable *class__, 1052979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten unsigned exposedMask, SLEngineItf engine); 1053979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern const ClassTable *objectIDtoClass(SLuint32 objectID); 1054979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern const struct SLInterfaceID_ SL_IID_array[MPH_MAX]; 1055b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kastenextern SLuint32 IObjectToObjectID(IObject *object); 1056b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten 1057d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Map an interface to it's "object ID" (which is really a class ID). 1058d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis. 1059d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// If you have an IObject, then use IObjectToObjectID directly. 1060b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten 1061b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten#define InterfaceToObjectID(this) IObjectToObjectID((this)->mThis) 1062daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten 1063d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Map an interface to it's corresponding IObject. 1064d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis. 1065d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// If you have an IObject, then you're done -- you already have what you need. 1066d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten 1067d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define InterfaceToIObject(this) ((this)->mThis) 1068d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten 10691fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi#define InterfaceToCAudioPlayer(this) (((CAudioPlayer*)InterfaceToIObject(this))) 10701fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi 10713af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#define InterfaceToCAudioRecorder(this) (((CAudioRecorder*)InterfaceToIObject(this))) 10723af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi 1073ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID 1074d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivi#include "android_AudioPlayer.h" 1075daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#endif 1076daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten 1077e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastenextern SLresult checkDataSource(const SLDataSource *pDataSrc, 10783af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi DataLocatorFormat *myDataSourceLocator); 1079daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenextern SLresult checkDataSink(const SLDataSink *pDataSink, DataLocatorFormat *myDataSinkLocator); 10803c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Triviextern SLresult checkSourceFormatVsInterfacesCompatibility( 10813c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi const DataLocatorFormat *pDataLocatorFormat, 10823c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds, 10833c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi const SLboolean *pInterfaceRequired); 1084daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenextern void freeDataLocatorFormat(DataLocatorFormat *dlf); 10853af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi 10863a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenextern SLresult CAudioPlayer_Realize(void *self, SLboolean async); 10873a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenextern void CAudioPlayer_Destroy(void *self); 10883af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi 10893af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Triviextern SLresult CAudioRecorder_Realize(void *self, SLboolean async); 10903af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Triviextern SLresult CAudioRecorder_Resume(void *self, SLboolean async); 10913af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Triviextern void CAudioRecorder_Destroy(void *self); 10923af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi 1093d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern SLresult CEngine_Realize(void *self, SLboolean async); 1094d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern void CEngine_Destroy(void *self); 10953af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi 109600d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#ifdef USE_SDL 109700d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kastenextern void SDL_start(IEngine *thisEngine); 109800d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#endif 1099510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_REALIZING_1 ((SLuint32) 0x4) // async realize on work queue 1100510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_REALIZING_2 ((SLuint32) 0x5) // sync realize, or async realize hook 1101510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_RESUMING_1 ((SLuint32) 0x6) // async resume on work queue 1102510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_RESUMING_2 ((SLuint32) 0x7) // sync resume, or async resume hook 1103510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_SUSPENDING ((SLuint32) 0x8) // suspend in progress 1104510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_REALIZING_1A ((SLuint32) 0x9) // abort while async realize on work queue 1105510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_RESUMING_1A ((SLuint32) 0xA) // abort while async resume on work queue 1106d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern void *sync_start(void *arg); 1107d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern SLresult err_to_result(int err); 11087245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten 11097245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten#ifdef __GNUC__ 1110d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define ctz __builtin_ctz 11117245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten#else 11127245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kastenextern unsigned ctz(unsigned); 11137245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten#endif 111440d1c40832a448e23d0bb37512aee53222575c2eGlenn Kastenextern const char * const interface_names[MPH_MAX]; 1115e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#include "platform.h" 1116e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten 1117e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten// Attributes 1118e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten 11193c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#define ATTR_NONE ((unsigned) 0x0) // none 11203c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#define ATTR_GAIN ((unsigned) 0x1 << 0) // player volume, channel mute, channel solo, 11213c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi // player stereo position, player mute 11223c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#define ATTR_TRANSPORT ((unsigned) 0x1 << 1) // play state, looping 11233c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#define ATTR_POSITION ((unsigned) 0x1 << 2) // requested position (a.k.a. seek position) 11244b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#define ATTR_ENQUEUE ((unsigned) 0x1 << 3) // buffer queue became non-empty while in playing state, (NTF rename) 1125a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten 1126a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten#define SL_DATALOCATOR_NULL 0 // application specified a NULL value for pLocator 1127a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten#define SL_DATAFORMAT_NULL 0 // application specified a NULL or undefined value for pFormat 1128ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 11297a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten// Trace debugging 11307a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten 11317a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#ifndef USE_TRACE 11327a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten 1133486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_ENTER_GLOBAL SLresult result; 1134486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_LEAVE_GLOBAL return result; 1135486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_ENTER_INTERFACE SLresult result; 1136486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_LEAVE_INTERFACE return result; 1137486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_ENTER_INTERFACE_VOID 1138486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_LEAVE_INTERFACE_VOID return; 11397a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten 1140ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#else 11417a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten 1142ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenextern void slEnterGlobal(const char *function); 1143ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenextern void slLeaveGlobal(const char *function, SLresult result); 1144ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenextern void slEnterInterface(const char *function); 1145ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenextern void slLeaveInterface(const char *function, SLresult result); 1146ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenextern void slEnterInterfaceVoid(const char *function); 1147ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenextern void slLeaveInterfaceVoid(const char *function); 1148486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_ENTER_GLOBAL SLresult result; slEnterGlobal(__FUNCTION__); 1149486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_LEAVE_GLOBAL slLeaveGlobal(__FUNCTION__, result); return result; 1150486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_ENTER_INTERFACE SLresult result; slEnterInterface(__FUNCTION__); 1151486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_LEAVE_INTERFACE slLeaveInterface(__FUNCTION__, result); return result; 1152486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_ENTER_INTERFACE_VOID slEnterInterfaceVoid(__FUNCTION__); 1153486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_LEAVE_INTERFACE_VOID slLeaveInterfaceVoid(__FUNCTION__); return; 11547a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten 1155ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#endif 11560b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten 11574b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#define SL_LOGE(...) do { fprintf(stderr, "ERROR: %s:%s:%d ", __FILE__, __FUNCTION__, __LINE__); \ 11584b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten fprintf(stderr, __VA_ARGS__); fputc('\n', stderr); } while(0) 11594b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten// #define SL_LOGV 11604b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#define SL_LOGV(...) do { fprintf(stderr, "VERBOSE: %s:%s:%d ", __FILE__, __FUNCTION__, __LINE__); \ 11614b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten fprintf(stderr, __VA_ARGS__); fputc('\n', stderr); } while(0) 11624b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 11634b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#ifdef USE_OUTPUTMIXEXT 11644b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 11654b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#define SL_PLAYSTATE_STOPPING ((SLuint32) 0x4) // Play::Stop while PLAYING 11664b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten// If we needed it, could have PLAYING mean mixer is currently reading from front buffer, 11674b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten// while PLAYABLE would mean application requested PLAYING, but buffer queue is empty 11684b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 11694b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#endif 11704b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 11714b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#ifdef USE_SNDFILE 11724b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kastenextern void audioPlayerTransportUpdate(CAudioPlayer *audioPlayer); 11734b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#endif 11744b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#ifdef ANDROID 11754b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kastenextern SLresult android_audioPlayerClear(CAudioPlayer *pAudioPlayer); 11760b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten#endif 1177