sles_allinclusive.h revision 8e564b93da69313ffddcd1f457d0549b7dedaa76
1193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi/* 2193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project 3193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * 4193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 5193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * you may not use this file except in compliance with the License. 6193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * You may obtain a copy of the License at 7193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * 8193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 9193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * 10193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 11193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 12193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * See the License for the specific language governing permissions and 14193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * limitations under the License. 15193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi */ 16193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 1710ee2bc6119445f4339ecef998c40c9cc95057cdGlenn Kasten/** \file sles_allinclusive.h Everything including the kitchen sink */ 1810ee2bc6119445f4339ecef998c40c9cc95057cdGlenn Kasten 192dc537a086811c9a97e1f925ace16be7d0b0fcb4Glenn Kasten#include "SLES/OpenSLES.h" 20193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <stddef.h> // offsetof 21193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <stdlib.h> // malloc 22193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <string.h> // memcmp 23193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <stdio.h> // debugging 24193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <assert.h> // debugging 25193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <pthread.h> 26d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten#include <unistd.h> // usleep 27437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten#include <errno.h> 28193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 299c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten#ifndef __cplusplus 309c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kastentypedef int bool; 319c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten#ifndef false 329c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten#define false 0 339c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten#endif 349c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten#ifndef true 359c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten#define true 1 369c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten#endif 379c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten#endif 389c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten 39193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "MPH.h" 40193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "MPH_to.h" 4182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten#include "devices.h" 42793ddb6dae36d6b5abf5a75f8f51b4182c5646d1Glenn Kasten#include "OpenSLESUT.h" 43437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten#include "ThreadPool.h" 44193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 454c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kastentypedef struct CAudioPlayer_struct CAudioPlayer; 46bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivitypedef struct CAudioRecorder_struct CAudioRecorder; 47ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kastentypedef struct C3DGroup_struct C3DGroup; 4815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kastentypedef struct COutputMix_struct COutputMix; 494c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten 50193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_SNDFILE 51193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <sndfile.h> 52aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten#include "SLSndFile.h" 53193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif // USE_SNDFILE 54193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 55193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_SDL 56193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <SDL/SDL_audio.h> 57193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif // USE_SDL 58193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 599db8335361c67c4ed877f68218835df96ce43a4bJean-Michel Trivi#ifdef ANDROID 60f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten#include <utils/Log.h> 612dc537a086811c9a97e1f925ace16be7d0b0fcb4Glenn Kasten#include "SLES/OpenSLES_Android.h" 62193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "media/AudioSystem.h" 63bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#include "media/mediarecorder.h" 64bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#include "media/AudioRecord.h" 65193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "media/AudioTrack.h" 66193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "media/mediaplayer.h" 67ff9f51f17b6c00beaa51698e22873a979c7b3ff6Glenn Kasten#ifndef USE_BACKPORT 681f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi#include "media/AudioEffect.h" 691f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi#include "media/EffectApi.h" 701f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi#include "media/EffectEqualizerApi.h" 71339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#include "media/EffectBassBoostApi.h" 728e564b93da69313ffddcd1f457d0549b7dedaa76Jean-Michel Trivi#include "media/EffectVirtualizerApi.h" 73ff9f51f17b6c00beaa51698e22873a979c7b3ff6Glenn Kasten#endif 740263d22efc4ad9420b367ec61b5a1d1ec72cebb9Jean-Michel Trivi#include <utils/String8.h> 758a307c7272108766eebabc7fa7044d7510d65f77Jean-Michel Trivi#define ANDROID_SL_MILLIBEL_MAX 0 76f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten#include <binder/ProcessState.h> 77ac4f9bf82c3321d2436485a3d4d0d490079872c6Jean-Michel Trivi#include "android_sles_conversions.h" 78ff9f51f17b6c00beaa51698e22873a979c7b3ff6Glenn Kasten#ifndef USE_BACKPORT 795d9e8432d0217fe139987703b8e1f129296171ffJean-Michel Trivi#include "android_SfPlayer.h" 801f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi#include "android_Effect.h" 81ff9f51f17b6c00beaa51698e22873a979c7b3ff6Glenn Kasten#endif 82bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#include "android_AudioRecorder.h" 83193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 84193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 8515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#define STEREO_CHANNELS 2 8615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten 87193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 88193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "OutputMixExt.h" 89193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 90193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 91193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// Hook functions 92193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 93193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivitypedef void (*VoidHook)(void *self); 94193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivitypedef SLresult (*StatusHook)(void *self); 958a47ad52488855f50b95da649744dde3a254698bJean-Michel Trivitypedef SLresult (*AsyncHook)(void *self, SLboolean async); 964cf440cd9f6106db00571345af7aa02529c9a10aJean-Michel Trivi 97193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// Describes how an interface is related to a given class 98193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 99193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_IMPLICIT 0 100193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_EXPLICIT 1 10104bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_DYNAMIC 2 10204bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_UNAVAILABLE 3 10304bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten// note that INTERFACE_OPTIONAL is always re-mapped to one of the above 10404bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten 10504bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten// Profile-specific interfaces 10604bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten 10704bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#ifdef USE_BASE 10804bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_IMPLICIT_BASE INTERFACE_IMPLICIT 10904bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_EXPLICIT_BASE INTERFACE_EXPLICIT 11004bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#else 11104bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_IMPLICIT_BASE INTERFACE_UNAVAILABLE 11204bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_EXPLICIT_BASE INTERFACE_UNAVAILABLE 11304bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#endif 11404bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten 11504bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#ifdef USE_GAME 11604bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_DYNAMIC_GAME INTERFACE_DYNAMIC 11704bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_EXPLICIT_GAME INTERFACE_EXPLICIT 11804bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#else 11904bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_DYNAMIC_GAME INTERFACE_OPTIONAL 12004bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_EXPLICIT_GAME INTERFACE_OPTIONAL 12104bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#endif 12204bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten 12304bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#ifdef USE_MUSIC 12404bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_DYNAMIC_MUSIC INTERFACE_DYNAMIC 12504bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#else 12604bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_DYNAMIC_MUSIC INTERFACE_OPTIONAL 12704bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#endif 12804bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten 12904bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#if defined(USE_GAME) || defined(USE_MUSIC) 13004bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_DYNAMIC_GAME_MUSIC INTERFACE_DYNAMIC 13104bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_EXPLICIT_GAME_MUSIC INTERFACE_EXPLICIT 13204bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#else 13304bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_DYNAMIC_GAME_MUSIC INTERFACE_OPTIONAL 13404bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_EXPLICIT_GAME_MUSIC INTERFACE_OPTIONAL 13504bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#endif 13604bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten 13704bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#if defined(USE_GAME) || defined(USE_PHONE) 13804bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_EXPLICIT_GAME_PHONE INTERFACE_EXPLICIT 13904bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#else 14004bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_EXPLICIT_GAME_PHONE INTERFACE_OPTIONAL 14104bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#endif 14204bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten 14304bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#ifdef USE_OPTIONAL 14404bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_OPTIONAL INTERFACE_EXPLICIT 14504bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_DYNAMIC_OPTIONAL INTERFACE_DYNAMIC 146f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten#else 14704bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_OPTIONAL INTERFACE_UNAVAILABLE 14804bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_DYNAMIC_OPTIONAL INTERFACE_UNAVAILABLE 149f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten#endif 150f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten 151bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten// Describes how an interface is related to a given object 152bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten 15310ee2bc6119445f4339ecef998c40c9cc95057cdGlenn Kasten#define INTERFACE_UNINITIALIZED 1 ///< /not requested at object creation time 15410ee2bc6119445f4339ecef998c40c9cc95057cdGlenn Kasten#define INTERFACE_EXPOSED 2 ///< /requested at object creation time 15510ee2bc6119445f4339ecef998c40c9cc95057cdGlenn Kasten#define INTERFACE_ADDING_1 3 ///< /part 1 of asynchronous AddInterface, pending 15610ee2bc6119445f4339ecef998c40c9cc95057cdGlenn Kasten#define INTERFACE_ADDING_2 4 ///< /synchronous AddInterface, or part 2 of asynchronous 15710ee2bc6119445f4339ecef998c40c9cc95057cdGlenn Kasten#define INTERFACE_ADDED 5 ///< /AddInterface has completed 15810ee2bc6119445f4339ecef998c40c9cc95057cdGlenn Kasten#define INTERFACE_REMOVING 6 ///< /unlocked phase of (synchronous) RemoveInterface 15910ee2bc6119445f4339ecef998c40c9cc95057cdGlenn Kasten#define INTERFACE_SUSPENDING 7 ///< /suspend in progress 16010ee2bc6119445f4339ecef998c40c9cc95057cdGlenn Kasten#define INTERFACE_SUSPENDED 8 ///< /suspend has completed 16110ee2bc6119445f4339ecef998c40c9cc95057cdGlenn Kasten#define INTERFACE_RESUMING_1 9 ///< /part 1 of asynchronous ResumeInterface, pending 16210ee2bc6119445f4339ecef998c40c9cc95057cdGlenn Kasten#define INTERFACE_RESUMING_2 10 ///< /synchronous ResumeInterface, or part 2 of asynchronous 16310ee2bc6119445f4339ecef998c40c9cc95057cdGlenn Kasten#define INTERFACE_ADDING_1A 11 ///< /part 1 of asynchronous AddInterface, aborted 16410ee2bc6119445f4339ecef998c40c9cc95057cdGlenn Kasten#define INTERFACE_RESUMING_1A 12 ///< /part 1 of asynchronous ResumeInterface, aborted 165bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten 166193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// Maps an interface ID to its offset within the class that exposes it 167193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 168193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivistruct iid_vtable { 169193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi unsigned char mMPH; 170193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi unsigned char mInterface; // relationship 171193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi /*size_t*/ unsigned short mOffset; 172193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi}; 173193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 174193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// Per-class const data shared by all instances of the same class 175193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 176903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 177193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct iid_vtable *mInterfaces; 178bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint32 mInterfaceCount; // number of possible interfaces 179193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const signed char *mMPH_to_index; 180ee35e132113602e20012829377d16f0572c61195Glenn Kasten const char * const mName; 181193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi size_t mSize; 182193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mObjectID; 183bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten // hooks 1848a47ad52488855f50b95da649744dde3a254698bJean-Michel Trivi AsyncHook mRealize; 185bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten AsyncHook mResume; 186193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi VoidHook mDestroy; 187903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} ClassTable; 188193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 189193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// BufferHeader describes each element of a BufferQueue, other than the data 190193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 191437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastentypedef struct { 192193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const void *mBuffer; 193193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mSize; 194437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten} BufferHeader; 195193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 196193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 197193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 198193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// stereo is a frame consisting of a pair of 16-bit PCM samples 199193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 200193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivitypedef struct { 201193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi short left; 202193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi short right; 203193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi} stereo; 204193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 205193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 206193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 207aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten#ifdef __cplusplus 208aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten#define this this_ 209aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten#endif 210aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten 211193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_SNDFILE 212193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 213ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten#define SndFile_BUFSIZE 512 // in 16-bit samples 214ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten#define SndFile_NUMBUFS 2 215ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten 216193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivistruct SndFile { 217193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // save URI also? 218193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLchar *mPathname; 219193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SNDFILE *mSNDFILE; 22023c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten SF_INFO mSfInfo; 22115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten pthread_mutex_t mMutex; // protects mSNDFILE only 22215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLboolean mEOF; // sf_read returned zero sample frames 223193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // These are used when Enqueue returns SL_RESULT_BUFFER_INSUFFICIENT 224193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const void *mRetryBuffer; 225193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mRetrySize; 226ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten SLuint32 mWhich; // which buffer to use next 227ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten short mBuffer[SndFile_BUFSIZE * SndFile_NUMBUFS]; 228193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi}; 229193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 230193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif // USE_SNDFILE 231193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 2324c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten/* Our own merged version of SLDataSource and SLDataSink */ 2334c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten 2344c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kastentypedef union { 2354c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLuint32 mLocatorType; 2364c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataLocator_Address mAddress; 2374c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataLocator_BufferQueue mBufferQueue; 2384c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataLocator_IODevice mIODevice; 2394c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataLocator_MIDIBufferQueue mMIDIBufferQueue; 2404c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataLocator_OutputMix mOutputMix; 2414c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataLocator_URI mURI; 242c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#ifdef ANDROID 243c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLDataLocator_AndroidFD mFD; 244c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#endif 2454c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten} DataLocator; 2464c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten 2474c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kastentypedef union { 2484c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLuint32 mFormatType; 2494c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataFormat_PCM mPCM; 2504c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataFormat_MIME mMIME; 2514c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten} DataFormat; 2524c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten 2534c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kastentypedef struct { 2544c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten union { 2554c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataSource mSource; 2564c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataSink mSink; 2574c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten struct { 2584c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten DataLocator *pLocator; 2594c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten DataFormat *pFormat; 2604c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten } mNeutral; 2614c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten } u; 2624c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten DataLocator mLocator; 2634c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten DataFormat mFormat; 2644c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten} DataLocatorFormat; 2654c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten 266193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi/* Interface structures */ 267193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 268903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct Object_interface { 26915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten const struct SLObjectItf_ *mItf; // const 27032a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten // field mThis would be redundant within an IObject, so we substitute mEngine 27115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten struct Engine_interface *mEngine; // const 27215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten const ClassTable *mClass; // const 27315f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLuint32 mInstanceID; // const for debugger and for RPC 274903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten slObjectCallback mCallback; 275903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten void *mContext; 2769c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten unsigned mGottenMask; ///< bit-mask of interfaces exposed or added, then gotten 277903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten unsigned mLossOfControlMask; // interfaces with loss of control enabled 27815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten unsigned mAttributesMask; // attributes which have changed since last sync 27904bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#ifdef USE_BASE 280903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten SLint32 mPriority; 281f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten#endif 282903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten pthread_mutex_t mMutex; 2833190a0da044e122c1c617e30d1d364701fb27110Glenn Kasten#ifdef USE_DEBUG 2843190a0da044e122c1c617e30d1d364701fb27110Glenn Kasten pthread_t mOwner; 2853190a0da044e122c1c617e30d1d364701fb27110Glenn Kasten const char *mFile; 2863190a0da044e122c1c617e30d1d364701fb27110Glenn Kasten int mLine; 2873190a0da044e122c1c617e30d1d364701fb27110Glenn Kasten#endif 288903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten pthread_cond_t mCond; 289bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mState; // really SLuint32, but SLuint8 to save space 29004bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#ifdef USE_BASE 291bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mPreemptable; // really SLboolean, but SLuint8 to save space 292f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten#else 293f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten SLuint8 mPadding; 294f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten#endif 295bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten // for best alignment, do not add any fields here 296bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_Default 2 297bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates[INTERFACES_Default]; // state of each of interface 29815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten // do not add any fields here 299903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IObject; 300903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten 30182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten#include "locks.h" 30282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 303903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 304903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten const struct SL3DCommitItf_ *mItf; 305903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 306193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mDeferred; 307d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten SLuint32 mGeneration; // incremented each master clock cycle 308c37c934e00a96afe18aaadd9f9a1863c721bf8eaGlenn Kasten SLuint32 mWaiting; // number of threads waiting in Commit 309903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DCommit; 310193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 311d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kastenenum CartesianSphericalActive { 312d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten CARTESIAN_COMPUTED_SPHERICAL_SET, 313d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten CARTESIAN_REQUESTED_SPHERICAL_SET, 314d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten CARTESIAN_UNKNOWN_SPHERICAL_SET, 315d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten CARTESIAN_SET_SPHERICAL_COMPUTED, // not in 1.0.1 316d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten CARTESIAN_SET_SPHERICAL_REQUESTED, // not in 1.0.1 317d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten CARTESIAN_SET_SPHERICAL_UNKNOWN 318d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten}; 319d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten 320903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 321193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SL3DDopplerItf_ *mItf; 322903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 323d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // The API allows client to specify either Cartesian and spherical velocities. 324d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // But an implementation will likely prefer one or the other. So for 325d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // maximum portablity, we maintain both units and an indication of which 326d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // unit was set most recently. In addition, we keep a flag saying whether 327d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // the other unit has been derived yet. It can take significant time 328d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // to compute the other unit, so this may be deferred to another thread. 329d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // For this reason we also keep an indication of whether the secondary 330d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // has been computed yet, and its accuracy. 331d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // Though only one unit is primary at a time, a union is inappropriate: 332d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // the application might read in both units (not in 1.0.1), 333d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // and due to multi-threading concerns. 334d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mVelocityCartesian; 335d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten struct { 336d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten SLmillidegree mAzimuth; 337d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten SLmillidegree mElevation; 338d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten SLmillidegree mSpeed; 339d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten } mVelocitySpherical; 340d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten enum CartesianSphericalActive mVelocityActive; 341193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mDopplerFactor; 342903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DDoppler; 343193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 344903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 345193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SL3DGroupingItf_ *mItf; 346903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 347ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten C3DGroup *mGroup; // link to associated group or NULL 348903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DGrouping; 349193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 350d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kastenenum AnglesVectorsActive { 351d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten ANGLES_COMPUTED_VECTORS_SET, // not in 1.0.1 352d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten ANGLES_REQUESTED_VECTORS_SET, // not in 1.0.1 353d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten ANGLES_UNKNOWN_VECTORS_SET, 354d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten ANGLES_SET_VECTORS_COMPUTED, 355d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten ANGLES_SET_VECTORS_REQUESTED, 356d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten ANGLES_SET_VECTORS_UNKNOWN 357d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten}; 358d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten 359903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 360193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SL3DLocationItf_ *mItf; 361903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 362d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mLocationCartesian; 363d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten struct { 364d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mAzimuth; 365d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mElevation; 366d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillimeter mDistance; 367d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten } mLocationSpherical; 368d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten enum CartesianSphericalActive mLocationActive; 369d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten struct { 370d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mHeading; 371d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mPitch; 372d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mRoll; 373d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten } mOrientationAngles; 374d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten struct { 375d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mFront; 376d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mAbove; 377d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mUp; 378d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten } mOrientationVectors; 379d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten enum AnglesVectorsActive mOrientationActive; 380d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // Rotations can be slow, so are deferred. 381d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mTheta; 382d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mAxis; 383d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLboolean mRotatePending; 384903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DLocation; 385193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 386903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 387193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SL3DMacroscopicItf_ *mItf; 388903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 389193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi struct { 390193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mWidth; 391193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mHeight; 392193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mDepth; 393193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi } mSize; 394193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi struct { 395193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mHeading; 396193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mPitch; 397193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mRoll; 398193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi } mOrientationAngles; 399193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi struct { 400193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLVec3D mFront; 401f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten SLVec3D mAbove; 402193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLVec3D mUp; 403193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi } mOrientationVectors; 404d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten enum AnglesVectorsActive mOrientationActive; 405d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // Rotations can be slow, so are deferred. 406d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mTheta; 407d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mAxis; 408d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLboolean mRotatePending; 409903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DMacroscopic; 410193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 411903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 412193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SL3DSourceItf_ *mItf; 413903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 414193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mHeadRelative; 415193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mRolloffMaxDistanceMute; 416193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mMaxDistance; 417193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mMinDistance; 418d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mConeInnerAngle; 419d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mConeOuterAngle; 420193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillibel mConeOuterLevel; 421193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mRolloffFactor; 422193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mRoomRolloffFactor; 423193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint8 mDistanceModel; 424903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DSource; 425193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 426903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 427193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLAudioDecoderCapabilitiesItf_ *mItf; 428903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 429903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IAudioDecoderCapabilities; 430193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 431903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 432193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLAudioEncoderItf_ *mItf; 433903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 434193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLAudioEncoderSettings mSettings; 435903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IAudioEncoder; 436193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 437903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 438193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLAudioEncoderCapabilitiesItf_ *mItf; 439903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 440903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IAudioEncoderCapabilities; 441193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 442903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 443193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLAudioIODeviceCapabilitiesItf_ *mItf; 444903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 445d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten slAvailableAudioInputsChangedCallback mAvailableAudioInputsChangedCallback; 446d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten void *mAvailableAudioInputsChangedContext; 447d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten slAvailableAudioOutputsChangedCallback mAvailableAudioOutputsChangedCallback; 448d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten void *mAvailableAudioOutputsChangedContext; 449d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten slDefaultDeviceIDMapChangedCallback mDefaultDeviceIDMapChangedCallback; 450d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten void *mDefaultDeviceIDMapChangedContext; 451903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IAudioIODeviceCapabilities; 452193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 453903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 454193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLBassBoostItf_ *mItf; 455903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 456193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mEnabled; 457193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mStrength; 458339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT) 459339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi effect_descriptor_t mBassBoostDescriptor; 460339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi android::sp<android::AudioEffect> mBassBoostEffect; 461339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#endif 462903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IBassBoost; 463193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 464903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct BufferQueue_interface { 465193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLBufferQueueItf_ *mItf; 466903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 46709f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten SLBufferQueueState mState; 468193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slBufferQueueCallback mCallback; 469193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mContext; 47023c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten // originally SLuint32, but range-checked down to SLuint16 47123c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten SLuint16 mNumBuffers; 47223c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten /*SLboolean*/ SLuint16 mClearRequested; 473437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten BufferHeader *mArray; 474437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten BufferHeader *mFront, *mRear; 47523c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten#ifdef ANDROID 47615005fc0b676f8b4091528b8a9eb2705dd3820c2Jean-Michel Trivi SLuint32 mSizeConsumed; 47723c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten#endif 478193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // saves a malloc in the typical case 479193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define BUFFER_HEADER_TYPICAL 4 480437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten BufferHeader mTypical[BUFFER_HEADER_TYPICAL+1]; 481903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IBufferQueue; 482193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 4837e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten#define MAX_DEVICE 2 4847e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten 485903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 486193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLDeviceVolumeItf_ *mItf; 487903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 488f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten SLint32 mVolume[MAX_DEVICE]; 489903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IDeviceVolume; 490193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 491903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 492193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLDynamicInterfaceManagementItf_ *mItf; 493903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 494193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slDynamicInterfaceManagementCallback mCallback; 495193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mContext; 496903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IDynamicInterfaceManagement; 497193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 498903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 499193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLDynamicSourceItf_ *mItf; 500903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 501193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLDataSource *mDataSource; 502903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IDynamicSource; 503193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 504193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// private 505193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 506193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivistruct EnableLevel { 507193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mEnable; 508193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillibel mSendLevel; 509193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi}; 510193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 511bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten// indexes into IEffectSend.mEnableLevels 512bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten 513bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define AUX_ENVIRONMENTALREVERB 0 514bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define AUX_PRESETREVERB 1 515bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define AUX_MAX 2 516bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten 517903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 518193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLEffectSendItf_ *mItf; 519903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 52015f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLmillibel mDirectLevel; // dry volume 52115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten struct EnableLevel mEnableLevels[AUX_MAX]; // wet enable and volume per effect type 522903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEffectSend; 523903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten 524d55d250a016c1400cc00b5e1ac5baaa095702585Glenn Kastentypedef struct Engine_interface { 525193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLEngineItf_ *mItf; 526903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 527193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mLossOfControlGlobal; 52899cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kasten#ifdef USE_SDL 52915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten COutputMix *mOutputMix; // SDL pulls PCM from an arbitrary IOutputMixExt 53099cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kasten#endif 531193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // Each engine is its own universe. 532903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten SLuint32 mInstanceCount; 53332a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten unsigned mInstanceMask; // 1 bit per active object 53415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten unsigned mChangedMask; // objects which have changed since last sync 53532a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten#define MAX_INSTANCE 32 // see mInstanceMask 53632a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten IObject *mInstances[MAX_INSTANCE]; 537437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten SLboolean mShutdown; 53815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLboolean mShutdownAck; 53915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten pthread_cond_t mShutdownCond; 540437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten ThreadPool mThreadPool; // for asynchronous operations 541ff9f51f17b6c00beaa51698e22873a979c7b3ff6Glenn Kasten#if defined(ANDROID) && !defined(USE_BACKPORT) 5421f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi SLuint32 mEqNumPresets; 5431f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi char** mEqPresetNames; 5441f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi#endif 545903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEngine; 546193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 547903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 548193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLEngineCapabilitiesItf_ *mItf; 549903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 550193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mThreadSafe; 5517e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten // const 5527e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten SLuint32 mMaxIndexLED; 5537e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten SLuint32 mMaxIndexVibra; 554903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEngineCapabilities; 555193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 556903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 557193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLEnvironmentalReverbItf_ *mItf; 558903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 559193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLEnvironmentalReverbSettings mProperties; 560903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEnvironmentalReverb; 561193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 562193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivistruct EqualizerBand { 563193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmilliHertz mMin; 564193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmilliHertz mCenter; 5654c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten SLmilliHertz mMax; 566193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi}; 567193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 568ff9f51f17b6c00beaa51698e22873a979c7b3ff6Glenn Kasten#if defined(ANDROID) && !defined(USE_BACKPORT) 5691f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi#define MAX_EQ_BANDS 0 5701f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi#else 57109f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten#define MAX_EQ_BANDS 4 // compile-time limit, runtime limit may be smaller 5721f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi#endif 57309f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten 574903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 575193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLEqualizerItf_ *mItf; 576903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 577193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mEnabled; 578193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mPreset; 57909f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten SLmillibel mLevels[MAX_EQ_BANDS]; 58009f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten // const to end of struct 581193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mNumPresets; 582193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mNumBands; 5834c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten const struct EqualizerBand *mBands; 58409f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten const struct EqualizerPreset *mPresets; 5854c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten SLmillibel mBandLevelRangeMin; 5864c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten SLmillibel mBandLevelRangeMax; 587ff9f51f17b6c00beaa51698e22873a979c7b3ff6Glenn Kasten#if defined(ANDROID) && !defined(USE_BACKPORT) 5881f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi effect_descriptor_t mEqDescriptor; 5891f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi android::sp<android::AudioEffect> mEqEffect; 5901f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi#endif 591903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEqualizer; 592193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 59309f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten#define MAX_LED_COUNT 32 59409f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten 595903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 596193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLLEDArrayItf_ *mItf; 597903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 598193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mLightMask; 59909f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten SLHSL mColors[MAX_LED_COUNT]; 600193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // const 601193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint8 mCount; 602903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} ILEDArray; 603193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 604903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 605193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMetadataExtractionItf_ *mItf; 606903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 607193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mKeySize; 608193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const void *mKey; 609193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mKeyEncoding; 610193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const SLchar *mValueLangCountry; 611193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mValueEncoding; 612193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint8 mFilterMask; 613ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten int mKeyFilter; 614903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMetadataExtraction; 615193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 616903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 617193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMetadataTraversalItf_ *mItf; 618903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 619193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mIndex; 620193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mMode; 621193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mCount; 622193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mSize; 623903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMetadataTraversal; 624193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 625903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 626193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMIDIMessageItf_ *mItf; 627903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 628193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slMetaEventCallback mMetaEventCallback; 629193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mMetaEventContext; 630193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slMIDIMessageCallback mMessageCallback; 631193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mMessageContext; 6324c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten SLuint8 mMessageTypes; 633903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMIDIMessage; 634193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 635903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 636193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMIDIMuteSoloItf_ *mItf; 637903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 638193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mChannelMuteMask; 639193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mChannelSoloMask; 640193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mTrackMuteMask; 641193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mTrackSoloMask; 642437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten // const 643193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mTrackCount; 644903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMIDIMuteSolo; 645193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 646903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 647193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMIDITempoItf_ *mItf; 648903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 649193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mTicksPerQuarterNote; 650193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mMicrosecondsPerQuarterNote; 651903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMIDITempo; 652193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 653903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 654193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMIDITimeItf_ *mItf; 655903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 656193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mDuration; 657193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mPosition; 658193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mStartTick; 659193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mNumTicks; 660903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMIDITime; 661193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 662903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 663193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMuteSoloItf_ *mItf; 664903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 6659c2a7b1e9f8203bf9de26efca0f1f805038b1f2bGlenn Kasten // fields that were formerly here are now at CAudioPlayer 666903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMuteSolo; 667193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 66832a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten#define MAX_TRACK 32 // see mActiveMask 66932a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten 670903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 671193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLOutputMixItf_ *mItf; 672903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 673d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten slMixDeviceChangeCallback mCallback; 674d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten void *mContext; 675193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 676193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi unsigned mActiveMask; // 1 bit per active track 67710ee2bc6119445f4339ecef998c40c9cc95057cdGlenn Kasten Track mTracks[MAX_TRACK]; 678193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 679903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IOutputMix; 680193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 681193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 682903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 683193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLOutputMixExtItf_ *mItf; 684903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 685903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IOutputMixExt; 686193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 687193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 688903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 689193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLPitchItf_ *mItf; 690903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 691193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mPitch; 692193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // const 693193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mMinPitch; 694193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mMaxPitch; 695903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPitch; 696193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 697903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct Play_interface { 698193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLPlayItf_ *mItf; 699903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 70009f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten SLuint32 mState; 70115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten // next 2 fields are read-only to application 702193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mDuration; 703193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mPosition; 704193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slPlayCallback mCallback; 705193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mContext; 706193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mEventFlags; 70715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten // the ISeek trick of using a distinct value doesn't work here because it's readable by app 708193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mMarkerPosition; 70915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLboolean mMarkerIsSet; 710193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mPositionUpdatePeriod; 711903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPlay; 712193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 713903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 714193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLPlaybackRateItf_ *mItf; 715903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 716193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mRate; 717193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mProperties; 7184c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten // const 719193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mMinRate; 720193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mMaxRate; 721193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mStepSize; 722193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mCapabilities; 723903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPlaybackRate; 724193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 725903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 726193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLPrefetchStatusItf_ *mItf; 727903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 728193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mStatus; 729193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mLevel; 730193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slPrefetchCallback mCallback; 731193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mContext; 732193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mCallbackEventsMask; 733193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mFillUpdatePeriod; 734903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPrefetchStatus; 735193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 736903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 737193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLPresetReverbItf_ *mItf; 738903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 739193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mPreset; 740903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPresetReverb; 741193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 742903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 743193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLRatePitchItf_ *mItf; 744903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 745193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mRate; 7464c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten // const 747193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mMinRate; 748193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mMaxRate; 749903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IRatePitch; 750193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 751903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 752193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLRecordItf_ *mItf; 753903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 754193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mState; 755193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mDurationLimit; 756193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mPosition; 757193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slRecordCallback mCallback; 758193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mContext; 759193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mCallbackEventsMask; 760193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mMarkerPosition; 761193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mPositionUpdatePeriod; 762903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IRecord; 763193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 764903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 765193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLSeekItf_ *mItf; 766903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 76715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLmillisecond mPos; // mPos != SL_TIME_UNKNOWN means pending seek request 768193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mLoopEnabled; 769193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mStartPos; 770193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mEndPos; 771903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} ISeek; 772193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 773903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 774193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLThreadSyncItf_ *mItf; 775903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 776193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mInCriticalSection; 77715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLuint32 mWaiting; // number of threads waiting 778193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi pthread_t mOwner; 779903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IThreadSync; 780193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 781903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 782193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLVibraItf_ *mItf; 783903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 784193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mVibrate; 785193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmilliHertz mFrequency; 786193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mIntensity; 787903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IVibra; 788193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 789903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 790193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLVirtualizerItf_ *mItf; 791903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 792193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mEnabled; 793193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mStrength; 7948e564b93da69313ffddcd1f457d0549b7dedaa76Jean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT) 7958e564b93da69313ffddcd1f457d0549b7dedaa76Jean-Michel Trivi effect_descriptor_t mVirtualizerDescriptor; 7968e564b93da69313ffddcd1f457d0549b7dedaa76Jean-Michel Trivi android::sp<android::AudioEffect> mVirtualizerEffect; 7978e564b93da69313ffddcd1f457d0549b7dedaa76Jean-Michel Trivi#endif 798903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IVirtualizer; 799193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 800903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 801193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLVisualizationItf_ *mItf; 802903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 803193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slVisualizationCallback mCallback; 804193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mContext; 805193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmilliHertz mRate; 806903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IVisualization; 807193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 80815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kastentypedef struct /*Volume_interface*/ { 809193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLVolumeItf_ *mItf; 810903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 81115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten // Values as specified by the application 812193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillibel mLevel; 813193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mStereoPosition; 814f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten SLuint8 /*SLboolean*/ mMute; 81515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLuint8 /*SLboolean*/ mEnableStereoPosition; 816903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IVolume; 817193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 818193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi/* Class structures */ 819193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 820ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten/*typedef*/ struct C3DGroup_struct { 821903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 822bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_3DGroup 6 // see MPH_to_3DGroup in MPH_to.c for list of interfaces 823bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_3DGroup - INTERFACES_Default]; 824903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 825903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DLocation m3DLocation; 826903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DDoppler m3DDoppler; 827903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DSource m3DSource; 828903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DMacroscopic m3DMacroscopic; 829ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten unsigned mMemberMask; // set of member objects 830ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten} /*C3DGroup*/; 831193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 832b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi#ifdef ANDROID 833ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivitypedef struct { 834ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi const struct SLAndroidStreamTypeItf_ *mItf; 835ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi IObject *mThis; 836ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi SLuint32 mStreamType; 837ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi} IAndroidStreamType; 838ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 839465ecf80ac962d6a59341d99d083fed7525e79afJean-Michel Trivitypedef struct { 840465ecf80ac962d6a59341d99d083fed7525e79afJean-Michel Trivi const struct SLAndroidAudioEffectItf_ *mItf; 841465ecf80ac962d6a59341d99d083fed7525e79afJean-Michel Trivi IObject *mThis; 842465ecf80ac962d6a59341d99d083fed7525e79afJean-Michel Trivi} IAndroidAudioEffect; 843465ecf80ac962d6a59341d99d083fed7525e79afJean-Michel Trivi 844193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi/* 845193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * Used to define the mapping from an OpenSL ES audio player to an Android 846193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * media framework object 847193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi */ 848193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivienum AndroidObject_type { 849f2a9b6c9fc2e5a35fd5dc19e82729eb3f894534aJean-Michel Trivi INVALID_TYPE =-1, 850193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi MEDIAPLAYER = 0, 851193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi AUDIOTRACK_PUSH = 1, 852193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi AUDIOTRACK_PULL = 2, 853193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi NUM_AUDIOPLAYER_MAP_TYPES 854193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi}; 855226ce6a635c4a333a66b8e0ea28316a6d405ee33Jean-Michel Trivi 856b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivienum AndroidObject_state { 857b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi ANDROID_UNINITIALIZED = -1, 858b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi ANDROID_PREPARING, 859b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi ANDROID_PREPARED, 860b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi ANDROID_PREFETCHING, 861b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi ANDROID_READY, 862b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi NUM_ANDROID_STATES 863b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi}; 864ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#endif //ifdef ANDROID 865ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 866193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 8674c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten/*typedef*/ struct CAudioPlayer_struct { 868903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 869ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#ifdef ANDROID 870465ecf80ac962d6a59341d99d083fed7525e79afJean-Michel Trivi#define INTERFACES_AudioPlayer 28 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces 871ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#else 872bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_AudioPlayer 26 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces 873ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#endif 874bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_AudioPlayer - INTERFACES_Default]; 875903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 876903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPlay mPlay; 877903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DDoppler m3DDoppler; 878903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DGrouping m3DGrouping; 879903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DLocation m3DLocation; 880903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DSource m3DSource; 881903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IBufferQueue mBufferQueue; 882903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEffectSend mEffectSend; 883903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMetadataExtraction mMetadataExtraction; 884903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMetadataTraversal mMetadataTraversal; 885903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPrefetchStatus mPrefetchStatus; 886903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IRatePitch mRatePitch; 887903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten ISeek mSeek; 888903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVolume mVolume; 88915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten IMuteSolo mMuteSolo; 890ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#ifdef ANDROID 891ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi IAndroidStreamType mAndroidStreamType; 892465ecf80ac962d6a59341d99d083fed7525e79afJean-Michel Trivi IAndroidAudioEffect mAndroidAudioEffect; 893ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#endif 894193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // optional interfaces 895903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DMacroscopic m3DMacroscopic; 896903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IBassBoost mBassBoost; 897903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicSource mDynamicSource; 898903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 899903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEqualizer mEqualizer; 900903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPitch mPitch; 901903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPresetReverb mPresetReverb; 902903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPlaybackRate mPlaybackRate; 903903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVirtualizer mVirtualizer; 904903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVisualization mVisualization; 905193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // rest of fields are not related to the interfaces 9064c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten DataLocatorFormat mDataSource; 9074c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten DataLocatorFormat mDataSink; 9086aa121077e8981b7d9f46471bdaa1a11211057e8Glenn Kasten COutputMix *mOutputMix; // output mix this audio player is attached to, for effect send 909da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi // cached data for this instance 91015f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLuint8 /*SLboolean*/ mMute; 9119c2a7b1e9f8203bf9de26efca0f1f805038b1f2bGlenn Kasten // Formerly at IMuteSolo 9129c2a7b1e9f8203bf9de26efca0f1f805038b1f2bGlenn Kasten SLuint8 mMuteMask; // Mask for which channels are muted: bit 0=left, 1=right 9139c2a7b1e9f8203bf9de26efca0f1f805038b1f2bGlenn Kasten SLuint8 mSoloMask; // Mask for which channels are soloed: bit 0=left, 1=right 9149c2a7b1e9f8203bf9de26efca0f1f805038b1f2bGlenn Kasten SLuint8 mNumChannels; // 0 means unknown, then const once it is known, range 1 <= x <= 8 9154bdead9570d01cd53a45ad1e0f6f94196d0e6058Jean-Michel Trivi SLuint32 mSampleRateMilliHz;// 0 means unknown, then const once it is known 916da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi // implementation-specific data for this instance 91715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#ifdef USE_OUTPUTMIXEXT 91810ee2bc6119445f4339ecef998c40c9cc95057cdGlenn Kasten Track *mTrack; 91915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#endif 920193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_SNDFILE 921193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi struct SndFile mSndFile; 922193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif // USE_SNDFILE 923b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi#ifdef ANDROID 924060adae7c9af5b1470ca12f44d8f36a27987efcbJean-Michel Trivi android::Mutex *mpLock; 925193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi enum AndroidObject_type mAndroidObjType; 926b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi enum AndroidObject_state mAndroidObjState; 927474bc3d17dc75cbaf3f553d16fe21ef35071ddadJean-Michel Trivi android::AudioTrack *mAudioTrack; 928ff9f51f17b6c00beaa51698e22873a979c7b3ff6Glenn Kasten#ifndef USE_BACKPORT 9295d9e8432d0217fe139987703b8e1f129296171ffJean-Michel Trivi android::sp<android::SfPlayer> mSfPlayer; 9305d9e8432d0217fe139987703b8e1f129296171ffJean-Michel Trivi android::sp<android::ALooper> mRenderLooper; 931ff9f51f17b6c00beaa51698e22873a979c7b3ff6Glenn Kasten#endif 93215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten /** 93315f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten * Amplification (can be attenuation) factor derived for the VolumeLevel 93415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten */ 93515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten float mAmplFromVolLevel; 93615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten /** 93715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten * Left/right amplification (can be attenuations) factors derived for the StereoPosition 93815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten */ 93915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten float mAmplFromStereoPos[STEREO_CHANNELS]; 940193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 9414c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten} /*CAudioPlayer*/; 942193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 943bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi 944bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi/*typedef*/ struct CAudioRecorder_struct { 945193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 946903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 947bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#ifdef ANDROID 948bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#define INTERFACES_AudioRecorder 10 // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces 949bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#else 950bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#define INTERFACES_AudioRecorder 9 // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces 951bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#endif 952bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceContinued[INTERFACES_AudioRecorder - INTERFACES_Default]; 953903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 954903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IRecord mRecord; 955903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IAudioEncoder mAudioEncoder; 956193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // optional interfaces 957903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IBassBoost mBassBoost; 958903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicSource mDynamicSource; 959903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEqualizer mEqualizer; 960903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVisualization mVisualization; 961903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVolume mVolume; 962bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#ifdef ANDROID 963bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi IBufferQueue mBufferQueue; 964bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#endif 965d55d250a016c1400cc00b5e1ac5baaa095702585Glenn Kasten // rest of fields are not related to the interfaces 966d55d250a016c1400cc00b5e1ac5baaa095702585Glenn Kasten DataLocatorFormat mDataSource; 967d55d250a016c1400cc00b5e1ac5baaa095702585Glenn Kasten DataLocatorFormat mDataSink; 968ac4f9bf82c3321d2436485a3d4d0d490079872c6Jean-Michel Trivi // cached data for this instance 969ac4f9bf82c3321d2436485a3d4d0d490079872c6Jean-Michel Trivi SLuint8 mNumChannels; // 0 means unknown, then const once it is known, range 1 <= x <= 8 970ac4f9bf82c3321d2436485a3d4d0d490079872c6Jean-Michel Trivi SLuint32 mSampleRateMilliHz;// 0 means unknown, then const once it is known 971bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi // implementation-specific data for this instance 972bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#ifdef ANDROID 973bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi android::AudioRecord *mAudioRecord; 974bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#endif 975bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi} /*CAudioRecorder*/; 976bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi 977193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 978903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 979193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated implicit interfaces 980903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 981bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_Engine 10 // see MPH_to_Engine in MPH_to.c for list of interfaces 982bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_Engine - INTERFACES_Default]; 983903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 984903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEngine mEngine; 985903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEngineCapabilities mEngineCapabilities; 986903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IThreadSync mThreadSync; 987193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated explicit interfaces 988903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IAudioIODeviceCapabilities mAudioIODeviceCapabilities; 989903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IAudioDecoderCapabilities mAudioDecoderCapabilities; 990903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IAudioEncoderCapabilities mAudioEncoderCapabilities; 991903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DCommit m3DCommit; 992193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // optional interfaces 993903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDeviceVolume mDeviceVolume; 994f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten // rest of fields are not related to the interfaces 995188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kasten pthread_t mSyncThread; 996903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CEngine; 997193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 998903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 999193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 1000903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 1001bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_LEDDevice 3 // see MPH_to_LEDDevice in MPH_to.c for list of interfaces 1002bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_LEDDevice - INTERFACES_Default]; 1003903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 1004903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten ILEDArray mLEDArray; 1005193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mDeviceID; 1006903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CLEDDevice; 1007193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 1008903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 1009193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 1010903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 1011bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_Listener 4 // see MPH_to_Listener in MPH_to.c for list of interfaces 1012bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_Listener - INTERFACES_Default]; 1013903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 1014903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DDoppler m3DDoppler; 1015903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DLocation m3DLocation; 1016903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CListener; 1017193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 1018903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 1019193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 1020903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 102115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#define INTERFACES_MetadataExtractor 5 // see MPH_to_MetadataExtractor in MPH_to.c for list of 102215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten // interfaces 1023bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_MetadataExtractor - INTERFACES_Default]; 1024903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 1025903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicSource mDynamicSource; 1026903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMetadataExtraction mMetadataExtraction; 1027903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMetadataTraversal mMetadataTraversal; 1028903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CMetadataExtractor; 1029193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 1030903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 1031193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 1032903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 1033ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#ifdef ANDROID 1034ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#define INTERFACES_MidiPlayer 30 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces 1035ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#else 1036bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_MidiPlayer 29 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces 1037ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#endif 1038bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_MidiPlayer - INTERFACES_Default]; 1039903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 1040903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPlay mPlay; 1041903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DDoppler m3DDoppler; 1042903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DGrouping m3DGrouping; 1043903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DLocation m3DLocation; 1044903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DSource m3DSource; 1045903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IBufferQueue mBufferQueue; 1046903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEffectSend mEffectSend; 1047903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMetadataExtraction mMetadataExtraction; 1048903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMetadataTraversal mMetadataTraversal; 1049903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMIDIMessage mMIDIMessage; 1050903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMIDITime mMIDITime; 1051903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMIDITempo mMIDITempo; 1052903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMIDIMuteSolo mMIDIMuteSolo; 1053903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPrefetchStatus mPrefetchStatus; 1054903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten ISeek mSeek; 1055903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVolume mVolume; 105615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten IMuteSolo mMuteSolo; 1057c37c934e00a96afe18aaadd9f9a1863c721bf8eaGlenn Kasten#ifdef ANDROID 1058ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi IAndroidStreamType mAndroidStreamType; 1059c37c934e00a96afe18aaadd9f9a1863c721bf8eaGlenn Kasten#endif 1060193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // optional interfaces 1061903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DMacroscopic m3DMacroscopic; 1062903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IBassBoost mBassBoost; 1063903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicSource mDynamicSource; 1064903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 1065903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEqualizer mEqualizer; 1066903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPitch mPitch; 1067903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPresetReverb mPresetReverb; 1068903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPlaybackRate mPlaybackRate; 1069903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVirtualizer mVirtualizer; 1070903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVisualization mVisualization; 1071903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CMidiPlayer; 1072903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten 107315f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten/*typedef*/ struct COutputMix_struct { 1074193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 1075903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 1076bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_OutputMix 11 // see MPH_to_OutputMix in MPH_to.c for list of interfaces 1077bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_OutputMix - INTERFACES_Default]; 1078903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 1079903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IOutputMix mOutputMix; 1080193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 1081903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IOutputMixExt mOutputMixExt; 1082193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 1083903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 1084903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEqualizer mEqualizer; 1085903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPresetReverb mPresetReverb; 1086903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVirtualizer mVirtualizer; 1087903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVolume mVolume; 1088193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // optional interfaces 1089903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IBassBoost mBassBoost; 1090903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVisualization mVisualization; 109115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten} /*COutputMix*/; 1092193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 1093903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 1094193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 1095903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 1096bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_VibraDevice 3 // see MPH_to_VibraDevice in MPH_to.c for list of interfaces 1097bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_VibraDevice - INTERFACES_Default]; 1098903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 1099903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVibra mVibra; 1100193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // 1101193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mDeviceID; 1102903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CVibraDevice; 110382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 110423b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenstruct MPH_init { 110523b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten // unsigned char mMPH; 110623b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten VoidHook mInit; 1107bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten VoidHook mResume; 110823b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten VoidHook mDeinit; 110923b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten}; 111023b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten 111123b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenextern /*static*/ int IID_to_MPH(const SLInterfaceID iid); 111223b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenextern /*static*/ const struct MPH_init MPH_init_table[MPH_MAX]; 1113492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kastenextern SLresult checkInterfaces(const ClassTable *class__, 1114492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kasten SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds, 1115492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kasten const SLboolean *pInterfaceRequired, unsigned *pExposedMask); 1116492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kastenextern IObject *construct(const ClassTable *class__, 1117492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kasten unsigned exposedMask, SLEngineItf engine); 1118492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kastenextern const ClassTable *objectIDtoClass(SLuint32 objectID); 1119492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kastenextern const struct SLInterfaceID_ SL_IID_array[MPH_MAX]; 1120188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kastenextern SLuint32 IObjectToObjectID(IObject *object); 1121188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kasten 112232a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// Map an interface to it's "object ID" (which is really a class ID). 112332a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis. 112432a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// If you have an IObject, then use IObjectToObjectID directly. 1125188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kasten 1126188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kasten#define InterfaceToObjectID(this) IObjectToObjectID((this)->mThis) 1127f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten 112832a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// Map an interface to it's corresponding IObject. 112932a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis. 113032a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// If you have an IObject, then you're done -- you already have what you need. 113132a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten 113232a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten#define InterfaceToIObject(this) ((this)->mThis) 113332a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten 1134da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi#define InterfaceToCAudioPlayer(this) (((CAudioPlayer*)InterfaceToIObject(this))) 1135da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi 1136bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#define InterfaceToCAudioRecorder(this) (((CAudioRecorder*)InterfaceToIObject(this))) 1137bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi 11389db8335361c67c4ed877f68218835df96ce43a4bJean-Michel Trivi#ifdef ANDROID 1139f66a508b11e327670a6bf5a8cf9c106f215e3b39Jean-Michel Trivi#include "android_AudioPlayer.h" 1140f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten#endif 1141f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten 114215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kastenextern SLresult checkDataSource(const SLDataSource *pDataSrc, 1143bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi DataLocatorFormat *myDataSourceLocator); 1144ac4f9bf82c3321d2436485a3d4d0d490079872c6Jean-Michel Triviextern SLresult checkDataSink(const SLDataSink *pDataSink, DataLocatorFormat *myDataSinkLocator, 1145ac4f9bf82c3321d2436485a3d4d0d490079872c6Jean-Michel Trivi SLuint32 objType); 1146d0222eec2f5ae565ab930fc1364950ab4530e1e8Jean-Michel Triviextern SLresult checkSourceFormatVsInterfacesCompatibility( 1147d0222eec2f5ae565ab930fc1364950ab4530e1e8Jean-Michel Trivi const DataLocatorFormat *pDataLocatorFormat, 1148d0222eec2f5ae565ab930fc1364950ab4530e1e8Jean-Michel Trivi SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds, 1149d0222eec2f5ae565ab930fc1364950ab4530e1e8Jean-Michel Trivi const SLboolean *pInterfaceRequired); 1150f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kastenextern void freeDataLocatorFormat(DataLocatorFormat *dlf); 1151bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi 115209f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kastenextern SLresult CAudioPlayer_Realize(void *self, SLboolean async); 115309f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kastenextern void CAudioPlayer_Destroy(void *self); 1154bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi 1155bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Triviextern SLresult CAudioRecorder_Realize(void *self, SLboolean async); 1156bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Triviextern SLresult CAudioRecorder_Resume(void *self, SLboolean async); 1157bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Triviextern void CAudioRecorder_Destroy(void *self); 1158bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi 1159437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenextern SLresult CEngine_Realize(void *self, SLboolean async); 1160437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenextern void CEngine_Destroy(void *self); 1161bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi 116299cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kasten#ifdef USE_SDL 116399cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kastenextern void SDL_start(IEngine *thisEngine); 116499cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kasten#endif 1165bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_REALIZING_1 ((SLuint32) 0x4) // async realize on work queue 1166bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_REALIZING_2 ((SLuint32) 0x5) // sync realize, or async realize hook 1167bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_RESUMING_1 ((SLuint32) 0x6) // async resume on work queue 1168bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_RESUMING_2 ((SLuint32) 0x7) // sync resume, or async resume hook 1169bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_SUSPENDING ((SLuint32) 0x8) // suspend in progress 1170bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_REALIZING_1A ((SLuint32) 0x9) // abort while async realize on work queue 1171bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_RESUMING_1A ((SLuint32) 0xA) // abort while async resume on work queue 1172437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenextern void *sync_start(void *arg); 1173437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenextern SLresult err_to_result(int err); 1174277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kasten 1175277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kasten#ifdef __GNUC__ 117632a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten#define ctz __builtin_ctz 1177277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kasten#else 1178277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kastenextern unsigned ctz(unsigned); 1179277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kasten#endif 11807e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kastenextern const char * const interface_names[MPH_MAX]; 118115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#include "platform.h" 118215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten 118315f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten// Attributes 118415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten 1185d0222eec2f5ae565ab930fc1364950ab4530e1e8Jean-Michel Trivi#define ATTR_NONE ((unsigned) 0x0) // none 1186d0222eec2f5ae565ab930fc1364950ab4530e1e8Jean-Michel Trivi#define ATTR_GAIN ((unsigned) 0x1 << 0) // player volume, channel mute, channel solo, 1187d0222eec2f5ae565ab930fc1364950ab4530e1e8Jean-Michel Trivi // player stereo position, player mute 1188d0222eec2f5ae565ab930fc1364950ab4530e1e8Jean-Michel Trivi#define ATTR_TRANSPORT ((unsigned) 0x1 << 1) // play state, looping 1189d0222eec2f5ae565ab930fc1364950ab4530e1e8Jean-Michel Trivi#define ATTR_POSITION ((unsigned) 0x1 << 2) // requested position (a.k.a. seek position) 11906aa121077e8981b7d9f46471bdaa1a11211057e8Glenn Kasten#define ATTR_ENQUEUE ((unsigned) 0x1 << 3) // buffer queue became non-empty and in playing state 1191c37c934e00a96afe18aaadd9f9a1863c721bf8eaGlenn Kasten 1192c37c934e00a96afe18aaadd9f9a1863c721bf8eaGlenn Kasten#define SL_DATALOCATOR_NULL 0 // application specified a NULL value for pLocator 1193c37c934e00a96afe18aaadd9f9a1863c721bf8eaGlenn Kasten#define SL_DATAFORMAT_NULL 0 // application specified a NULL or undefined value for pFormat 1194f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 1195f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten// Trace debugging 1196f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten 119729745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten// Always defined, but may be a no-op if trace support is disabled at compile-time 119829745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kastenextern void slTraceSetEnabled(unsigned enabled); 119929745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten 120029745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten#define SL_TRACE_ENTER 0x1 120129745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten#define SL_TRACE_LEAVE_FAILURE 0x2 120229745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten#define SL_TRACE_LEAVE_VOID 0x4 120329745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten#define SL_TRACE_DEFAULT (SL_TRACE_LEAVE_FAILURE) 120429745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten 1205f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten#ifndef USE_TRACE 1206f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten 12072caa5decd4882f609c3bf1c69b40d6c2398387bcJean-Michel Trivi#define SL_ENTER_GLOBAL SLresult result; 12082caa5decd4882f609c3bf1c69b40d6c2398387bcJean-Michel Trivi#define SL_LEAVE_GLOBAL return result; 12092caa5decd4882f609c3bf1c69b40d6c2398387bcJean-Michel Trivi#define SL_ENTER_INTERFACE SLresult result; 12102caa5decd4882f609c3bf1c69b40d6c2398387bcJean-Michel Trivi#define SL_LEAVE_INTERFACE return result; 12112caa5decd4882f609c3bf1c69b40d6c2398387bcJean-Michel Trivi#define SL_ENTER_INTERFACE_VOID 12122caa5decd4882f609c3bf1c69b40d6c2398387bcJean-Michel Trivi#define SL_LEAVE_INTERFACE_VOID return; 1213f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten 1214f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#else 1215f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten 121629745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kastenextern void slTraceEnterGlobal(const char *function); 121729745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kastenextern void slTraceLeaveGlobal(const char *function, SLresult result); 121829745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kastenextern void slTraceEnterInterface(const char *function); 121929745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kastenextern void slTraceLeaveInterface(const char *function, SLresult result); 122029745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kastenextern void slTraceEnterInterfaceVoid(const char *function); 122129745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kastenextern void slTraceLeaveInterfaceVoid(const char *function); 122229745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten#define SL_ENTER_GLOBAL SLresult result; slTraceEnterGlobal(__FUNCTION__); 122329745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten#define SL_LEAVE_GLOBAL slTraceLeaveGlobal(__FUNCTION__, result); return result; 122429745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten#define SL_ENTER_INTERFACE SLresult result; slTraceEnterInterface(__FUNCTION__); 122529745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten#define SL_LEAVE_INTERFACE slTraceLeaveInterface(__FUNCTION__, result); return result; 122629745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten#define SL_ENTER_INTERFACE_VOID slTraceEnterInterfaceVoid(__FUNCTION__); 122729745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten#define SL_LEAVE_INTERFACE_VOID slTraceLeaveInterfaceVoid(__FUNCTION__); return; 1228f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten 1229f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#endif 1230158dbd1a71a890d29490198c8e5019081ac94ac3Glenn Kasten 12313190a0da044e122c1c617e30d1d364701fb27110Glenn Kasten#ifdef USE_DEBUG 123223c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten#define SL_LOGE(...) do { fprintf(stderr, "ERROR: %s:%s:%d ", __FILE__, __FUNCTION__, __LINE__); \ 123323c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten fprintf(stderr, __VA_ARGS__); fputc('\n', stderr); } while(0) 123423c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten#define SL_LOGV(...) do { fprintf(stderr, "VERBOSE: %s:%s:%d ", __FILE__, __FUNCTION__, __LINE__); \ 123523c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten fprintf(stderr, __VA_ARGS__); fputc('\n', stderr); } while(0) 12363190a0da044e122c1c617e30d1d364701fb27110Glenn Kasten#else 12373190a0da044e122c1c617e30d1d364701fb27110Glenn Kasten#define SL_LOGE(...) do { } while (0) 12383190a0da044e122c1c617e30d1d364701fb27110Glenn Kasten#define SL_LOGV(...) do { } while (0) 12393190a0da044e122c1c617e30d1d364701fb27110Glenn Kasten#endif 124023c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten 124123c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten#ifdef USE_OUTPUTMIXEXT 124223c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten 124323c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten#define SL_PLAYSTATE_STOPPING ((SLuint32) 0x4) // Play::Stop while PLAYING 124423c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten// If we needed it, could have PLAYING mean mixer is currently reading from front buffer, 124523c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten// while PLAYABLE would mean application requested PLAYING, but buffer queue is empty 124623c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten 124723c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten#endif 124823c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten 124923c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten#ifdef USE_SNDFILE 125023c38816f7c210afae5072fd44658c98fec7e119Glenn Kastenextern void audioPlayerTransportUpdate(CAudioPlayer *audioPlayer); 125123c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten#endif 125223c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten#ifdef ANDROID 125323c38816f7c210afae5072fd44658c98fec7e119Glenn Kastenextern SLresult android_audioPlayerClear(CAudioPlayer *pAudioPlayer); 1254158dbd1a71a890d29490198c8e5019081ac94ac3Glenn Kasten#endif 12559c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten 12569c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kastenextern SLresult IBufferQueue_Enqueue(SLBufferQueueItf self, const void *pBuffer, SLuint32 size); 12579c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kastenextern SLresult IBufferQueue_Clear(SLBufferQueueItf self); 12589c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kastenextern SLresult IBufferQueue_RegisterCallback(SLBufferQueueItf self, 12599c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten slBufferQueueCallback callback, void *pContext); 12609c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten 12619c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kastenextern bool IsInterfaceInitialized(IObject *this, unsigned MPH); 1262