sles_allinclusive.h revision 7e01bc6208fb5b4a2a0019d67bf74373f8ee9428
1773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* 2773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project 3773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * 4773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 5773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * you may not use this file except in compliance with the License. 6773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * You may obtain a copy of the License at 7773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * 8773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 9773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * 10773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 11773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 12773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * See the License for the specific language governing permissions and 14773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * limitations under the License. 15773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi */ 16773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 17369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten/** \file sles_allinclusive.h Everything including the kitchen sink */ 18369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten 19ee21d26b4b66d0f19b826685b3070497523994d5Glenn Kasten#include "SLES/OpenSLES.h" 20773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <stddef.h> // offsetof 21773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <stdlib.h> // malloc 22773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <string.h> // memcmp 23773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <stdio.h> // debugging 24773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <assert.h> // debugging 25773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <pthread.h> 2632918086b694fc383c8c2d590ac45492801676f7Glenn Kasten#include <unistd.h> // usleep 27d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten#include <errno.h> 28773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 29e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#ifndef __cplusplus 30e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kastentypedef int bool; 31e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#ifndef false 32e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#define false 0 33e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#endif 34e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#ifndef true 35e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#define true 1 36e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#endif 37e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#endif 38e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten 39773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "MPH.h" 40773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "MPH_to.h" 41a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "devices.h" 425dacc932cd1084e0cd746afe0a4d7e035560113cGlenn Kasten#include "OpenSLESUT.h" 43d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten#include "ThreadPool.h" 44773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 45acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef struct CAudioPlayer_struct CAudioPlayer; 463af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivitypedef struct CAudioRecorder_struct CAudioRecorder; 476a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kastentypedef struct C3DGroup_struct C3DGroup; 48e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastentypedef struct COutputMix_struct COutputMix; 49acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten 50773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE 51773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <sndfile.h> 527324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#include "SLSndFile.h" 53773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE 54773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 55773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SDL 56773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <SDL/SDL_audio.h> 57773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SDL 58773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 59ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID 607a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#include <utils/Log.h> 61ee21d26b4b66d0f19b826685b3070497523994d5Glenn Kasten#include "SLES/OpenSLES_Android.h" 62773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/AudioSystem.h" 633af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#include "media/mediarecorder.h" 643af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#include "media/AudioRecord.h" 65773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/AudioTrack.h" 66773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/mediaplayer.h" 6714e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT 684be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "media/AudioEffect.h" 694be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "media/EffectApi.h" 704be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "media/EffectEqualizerApi.h" 719cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#include "media/EffectBassBoostApi.h" 72f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi#include "media/EffectVirtualizerApi.h" 737e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi#include "media/EffectPresetReverbApi.h" 7414e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif 756fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi#include <utils/String8.h> 76b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi#define ANDROID_SL_MILLIBEL_MAX 0 77daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#include <binder/ProcessState.h> 78712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi#include "android_sles_conversions.h" 7914e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT 80de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi#include "android_SfPlayer.h" 817e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi#include "android_OutputMix.h" 8214e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif 833af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#include "android_AudioRecorder.h" 84773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 85773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 86e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#define STEREO_CHANNELS 2 87e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten 88773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 89773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "OutputMixExt.h" 90773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 91773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 92773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Hook functions 93773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 94773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef void (*VoidHook)(void *self); 95773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef SLresult (*StatusHook)(void *self); 963d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivitypedef SLresult (*AsyncHook)(void *self, SLboolean async); 97b90cb3de9b67383be4e077d807464044f6f18f7aJean-Michel Trivi 98773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Describes how an interface is related to a given class 99773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 100773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_IMPLICIT 0 101773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_EXPLICIT 1 102c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC 2 103c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_UNAVAILABLE 3 104c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten// note that INTERFACE_OPTIONAL is always re-mapped to one of the above 105c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten 106c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten// Profile-specific interfaces 107c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten 108c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#ifdef USE_BASE 109c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_IMPLICIT_BASE INTERFACE_IMPLICIT 110c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_BASE INTERFACE_EXPLICIT 111c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#else 112c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_IMPLICIT_BASE INTERFACE_UNAVAILABLE 113c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_BASE INTERFACE_UNAVAILABLE 114c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#endif 115c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten 116c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#ifdef USE_GAME 117c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_GAME INTERFACE_DYNAMIC 118c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_GAME INTERFACE_EXPLICIT 119c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#else 120c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_GAME INTERFACE_OPTIONAL 121c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_GAME INTERFACE_OPTIONAL 122c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#endif 123c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten 124c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#ifdef USE_MUSIC 125c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_MUSIC INTERFACE_DYNAMIC 126c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#else 127c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_MUSIC INTERFACE_OPTIONAL 128c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#endif 129c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten 130c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#if defined(USE_GAME) || defined(USE_MUSIC) 131c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_GAME_MUSIC INTERFACE_DYNAMIC 132c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_GAME_MUSIC INTERFACE_EXPLICIT 133c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#else 134c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_GAME_MUSIC INTERFACE_OPTIONAL 135c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_GAME_MUSIC INTERFACE_OPTIONAL 136c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#endif 137c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten 138c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#if defined(USE_GAME) || defined(USE_PHONE) 139c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_GAME_PHONE INTERFACE_EXPLICIT 140c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#else 141c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_GAME_PHONE INTERFACE_OPTIONAL 142c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#endif 143c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten 144c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#ifdef USE_OPTIONAL 145c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_OPTIONAL INTERFACE_EXPLICIT 146c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_OPTIONAL INTERFACE_DYNAMIC 1477a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#else 148c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_OPTIONAL INTERFACE_UNAVAILABLE 149c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_OPTIONAL INTERFACE_UNAVAILABLE 1507a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif 1517a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten 152510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten// Describes how an interface is related to a given object 153510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten 154369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_UNINITIALIZED 1 ///< /not requested at object creation time 155369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_EXPOSED 2 ///< /requested at object creation time 156369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_ADDING_1 3 ///< /part 1 of asynchronous AddInterface, pending 157369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_ADDING_2 4 ///< /synchronous AddInterface, or part 2 of asynchronous 158369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_ADDED 5 ///< /AddInterface has completed 159369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_REMOVING 6 ///< /unlocked phase of (synchronous) RemoveInterface 160369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_SUSPENDING 7 ///< /suspend in progress 161369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_SUSPENDED 8 ///< /suspend has completed 162369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_RESUMING_1 9 ///< /part 1 of asynchronous ResumeInterface, pending 163369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_RESUMING_2 10 ///< /synchronous ResumeInterface, or part 2 of asynchronous 164369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_ADDING_1A 11 ///< /part 1 of asynchronous AddInterface, aborted 165369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_RESUMING_1A 12 ///< /part 1 of asynchronous ResumeInterface, aborted 166510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten 167773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Maps an interface ID to its offset within the class that exposes it 168773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 169773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct iid_vtable { 170773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi unsigned char mMPH; 171773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi unsigned char mInterface; // relationship 172773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi /*size_t*/ unsigned short mOffset; 173773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 174773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 175773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Per-class const data shared by all instances of the same class 176773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 17772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 178773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct iid_vtable *mInterfaces; 179510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint32 mInterfaceCount; // number of possible interfaces 180773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const signed char *mMPH_to_index; 18176dde6cd71bdb39459f38218e8aa2b7c19e790dbGlenn Kasten const char * const mName; 182773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi size_t mSize; 183773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mObjectID; 184510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten // hooks 1853d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivi AsyncHook mRealize; 186510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten AsyncHook mResume; 187773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi VoidHook mDestroy; 18872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ClassTable; 189773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 190773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// BufferHeader describes each element of a BufferQueue, other than the data 191773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 192d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastentypedef struct { 193773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const void *mBuffer; 194773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mSize; 195d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten} BufferHeader; 196773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 197773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 198773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 199773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// stereo is a frame consisting of a pair of 16-bit PCM samples 200773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 201773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef struct { 202773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi short left; 203773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi short right; 204773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi} stereo; 205773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 206773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 207773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 2087324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#ifdef __cplusplus 2097324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#define this this_ 2107324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#endif 2117324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten 212773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE 213773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 2146a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten#define SndFile_BUFSIZE 512 // in 16-bit samples 2156a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten#define SndFile_NUMBUFS 2 2166a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten 217773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct SndFile { 218773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // save URI also? 219773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLchar *mPathname; 220773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SNDFILE *mSNDFILE; 2214b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SF_INFO mSfInfo; 222e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten pthread_mutex_t mMutex; // protects mSNDFILE only 223e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLboolean mEOF; // sf_read returned zero sample frames 224773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // These are used when Enqueue returns SL_RESULT_BUFFER_INSUFFICIENT 225773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const void *mRetryBuffer; 226773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mRetrySize; 2276a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten SLuint32 mWhich; // which buffer to use next 2286a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten short mBuffer[SndFile_BUFSIZE * SndFile_NUMBUFS]; 229773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 230773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 231773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE 232773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 233acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten/* Our own merged version of SLDataSource and SLDataSink */ 234acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten 235acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef union { 236acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLuint32 mLocatorType; 237acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataLocator_Address mAddress; 238acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataLocator_BufferQueue mBufferQueue; 239acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataLocator_IODevice mIODevice; 240acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataLocator_MIDIBufferQueue mMIDIBufferQueue; 241acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataLocator_OutputMix mOutputMix; 242acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataLocator_URI mURI; 243989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi#ifdef ANDROID 244989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi SLDataLocator_AndroidFD mFD; 245989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi#endif 246acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} DataLocator; 247acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten 248acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef union { 249acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLuint32 mFormatType; 250acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataFormat_PCM mPCM; 251acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataFormat_MIME mMIME; 252acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} DataFormat; 253acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten 254acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef struct { 255acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten union { 256acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataSource mSource; 257acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataSink mSink; 258acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten struct { 259acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten DataLocator *pLocator; 260acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten DataFormat *pFormat; 261acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten } mNeutral; 262acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten } u; 263acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten DataLocator mLocator; 264acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten DataFormat mFormat; 265acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} DataLocatorFormat; 266acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten 267773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Interface structures */ 268773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 26972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Object_interface { 270e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten const struct SLObjectItf_ *mItf; // const 271d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten // field mThis would be redundant within an IObject, so we substitute mEngine 272e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten struct Engine_interface *mEngine; // const 273e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten const ClassTable *mClass; // const 274e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLuint32 mInstanceID; // const for debugger and for RPC 27572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten slObjectCallback mCallback; 27672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten void *mContext; 277e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten unsigned mGottenMask; ///< bit-mask of interfaces exposed or added, then gotten 27872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten unsigned mLossOfControlMask; // interfaces with loss of control enabled 279e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten unsigned mAttributesMask; // attributes which have changed since last sync 280c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#ifdef USE_BASE 28172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten SLint32 mPriority; 2827a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif 28372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten pthread_mutex_t mMutex; 284fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#ifdef USE_DEBUG 285fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten pthread_t mOwner; 286fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten const char *mFile; 287fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten int mLine; 288fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#endif 28972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten pthread_cond_t mCond; 290510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mState; // really SLuint32, but SLuint8 to save space 291c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#ifdef USE_BASE 292510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mPreemptable; // really SLboolean, but SLuint8 to save space 2937a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#else 2947a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten SLuint8 mPadding; 2957a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif 296510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten // for best alignment, do not add any fields here 297510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_Default 2 298510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates[INTERFACES_Default]; // state of each of interface 299e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // do not add any fields here 30072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IObject; 30172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten 302a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "locks.h" 303a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 30472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 30572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten const struct SL3DCommitItf_ *mItf; 30672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 307773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mDeferred; 30832918086b694fc383c8c2d590ac45492801676f7Glenn Kasten SLuint32 mGeneration; // incremented each master clock cycle 309a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten SLuint32 mWaiting; // number of threads waiting in Commit 31072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DCommit; 311773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 3127754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum CartesianSphericalActive { 3137754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_COMPUTED_SPHERICAL_SET, 3147754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_REQUESTED_SPHERICAL_SET, 3157754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_UNKNOWN_SPHERICAL_SET, 3167754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_SET_SPHERICAL_COMPUTED, // not in 1.0.1 3177754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_SET_SPHERICAL_REQUESTED, // not in 1.0.1 3187754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_SET_SPHERICAL_UNKNOWN 3197754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten}; 3207754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten 32172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 322773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DDopplerItf_ *mItf; 32372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 3247754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // The API allows client to specify either Cartesian and spherical velocities. 3257754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // But an implementation will likely prefer one or the other. So for 3267754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // maximum portablity, we maintain both units and an indication of which 3277754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // unit was set most recently. In addition, we keep a flag saying whether 3287754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // the other unit has been derived yet. It can take significant time 3297754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // to compute the other unit, so this may be deferred to another thread. 3307754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // For this reason we also keep an indication of whether the secondary 3317754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // has been computed yet, and its accuracy. 3327754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // Though only one unit is primary at a time, a union is inappropriate: 3337754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // the application might read in both units (not in 1.0.1), 3347754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // and due to multi-threading concerns. 3357754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mVelocityCartesian; 33632918086b694fc383c8c2d590ac45492801676f7Glenn Kasten struct { 33732918086b694fc383c8c2d590ac45492801676f7Glenn Kasten SLmillidegree mAzimuth; 33832918086b694fc383c8c2d590ac45492801676f7Glenn Kasten SLmillidegree mElevation; 33932918086b694fc383c8c2d590ac45492801676f7Glenn Kasten SLmillidegree mSpeed; 3407754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten } mVelocitySpherical; 3417754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten enum CartesianSphericalActive mVelocityActive; 342773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mDopplerFactor; 34372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DDoppler; 344773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 34572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 346773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DGroupingItf_ *mItf; 34772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 3486a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten C3DGroup *mGroup; // link to associated group or NULL 34972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DGrouping; 350773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 3517754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum AnglesVectorsActive { 3527754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_COMPUTED_VECTORS_SET, // not in 1.0.1 3537754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_REQUESTED_VECTORS_SET, // not in 1.0.1 3547754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_UNKNOWN_VECTORS_SET, 3557754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_SET_VECTORS_COMPUTED, 3567754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_SET_VECTORS_REQUESTED, 3577754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_SET_VECTORS_UNKNOWN 3587754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten}; 3597754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten 36072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 361773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DLocationItf_ *mItf; 36272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 3637754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mLocationCartesian; 3647754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten struct { 3657754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mAzimuth; 3667754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mElevation; 3677754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillimeter mDistance; 3687754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten } mLocationSpherical; 3697754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten enum CartesianSphericalActive mLocationActive; 3707754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten struct { 3717754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mHeading; 3727754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mPitch; 3737754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mRoll; 3747754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten } mOrientationAngles; 3757754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten struct { 3767754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mFront; 3777754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mAbove; 3787754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mUp; 3797754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten } mOrientationVectors; 3807754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten enum AnglesVectorsActive mOrientationActive; 3817754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // Rotations can be slow, so are deferred. 3827754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mTheta; 3837754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mAxis; 3847754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLboolean mRotatePending; 38572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DLocation; 386773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 38772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 388773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DMacroscopicItf_ *mItf; 38972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 390773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct { 391773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mWidth; 392773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mHeight; 393773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mDepth; 394773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi } mSize; 395773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct { 396773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mHeading; 397773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mPitch; 398773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mRoll; 399773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi } mOrientationAngles; 400773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct { 401773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLVec3D mFront; 402ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SLVec3D mAbove; 403773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLVec3D mUp; 404773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi } mOrientationVectors; 4057754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten enum AnglesVectorsActive mOrientationActive; 4067754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // Rotations can be slow, so are deferred. 4077754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mTheta; 4087754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mAxis; 4097754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLboolean mRotatePending; 41072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DMacroscopic; 411773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 41272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 413773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DSourceItf_ *mItf; 41472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 415773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mHeadRelative; 416773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mRolloffMaxDistanceMute; 417773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mMaxDistance; 418773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mMinDistance; 4197754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mConeInnerAngle; 4207754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mConeOuterAngle; 421773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillibel mConeOuterLevel; 422773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mRolloffFactor; 423773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mRoomRolloffFactor; 424773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint8 mDistanceModel; 42572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DSource; 426773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 42772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 428773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLAudioDecoderCapabilitiesItf_ *mItf; 42972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 43072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioDecoderCapabilities; 431773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 43272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 433773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLAudioEncoderItf_ *mItf; 43472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 435773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLAudioEncoderSettings mSettings; 43672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoder; 437773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 43872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 439773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLAudioEncoderCapabilitiesItf_ *mItf; 44072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 44172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoderCapabilities; 442773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 44372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 444773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLAudioIODeviceCapabilitiesItf_ *mItf; 44572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 4467754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten slAvailableAudioInputsChangedCallback mAvailableAudioInputsChangedCallback; 4477754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten void *mAvailableAudioInputsChangedContext; 4487754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten slAvailableAudioOutputsChangedCallback mAvailableAudioOutputsChangedCallback; 4497754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten void *mAvailableAudioOutputsChangedContext; 4507754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten slDefaultDeviceIDMapChangedCallback mDefaultDeviceIDMapChangedCallback; 4517754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten void *mDefaultDeviceIDMapChangedContext; 45272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioIODeviceCapabilities; 453773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 45472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 455773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLBassBoostItf_ *mItf; 45672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 457773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mEnabled; 458773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mStrength; 4599cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT) 4609cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi effect_descriptor_t mBassBoostDescriptor; 4619cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi android::sp<android::AudioEffect> mBassBoostEffect; 4629cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#endif 46372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBassBoost; 464773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 46572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct BufferQueue_interface { 466773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLBufferQueueItf_ *mItf; 46772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 4683a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten SLBufferQueueState mState; 469773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slBufferQueueCallback mCallback; 470773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 4714b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten // originally SLuint32, but range-checked down to SLuint16 4724b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SLuint16 mNumBuffers; 4734b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten /*SLboolean*/ SLuint16 mClearRequested; 474d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten BufferHeader *mArray; 475d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten BufferHeader *mFront, *mRear; 4764b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#ifdef ANDROID 4771ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi SLuint32 mSizeConsumed; 4784b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#endif 479773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // saves a malloc in the typical case 480773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define BUFFER_HEADER_TYPICAL 4 481d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten BufferHeader mTypical[BUFFER_HEADER_TYPICAL+1]; 48272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBufferQueue; 483773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 48440d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten#define MAX_DEVICE 2 48540d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten 48672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 487773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLDeviceVolumeItf_ *mItf; 48872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 4897a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten SLint32 mVolume[MAX_DEVICE]; 49072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDeviceVolume; 491773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 49272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 493773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLDynamicInterfaceManagementItf_ *mItf; 49472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 495773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slDynamicInterfaceManagementCallback mCallback; 496773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 49772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicInterfaceManagement; 498773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 49972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 500773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLDynamicSourceItf_ *mItf; 50172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 502773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLDataSource *mDataSource; 50372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicSource; 504773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 505773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// private 506773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 507773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EnableLevel { 508773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mEnable; 509773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillibel mSendLevel; 510773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 511773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 512510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten// indexes into IEffectSend.mEnableLevels 513510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten 514510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define AUX_ENVIRONMENTALREVERB 0 515510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define AUX_PRESETREVERB 1 516510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define AUX_MAX 2 517510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten 51872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 519773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEffectSendItf_ *mItf; 52072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 521e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLmillibel mDirectLevel; // dry volume 522e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten struct EnableLevel mEnableLevels[AUX_MAX]; // wet enable and volume per effect type 52372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEffectSend; 52472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten 525ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kastentypedef struct Engine_interface { 526773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEngineItf_ *mItf; 52772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 528773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mLossOfControlGlobal; 52900d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#ifdef USE_SDL 530e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten COutputMix *mOutputMix; // SDL pulls PCM from an arbitrary IOutputMixExt 53100d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#endif 532773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // Each engine is its own universe. 53372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten SLuint32 mInstanceCount; 534d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten unsigned mInstanceMask; // 1 bit per active object 535e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten unsigned mChangedMask; // objects which have changed since last sync 536d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define MAX_INSTANCE 32 // see mInstanceMask 537d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten IObject *mInstances[MAX_INSTANCE]; 538d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten SLboolean mShutdown; 539e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLboolean mShutdownAck; 540d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten ThreadPool mThreadPool; // for asynchronous operations 54114e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if defined(ANDROID) && !defined(USE_BACKPORT) 5427e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi // FIXME number of presets will only be saved in IEqualizer, preset names will not be stored 5434be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi SLuint32 mEqNumPresets; 5444be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi char** mEqPresetNames; 5454be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif 54672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngine; 547773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 54872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 549773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEngineCapabilitiesItf_ *mItf; 55072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 551773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mThreadSafe; 55240d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten // const 55340d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten SLuint32 mMaxIndexLED; 55440d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten SLuint32 mMaxIndexVibra; 55572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngineCapabilities; 556773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 55772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 558773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEnvironmentalReverbItf_ *mItf; 55972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 560773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLEnvironmentalReverbSettings mProperties; 56172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEnvironmentalReverb; 562773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 563773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EqualizerBand { 564773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmilliHertz mMin; 565773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmilliHertz mCenter; 5660b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLmilliHertz mMax; 567773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 568773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 56914e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if defined(ANDROID) && !defined(USE_BACKPORT) 5704be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#define MAX_EQ_BANDS 0 5714be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#else 5723a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten#define MAX_EQ_BANDS 4 // compile-time limit, runtime limit may be smaller 5734be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif 5743a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten 57572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 576773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEqualizerItf_ *mItf; 57772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 578773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mEnabled; 579773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mPreset; 5803a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten SLmillibel mLevels[MAX_EQ_BANDS]; 5813a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten // const to end of struct 582773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mNumPresets; 583773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mNumBands; 5840b167267bda99b68346045ccab14e810121d5de4Glenn Kasten const struct EqualizerBand *mBands; 5853a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten const struct EqualizerPreset *mPresets; 5860b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLmillibel mBandLevelRangeMin; 5870b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLmillibel mBandLevelRangeMax; 58814e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if defined(ANDROID) && !defined(USE_BACKPORT) 5894be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi effect_descriptor_t mEqDescriptor; 5904be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi android::sp<android::AudioEffect> mEqEffect; 5914be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif 59272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEqualizer; 593773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 5947e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT) 5957e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi#include "android_Effect.h" 5967e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi#endif 5977e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi 5983a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten#define MAX_LED_COUNT 32 5993a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten 60072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 601773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLLEDArrayItf_ *mItf; 60272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 603773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mLightMask; 6043a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten SLHSL mColors[MAX_LED_COUNT]; 605773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // const 606773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint8 mCount; 60772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ILEDArray; 608773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 60972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 610773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMetadataExtractionItf_ *mItf; 61172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 612773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mKeySize; 613773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const void *mKey; 614773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mKeyEncoding; 615773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const SLchar *mValueLangCountry; 616773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mValueEncoding; 617773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint8 mFilterMask; 6186a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten int mKeyFilter; 61972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataExtraction; 620773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 62172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 622773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMetadataTraversalItf_ *mItf; 62372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 624773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mIndex; 625773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mMode; 626773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mCount; 627773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mSize; 62872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataTraversal; 629773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 63072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 631773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMIDIMessageItf_ *mItf; 63272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 633773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slMetaEventCallback mMetaEventCallback; 634773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mMetaEventContext; 635773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slMIDIMessageCallback mMessageCallback; 636773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mMessageContext; 6370b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLuint8 mMessageTypes; 63872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMessage; 639773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 64072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 641773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMIDIMuteSoloItf_ *mItf; 64272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 643773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mChannelMuteMask; 644773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mChannelSoloMask; 645773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mTrackMuteMask; 646773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mTrackSoloMask; 647d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten // const 648773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mTrackCount; 64972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMuteSolo; 650773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 65172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 652773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMIDITempoItf_ *mItf; 65372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 654773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mTicksPerQuarterNote; 655773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mMicrosecondsPerQuarterNote; 65672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITempo; 657773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 65872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 659773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMIDITimeItf_ *mItf; 66072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 661773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mDuration; 662773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mPosition; 663773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mStartTick; 664773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mNumTicks; 66572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITime; 666773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 66772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 668773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMuteSoloItf_ *mItf; 66972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 670b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten // fields that were formerly here are now at CAudioPlayer 67172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMuteSolo; 672773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 673d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define MAX_TRACK 32 // see mActiveMask 674d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten 67572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 676773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLOutputMixItf_ *mItf; 67772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 6787754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten slMixDeviceChangeCallback mCallback; 6797754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten void *mContext; 680773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 681773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi unsigned mActiveMask; // 1 bit per active track 682369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten Track mTracks[MAX_TRACK]; 683773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 68472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMix; 685773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 686773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 68772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 688773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLOutputMixExtItf_ *mItf; 68972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 69072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMixExt; 691773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 692773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 69372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 694773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPitchItf_ *mItf; 69572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 696773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mPitch; 697773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // const 698773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMinPitch; 699773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMaxPitch; 70072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPitch; 701773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 70272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Play_interface { 703773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPlayItf_ *mItf; 70472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 7053a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten SLuint32 mState; 706e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // next 2 fields are read-only to application 707773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mDuration; 708773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mPosition; 709773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slPlayCallback mCallback; 710773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 711773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mEventFlags; 712e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // the ISeek trick of using a distinct value doesn't work here because it's readable by app 713773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mMarkerPosition; 714e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLboolean mMarkerIsSet; 715773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mPositionUpdatePeriod; 71672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlay; 717773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 71872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 719773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPlaybackRateItf_ *mItf; 72072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 721773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mRate; 722773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mProperties; 7230b167267bda99b68346045ccab14e810121d5de4Glenn Kasten // const 724773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMinRate; 725773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMaxRate; 726773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mStepSize; 727773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mCapabilities; 72872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlaybackRate; 729773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 73072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 731773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPrefetchStatusItf_ *mItf; 73272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 733773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mStatus; 734773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mLevel; 735773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slPrefetchCallback mCallback; 736773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 737773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mCallbackEventsMask; 738773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mFillUpdatePeriod; 73972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPrefetchStatus; 740773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 74172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 742773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPresetReverbItf_ *mItf; 74372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 744773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mPreset; 74572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPresetReverb; 746773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 74772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 748773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLRatePitchItf_ *mItf; 74972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 750773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mRate; 7510b167267bda99b68346045ccab14e810121d5de4Glenn Kasten // const 752773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMinRate; 753773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMaxRate; 75472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRatePitch; 755773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 75672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 757773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLRecordItf_ *mItf; 75872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 759773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mState; 760773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mDurationLimit; 761773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mPosition; 762773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slRecordCallback mCallback; 763773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 764773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mCallbackEventsMask; 765773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mMarkerPosition; 766773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mPositionUpdatePeriod; 76772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRecord; 768773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 76972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 770773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLSeekItf_ *mItf; 77172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 772e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLmillisecond mPos; // mPos != SL_TIME_UNKNOWN means pending seek request 773773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mLoopEnabled; 774773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mStartPos; 775773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mEndPos; 77672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ISeek; 777773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 77872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 779773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLThreadSyncItf_ *mItf; 78072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 781773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mInCriticalSection; 782e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLuint32 mWaiting; // number of threads waiting 783773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi pthread_t mOwner; 78472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IThreadSync; 785773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 78672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 787773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLVibraItf_ *mItf; 78872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 789773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mVibrate; 790773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmilliHertz mFrequency; 791773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mIntensity; 79272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVibra; 793773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 79472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 795773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLVirtualizerItf_ *mItf; 79672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 797773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mEnabled; 798773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mStrength; 799f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT) 800f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi effect_descriptor_t mVirtualizerDescriptor; 801f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi android::sp<android::AudioEffect> mVirtualizerEffect; 802f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi#endif 80372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVirtualizer; 804773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 80572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 806773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLVisualizationItf_ *mItf; 80772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 808773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slVisualizationCallback mCallback; 809773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 810773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmilliHertz mRate; 81172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVisualization; 812773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 813e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastentypedef struct /*Volume_interface*/ { 814773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLVolumeItf_ *mItf; 81572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 816e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // Values as specified by the application 817773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillibel mLevel; 818773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mStereoPosition; 8197a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten SLuint8 /*SLboolean*/ mMute; 820e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLuint8 /*SLboolean*/ mEnableStereoPosition; 82172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVolume; 822773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 823773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Class structures */ 824773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 8256a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten/*typedef*/ struct C3DGroup_struct { 82672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 827510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_3DGroup 6 // see MPH_to_3DGroup in MPH_to.c for list of interfaces 828510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_3DGroup - INTERFACES_Default]; 82972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 83072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DLocation m3DLocation; 83172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DDoppler m3DDoppler; 83272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DSource m3DSource; 83372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DMacroscopic m3DMacroscopic; 8346a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten unsigned mMemberMask; // set of member objects 8356a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten} /*C3DGroup*/; 836773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 83780ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi#ifdef ANDROID 83805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivitypedef struct { 83905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi const struct SLAndroidStreamTypeItf_ *mItf; 84005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi IObject *mThis; 84105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi SLuint32 mStreamType; 84205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi} IAndroidStreamType; 84305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi 84467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivitypedef struct { 84567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi const struct SLAndroidAudioEffectItf_ *mItf; 84667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi IObject *mThis; 84767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi} IAndroidAudioEffect; 84867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 849773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* 850773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Used to define the mapping from an OpenSL ES audio player to an Android 851773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * media framework object 852773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi */ 853773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivienum AndroidObject_type { 854c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi INVALID_TYPE =-1, 855773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi MEDIAPLAYER = 0, 856773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi AUDIOTRACK_PUSH = 1, 857773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi AUDIOTRACK_PULL = 2, 858773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi NUM_AUDIOPLAYER_MAP_TYPES 859773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 860f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi 86180ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivienum AndroidObject_state { 86280ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi ANDROID_UNINITIALIZED = -1, 86380ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi ANDROID_PREPARING, 86480ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi ANDROID_PREPARED, 86580ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi ANDROID_PREFETCHING, 86680ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi ANDROID_READY, 86780ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi NUM_ANDROID_STATES 86880ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi}; 86905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#endif //ifdef ANDROID 87005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi 871773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 872acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten/*typedef*/ struct CAudioPlayer_struct { 87372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 87405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#ifdef ANDROID 87567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi#define INTERFACES_AudioPlayer 28 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces 87605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#else 877510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_AudioPlayer 26 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces 87805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#endif 879510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_AudioPlayer - INTERFACES_Default]; 88072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 88172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPlay mPlay; 88272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DDoppler m3DDoppler; 88372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DGrouping m3DGrouping; 88472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DLocation m3DLocation; 88572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DSource m3DSource; 88672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBufferQueue mBufferQueue; 88772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEffectSend mEffectSend; 88872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataExtraction mMetadataExtraction; 88972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataTraversal mMetadataTraversal; 89072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPrefetchStatus mPrefetchStatus; 89172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IRatePitch mRatePitch; 89272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten ISeek mSeek; 89372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVolume mVolume; 894e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten IMuteSolo mMuteSolo; 89505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#ifdef ANDROID 89605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi IAndroidStreamType mAndroidStreamType; 89767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi IAndroidAudioEffect mAndroidAudioEffect; 89805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#endif 899773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 90072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DMacroscopic m3DMacroscopic; 90172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBassBoost mBassBoost; 90272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicSource mDynamicSource; 90372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 90472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEqualizer mEqualizer; 90572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPitch mPitch; 90672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPresetReverb mPresetReverb; 90772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPlaybackRate mPlaybackRate; 90872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVirtualizer mVirtualizer; 90972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVisualization mVisualization; 910773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // rest of fields are not related to the interfaces 911acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten DataLocatorFormat mDataSource; 912acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten DataLocatorFormat mDataSink; 913343c522ebf4f9c321eef8c3b3b2945f1c1cb8846Glenn Kasten COutputMix *mOutputMix; // output mix this audio player is attached to, for effect send 9141fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // cached data for this instance 915e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLuint8 /*SLboolean*/ mMute; 916b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten // Formerly at IMuteSolo 917b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten SLuint8 mMuteMask; // Mask for which channels are muted: bit 0=left, 1=right 918b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten SLuint8 mSoloMask; // Mask for which channels are soloed: bit 0=left, 1=right 919b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten SLuint8 mNumChannels; // 0 means unknown, then const once it is known, range 1 <= x <= 8 920a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi SLuint32 mSampleRateMilliHz;// 0 means unknown, then const once it is known 9211fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // implementation-specific data for this instance 922e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#ifdef USE_OUTPUTMIXEXT 923369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten Track *mTrack; 924e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#endif 925773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE 926773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct SndFile mSndFile; 927773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE 92880ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi#ifdef ANDROID 92906a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi android::Mutex *mpLock; 930773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi enum AndroidObject_type mAndroidObjType; 93180ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi enum AndroidObject_state mAndroidObjState; 9324614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi android::AudioTrack *mAudioTrack; 93314e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT 934de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi android::sp<android::SfPlayer> mSfPlayer; 935de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi android::sp<android::ALooper> mRenderLooper; 93614e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif 937e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten /** 938e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten * Amplification (can be attenuation) factor derived for the VolumeLevel 939e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten */ 940e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten float mAmplFromVolLevel; 941e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten /** 942e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten * Left/right amplification (can be attenuations) factors derived for the StereoPosition 943e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten */ 944e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten float mAmplFromStereoPos[STEREO_CHANNELS]; 945773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 946acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} /*CAudioPlayer*/; 947773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 9483af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi 9493af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi/*typedef*/ struct CAudioRecorder_struct { 950773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 95172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 9523af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#ifdef ANDROID 9533af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#define INTERFACES_AudioRecorder 10 // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces 9543af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#else 9553af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#define INTERFACES_AudioRecorder 9 // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces 9563af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#endif 957510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceContinued[INTERFACES_AudioRecorder - INTERFACES_Default]; 95872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 95972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IRecord mRecord; 96072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IAudioEncoder mAudioEncoder; 961773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 96272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBassBoost mBassBoost; 96372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicSource mDynamicSource; 96472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEqualizer mEqualizer; 96572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVisualization mVisualization; 96672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVolume mVolume; 9673af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#ifdef ANDROID 9683af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi IBufferQueue mBufferQueue; 9693af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#endif 970ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten // rest of fields are not related to the interfaces 971ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten DataLocatorFormat mDataSource; 972ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten DataLocatorFormat mDataSink; 973712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi // cached data for this instance 974712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi SLuint8 mNumChannels; // 0 means unknown, then const once it is known, range 1 <= x <= 8 975712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi SLuint32 mSampleRateMilliHz;// 0 means unknown, then const once it is known 9763af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi // implementation-specific data for this instance 9773af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#ifdef ANDROID 9783af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi android::AudioRecord *mAudioRecord; 9793af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#endif 9803af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi} /*CAudioRecorder*/; 9813af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi 982773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 98372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 984773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated implicit interfaces 98572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 986510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_Engine 10 // see MPH_to_Engine in MPH_to.c for list of interfaces 987510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_Engine - INTERFACES_Default]; 98872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 98972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEngine mEngine; 99072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEngineCapabilities mEngineCapabilities; 99172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IThreadSync mThreadSync; 992773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated explicit interfaces 99372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IAudioIODeviceCapabilities mAudioIODeviceCapabilities; 99472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IAudioDecoderCapabilities mAudioDecoderCapabilities; 99572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IAudioEncoderCapabilities mAudioEncoderCapabilities; 99672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DCommit m3DCommit; 997773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 99872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDeviceVolume mDeviceVolume; 9997a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten // rest of fields are not related to the interfaces 1000b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten pthread_t mSyncThread; 100172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CEngine; 1002773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 100372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 1004773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 100572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 1006510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_LEDDevice 3 // see MPH_to_LEDDevice in MPH_to.c for list of interfaces 1007510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_LEDDevice - INTERFACES_Default]; 100872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 100972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten ILEDArray mLEDArray; 1010773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mDeviceID; 101172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CLEDDevice; 1012773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 101372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 1014773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 101572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 1016510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_Listener 4 // see MPH_to_Listener in MPH_to.c for list of interfaces 1017510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_Listener - INTERFACES_Default]; 101872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 101972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DDoppler m3DDoppler; 102072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DLocation m3DLocation; 102172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CListener; 1022773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 102372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 1024773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 102572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 1026e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#define INTERFACES_MetadataExtractor 5 // see MPH_to_MetadataExtractor in MPH_to.c for list of 1027e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // interfaces 1028510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_MetadataExtractor - INTERFACES_Default]; 102972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 103072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicSource mDynamicSource; 103172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataExtraction mMetadataExtraction; 103272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataTraversal mMetadataTraversal; 103372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMetadataExtractor; 1034773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 103572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 1036773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 103772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 103805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#ifdef ANDROID 103905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#define INTERFACES_MidiPlayer 30 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces 104005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#else 1041510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_MidiPlayer 29 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces 104205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#endif 1043510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_MidiPlayer - INTERFACES_Default]; 104472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 104572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPlay mPlay; 104672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DDoppler m3DDoppler; 104772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DGrouping m3DGrouping; 104872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DLocation m3DLocation; 104972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DSource m3DSource; 105072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBufferQueue mBufferQueue; 105172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEffectSend mEffectSend; 105272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataExtraction mMetadataExtraction; 105372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataTraversal mMetadataTraversal; 105472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMIDIMessage mMIDIMessage; 105572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMIDITime mMIDITime; 105672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMIDITempo mMIDITempo; 105772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMIDIMuteSolo mMIDIMuteSolo; 105872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPrefetchStatus mPrefetchStatus; 105972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten ISeek mSeek; 106072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVolume mVolume; 1061e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten IMuteSolo mMuteSolo; 1062a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten#ifdef ANDROID 106305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi IAndroidStreamType mAndroidStreamType; 1064a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten#endif 1065773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 106672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DMacroscopic m3DMacroscopic; 106772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBassBoost mBassBoost; 106872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicSource mDynamicSource; 106972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 107072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEqualizer mEqualizer; 107172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPitch mPitch; 107272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPresetReverb mPresetReverb; 107372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPlaybackRate mPlaybackRate; 107472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVirtualizer mVirtualizer; 107572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVisualization mVisualization; 107672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMidiPlayer; 107772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten 1078e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten/*typedef*/ struct COutputMix_struct { 1079773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 108072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 1081510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_OutputMix 11 // see MPH_to_OutputMix in MPH_to.c for list of interfaces 1082510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_OutputMix - INTERFACES_Default]; 108372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 108472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IOutputMix mOutputMix; 1085773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 108672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IOutputMixExt mOutputMixExt; 1087773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 108872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 108972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEqualizer mEqualizer; 109072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPresetReverb mPresetReverb; 109172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVirtualizer mVirtualizer; 109272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVolume mVolume; 1093773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 109472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBassBoost mBassBoost; 109572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVisualization mVisualization; 10967e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi // implementation-specific data for this instance 10977e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi#ifdef ANDROID 10987e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi#endif 1099e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten} /*COutputMix*/; 1100773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 110172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 1102773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 110372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 1104510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_VibraDevice 3 // see MPH_to_VibraDevice in MPH_to.c for list of interfaces 1105510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_VibraDevice - INTERFACES_Default]; 110672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 110772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVibra mVibra; 1108773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // 1109773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mDeviceID; 111072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CVibraDevice; 1111a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 111261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstruct MPH_init { 111361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten // unsigned char mMPH; 111461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten VoidHook mInit; 1115510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten VoidHook mResume; 111661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten VoidHook mDeinit; 111761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}; 111861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 111961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenextern /*static*/ int IID_to_MPH(const SLInterfaceID iid); 112061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenextern /*static*/ const struct MPH_init MPH_init_table[MPH_MAX]; 1121979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern SLresult checkInterfaces(const ClassTable *class__, 1122979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds, 1123979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten const SLboolean *pInterfaceRequired, unsigned *pExposedMask); 1124979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern IObject *construct(const ClassTable *class__, 1125979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten unsigned exposedMask, SLEngineItf engine); 1126979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern const ClassTable *objectIDtoClass(SLuint32 objectID); 1127979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern const struct SLInterfaceID_ SL_IID_array[MPH_MAX]; 1128b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kastenextern SLuint32 IObjectToObjectID(IObject *object); 1129b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten 1130d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Map an interface to it's "object ID" (which is really a class ID). 1131d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis. 1132d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// If you have an IObject, then use IObjectToObjectID directly. 1133b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten 1134b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten#define InterfaceToObjectID(this) IObjectToObjectID((this)->mThis) 1135daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten 1136d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Map an interface to it's corresponding IObject. 1137d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis. 1138d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// If you have an IObject, then you're done -- you already have what you need. 1139d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten 1140d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define InterfaceToIObject(this) ((this)->mThis) 1141d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten 11421fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi#define InterfaceToCAudioPlayer(this) (((CAudioPlayer*)InterfaceToIObject(this))) 11431fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi 11443af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#define InterfaceToCAudioRecorder(this) (((CAudioRecorder*)InterfaceToIObject(this))) 11453af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi 1146ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID 1147d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivi#include "android_AudioPlayer.h" 1148daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#endif 1149daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten 1150e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastenextern SLresult checkDataSource(const SLDataSource *pDataSrc, 11513af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi DataLocatorFormat *myDataSourceLocator); 1152712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Triviextern SLresult checkDataSink(const SLDataSink *pDataSink, DataLocatorFormat *myDataSinkLocator, 1153712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi SLuint32 objType); 11543c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Triviextern SLresult checkSourceFormatVsInterfacesCompatibility( 11553c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi const DataLocatorFormat *pDataLocatorFormat, 11563c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds, 11573c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi const SLboolean *pInterfaceRequired); 1158daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenextern void freeDataLocatorFormat(DataLocatorFormat *dlf); 11593af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi 11603a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenextern SLresult CAudioPlayer_Realize(void *self, SLboolean async); 11613a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenextern void CAudioPlayer_Destroy(void *self); 11623af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi 11633af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Triviextern SLresult CAudioRecorder_Realize(void *self, SLboolean async); 11643af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Triviextern SLresult CAudioRecorder_Resume(void *self, SLboolean async); 11653af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Triviextern void CAudioRecorder_Destroy(void *self); 11663af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi 1167d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern SLresult CEngine_Realize(void *self, SLboolean async); 1168d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern void CEngine_Destroy(void *self); 11693af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi 11707e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Triviextern SLresult COutputMix_Realize(void *self, SLboolean async); 11717e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Triviextern SLresult COutputMix_Resume(void *self, SLboolean async); 11727e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Triviextern void COutputMix_Destroy(void *self); 11737e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi 117400d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#ifdef USE_SDL 1175768edbc2a8e7f197548cf1141689dd237d19c455Glenn Kastenextern void SDL_open(IEngine *thisEngine); 1176768edbc2a8e7f197548cf1141689dd237d19c455Glenn Kastenextern void SDL_close(void); 117700d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#endif 1178510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_REALIZING_1 ((SLuint32) 0x4) // async realize on work queue 1179510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_REALIZING_2 ((SLuint32) 0x5) // sync realize, or async realize hook 1180510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_RESUMING_1 ((SLuint32) 0x6) // async resume on work queue 1181510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_RESUMING_2 ((SLuint32) 0x7) // sync resume, or async resume hook 1182510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_SUSPENDING ((SLuint32) 0x8) // suspend in progress 1183510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_REALIZING_1A ((SLuint32) 0x9) // abort while async realize on work queue 1184510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_RESUMING_1A ((SLuint32) 0xA) // abort while async resume on work queue 1185d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern void *sync_start(void *arg); 1186d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern SLresult err_to_result(int err); 11877245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten 11887245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten#ifdef __GNUC__ 1189d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define ctz __builtin_ctz 11907245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten#else 11917245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kastenextern unsigned ctz(unsigned); 11927245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten#endif 119340d1c40832a448e23d0bb37512aee53222575c2eGlenn Kastenextern const char * const interface_names[MPH_MAX]; 1194e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#include "platform.h" 1195e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten 1196e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten// Attributes 1197e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten 11983c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#define ATTR_NONE ((unsigned) 0x0) // none 11993c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#define ATTR_GAIN ((unsigned) 0x1 << 0) // player volume, channel mute, channel solo, 12003c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi // player stereo position, player mute 12013c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#define ATTR_TRANSPORT ((unsigned) 0x1 << 1) // play state, looping 12023c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#define ATTR_POSITION ((unsigned) 0x1 << 2) // requested position (a.k.a. seek position) 1203343c522ebf4f9c321eef8c3b3b2945f1c1cb8846Glenn Kasten#define ATTR_ENQUEUE ((unsigned) 0x1 << 3) // buffer queue became non-empty and in playing state 1204a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten 1205a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten#define SL_DATALOCATOR_NULL 0 // application specified a NULL value for pLocator 1206a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten#define SL_DATAFORMAT_NULL 0 // application specified a NULL or undefined value for pFormat 1207ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 12087a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten// Trace debugging 12097a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten 12104c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten// Always defined, but may be a no-op if trace support is disabled at compile-time 12114c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceSetEnabled(unsigned enabled); 12124c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten 12134c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_TRACE_ENTER 0x1 12144c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_TRACE_LEAVE_FAILURE 0x2 12154c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_TRACE_LEAVE_VOID 0x4 12164597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten#define SL_TRACE_LEAVE_SUCCESS 0x8 12174597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten#define SL_TRACE_LEAVE (SL_TRACE_LEAVE_FAILURE | SL_TRACE_LEAVE_VOID | \ 12184597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten SL_TRACE_LEAVE_SUCCESS) 12194597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten#define SL_TRACE_ALL (SL_TRACE_ENTER | SL_TRACE_LEAVE) 12204c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_TRACE_DEFAULT (SL_TRACE_LEAVE_FAILURE) 12214c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten 12227a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#ifndef USE_TRACE 12237a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten 1224486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_ENTER_GLOBAL SLresult result; 1225486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_LEAVE_GLOBAL return result; 1226486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_ENTER_INTERFACE SLresult result; 1227486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_LEAVE_INTERFACE return result; 1228486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_ENTER_INTERFACE_VOID 1229486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_LEAVE_INTERFACE_VOID return; 12307a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten 1231ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#else 12327a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten 12334c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceEnterGlobal(const char *function); 12344c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceLeaveGlobal(const char *function, SLresult result); 12354c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceEnterInterface(const char *function); 12364c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceLeaveInterface(const char *function, SLresult result); 12374c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceEnterInterfaceVoid(const char *function); 12384c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceLeaveInterfaceVoid(const char *function); 12394c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_ENTER_GLOBAL SLresult result; slTraceEnterGlobal(__FUNCTION__); 12404c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_LEAVE_GLOBAL slTraceLeaveGlobal(__FUNCTION__, result); return result; 12414c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_ENTER_INTERFACE SLresult result; slTraceEnterInterface(__FUNCTION__); 12424c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_LEAVE_INTERFACE slTraceLeaveInterface(__FUNCTION__, result); return result; 12434c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_ENTER_INTERFACE_VOID slTraceEnterInterfaceVoid(__FUNCTION__); 12444c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_LEAVE_INTERFACE_VOID slTraceLeaveInterfaceVoid(__FUNCTION__); return; 12457a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten 1246ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#endif 12470b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten 1248fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#ifdef USE_DEBUG 12494b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#define SL_LOGE(...) do { fprintf(stderr, "ERROR: %s:%s:%d ", __FILE__, __FUNCTION__, __LINE__); \ 12504b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten fprintf(stderr, __VA_ARGS__); fputc('\n', stderr); } while(0) 12514b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#define SL_LOGV(...) do { fprintf(stderr, "VERBOSE: %s:%s:%d ", __FILE__, __FUNCTION__, __LINE__); \ 12524b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten fprintf(stderr, __VA_ARGS__); fputc('\n', stderr); } while(0) 1253fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#else 1254fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#define SL_LOGE(...) do { } while (0) 1255fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#define SL_LOGV(...) do { } while (0) 1256fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#endif 12574b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 12584b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#ifdef USE_OUTPUTMIXEXT 12594b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 12604b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#define SL_PLAYSTATE_STOPPING ((SLuint32) 0x4) // Play::Stop while PLAYING 12614b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten// If we needed it, could have PLAYING mean mixer is currently reading from front buffer, 12624b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten// while PLAYABLE would mean application requested PLAYING, but buffer queue is empty 12634b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 12644b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#endif 12654b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 12664b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#ifdef USE_SNDFILE 12674b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kastenextern void audioPlayerTransportUpdate(CAudioPlayer *audioPlayer); 12684b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#endif 12694b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#ifdef ANDROID 12704b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kastenextern SLresult android_audioPlayerClear(CAudioPlayer *pAudioPlayer); 12710b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten#endif 1272e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten 1273e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kastenextern SLresult IBufferQueue_Enqueue(SLBufferQueueItf self, const void *pBuffer, SLuint32 size); 1274e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kastenextern SLresult IBufferQueue_Clear(SLBufferQueueItf self); 1275e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kastenextern SLresult IBufferQueue_RegisterCallback(SLBufferQueueItf self, 1276e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten slBufferQueueCallback callback, void *pContext); 1277e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten 1278e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kastenextern bool IsInterfaceInitialized(IObject *this, unsigned MPH); 1279