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