1193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi/* 2193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project 3193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * 4193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 5193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * you may not use this file except in compliance with the License. 6193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * You may obtain a copy of the License at 7193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * 8193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 9193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * 10193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 11193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 12193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * See the License for the specific language governing permissions and 14193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * limitations under the License. 15193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi */ 16193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 1710ee2bc6119445f4339ecef998c40c9cc95057cdGlenn Kasten/** \file sles_allinclusive.h Everything including the kitchen sink */ 1810ee2bc6119445f4339ecef998c40c9cc95057cdGlenn Kasten 192dc537a086811c9a97e1f925ace16be7d0b0fcb4Glenn Kasten#include "SLES/OpenSLES.h" 2051cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten#ifdef ANDROID 2151cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten#include "SLES/OpenSLES_Android.h" 2251cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten#endif 23193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <stddef.h> // offsetof 24193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <stdlib.h> // malloc 25193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <string.h> // memcmp 26193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <stdio.h> // debugging 27193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <assert.h> // debugging 28193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <pthread.h> 29d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten#include <unistd.h> // usleep 30437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten#include <errno.h> 31193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 329c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten#ifndef __cplusplus 339c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kastentypedef int bool; 349c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten#ifndef false 359c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten#define false 0 369c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten#endif 379c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten#ifndef true 389c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten#define true 1 399c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten#endif 409c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten#endif 419c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten 4251cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten// The OpenSLES.h definitions of SL_PROFILES_... have casts, so are unusable by preprocessor 4351cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten#define USE_PROFILES_PHONE 0x1 // == SL_PROFILES_PHONE 4451cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten#define USE_PROFILES_MUSIC 0x2 // == SL_PROFILES_MUSIC 4551cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten#define USE_PROFILES_GAME 0x4 // == SL_PROFILES_GAME 4651cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten// Pseudo profiles, used to decide whether to include code for incomplete or untested features 4751cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten// Features that are not in union of all profiles: audio recorder, LED, Vibra 4851cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten#define USE_PROFILES_OPTIONAL 0x8 4951cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten// Features that are in the intersection of all profiles: 5051cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten// object priorities, preemption, loss of control, device configuration 5151cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten#define USE_PROFILES_BASE 0x10 5251cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten 53193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "MPH.h" 54193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "MPH_to.h" 5582b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten#include "devices.h" 56793ddb6dae36d6b5abf5a75f8f51b4182c5646d1Glenn Kasten#include "OpenSLESUT.h" 57437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten#include "ThreadPool.h" 58193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 594c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kastentypedef struct CAudioPlayer_struct CAudioPlayer; 60bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivitypedef struct CAudioRecorder_struct CAudioRecorder; 61ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kastentypedef struct C3DGroup_struct C3DGroup; 6215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kastentypedef struct COutputMix_struct COutputMix; 634c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten 64193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_SNDFILE 65193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <sndfile.h> 66aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten#include "SLSndFile.h" 67193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif // USE_SNDFILE 68193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 69193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_SDL 70193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <SDL/SDL_audio.h> 71193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif // USE_SDL 72193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 739db8335361c67c4ed877f68218835df96ce43a4bJean-Michel Trivi#ifdef ANDROID 74f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten#include <utils/Log.h> 755bd7bea2bbc5133d26cdcd8b95d3452bd0116680Jean-Michel Trivi#include <utils/KeyedVector.h> 76de8654b40c7701ea213c157448cbb96c29522e39Jean-Michel Trivi#include "SLES/OpenSLES_AndroidConfiguration.h" 77193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "media/AudioSystem.h" 78bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#include "media/mediarecorder.h" 79bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#include "media/AudioRecord.h" 80193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "media/AudioTrack.h" 81193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "media/mediaplayer.h" 82ff9f51f17b6c00beaa51698e22873a979c7b3ff6Glenn Kasten#ifndef USE_BACKPORT 831f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi#include "media/AudioEffect.h" 841f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi#include "media/EffectApi.h" 851f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi#include "media/EffectEqualizerApi.h" 86339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#include "media/EffectBassBoostApi.h" 878e564b93da69313ffddcd1f457d0549b7dedaa76Jean-Michel Trivi#include "media/EffectVirtualizerApi.h" 88dc098b54cd7df1b79b4560ae0570d88e4b9f751eJean-Michel Trivi#include "media/EffectPresetReverbApi.h" 89dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#include "media/EffectEnvironmentalReverbApi.h" 90ff9f51f17b6c00beaa51698e22873a979c7b3ff6Glenn Kasten#endif 910263d22efc4ad9420b367ec61b5a1d1ec72cebb9Jean-Michel Trivi#include <utils/String8.h> 928a307c7272108766eebabc7fa7044d7510d65f77Jean-Michel Trivi#define ANDROID_SL_MILLIBEL_MAX 0 93f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten#include <binder/ProcessState.h> 94ac4f9bf82c3321d2436485a3d4d0d490079872c6Jean-Michel Trivi#include "android_sles_conversions.h" 95ff9f51f17b6c00beaa51698e22873a979c7b3ff6Glenn Kasten#ifndef USE_BACKPORT 965d9e8432d0217fe139987703b8e1f129296171ffJean-Michel Trivi#include "android_SfPlayer.h" 97dc098b54cd7df1b79b4560ae0570d88e4b9f751eJean-Michel Trivi#include "android_OutputMix.h" 98ff9f51f17b6c00beaa51698e22873a979c7b3ff6Glenn Kasten#endif 99bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#include "android_AudioRecorder.h" 100193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 101193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 10215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#define STEREO_CHANNELS 2 10315f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten 104193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 105193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "OutputMixExt.h" 106193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 107193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 10803716fc64636a68ba59881508e80550b948f0f40Glenn Kasten#include "sllog.h" 10903716fc64636a68ba59881508e80550b948f0f40Glenn Kasten 110193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// Hook functions 111193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 112193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivitypedef void (*VoidHook)(void *self); 1132a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten//typedef SLresult (*ResultHook)(void *self); 1148a47ad52488855f50b95da649744dde3a254698bJean-Michel Trivitypedef SLresult (*AsyncHook)(void *self, SLboolean async); 1154f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kastentypedef bool (*BoolHook)(void *self); 1164cf440cd9f6106db00571345af7aa02529c9a10aJean-Michel Trivi 117bd2fc031926582ee8b0df40673c66dfa4cc45a61Glenn Kasten// Describes how an interface is related to a given class, used in iid_vtable::mInterface 118193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 119bd2fc031926582ee8b0df40673c66dfa4cc45a61Glenn Kasten#define INTERFACE_IMPLICIT 0 // no need for application to request prior to GetInterface 120bd2fc031926582ee8b0df40673c66dfa4cc45a61Glenn Kasten#define INTERFACE_EXPLICIT 1 // must be requested explicitly during object creation 121bd2fc031926582ee8b0df40673c66dfa4cc45a61Glenn Kasten#define INTERFACE_DYNAMIC 2 // can be requested after object creation 122bd2fc031926582ee8b0df40673c66dfa4cc45a61Glenn Kasten#define INTERFACE_UNAVAILABLE 3 // this interface is not available on objects of this class 1239a889c24ace7bbc9659e1531d7a61dc43452d7c0Glenn Kasten#define INTERFACE_IMPLICIT_PREREALIZE 4 // implicit, and can call GetInterface before Realize 1249a889c24ace7bbc9659e1531d7a61dc43452d7c0Glenn Kasten#define INTERFACE_EXPLICIT_PREREALIZE 5 // explicit, and can call GetInterface before Realize 1259a889c24ace7bbc9659e1531d7a61dc43452d7c0Glenn Kasten// 6 and 7 are reserved for the meaningless DYNAMIC_PREREALIZE and UNAVAILABLE_PREREALIZE 12604bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten// note that INTERFACE_OPTIONAL is always re-mapped to one of the above 1279a889c24ace7bbc9659e1531d7a61dc43452d7c0Glenn Kasten#define INTERFACE_PREREALIZE 4 // bit-mask to test for calling GetInterface before Realize 12804bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten 12904bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten// Profile-specific interfaces 13004bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten 13151cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten#if USE_PROFILES & USE_PROFILES_BASE 13204bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_IMPLICIT_BASE INTERFACE_IMPLICIT 13304bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_EXPLICIT_BASE INTERFACE_EXPLICIT 13404bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#else 13504bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_IMPLICIT_BASE INTERFACE_UNAVAILABLE 13604bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_EXPLICIT_BASE INTERFACE_UNAVAILABLE 13704bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#endif 13804bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten 13951cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten#if USE_PROFILES & USE_PROFILES_GAME 14004bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_DYNAMIC_GAME INTERFACE_DYNAMIC 14104bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_EXPLICIT_GAME INTERFACE_EXPLICIT 14204bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#else 14304bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_DYNAMIC_GAME INTERFACE_OPTIONAL 14404bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_EXPLICIT_GAME INTERFACE_OPTIONAL 14504bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#endif 14604bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten 14751cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten#if USE_PROFILES & USE_PROFILES_MUSIC 14804bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_DYNAMIC_MUSIC INTERFACE_DYNAMIC 14904bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#else 15004bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_DYNAMIC_MUSIC INTERFACE_OPTIONAL 15104bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#endif 15204bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten 15351cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten#if USE_PROFILES & (USE_PROFILES_GAME | USE_PROFILES_MUSIC) 15404bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_DYNAMIC_GAME_MUSIC INTERFACE_DYNAMIC 15504bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_EXPLICIT_GAME_MUSIC INTERFACE_EXPLICIT 15604bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#else 15704bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_DYNAMIC_GAME_MUSIC INTERFACE_OPTIONAL 15804bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_EXPLICIT_GAME_MUSIC INTERFACE_OPTIONAL 15904bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#endif 16004bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten 16151cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten#if USE_PROFILES & (USE_PROFILES_GAME | USE_PROFILES_PHONE) 16204bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_EXPLICIT_GAME_PHONE INTERFACE_EXPLICIT 16304bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#else 16404bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_EXPLICIT_GAME_PHONE INTERFACE_OPTIONAL 16504bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#endif 16604bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten 16751cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten#if USE_PROFILES & USE_PROFILES_OPTIONAL 16804bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_OPTIONAL INTERFACE_EXPLICIT 16904bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_DYNAMIC_OPTIONAL INTERFACE_DYNAMIC 170f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten#else 17104bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_OPTIONAL INTERFACE_UNAVAILABLE 17204bd7e37c043835a177bedc7cc7520c30d32951aGlenn Kasten#define INTERFACE_DYNAMIC_OPTIONAL INTERFACE_UNAVAILABLE 173f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten#endif 174f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten 175bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten// Describes how an interface is related to a given object 176bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten 1772a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#define INTERFACE_UNINITIALIZED 0 ///< not available 1782a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#define INTERFACE_INITIALIZED 1 ///< not requested at object creation time 1792a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#define INTERFACE_EXPOSED 2 ///< requested at object creation time 1802a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#define INTERFACE_ADDING_1 3 ///< part 1 of asynchronous AddInterface, pending 1812a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#define INTERFACE_ADDING_2 4 ///< synchronous AddInterface, or part 2 of asynchronous 1822a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#define INTERFACE_ADDED 5 ///< AddInterface has completed 1832a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#define INTERFACE_REMOVING 6 ///< unlocked phase of (synchronous) RemoveInterface 1842a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#define INTERFACE_SUSPENDING 7 ///< suspend in progress 1852a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#define INTERFACE_SUSPENDED 8 ///< suspend has completed 1862a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#define INTERFACE_RESUMING_1 9 ///< part 1 of asynchronous ResumeInterface, pending 1872a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#define INTERFACE_RESUMING_2 10 ///< synchronous ResumeInterface, or part 2 of asynchronous 1882a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#define INTERFACE_ADDING_1A 11 ///< part 1 of asynchronous AddInterface, aborted 1892a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#define INTERFACE_RESUMING_1A 12 ///< part 1 of asynchronous ResumeInterface, aborted 190bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten 191de8654b40c7701ea213c157448cbb96c29522e39Jean-Michel Trivi 192193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// Maps an interface ID to its offset within the class that exposes it 193193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 194193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivistruct iid_vtable { 1951a6bb4f8e738c9387dc9629db294ea5de618a53cGlenn Kasten unsigned char mMPH; // primary MPH for this interface, does not include any aliases 1961a6bb4f8e738c9387dc9629db294ea5de618a53cGlenn Kasten unsigned char mInterface; // relationship of interface to this class 197193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi /*size_t*/ unsigned short mOffset; 198193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi}; 199193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 200193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// Per-class const data shared by all instances of the same class 201193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 202903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 2031a6bb4f8e738c9387dc9629db294ea5de618a53cGlenn Kasten const struct iid_vtable *mInterfaces; // maps interface index to info about that interface 204bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint32 mInterfaceCount; // number of possible interfaces 205193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const signed char *mMPH_to_index; 206ee35e132113602e20012829377d16f0572c61195Glenn Kasten const char * const mName; 207193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi size_t mSize; 208193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mObjectID; 209bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten // hooks 2108a47ad52488855f50b95da649744dde3a254698bJean-Michel Trivi AsyncHook mRealize; 211bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten AsyncHook mResume; 212193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi VoidHook mDestroy; 2134f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kasten BoolHook mPreDestroy; 214903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} ClassTable; 215193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 216193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// BufferHeader describes each element of a BufferQueue, other than the data 217193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 218437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastentypedef struct { 219193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const void *mBuffer; 220193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mSize; 221437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten} BufferHeader; 222193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 223aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten#ifdef __cplusplus 224aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten#define this this_ 225aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten#endif 226aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten 227193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_SNDFILE 228193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 229ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten#define SndFile_BUFSIZE 512 // in 16-bit samples 230ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten#define SndFile_NUMBUFS 2 231ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten 232193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivistruct SndFile { 233193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // save URI also? 234193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLchar *mPathname; 235193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SNDFILE *mSNDFILE; 23623c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten SF_INFO mSfInfo; 23715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten pthread_mutex_t mMutex; // protects mSNDFILE only 23815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLboolean mEOF; // sf_read returned zero sample frames 23966f75c45c9aea410b1f913d76995661e72571b67Glenn Kasten SLuint32 mWhich; // which buffer to use next 240ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten short mBuffer[SndFile_BUFSIZE * SndFile_NUMBUFS]; 241193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi}; 242193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 243193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif // USE_SNDFILE 244193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 2454c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten/* Our own merged version of SLDataSource and SLDataSink */ 2464c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten 2474c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kastentypedef union { 2484c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLuint32 mLocatorType; 2494c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataLocator_Address mAddress; 2504c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataLocator_BufferQueue mBufferQueue; 2514c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataLocator_IODevice mIODevice; 2524c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataLocator_MIDIBufferQueue mMIDIBufferQueue; 2534c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataLocator_OutputMix mOutputMix; 2544c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataLocator_URI mURI; 255c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#ifdef ANDROID 256c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLDataLocator_AndroidFD mFD; 257c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#endif 2584c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten} DataLocator; 2594c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten 2604c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kastentypedef union { 2614c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLuint32 mFormatType; 2624c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataFormat_PCM mPCM; 2634c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataFormat_MIME mMIME; 2644c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten} DataFormat; 2654c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten 2664c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kastentypedef struct { 2674c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten union { 2684c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataSource mSource; 2694c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten SLDataSink mSink; 2704c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten struct { 2714c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten DataLocator *pLocator; 2724c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten DataFormat *pFormat; 2734c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten } mNeutral; 2744c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten } u; 2754c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten DataLocator mLocator; 2764c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten DataFormat mFormat; 2774c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten} DataLocatorFormat; 2784c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten 279193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi/* Interface structures */ 280193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 281903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct Object_interface { 28215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten const struct SLObjectItf_ *mItf; // const 28332a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten // field mThis would be redundant within an IObject, so we substitute mEngine 28415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten struct Engine_interface *mEngine; // const 28515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten const ClassTable *mClass; // const 28631df22b193ea7c7c331d26a27fa6756a89c8ec3cGlenn Kasten SLuint32 mInstanceID; // const for debugger and for RPC, 0 means unpublished 287903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten slObjectCallback mCallback; 288903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten void *mContext; 2899c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten unsigned mGottenMask; ///< bit-mask of interfaces exposed or added, then gotten 290903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten unsigned mLossOfControlMask; // interfaces with loss of control enabled 29115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten unsigned mAttributesMask; // attributes which have changed since last sync 29251cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten#if USE_PROFILES & USE_PROFILES_BASE 293903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten SLint32 mPriority; 294f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten#endif 295903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten pthread_mutex_t mMutex; 2963190a0da044e122c1c617e30d1d364701fb27110Glenn Kasten#ifdef USE_DEBUG 2973190a0da044e122c1c617e30d1d364701fb27110Glenn Kasten pthread_t mOwner; 2983190a0da044e122c1c617e30d1d364701fb27110Glenn Kasten const char *mFile; 2993190a0da044e122c1c617e30d1d364701fb27110Glenn Kasten int mLine; 3003190a0da044e122c1c617e30d1d364701fb27110Glenn Kasten#endif 301903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten pthread_cond_t mCond; 302bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mState; // really SLuint32, but SLuint8 to save space 30351cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten#if USE_PROFILES & USE_PROFILES_BASE 304bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mPreemptable; // really SLboolean, but SLuint8 to save space 305f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten#else 306f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten SLuint8 mPadding; 307f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten#endif 3084f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kasten SLuint8 mStrongRefCount; // number of strong references to this object 3094f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kasten // (object cannot be destroyed as long as > 0, and referrers _prefer_ it stay in Realized state) 310bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten // for best alignment, do not add any fields here 3114f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kasten#define INTERFACES_Default 1 312bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates[INTERFACES_Default]; // state of each of interface 31315f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten // do not add any fields here 314903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IObject; 315903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten 31682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten#include "locks.h" 31782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 318903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 319903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten const struct SL3DCommitItf_ *mItf; 320903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 321193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mDeferred; 322d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten SLuint32 mGeneration; // incremented each master clock cycle 323c37c934e00a96afe18aaadd9f9a1863c721bf8eaGlenn Kasten SLuint32 mWaiting; // number of threads waiting in Commit 324903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DCommit; 325193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 326d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kastenenum CartesianSphericalActive { 327d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten CARTESIAN_COMPUTED_SPHERICAL_SET, 328d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten CARTESIAN_REQUESTED_SPHERICAL_SET, 329d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten CARTESIAN_UNKNOWN_SPHERICAL_SET, 330d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten CARTESIAN_SET_SPHERICAL_COMPUTED, // not in 1.0.1 331d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten CARTESIAN_SET_SPHERICAL_REQUESTED, // not in 1.0.1 332d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten CARTESIAN_SET_SPHERICAL_UNKNOWN 333d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten}; 334d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten 335903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 336193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SL3DDopplerItf_ *mItf; 337903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 338d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // The API allows client to specify either Cartesian and spherical velocities. 339d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // But an implementation will likely prefer one or the other. So for 340d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // maximum portablity, we maintain both units and an indication of which 341d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // unit was set most recently. In addition, we keep a flag saying whether 342d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // the other unit has been derived yet. It can take significant time 343d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // to compute the other unit, so this may be deferred to another thread. 344d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // For this reason we also keep an indication of whether the secondary 345d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // has been computed yet, and its accuracy. 346d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // Though only one unit is primary at a time, a union is inappropriate: 347d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // the application might read in both units (not in 1.0.1), 348d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // and due to multi-threading concerns. 349d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mVelocityCartesian; 350d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten struct { 351d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten SLmillidegree mAzimuth; 352d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten SLmillidegree mElevation; 353d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten SLmillidegree mSpeed; 354d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten } mVelocitySpherical; 355d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten enum CartesianSphericalActive mVelocityActive; 356193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mDopplerFactor; 357903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DDoppler; 358193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 359903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 360193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SL3DGroupingItf_ *mItf; 361903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 36231df22b193ea7c7c331d26a27fa6756a89c8ec3cGlenn Kasten C3DGroup *mGroup; // strong reference to associated group or NULL 363903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DGrouping; 364193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 365d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kastenenum AnglesVectorsActive { 366d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten ANGLES_COMPUTED_VECTORS_SET, // not in 1.0.1 367d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten ANGLES_REQUESTED_VECTORS_SET, // not in 1.0.1 368d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten ANGLES_UNKNOWN_VECTORS_SET, 369d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten ANGLES_SET_VECTORS_COMPUTED, 370d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten ANGLES_SET_VECTORS_REQUESTED, 371d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten ANGLES_SET_VECTORS_UNKNOWN 372d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten}; 373d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten 374903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 375193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SL3DLocationItf_ *mItf; 376903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 377d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mLocationCartesian; 378d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten struct { 379d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mAzimuth; 380d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mElevation; 381d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillimeter mDistance; 382d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten } mLocationSpherical; 383d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten enum CartesianSphericalActive mLocationActive; 384d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten struct { 385d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mHeading; 386d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mPitch; 387d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mRoll; 388d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten } mOrientationAngles; 389d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten struct { 390d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mFront; 391d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mAbove; 392d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mUp; 393d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten } mOrientationVectors; 394d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten enum AnglesVectorsActive mOrientationActive; 395d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // Rotations can be slow, so are deferred. 396d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mTheta; 397d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mAxis; 398d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLboolean mRotatePending; 399903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DLocation; 400193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 401903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 402193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SL3DMacroscopicItf_ *mItf; 403903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 404193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi struct { 405193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mWidth; 406193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mHeight; 407193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mDepth; 408193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi } mSize; 409193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi struct { 410193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mHeading; 411193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mPitch; 412193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mRoll; 413193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi } mOrientationAngles; 414193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi struct { 415193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLVec3D mFront; 416f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten SLVec3D mAbove; 417193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLVec3D mUp; 418193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi } mOrientationVectors; 419d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten enum AnglesVectorsActive mOrientationActive; 420d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten // Rotations can be slow, so are deferred. 421d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mTheta; 422d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLVec3D mAxis; 423d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLboolean mRotatePending; 424903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DMacroscopic; 425193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 426903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 427193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SL3DSourceItf_ *mItf; 428903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 429193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mHeadRelative; 430193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mRolloffMaxDistanceMute; 431193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mMaxDistance; 432193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillimeter mMinDistance; 433d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mConeInnerAngle; 434d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten SLmillidegree mConeOuterAngle; 435193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillibel mConeOuterLevel; 436193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mRolloffFactor; 437193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mRoomRolloffFactor; 438193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint8 mDistanceModel; 439903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DSource; 440193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 441903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 442193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLAudioDecoderCapabilitiesItf_ *mItf; 443903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 444903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IAudioDecoderCapabilities; 445193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 446903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 447193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLAudioEncoderItf_ *mItf; 448903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 449193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLAudioEncoderSettings mSettings; 450903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IAudioEncoder; 451193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 452903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 453193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLAudioEncoderCapabilitiesItf_ *mItf; 454903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 455903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IAudioEncoderCapabilities; 456193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 457903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 458193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLAudioIODeviceCapabilitiesItf_ *mItf; 459903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 460d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten slAvailableAudioInputsChangedCallback mAvailableAudioInputsChangedCallback; 461d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten void *mAvailableAudioInputsChangedContext; 462d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten slAvailableAudioOutputsChangedCallback mAvailableAudioOutputsChangedCallback; 463d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten void *mAvailableAudioOutputsChangedContext; 464d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten slDefaultDeviceIDMapChangedCallback mDefaultDeviceIDMapChangedCallback; 465d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten void *mDefaultDeviceIDMapChangedContext; 466903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IAudioIODeviceCapabilities; 467193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 468903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 469193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLBassBoostItf_ *mItf; 470903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 471193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mEnabled; 472193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mStrength; 473339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT) 474339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi effect_descriptor_t mBassBoostDescriptor; 475339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi android::sp<android::AudioEffect> mBassBoostEffect; 476339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#endif 477903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IBassBoost; 478193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 479903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct BufferQueue_interface { 480193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLBufferQueueItf_ *mItf; 481903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 48209f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten SLBufferQueueState mState; 483193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slBufferQueueCallback mCallback; 484193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mContext; 48523c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten // originally SLuint32, but range-checked down to SLuint16 48623c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten SLuint16 mNumBuffers; 48723c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten /*SLboolean*/ SLuint16 mClearRequested; 488437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten BufferHeader *mArray; 489437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten BufferHeader *mFront, *mRear; 49023c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten#ifdef ANDROID 49115005fc0b676f8b4091528b8a9eb2705dd3820c2Jean-Michel Trivi SLuint32 mSizeConsumed; 49223c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten#endif 493193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // saves a malloc in the typical case 494193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define BUFFER_HEADER_TYPICAL 4 495437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten BufferHeader mTypical[BUFFER_HEADER_TYPICAL+1]; 496903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IBufferQueue; 497193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 4982a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#define MAX_DEVICE 2 // hard-coded array size for default in/out 4997e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten 500903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 501193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLDeviceVolumeItf_ *mItf; 502903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 503f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten SLint32 mVolume[MAX_DEVICE]; 504903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IDeviceVolume; 505193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 506903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 507193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLDynamicInterfaceManagementItf_ *mItf; 508903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 509193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slDynamicInterfaceManagementCallback mCallback; 510193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mContext; 511903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IDynamicInterfaceManagement; 512193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 513903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 514193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLDynamicSourceItf_ *mItf; 515903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 516193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLDataSource *mDataSource; 517903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IDynamicSource; 518193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 519193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// private 520193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 521193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivistruct EnableLevel { 522193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mEnable; 523193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillibel mSendLevel; 524193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi}; 525193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 526bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten// indexes into IEffectSend.mEnableLevels 527bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten 528bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define AUX_ENVIRONMENTALREVERB 0 529bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define AUX_PRESETREVERB 1 530bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define AUX_MAX 2 531bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten 532903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 533193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLEffectSendItf_ *mItf; 534903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 53515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten struct EnableLevel mEnableLevels[AUX_MAX]; // wet enable and volume per effect type 536903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEffectSend; 537903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten 538d55d250a016c1400cc00b5e1ac5baaa095702585Glenn Kastentypedef struct Engine_interface { 539193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLEngineItf_ *mItf; 540903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 541193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mLossOfControlGlobal; 54299cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kasten#ifdef USE_SDL 54315f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten COutputMix *mOutputMix; // SDL pulls PCM from an arbitrary IOutputMixExt 54499cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kasten#endif 545193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // Each engine is its own universe. 546903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten SLuint32 mInstanceCount; 54732a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten unsigned mInstanceMask; // 1 bit per active object 54815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten unsigned mChangedMask; // objects which have changed since last sync 54951cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten#define MAX_INSTANCE 32 // maximum active objects per engine, see mInstanceMask 55032a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten IObject *mInstances[MAX_INSTANCE]; 551437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten SLboolean mShutdown; 55215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLboolean mShutdownAck; 553437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten ThreadPool mThreadPool; // for asynchronous operations 554ff9f51f17b6c00beaa51698e22873a979c7b3ff6Glenn Kasten#if defined(ANDROID) && !defined(USE_BACKPORT) 555dc098b54cd7df1b79b4560ae0570d88e4b9f751eJean-Michel Trivi // FIXME number of presets will only be saved in IEqualizer, preset names will not be stored 5561f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi SLuint32 mEqNumPresets; 5571f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi char** mEqPresetNames; 5581f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi#endif 559903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEngine; 560193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 561903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 562193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLEngineCapabilitiesItf_ *mItf; 563903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 564193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mThreadSafe; 5657e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten // const 5667e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten SLuint32 mMaxIndexLED; 5677e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten SLuint32 mMaxIndexVibra; 568903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEngineCapabilities; 569193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 570903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 571193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLEnvironmentalReverbItf_ *mItf; 572903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 573193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLEnvironmentalReverbSettings mProperties; 57468817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT) 57568817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi effect_descriptor_t mEnvironmentalReverbDescriptor; 57668817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi android::sp<android::AudioEffect> mEnvironmentalReverbEffect; 57768817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi#endif 578903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEnvironmentalReverb; 579193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 580193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivistruct EqualizerBand { 581193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmilliHertz mMin; 582193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmilliHertz mCenter; 5834c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten SLmilliHertz mMax; 584193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi}; 585193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 586ff9f51f17b6c00beaa51698e22873a979c7b3ff6Glenn Kasten#if defined(ANDROID) && !defined(USE_BACKPORT) 5871f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi#define MAX_EQ_BANDS 0 5881f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi#else 58909f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten#define MAX_EQ_BANDS 4 // compile-time limit, runtime limit may be smaller 5901f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi#endif 59109f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten 592903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 593193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLEqualizerItf_ *mItf; 594903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 595193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mEnabled; 596193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mPreset; 5972a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#if 0 < MAX_EQ_BANDS 59809f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten SLmillibel mLevels[MAX_EQ_BANDS]; 5992a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#endif 60009f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten // const to end of struct 601193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mNumPresets; 602193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mNumBands; 6032a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#if !defined(ANDROID) || defined(USE_BACKPORT) 6044c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten const struct EqualizerBand *mBands; 60509f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten const struct EqualizerPreset *mPresets; 6062a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#endif 6074c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten SLmillibel mBandLevelRangeMin; 6084c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten SLmillibel mBandLevelRangeMax; 609ff9f51f17b6c00beaa51698e22873a979c7b3ff6Glenn Kasten#if defined(ANDROID) && !defined(USE_BACKPORT) 6101f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi effect_descriptor_t mEqDescriptor; 6111f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi android::sp<android::AudioEffect> mEqEffect; 6121f5702ed2239c79b701aa8cc3c675798b34a9656Jean-Michel Trivi#endif 613903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEqualizer; 614193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 61509f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten#define MAX_LED_COUNT 32 61609f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten 617903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 618193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLLEDArrayItf_ *mItf; 619903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 620193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mLightMask; 62109f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten SLHSL mColors[MAX_LED_COUNT]; 622193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // const 623193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint8 mCount; 624903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} ILEDArray; 625193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 626903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 627193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMetadataExtractionItf_ *mItf; 628903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 629193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mKeySize; 630193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const void *mKey; 631193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mKeyEncoding; 632193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const SLchar *mValueLangCountry; 633193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mValueEncoding; 634193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint8 mFilterMask; 635ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten int mKeyFilter; 636903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMetadataExtraction; 637193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 638903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 639193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMetadataTraversalItf_ *mItf; 640903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 641193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mIndex; 642193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mMode; 643193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mCount; 644193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mSize; 645903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMetadataTraversal; 646193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 647903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 648193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMIDIMessageItf_ *mItf; 649903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 650193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slMetaEventCallback mMetaEventCallback; 651193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mMetaEventContext; 652193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slMIDIMessageCallback mMessageCallback; 653193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mMessageContext; 6544c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten SLuint8 mMessageTypes; 655903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMIDIMessage; 656193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 657903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 658193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMIDIMuteSoloItf_ *mItf; 659903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 660193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mChannelMuteMask; 661193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mChannelSoloMask; 662193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mTrackMuteMask; 663193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mTrackSoloMask; 664437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten // const 665193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mTrackCount; 666903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMIDIMuteSolo; 667193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 668903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 669193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMIDITempoItf_ *mItf; 670903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 671193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mTicksPerQuarterNote; 672193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mMicrosecondsPerQuarterNote; 673903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMIDITempo; 674193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 675903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 676193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMIDITimeItf_ *mItf; 677903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 678193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mDuration; 679193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mPosition; 680193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mStartTick; 681193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mNumTicks; 682903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMIDITime; 683193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 684903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 685193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLMuteSoloItf_ *mItf; 686903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 6879c2a7b1e9f8203bf9de26efca0f1f805038b1f2bGlenn Kasten // fields that were formerly here are now at CAudioPlayer 688903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMuteSolo; 689193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 69032a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten#define MAX_TRACK 32 // see mActiveMask 69132a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten 692903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 693193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLOutputMixItf_ *mItf; 694903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 695d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten slMixDeviceChangeCallback mCallback; 696d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten void *mContext; 697903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IOutputMix; 698193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 699193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 700903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 701193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLOutputMixExtItf_ *mItf; 702903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 7034f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kasten unsigned mActiveMask; // 1 bit per active track 7044f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kasten Track mTracks[MAX_TRACK]; 70531df22b193ea7c7c331d26a27fa6756a89c8ec3cGlenn Kasten SLboolean mDestroyRequested; ///< Mixer to acknowledge application's call to Object::Destroy 706903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IOutputMixExt; 707193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 708193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 709903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 710193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLPitchItf_ *mItf; 711903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 712193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mPitch; 713193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // const 714193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mMinPitch; 715193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mMaxPitch; 716903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPitch; 717193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 718903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct Play_interface { 719193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLPlayItf_ *mItf; 720903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 72109f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten SLuint32 mState; 72215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten // next 2 fields are read-only to application 723193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mDuration; 724193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mPosition; 725193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slPlayCallback mCallback; 726193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mContext; 727193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mEventFlags; 72815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten // the ISeek trick of using a distinct value doesn't work here because it's readable by app 729193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mMarkerPosition; 73066f75c45c9aea410b1f913d76995661e72571b67Glenn Kasten SLmillisecond mPositionUpdatePeriod; // Zero means do not do position updates (FIXME ~0) 73166f75c45c9aea410b1f913d76995661e72571b67Glenn Kasten#ifdef USE_OUTPUTMIXEXT 73266f75c45c9aea410b1f913d76995661e72571b67Glenn Kasten SLuint32 mFrameUpdatePeriod; // mPositionUpdatePeriod in frame units 73366f75c45c9aea410b1f913d76995661e72571b67Glenn Kasten SLmillisecond mLastSeekPosition; // Last known accurate position, set at Seek 73466f75c45c9aea410b1f913d76995661e72571b67Glenn Kasten SLuint32 mFramesSinceLastSeek; // Frames mixed since last known accurate position 73566f75c45c9aea410b1f913d76995661e72571b67Glenn Kasten SLuint32 mFramesSincePositionUpdate; // Frames mixed since last position update callback 73666f75c45c9aea410b1f913d76995661e72571b67Glenn Kasten#endif 737903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPlay; 738193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 739903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 740193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLPlaybackRateItf_ *mItf; 741903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 742193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mRate; 743193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mProperties; 7444c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten // const 745193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mMinRate; 746193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mMaxRate; 747193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mStepSize; 748193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mCapabilities; 749903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPlaybackRate; 750193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 751903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 752193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLPrefetchStatusItf_ *mItf; 753903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 754193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mStatus; 755193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mLevel; 756193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slPrefetchCallback mCallback; 757193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mContext; 758193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mCallbackEventsMask; 759193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mFillUpdatePeriod; 760903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPrefetchStatus; 761193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 762903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 763193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLPresetReverbItf_ *mItf; 764903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 765193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint16 mPreset; 76668817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT) 76768817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi effect_descriptor_t mPresetReverbDescriptor; 76868817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi android::sp<android::AudioEffect> mPresetReverbEffect; 76968817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi#endif 770903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPresetReverb; 771193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 772903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 773193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLRatePitchItf_ *mItf; 774903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 775193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mRate; 7764c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten // const 777193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mMinRate; 778193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mMaxRate; 779903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IRatePitch; 780193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 781903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 782193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLRecordItf_ *mItf; 783903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 784193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mState; 785193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mDurationLimit; 786193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mPosition; 787193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slRecordCallback mCallback; 788193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mContext; 789193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mCallbackEventsMask; 790193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mMarkerPosition; 791193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mPositionUpdatePeriod; 792903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IRecord; 793193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 794903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 795193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLSeekItf_ *mItf; 796903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 79715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLmillisecond mPos; // mPos != SL_TIME_UNKNOWN means pending seek request 798193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mLoopEnabled; 799193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mStartPos; 800193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillisecond mEndPos; 801903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} ISeek; 802193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 803903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 804193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLThreadSyncItf_ *mItf; 805903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 806193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mInCriticalSection; 80715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLuint32 mWaiting; // number of threads waiting 808193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi pthread_t mOwner; 809903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IThreadSync; 810193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 811903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 812193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLVibraItf_ *mItf; 813903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 814193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mVibrate; 815193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmilliHertz mFrequency; 816193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mIntensity; 817903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IVibra; 818193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 819903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 820193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLVirtualizerItf_ *mItf; 821903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 822193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLboolean mEnabled; 823193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mStrength; 8248e564b93da69313ffddcd1f457d0549b7dedaa76Jean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT) 8258e564b93da69313ffddcd1f457d0549b7dedaa76Jean-Michel Trivi effect_descriptor_t mVirtualizerDescriptor; 8268e564b93da69313ffddcd1f457d0549b7dedaa76Jean-Michel Trivi android::sp<android::AudioEffect> mVirtualizerEffect; 8278e564b93da69313ffddcd1f457d0549b7dedaa76Jean-Michel Trivi#endif 828903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IVirtualizer; 829193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 830903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 831193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLVisualizationItf_ *mItf; 832903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 833193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi slVisualizationCallback mCallback; 834193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi void *mContext; 835193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmilliHertz mRate; 836903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IVisualization; 837193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 83815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kastentypedef struct /*Volume_interface*/ { 839193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi const struct SLVolumeItf_ *mItf; 840903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject *mThis; 84115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten // Values as specified by the application 842193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLmillibel mLevel; 843193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLpermille mStereoPosition; 844f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten SLuint8 /*SLboolean*/ mMute; 84515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLuint8 /*SLboolean*/ mEnableStereoPosition; 846903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IVolume; 847193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 848193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi/* Class structures */ 849193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 850ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten/*typedef*/ struct C3DGroup_struct { 851903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 852bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_3DGroup 6 // see MPH_to_3DGroup in MPH_to.c for list of interfaces 853bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_3DGroup - INTERFACES_Default]; 854903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 855903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DLocation m3DLocation; 856903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DDoppler m3DDoppler; 857903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DSource m3DSource; 858903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DMacroscopic m3DMacroscopic; 8592a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten // remaining are per-instance private fields not associated with an interface 860ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten unsigned mMemberMask; // set of member objects 861ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten} /*C3DGroup*/; 862193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 863b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi#ifdef ANDROID 864ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 86551cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten// FIXME Move these into the I... section above 86651cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten 867465ecf80ac962d6a59341d99d083fed7525e79afJean-Michel Trivitypedef struct { 8685bd7bea2bbc5133d26cdcd8b95d3452bd0116680Jean-Michel Trivi const struct SLAndroidEffectItf_ *mItf; 869465ecf80ac962d6a59341d99d083fed7525e79afJean-Michel Trivi IObject *mThis; 87088eb1c9e7a1a86e09fc7c56583414bb974873648Eric Laurent android::KeyedVector<SLuint32, android::AudioEffect* > *mEffects; 8715bd7bea2bbc5133d26cdcd8b95d3452bd0116680Jean-Michel Trivi} IAndroidEffect; 8725bd7bea2bbc5133d26cdcd8b95d3452bd0116680Jean-Michel Trivi 8735bd7bea2bbc5133d26cdcd8b95d3452bd0116680Jean-Michel Trivitypedef struct { 8745bd7bea2bbc5133d26cdcd8b95d3452bd0116680Jean-Michel Trivi const struct SLAndroidEffectCapabilitiesItf_ *mItf; 8755bd7bea2bbc5133d26cdcd8b95d3452bd0116680Jean-Michel Trivi IObject *mThis; 8765bd7bea2bbc5133d26cdcd8b95d3452bd0116680Jean-Michel Trivi SLuint32 mNumFx; 8775bd7bea2bbc5133d26cdcd8b95d3452bd0116680Jean-Michel Trivi effect_descriptor_t* mFxDescriptors; 8785bd7bea2bbc5133d26cdcd8b95d3452bd0116680Jean-Michel Trivi} IAndroidEffectCapabilities; 8795bd7bea2bbc5133d26cdcd8b95d3452bd0116680Jean-Michel Trivi 880984c4a1d192f83fcd2cf9e333ebe48a32a65b591Jean-Michel Trivitypedef struct { 881984c4a1d192f83fcd2cf9e333ebe48a32a65b591Jean-Michel Trivi const struct SLAndroidEffectSendItf_ *mItf; 882984c4a1d192f83fcd2cf9e333ebe48a32a65b591Jean-Michel Trivi IObject *mThis; 883984c4a1d192f83fcd2cf9e333ebe48a32a65b591Jean-Michel Trivi // only one send per interface for now (1 bus) 884984c4a1d192f83fcd2cf9e333ebe48a32a65b591Jean-Michel Trivi SLboolean mEnabled; 885984c4a1d192f83fcd2cf9e333ebe48a32a65b591Jean-Michel Trivi SLmillibel mSendLevel; //android::KeyedVector<SLuint32, SLmillibel> mSendLevels; 886984c4a1d192f83fcd2cf9e333ebe48a32a65b591Jean-Michel Trivi} IAndroidEffectSend; 887984c4a1d192f83fcd2cf9e333ebe48a32a65b591Jean-Michel Trivi 888c7369d04a4b94aca0462d0e0a38c243a80a945a9Jean-Michel Trivitypedef struct { 889c7369d04a4b94aca0462d0e0a38c243a80a945a9Jean-Michel Trivi const struct SLAndroidConfigurationItf_ *mItf; 890c7369d04a4b94aca0462d0e0a38c243a80a945a9Jean-Michel Trivi IObject *mThis; 891c7369d04a4b94aca0462d0e0a38c243a80a945a9Jean-Michel Trivi} IAndroidConfiguration; 892c7369d04a4b94aca0462d0e0a38c243a80a945a9Jean-Michel Trivi 8935bd7bea2bbc5133d26cdcd8b95d3452bd0116680Jean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT) 8945bd7bea2bbc5133d26cdcd8b95d3452bd0116680Jean-Michel Trivi// FIXME this include is done here so the effect structures have been defined. Messy. 8955bd7bea2bbc5133d26cdcd8b95d3452bd0116680Jean-Michel Trivi#include "android_Effect.h" 8965bd7bea2bbc5133d26cdcd8b95d3452bd0116680Jean-Michel Trivi#endif 8975bd7bea2bbc5133d26cdcd8b95d3452bd0116680Jean-Michel Trivi 898465ecf80ac962d6a59341d99d083fed7525e79afJean-Michel Trivi 899193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi/* 900193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * Used to define the mapping from an OpenSL ES audio player to an Android 901193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * media framework object 902193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi */ 903193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivienum AndroidObject_type { 904f2a9b6c9fc2e5a35fd5dc19e82729eb3f894534aJean-Michel Trivi INVALID_TYPE =-1, 905193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi MEDIAPLAYER = 0, 9063d2470a7f5c936182f1d6179b290814d8a620f9dJean-Michel Trivi AUDIOTRACK_PULL = 1, 907193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi NUM_AUDIOPLAYER_MAP_TYPES 908193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi}; 909226ce6a635c4a333a66b8e0ea28316a6d405ee33Jean-Michel Trivi 910b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivienum AndroidObject_state { 911b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi ANDROID_UNINITIALIZED = -1, 912b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi ANDROID_PREPARING, 913b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi ANDROID_READY, 914b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi NUM_ANDROID_STATES 915b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi}; 91651cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten 91751cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten#endif // ANDROID 918ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 919193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 9204c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten/*typedef*/ struct CAudioPlayer_struct { 921903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 922ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#ifdef ANDROID 923984c4a1d192f83fcd2cf9e333ebe48a32a65b591Jean-Michel Trivi#define INTERFACES_AudioPlayer 29 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces 924ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#else 925bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_AudioPlayer 26 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces 926ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#endif 927bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_AudioPlayer - INTERFACES_Default]; 928903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 929903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPlay mPlay; 930903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DDoppler m3DDoppler; 931903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DGrouping m3DGrouping; 932903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DLocation m3DLocation; 933903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DSource m3DSource; 934903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IBufferQueue mBufferQueue; 935903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEffectSend mEffectSend; 936903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMetadataExtraction mMetadataExtraction; 937903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMetadataTraversal mMetadataTraversal; 938903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPrefetchStatus mPrefetchStatus; 939903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IRatePitch mRatePitch; 940903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten ISeek mSeek; 941903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVolume mVolume; 94215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten IMuteSolo mMuteSolo; 943ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#ifdef ANDROID 9445bd7bea2bbc5133d26cdcd8b95d3452bd0116680Jean-Michel Trivi IAndroidEffect mAndroidEffect; 945984c4a1d192f83fcd2cf9e333ebe48a32a65b591Jean-Michel Trivi IAndroidEffectSend mAndroidEffectSend; 946d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi IAndroidConfiguration mAndroidConfiguration; 947ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#endif 948193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // optional interfaces 949903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DMacroscopic m3DMacroscopic; 950903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IBassBoost mBassBoost; 951903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicSource mDynamicSource; 952903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 953903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEqualizer mEqualizer; 954903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPitch mPitch; 955903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPresetReverb mPresetReverb; 956903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPlaybackRate mPlaybackRate; 957903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVirtualizer mVirtualizer; 958903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVisualization mVisualization; 9592a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten // remaining are per-instance private fields not associated with an interface 9604c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten DataLocatorFormat mDataSource; 9614c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten DataLocatorFormat mDataSink; 962da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi // cached data for this instance 96315f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten SLuint8 /*SLboolean*/ mMute; 9649c2a7b1e9f8203bf9de26efca0f1f805038b1f2bGlenn Kasten // Formerly at IMuteSolo 9659c2a7b1e9f8203bf9de26efca0f1f805038b1f2bGlenn Kasten SLuint8 mMuteMask; // Mask for which channels are muted: bit 0=left, 1=right 9669c2a7b1e9f8203bf9de26efca0f1f805038b1f2bGlenn Kasten SLuint8 mSoloMask; // Mask for which channels are soloed: bit 0=left, 1=right 9679c2a7b1e9f8203bf9de26efca0f1f805038b1f2bGlenn Kasten SLuint8 mNumChannels; // 0 means unknown, then const once it is known, range 1 <= x <= 8 9684bdead9570d01cd53a45ad1e0f6f94196d0e6058Jean-Michel Trivi SLuint32 mSampleRateMilliHz;// 0 means unknown, then const once it is known 9694f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kasten // Formerly at IEffectSend 9704f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kasten /** 9714f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kasten * Dry volume modified by effect send interfaces: SLEffectSendItf and SLAndroidEffectSendItf 9724f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kasten */ 9734f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kasten SLmillibel mDirectLevel; 974da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi // implementation-specific data for this instance 97515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#ifdef USE_OUTPUTMIXEXT 97610ee2bc6119445f4339ecef998c40c9cc95057cdGlenn Kasten Track *mTrack; 9774f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kasten float mGains[STEREO_CHANNELS]; ///< Computed gain based on volume, mute, solo, stereo position 9784f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kasten SLboolean mDestroyRequested; ///< Mixer to acknowledge application's call to Object::Destroy 97915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#endif 980193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_SNDFILE 981193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi struct SndFile mSndFile; 982193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif // USE_SNDFILE 983b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi#ifdef ANDROID 984060adae7c9af5b1470ca12f44d8f36a27987efcbJean-Michel Trivi android::Mutex *mpLock; 985193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi enum AndroidObject_type mAndroidObjType; 986b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi enum AndroidObject_state mAndroidObjState; 987d48ef8a6143d7981a03ba1b18b41bf1be75c0838Jean-Michel Trivi /** identifies which group of effects ("session") this player belongs to */ 988d48ef8a6143d7981a03ba1b18b41bf1be75c0838Jean-Michel Trivi int mSessionId; 9894e18ff44c76f52102a6cf7d737a91025ca28feaeJean-Michel Trivi /** identifies the Android stream type playback will occur on */ 9904e18ff44c76f52102a6cf7d737a91025ca28feaeJean-Michel Trivi int mStreamType; 991d48ef8a6143d7981a03ba1b18b41bf1be75c0838Jean-Michel Trivi /** plays the PCM data for this player */ 992474bc3d17dc75cbaf3f553d16fe21ef35071ddadJean-Michel Trivi android::AudioTrack *mAudioTrack; 993ff9f51f17b6c00beaa51698e22873a979c7b3ff6Glenn Kasten#ifndef USE_BACKPORT 9945d9e8432d0217fe139987703b8e1f129296171ffJean-Michel Trivi android::sp<android::SfPlayer> mSfPlayer; 995c35fd2e7ba670b1024a920ebf007b0fa1d92c969Jean-Michel Trivi /** aux effect the AudioTrack will be attached to if aux send enabled */ 996c35fd2e7ba670b1024a920ebf007b0fa1d92c969Jean-Michel Trivi android::sp<android::AudioEffect> mAuxEffect; 997c35fd2e7ba670b1024a920ebf007b0fa1d92c969Jean-Michel Trivi /** send level to aux effect, there's a single aux bus, so there's a single level */ 998c35fd2e7ba670b1024a920ebf007b0fa1d92c969Jean-Michel Trivi SLmillibel mAuxSendLevel; 999ff9f51f17b6c00beaa51698e22873a979c7b3ff6Glenn Kasten#endif 100015f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten /** 100115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten * Amplification (can be attenuation) factor derived for the VolumeLevel 100215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten */ 100315f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten float mAmplFromVolLevel; 100415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten /** 100515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten * Left/right amplification (can be attenuations) factors derived for the StereoPosition 100615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten */ 100715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten float mAmplFromStereoPos[STEREO_CHANNELS]; 100868817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi /** 1009984c4a1d192f83fcd2cf9e333ebe48a32a65b591Jean-Michel Trivi * Attenuation factor derived from direct level 101068817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi */ 101168817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi float mAmplFromDirectLevel; 1012193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 10134c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten} /*CAudioPlayer*/; 1014193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 1015bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi 1016bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi/*typedef*/ struct CAudioRecorder_struct { 1017193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 1018903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 1019bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#ifdef ANDROID 1020c7369d04a4b94aca0462d0e0a38c243a80a945a9Jean-Michel Trivi#define INTERFACES_AudioRecorder 11 // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces 1021bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#else 1022bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#define INTERFACES_AudioRecorder 9 // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces 1023bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#endif 102451cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_AudioRecorder - INTERFACES_Default]; 1025903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 1026903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IRecord mRecord; 1027903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IAudioEncoder mAudioEncoder; 1028193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // optional interfaces 1029903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IBassBoost mBassBoost; 1030903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicSource mDynamicSource; 1031903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEqualizer mEqualizer; 1032903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVisualization mVisualization; 1033903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVolume mVolume; 1034bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#ifdef ANDROID 1035bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi IBufferQueue mBufferQueue; 1036c7369d04a4b94aca0462d0e0a38c243a80a945a9Jean-Michel Trivi IAndroidConfiguration mAndroidConfiguration; 1037bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#endif 10382a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten // remaining are per-instance private fields not associated with an interface 1039d55d250a016c1400cc00b5e1ac5baaa095702585Glenn Kasten DataLocatorFormat mDataSource; 1040d55d250a016c1400cc00b5e1ac5baaa095702585Glenn Kasten DataLocatorFormat mDataSink; 1041ac4f9bf82c3321d2436485a3d4d0d490079872c6Jean-Michel Trivi // cached data for this instance 1042ac4f9bf82c3321d2436485a3d4d0d490079872c6Jean-Michel Trivi SLuint8 mNumChannels; // 0 means unknown, then const once it is known, range 1 <= x <= 8 1043ac4f9bf82c3321d2436485a3d4d0d490079872c6Jean-Michel Trivi SLuint32 mSampleRateMilliHz;// 0 means unknown, then const once it is known 1044bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi // implementation-specific data for this instance 1045bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#ifdef ANDROID 1046bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi android::AudioRecord *mAudioRecord; 1047de8654b40c7701ea213c157448cbb96c29522e39Jean-Michel Trivi int mRecordSource; 1048bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#endif 1049bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi} /*CAudioRecorder*/; 1050bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi 1051193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 1052903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 1053193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated implicit interfaces 1054903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 10555bd7bea2bbc5133d26cdcd8b95d3452bd0116680Jean-Michel Trivi#ifdef ANDROID 10565bd7bea2bbc5133d26cdcd8b95d3452bd0116680Jean-Michel Trivi#define INTERFACES_Engine 11 // see MPH_to_Engine in MPH_to.c for list of interfaces 10575bd7bea2bbc5133d26cdcd8b95d3452bd0116680Jean-Michel Trivi#else 1058bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_Engine 10 // see MPH_to_Engine in MPH_to.c for list of interfaces 10595bd7bea2bbc5133d26cdcd8b95d3452bd0116680Jean-Michel Trivi#endif 1060bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_Engine - INTERFACES_Default]; 1061903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 1062903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEngine mEngine; 1063903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEngineCapabilities mEngineCapabilities; 1064903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IThreadSync mThreadSync; 1065193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated explicit interfaces 1066903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IAudioIODeviceCapabilities mAudioIODeviceCapabilities; 1067903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IAudioDecoderCapabilities mAudioDecoderCapabilities; 1068903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IAudioEncoderCapabilities mAudioEncoderCapabilities; 1069903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DCommit m3DCommit; 10704f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kasten#ifdef ANDROID 10715bd7bea2bbc5133d26cdcd8b95d3452bd0116680Jean-Michel Trivi IAndroidEffectCapabilities mAndroidEffectCapabilities; 10724f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kasten#endif 1073193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // optional interfaces 1074903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDeviceVolume mDeviceVolume; 10752a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten // remaining are per-instance private fields not associated with an interface 1076188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kasten pthread_t mSyncThread; 1077903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CEngine; 1078193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 1079903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 1080193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 1081903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 1082bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_LEDDevice 3 // see MPH_to_LEDDevice in MPH_to.c for list of interfaces 1083bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_LEDDevice - INTERFACES_Default]; 1084903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 1085903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten ILEDArray mLEDArray; 10862a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten // remaining are per-instance private fields not associated with an interface 1087193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mDeviceID; 1088903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CLEDDevice; 1089193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 1090903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 1091193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 1092903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 1093bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_Listener 4 // see MPH_to_Listener in MPH_to.c for list of interfaces 1094bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_Listener - INTERFACES_Default]; 1095903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 1096903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DDoppler m3DDoppler; 1097903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DLocation m3DLocation; 10982a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten // remaining are per-instance private fields not associated with an interface 1099903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CListener; 1100193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 1101903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 1102193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 1103903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 110415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#define INTERFACES_MetadataExtractor 5 // see MPH_to_MetadataExtractor in MPH_to.c for list of 110515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten // interfaces 1106bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_MetadataExtractor - INTERFACES_Default]; 1107903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 1108903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicSource mDynamicSource; 1109903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMetadataExtraction mMetadataExtraction; 1110903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMetadataTraversal mMetadataTraversal; 11112a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten // remaining are per-instance private fields not associated with an interface 1112903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CMetadataExtractor; 1113193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 1114903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 1115193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 1116903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 1117d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi 1118bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_MidiPlayer 29 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces 1119bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_MidiPlayer - INTERFACES_Default]; 1120903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 1121903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPlay mPlay; 1122903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DDoppler m3DDoppler; 1123903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DGrouping m3DGrouping; 1124903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DLocation m3DLocation; 1125903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DSource m3DSource; 1126903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IBufferQueue mBufferQueue; 1127903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEffectSend mEffectSend; 1128903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMetadataExtraction mMetadataExtraction; 1129903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMetadataTraversal mMetadataTraversal; 1130903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMIDIMessage mMIDIMessage; 1131903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMIDITime mMIDITime; 1132903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMIDITempo mMIDITempo; 1133903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IMIDIMuteSolo mMIDIMuteSolo; 1134903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPrefetchStatus mPrefetchStatus; 1135903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten ISeek mSeek; 1136903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVolume mVolume; 113715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten IMuteSolo mMuteSolo; 1138193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // optional interfaces 1139903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten I3DMacroscopic m3DMacroscopic; 1140903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IBassBoost mBassBoost; 1141903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicSource mDynamicSource; 1142903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 1143903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEqualizer mEqualizer; 1144903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPitch mPitch; 1145903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPresetReverb mPresetReverb; 1146903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPlaybackRate mPlaybackRate; 1147903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVirtualizer mVirtualizer; 1148903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVisualization mVisualization; 11492a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten // remaining are per-instance private fields not associated with an interface 1150903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CMidiPlayer; 1151903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten 115215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten/*typedef*/ struct COutputMix_struct { 1153193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 1154903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 11555c906e11f2749e438fdc6a4433c3bfd9db235356Jean-Michel Trivi#ifdef ANDROID 11565c906e11f2749e438fdc6a4433c3bfd9db235356Jean-Michel Trivi#define INTERFACES_OutputMix 12 // see MPH_to_OutputMix in MPH_to.c for list of interfaces 11575c906e11f2749e438fdc6a4433c3bfd9db235356Jean-Michel Trivi#else 1158bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_OutputMix 11 // see MPH_to_OutputMix in MPH_to.c for list of interfaces 11595c906e11f2749e438fdc6a4433c3bfd9db235356Jean-Michel Trivi#endif 1160bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_OutputMix - INTERFACES_Default]; 1161903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 1162903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IOutputMix mOutputMix; 1163193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 1164903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IOutputMixExt mOutputMixExt; 1165193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif 1166903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 1167903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IEqualizer mEqualizer; 1168903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IPresetReverb mPresetReverb; 1169903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVirtualizer mVirtualizer; 1170903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVolume mVolume; 1171193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // optional interfaces 1172903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IBassBoost mBassBoost; 1173903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVisualization mVisualization; 1174dc098b54cd7df1b79b4560ae0570d88e4b9f751eJean-Michel Trivi#ifdef ANDROID 11755c906e11f2749e438fdc6a4433c3bfd9db235356Jean-Michel Trivi IAndroidEffect mAndroidEffect; 1176dc098b54cd7df1b79b4560ae0570d88e4b9f751eJean-Michel Trivi#endif 11772a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten // remaining are per-instance private fields not associated with an interface 117815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten} /*COutputMix*/; 1179193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi 1180903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct { 1181193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi // mandated interfaces 1182903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IObject mObject; 1183bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_VibraDevice 3 // see MPH_to_VibraDevice in MPH_to.c for list of interfaces 1184bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_VibraDevice - INTERFACES_Default]; 1185903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 1186903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten IVibra mVibra; 11872a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten // remaining are per-instance private fields not associated with an interface 1188193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi SLuint32 mDeviceID; 1189903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CVibraDevice; 119082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 119123b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenstruct MPH_init { 11922a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten VoidHook mInit; // called first to initialize the interface, right after object is allocated 11932a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten // Each interface is initialized regardless whether it is exposed to application. 11942a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten VoidHook mResume; // called to resume interface after suspension, not currently used 11952a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten VoidHook mDeinit; // called last when object is about to be destroyed 11962a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten BoolHook mExpose; // called after initialization, only if interface is exposed to application 1197d78ef68025c4de08bffaa318d0057d8affac81a1Glenn Kasten VoidHook mRemove; // called by DynamicInterfaceManager::RemoveInterface, and prior to mDeinit 11982a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten // will need a suspend hook when suspend is implemented 119923b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten}; 120023b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten 120123b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenextern /*static*/ int IID_to_MPH(const SLInterfaceID iid); 120223b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenextern /*static*/ const struct MPH_init MPH_init_table[MPH_MAX]; 1203492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kastenextern SLresult checkInterfaces(const ClassTable *class__, 1204492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kasten SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds, 1205492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kasten const SLboolean *pInterfaceRequired, unsigned *pExposedMask); 1206492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kastenextern IObject *construct(const ClassTable *class__, 1207492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kasten unsigned exposedMask, SLEngineItf engine); 1208492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kastenextern const ClassTable *objectIDtoClass(SLuint32 objectID); 1209492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kastenextern const struct SLInterfaceID_ SL_IID_array[MPH_MAX]; 1210188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kastenextern SLuint32 IObjectToObjectID(IObject *object); 121131df22b193ea7c7c331d26a27fa6756a89c8ec3cGlenn Kastenextern void IObject_Publish(IObject *this); 121231df22b193ea7c7c331d26a27fa6756a89c8ec3cGlenn Kastenextern void IObject_Destroy(SLObjectItf self); 1213188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kasten 121432a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// Map an interface to it's "object ID" (which is really a class ID). 121532a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis. 121632a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// If you have an IObject, then use IObjectToObjectID directly. 1217188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kasten 1218188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kasten#define InterfaceToObjectID(this) IObjectToObjectID((this)->mThis) 1219f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten 122032a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// Map an interface to it's corresponding IObject. 122132a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis. 122232a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// If you have an IObject, then you're done -- you already have what you need. 122332a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten 122432a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten#define InterfaceToIObject(this) ((this)->mThis) 122532a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten 1226da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi#define InterfaceToCAudioPlayer(this) (((CAudioPlayer*)InterfaceToIObject(this))) 1227da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi 1228bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi#define InterfaceToCAudioRecorder(this) (((CAudioRecorder*)InterfaceToIObject(this))) 1229bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi 12309db8335361c67c4ed877f68218835df96ce43a4bJean-Michel Trivi#ifdef ANDROID 1231f66a508b11e327670a6bf5a8cf9c106f215e3b39Jean-Michel Trivi#include "android_AudioPlayer.h" 1232f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten#endif 1233f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten 123415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kastenextern SLresult checkDataSource(const SLDataSource *pDataSrc, 1235bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi DataLocatorFormat *myDataSourceLocator); 1236ac4f9bf82c3321d2436485a3d4d0d490079872c6Jean-Michel Triviextern SLresult checkDataSink(const SLDataSink *pDataSink, DataLocatorFormat *myDataSinkLocator, 1237ac4f9bf82c3321d2436485a3d4d0d490079872c6Jean-Michel Trivi SLuint32 objType); 1238d0222eec2f5ae565ab930fc1364950ab4530e1e8Jean-Michel Triviextern SLresult checkSourceFormatVsInterfacesCompatibility( 12399a889c24ace7bbc9659e1531d7a61dc43452d7c0Glenn Kasten const DataLocatorFormat *pDataLocatorFormat, const ClassTable *class__, 12409a889c24ace7bbc9659e1531d7a61dc43452d7c0Glenn Kasten unsigned exposedMask); 1241f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kastenextern void freeDataLocatorFormat(DataLocatorFormat *dlf); 1242bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi 124331df22b193ea7c7c331d26a27fa6756a89c8ec3cGlenn Kastenextern bool C3DGroup_PreDestroy(void *self); 124431df22b193ea7c7c331d26a27fa6756a89c8ec3cGlenn Kasten 124509f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kastenextern SLresult CAudioPlayer_Realize(void *self, SLboolean async); 12464f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kastenextern SLresult CAudioPlayer_Resume(void *self, SLboolean async); 124709f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kastenextern void CAudioPlayer_Destroy(void *self); 12484f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kastenextern bool CAudioPlayer_PreDestroy(void *self); 1249bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi 1250bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Triviextern SLresult CAudioRecorder_Realize(void *self, SLboolean async); 1251bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Triviextern SLresult CAudioRecorder_Resume(void *self, SLboolean async); 1252bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Triviextern void CAudioRecorder_Destroy(void *self); 12534f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kastenextern bool CAudioRecorder_PreDestroy(void *self); 1254bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi 1255437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenextern SLresult CEngine_Realize(void *self, SLboolean async); 12564f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kastenextern SLresult CEngine_Resume(void *self, SLboolean async); 1257437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenextern void CEngine_Destroy(void *self); 12584f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kastenextern bool CEngine_PreDestroy(void *self); 1259d78ef68025c4de08bffaa318d0057d8affac81a1Glenn Kastenextern void CEngine_Destroyed(CEngine *self); 1260bdb243c16be832f5853083480965a437b81df3c8Jean-Michel Trivi 1261dc098b54cd7df1b79b4560ae0570d88e4b9f751eJean-Michel Triviextern SLresult COutputMix_Realize(void *self, SLboolean async); 1262dc098b54cd7df1b79b4560ae0570d88e4b9f751eJean-Michel Triviextern SLresult COutputMix_Resume(void *self, SLboolean async); 1263dc098b54cd7df1b79b4560ae0570d88e4b9f751eJean-Michel Triviextern void COutputMix_Destroy(void *self); 12644f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kastenextern bool COutputMix_PreDestroy(void *self); 1265dc098b54cd7df1b79b4560ae0570d88e4b9f751eJean-Michel Trivi 126699cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kasten#ifdef USE_SDL 1267bc1596c33e134859d3ae3182d641b2dd03405b5dGlenn Kastenextern void SDL_open(IEngine *thisEngine); 1268bc1596c33e134859d3ae3182d641b2dd03405b5dGlenn Kastenextern void SDL_close(void); 126999cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kasten#endif 1270bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_REALIZING_1 ((SLuint32) 0x4) // async realize on work queue 1271bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_REALIZING_2 ((SLuint32) 0x5) // sync realize, or async realize hook 1272bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_RESUMING_1 ((SLuint32) 0x6) // async resume on work queue 1273bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_RESUMING_2 ((SLuint32) 0x7) // sync resume, or async resume hook 1274bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_SUSPENDING ((SLuint32) 0x8) // suspend in progress 1275bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_REALIZING_1A ((SLuint32) 0x9) // abort while async realize on work queue 1276bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_RESUMING_1A ((SLuint32) 0xA) // abort while async resume on work queue 12774f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kasten#define SL_OBJECT_STATE_DESTROYING ((SLuint32) 0xB) // destroy object when no strong references 1278227b8b5fe36d5385bbb23d63198bc8e72bfda5d3Glenn Kasten#ifndef ANDROID 1279437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenextern void *sync_start(void *arg); 1280227b8b5fe36d5385bbb23d63198bc8e72bfda5d3Glenn Kasten#endif 1281437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenextern SLresult err_to_result(int err); 1282277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kasten 1283277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kasten#ifdef __GNUC__ 128432a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten#define ctz __builtin_ctz 1285277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kasten#else 1286277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kastenextern unsigned ctz(unsigned); 1287277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kasten#endif 12887e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kastenextern const char * const interface_names[MPH_MAX]; 128915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#include "platform.h" 129015f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten 129115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten// Attributes 129215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten 1293d0222eec2f5ae565ab930fc1364950ab4530e1e8Jean-Michel Trivi#define ATTR_NONE ((unsigned) 0x0) // none 1294d0222eec2f5ae565ab930fc1364950ab4530e1e8Jean-Michel Trivi#define ATTR_GAIN ((unsigned) 0x1 << 0) // player volume, channel mute, channel solo, 1295d0222eec2f5ae565ab930fc1364950ab4530e1e8Jean-Michel Trivi // player stereo position, player mute 1296d0222eec2f5ae565ab930fc1364950ab4530e1e8Jean-Michel Trivi#define ATTR_TRANSPORT ((unsigned) 0x1 << 1) // play state, looping 1297d0222eec2f5ae565ab930fc1364950ab4530e1e8Jean-Michel Trivi#define ATTR_POSITION ((unsigned) 0x1 << 2) // requested position (a.k.a. seek position) 12986aa121077e8981b7d9f46471bdaa1a11211057e8Glenn Kasten#define ATTR_ENQUEUE ((unsigned) 0x1 << 3) // buffer queue became non-empty and in playing state 1299c37c934e00a96afe18aaadd9f9a1863c721bf8eaGlenn Kasten 1300c37c934e00a96afe18aaadd9f9a1863c721bf8eaGlenn Kasten#define SL_DATALOCATOR_NULL 0 // application specified a NULL value for pLocator 1301c37c934e00a96afe18aaadd9f9a1863c721bf8eaGlenn Kasten#define SL_DATAFORMAT_NULL 0 // application specified a NULL or undefined value for pFormat 1302f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 1303f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten// Trace debugging 1304f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten 130529745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten// Always defined, but may be a no-op if trace support is disabled at compile-time 130629745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kastenextern void slTraceSetEnabled(unsigned enabled); 130729745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten 130829745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten#define SL_TRACE_ENTER 0x1 130929745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten#define SL_TRACE_LEAVE_FAILURE 0x2 131029745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten#define SL_TRACE_LEAVE_VOID 0x4 1311974aacf14bfe6869b7d0cda3abcaef46af335487Glenn Kasten#define SL_TRACE_LEAVE_SUCCESS 0x8 1312974aacf14bfe6869b7d0cda3abcaef46af335487Glenn Kasten#define SL_TRACE_LEAVE (SL_TRACE_LEAVE_FAILURE | SL_TRACE_LEAVE_VOID | \ 1313974aacf14bfe6869b7d0cda3abcaef46af335487Glenn Kasten SL_TRACE_LEAVE_SUCCESS) 1314974aacf14bfe6869b7d0cda3abcaef46af335487Glenn Kasten#define SL_TRACE_ALL (SL_TRACE_ENTER | SL_TRACE_LEAVE) 1315bd2fc031926582ee8b0df40673c66dfa4cc45a61Glenn Kasten#ifndef SL_TRACE_DEFAULT 131629745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten#define SL_TRACE_DEFAULT (SL_TRACE_LEAVE_FAILURE) 1317bd2fc031926582ee8b0df40673c66dfa4cc45a61Glenn Kasten#endif 131829745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten 1319f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten#ifndef USE_TRACE 1320f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten 13212caa5decd4882f609c3bf1c69b40d6c2398387bcJean-Michel Trivi#define SL_ENTER_GLOBAL SLresult result; 13222caa5decd4882f609c3bf1c69b40d6c2398387bcJean-Michel Trivi#define SL_LEAVE_GLOBAL return result; 13232caa5decd4882f609c3bf1c69b40d6c2398387bcJean-Michel Trivi#define SL_ENTER_INTERFACE SLresult result; 13242caa5decd4882f609c3bf1c69b40d6c2398387bcJean-Michel Trivi#define SL_LEAVE_INTERFACE return result; 13252caa5decd4882f609c3bf1c69b40d6c2398387bcJean-Michel Trivi#define SL_ENTER_INTERFACE_VOID 13262caa5decd4882f609c3bf1c69b40d6c2398387bcJean-Michel Trivi#define SL_LEAVE_INTERFACE_VOID return; 1327f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten 1328f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#else 1329f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten 133029745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kastenextern void slTraceEnterGlobal(const char *function); 133129745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kastenextern void slTraceLeaveGlobal(const char *function, SLresult result); 133229745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kastenextern void slTraceEnterInterface(const char *function); 133329745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kastenextern void slTraceLeaveInterface(const char *function, SLresult result); 133429745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kastenextern void slTraceEnterInterfaceVoid(const char *function); 133529745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kastenextern void slTraceLeaveInterfaceVoid(const char *function); 133629745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten#define SL_ENTER_GLOBAL SLresult result; slTraceEnterGlobal(__FUNCTION__); 133729745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten#define SL_LEAVE_GLOBAL slTraceLeaveGlobal(__FUNCTION__, result); return result; 133829745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten#define SL_ENTER_INTERFACE SLresult result; slTraceEnterInterface(__FUNCTION__); 133929745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten#define SL_LEAVE_INTERFACE slTraceLeaveInterface(__FUNCTION__, result); return result; 134029745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten#define SL_ENTER_INTERFACE_VOID slTraceEnterInterfaceVoid(__FUNCTION__); 134129745d2982365fb0a2a0d28b366aefc0ab79f965Glenn Kasten#define SL_LEAVE_INTERFACE_VOID slTraceLeaveInterfaceVoid(__FUNCTION__); return; 1342f51f5c6ec99ebc8f2c833a68f232bc1c874a7f2fGlenn Kasten 1343f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#endif 1344158dbd1a71a890d29490198c8e5019081ac94ac3Glenn Kasten 134523c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten#ifdef USE_OUTPUTMIXEXT 134623c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten 134723c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten#define SL_PLAYSTATE_STOPPING ((SLuint32) 0x4) // Play::Stop while PLAYING 134823c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten// If we needed it, could have PLAYING mean mixer is currently reading from front buffer, 134923c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten// while PLAYABLE would mean application requested PLAYING, but buffer queue is empty 135023c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten 135123c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten#endif 135223c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten 135323c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten#ifdef USE_SNDFILE 135423c38816f7c210afae5072fd44658c98fec7e119Glenn Kastenextern void audioPlayerTransportUpdate(CAudioPlayer *audioPlayer); 135523c38816f7c210afae5072fd44658c98fec7e119Glenn Kasten#endif 13569c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten 13579c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kastenextern SLresult IBufferQueue_Enqueue(SLBufferQueueItf self, const void *pBuffer, SLuint32 size); 13589c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kastenextern SLresult IBufferQueue_Clear(SLBufferQueueItf self); 13599c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kastenextern SLresult IBufferQueue_RegisterCallback(SLBufferQueueItf self, 13609c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten slBufferQueueCallback callback, void *pContext); 13619c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kasten 13629c03f04a9c6cc2a821182c8be8f2efe964a27efeGlenn Kastenextern bool IsInterfaceInitialized(IObject *this, unsigned MPH); 13634f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kastenextern SLresult AcquireStrongRef(IObject *object, SLuint32 expectedObjectID); 13644f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kastenextern void ReleaseStrongRef(IObject *object); 13654f924ff768d761f53db6fa2dbfb794ba7a65e776Glenn Kastenextern void ReleaseStrongRefAndUnlockExclusive(IObject *object); 136631df22b193ea7c7c331d26a27fa6756a89c8ec3cGlenn Kasten 136731df22b193ea7c7c331d26a27fa6756a89c8ec3cGlenn Kastenextern COutputMix *CAudioPlayer_GetOutputMix(CAudioPlayer *audioPlayer); 1368