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