1cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten/*
2cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten * Copyright (C) 2010 The Android Open Source Project
3cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten *
4cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
5cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten * you may not use this file except in compliance with the License.
6cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten * You may obtain a copy of the License at
7cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten *
8cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
9cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten *
10cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten * Unless required by applicable law or agreed to in writing, software
11cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
12cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten * See the License for the specific language governing permissions and
14cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten * limitations under the License.
15cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten */
16cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
1710d8b6a5f9a7c24203e3ee228ec596d03c1aa78dGlenn Kasten#include "Configuration.h"
1863c002ab68761be0eace98f28320d8eb2f3f7695Jean-Michel Trivi#ifdef ANDROID
196cce136651f6fd2c7aecd45bc553270152d75462Jean-Michel Trivi#include "android/CallbackProtector.h"
2063c002ab68761be0eace98f28320d8eb2f3f7695Jean-Michel Trivi#include "android/android_Effect.h"
2163c002ab68761be0eace98f28320d8eb2f3f7695Jean-Michel Trivi#include "android/android_GenericPlayer.h"
2263c002ab68761be0eace98f28320d8eb2f3f7695Jean-Michel Trivi#endif
2363c002ab68761be0eace98f28320d8eb2f3f7695Jean-Michel Trivi
24cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten// Class structures
25cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
26cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
27cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten/*typedef*/ struct CAudioPlayer_struct {
28cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject mObject;
29cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#ifdef ANDROID
30cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#define INTERFACES_AudioPlayer 30 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces
31cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#else
32cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#define INTERFACES_AudioPlayer 26 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces
33cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
34cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_AudioPlayer - INTERFACES_Default];
35cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
36cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IPlay mPlay;
37cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    I3DDoppler m3DDoppler;
38cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    I3DGrouping m3DGrouping;
39cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    I3DLocation m3DLocation;
40cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    I3DSource m3DSource;
41cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IBufferQueue mBufferQueue;
42cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IEffectSend mEffectSend;
43cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IMetadataExtraction mMetadataExtraction;
44cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IMetadataTraversal mMetadataTraversal;
45cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IPrefetchStatus mPrefetchStatus;
46cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IRatePitch mRatePitch;
47cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    ISeek mSeek;
48cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IVolume mVolume;
49cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IMuteSolo mMuteSolo;
50cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#ifdef ANDROID
51cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IAndroidEffect mAndroidEffect;
52cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IAndroidEffectSend mAndroidEffectSend;
53cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IAndroidConfiguration mAndroidConfiguration;
54cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IAndroidBufferQueue mAndroidBufferQueue;
55cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
56cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // optional interfaces
57cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    I3DMacroscopic m3DMacroscopic;
58cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IBassBoost mBassBoost;
59cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IDynamicSource mDynamicSource;
60cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
61cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IEqualizer mEqualizer;
62cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IPitch mPitch;
63cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IPresetReverb mPresetReverb;
64cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IPlaybackRate mPlaybackRate;
65cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IVirtualizer mVirtualizer;
66cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IVisualization mVisualization;
67d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    // fields below are per-instance private fields not associated with an interface
68cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    DataLocatorFormat mDataSource;
69cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    DataLocatorFormat mDataSink;
70cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // cached data for this instance
71cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // Formerly at IMuteSolo
72cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint8 mMuteMask;      // Mask for which channels are muted: bit 0=left, 1=right
73cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint8 mSoloMask;      // Mask for which channels are soloed: bit 0=left, 1=right
741a9c2615d0933d183fcb1b9e34ec8f0da2a85153Glenn Kasten    SLuint8 mNumChannels;   // initially UNKNOWN_NUMCHANNELS, then const once it is known,
75680943a4c349712f641b7577e5b0a3fdf49e39d9Glenn Kasten                            // range 1 <= x <= FCC_8
7699b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten    // End of former IMuteSolo fields
771a9c2615d0933d183fcb1b9e34ec8f0da2a85153Glenn Kasten    SLuint32 mSampleRateMilliHz;// initially UNKNOWN_SAMPLERATE, then const once it is known
78cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // Formerly at IEffectSend
79cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    /**
80cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten     * Dry volume modified by effect send interfaces: SLEffectSendItf and SLAndroidEffectSendItf
81cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten     */
82cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmillibel mDirectLevel;
83cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // implementation-specific data for this instance
84cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#ifdef USE_OUTPUTMIXEXT
85cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    Track *mTrack;
86cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    float mGains[STEREO_CHANNELS];  ///< Computed gain based on volume, mute, solo, stereo position
87cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLboolean mDestroyRequested;    ///< Mixer to acknowledge application's call to Object::Destroy
88cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
89cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#ifdef USE_SNDFILE
90cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    struct SndFile mSndFile;
91cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif // USE_SNDFILE
92cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#ifdef ANDROID
93b05ea38e5131001884aa226f90fd50cf594a23f3Jean-Michel Trivi    enum AndroidObjectType mAndroidObjType;
94f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    /** identifies the initialization and preparation state */
95b05ea38e5131001884aa226f90fd50cf594a23f3Jean-Michel Trivi    enum AndroidObjectState mAndroidObjState;
96cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    /** identifies which group of effects ("session") this player belongs to */
97213c31153b9bda7b5a091f2996da7b655c8ed451Glenn Kasten    audio_session_t mSessionId;
98cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    /** identifies the Android stream type playback will occur on */
990bfed90f3b312f7c8f2b744efcf62f1992661d6cGlenn Kasten    audio_stream_type_t mStreamType;
10047550bf6cf5cf08a402a54b1589f4b64582a5120Glenn Kasten    // FIXME consolidate the next several variables into one class to avoid placement new
101cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    /** plays the PCM data for this player */
102ae1a5c8dc1fccf7c121eda830f8d23bd094c0f16Glenn Kasten    android::sp<android::AudioTrack> mAudioTrack;
1036cce136651f6fd2c7aecd45bc553270152d75462Jean-Michel Trivi    android::sp<android::CallbackProtector> mCallbackProtector;
104d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    android::sp<android::GenericPlayer> mAPlayer;
105cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    /** aux effect the AudioTrack will be attached to if aux send enabled */
106cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    android::sp<android::AudioEffect> mAuxEffect;
107b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi    // FIXME all levels below need to be encapsulated in a field of type AndroidAudioLevels
108cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    /** send level to aux effect, there's a single aux bus, so there's a single level */
109cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmillibel mAuxSendLevel;
110cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    /**
111cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten     * Attenuation factor derived from direct level
112cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten     */
113cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    float mAmplFromDirectLevel;
114a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten    /** FIXME whether to call AudioTrack::start() at the next safe opportunity */
11547550bf6cf5cf08a402a54b1589f4b64582a5120Glenn Kasten    bool mDeferredStart;
1168c9071f491393fadf767b6164a17b0795eba3fdaEric Laurent    SLuint32 mPerformanceMode;
117cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
118cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} /*CAudioPlayer*/;
119cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
120cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
121cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten/*typedef*/ struct CAudioRecorder_struct {
122cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // mandated interfaces
123cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject mObject;
124cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#ifdef ANDROID
125f8b3141926967ba37d315cc8d3956d7214958e6bPaul McLean#define INTERFACES_AudioRecorder 14 // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces
126cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#else
127cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#define INTERFACES_AudioRecorder 9  // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces
128cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
129cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_AudioRecorder - INTERFACES_Default];
130cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
131cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IRecord mRecord;
132cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IAudioEncoder mAudioEncoder;
133cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // optional interfaces
134cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IBassBoost mBassBoost;
135cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IDynamicSource mDynamicSource;
136cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IEqualizer mEqualizer;
137cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IVisualization mVisualization;
138cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IVolume mVolume;
139cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#ifdef ANDROID
140cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IBufferQueue mBufferQueue;
141cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IAndroidConfiguration mAndroidConfiguration;
1421580f7ab4e02ed2881ac7cdeab2044e990f2e9e6Glenn Kasten    IAndroidAcousticEchoCancellation  mAcousticEchoCancellation;
1431580f7ab4e02ed2881ac7cdeab2044e990f2e9e6Glenn Kasten    IAndroidAutomaticGainControl mAutomaticGainControl;
1441580f7ab4e02ed2881ac7cdeab2044e990f2e9e6Glenn Kasten    IAndroidNoiseSuppression mNoiseSuppression;
145cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
146cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // remaining are per-instance private fields not associated with an interface
147cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    DataLocatorFormat mDataSource;
148cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    DataLocatorFormat mDataSink;
149cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // cached data for this instance
1501a9c2615d0933d183fcb1b9e34ec8f0da2a85153Glenn Kasten    SLuint8 mNumChannels;   // initially UNKNOWN_NUMCHANNELS, then const once it is known,
151680943a4c349712f641b7577e5b0a3fdf49e39d9Glenn Kasten                            // range 1 <= x <= FCC_8
1521a9c2615d0933d183fcb1b9e34ec8f0da2a85153Glenn Kasten    SLuint32 mSampleRateMilliHz;// initially UNKNOWN_SAMPLERATE, then const once it is known
153cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // implementation-specific data for this instance
154cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#ifdef ANDROID
155e5ede1a139fcedbf075675179d919fbe731898f0Glenn Kasten    // FIXME consolidate the next several variables into ARecorder class to avoid placement new
156b05ea38e5131001884aa226f90fd50cf594a23f3Jean-Michel Trivi    enum AndroidObjectType mAndroidObjType;
157e5ede1a139fcedbf075675179d919fbe731898f0Glenn Kasten    android::sp<android::AudioRecord> mAudioRecord;
158460bdad43aaec3c6ffe7f259719e00807742ad6dGlenn Kasten    android::sp<android::CallbackProtector> mCallbackProtector;
159e5ede1a139fcedbf075675179d919fbe731898f0Glenn Kasten    audio_source_t mRecordSource;
1608c9071f491393fadf767b6164a17b0795eba3fdaEric Laurent    SLuint32 mPerformanceMode;
161cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
162cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} /*CAudioRecorder*/;
163cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
164cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
165cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten/*typedef*/ struct CEngine_struct {
166cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // mandated implicit interfaces
167cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject mObject;
168cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#ifdef ANDROID
1696e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi#define INTERFACES_Engine 13 // see MPH_to_Engine in MPH_to.c for list of interfaces
170cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#else
1716e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi#define INTERFACES_Engine 12 // see MPH_to_Engine in MPH_to.c for list of interfaces
172cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
173cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_Engine - INTERFACES_Default];
174cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
175cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IEngine mEngine;
176cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IEngineCapabilities mEngineCapabilities;
177cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IThreadSync mThreadSync;
178cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // mandated explicit interfaces
179cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IAudioIODeviceCapabilities mAudioIODeviceCapabilities;
180cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IAudioDecoderCapabilities mAudioDecoderCapabilities;
181cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IAudioEncoderCapabilities mAudioEncoderCapabilities;
182cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    I3DCommit m3DCommit;
183cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // optional interfaces
184cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IDeviceVolume mDeviceVolume;
185cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // OpenMAX AL mandated implicit interfaces
186cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IXAEngine mXAEngine;
187cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#ifdef ANDROID
188cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IAndroidEffectCapabilities mAndroidEffectCapabilities;
189cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
1906e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi    // OpenMAX AL explicit interfaces
1916e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi    IVideoDecoderCapabilities mVideoDecoderCapabilities;
192cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // remaining are per-instance private fields not associated with an interface
193cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    ThreadPool mThreadPool; // for asynchronous operations
194cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    pthread_t mSyncThread;
195faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID)
196cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // FIXME number of presets will only be saved in IEqualizer, preset names will not be stored
197cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mEqNumPresets;
198cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    char** mEqPresetNames;
199cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
200cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} /*CEngine*/;
201cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
202cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
203cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // mandated interfaces
204cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject mObject;
205cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#define INTERFACES_LEDDevice 3 // see MPH_to_LEDDevice in MPH_to.c for list of interfaces
206cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_LEDDevice - INTERFACES_Default];
207cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
208cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    ILEDArray mLEDArray;
209cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // remaining are per-instance private fields not associated with an interface
210cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mDeviceID;
211cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} CLEDDevice;
212cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
213cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
214cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // mandated interfaces
215cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject mObject;
216cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#define INTERFACES_Listener 4 // see MPH_to_Listener in MPH_to.c for list of interfaces
217cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_Listener - INTERFACES_Default];
218cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
219cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    I3DDoppler m3DDoppler;
220cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    I3DLocation m3DLocation;
221cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // remaining are per-instance private fields not associated with an interface
222cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} CListener;
223cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
224cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
225cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // mandated interfaces
226cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject mObject;
227cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#define INTERFACES_MetadataExtractor 5 // see MPH_to_MetadataExtractor in MPH_to.c for list of
228cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten                                       // interfaces
229cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_MetadataExtractor - INTERFACES_Default];
230cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
231cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IDynamicSource mDynamicSource;
232cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IMetadataExtraction mMetadataExtraction;
233cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IMetadataTraversal mMetadataTraversal;
234cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // remaining are per-instance private fields not associated with an interface
235cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} CMetadataExtractor;
236cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
237cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
238cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // mandated interfaces
239cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject mObject;
240cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
241cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#define INTERFACES_MidiPlayer 29 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces
242cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_MidiPlayer - INTERFACES_Default];
243cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
244cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IPlay mPlay;
245cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    I3DDoppler m3DDoppler;
246cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    I3DGrouping m3DGrouping;
247cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    I3DLocation m3DLocation;
248cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    I3DSource m3DSource;
249cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IBufferQueue mBufferQueue;
250cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IEffectSend mEffectSend;
251cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IMetadataExtraction mMetadataExtraction;
252cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IMetadataTraversal mMetadataTraversal;
253cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IMIDIMessage mMIDIMessage;
254cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IMIDITime mMIDITime;
255cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IMIDITempo mMIDITempo;
256cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IMIDIMuteSolo mMIDIMuteSolo;
257cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IPrefetchStatus mPrefetchStatus;
258cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    ISeek mSeek;
259cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IVolume mVolume;
260cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IMuteSolo mMuteSolo;
261cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // optional interfaces
262cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    I3DMacroscopic m3DMacroscopic;
263cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IBassBoost mBassBoost;
264cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IDynamicSource mDynamicSource;
265cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
266cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IEqualizer mEqualizer;
267cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IPitch mPitch;
268cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IPresetReverb mPresetReverb;
269cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IPlaybackRate mPlaybackRate;
270cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IVirtualizer mVirtualizer;
271cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IVisualization mVisualization;
272cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // remaining are per-instance private fields not associated with an interface
273cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} CMidiPlayer;
274cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
275cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten/*typedef*/ struct COutputMix_struct {
276cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // mandated interfaces
277cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject mObject;
278cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#ifdef ANDROID
279cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#define INTERFACES_OutputMix 12 // see MPH_to_OutputMix in MPH_to.c for list of interfaces
280cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#else
281cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#define INTERFACES_OutputMix 11 // see MPH_to_OutputMix in MPH_to.c for list of interfaces
282cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
283cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_OutputMix - INTERFACES_Default];
284cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
285cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IOutputMix mOutputMix;
286cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#ifdef USE_OUTPUTMIXEXT
287cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IOutputMixExt mOutputMixExt;
288cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
289cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
290cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IEqualizer mEqualizer;
291cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IPresetReverb mPresetReverb;
292cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IVirtualizer mVirtualizer;
293cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IVolume mVolume;
294cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // optional interfaces
295cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IBassBoost mBassBoost;
296cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IVisualization mVisualization;
297cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#ifdef ANDROID
298cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IAndroidEffect mAndroidEffect;
299cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
300cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // remaining are per-instance private fields not associated with an interface
301cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} /*COutputMix*/;
302cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
303cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
304cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // mandated interfaces
305cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject mObject;
306cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#define INTERFACES_VibraDevice 3 // see MPH_to_VibraDevice in MPH_to.c for list of interfaces
307cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_VibraDevice - INTERFACES_Default];
308cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
309cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IVibra mVibra;
310cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // remaining are per-instance private fields not associated with an interface
311cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mDeviceID;
312cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} CVibraDevice;
3138b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten
3148b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten
3158b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kastentypedef struct CMediaPlayer_struct {
3168b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    IObject mObject;
31792b245bf8828db9e469febebbe8774c00570b5b9Jean-Michel Trivi#ifdef ANDROID
318c623c89c0a32c5fc77c998f1742d58e7be69e8c1Glenn Kasten#define INTERFACES_MediaPlayer 8
31992b245bf8828db9e469febebbe8774c00570b5b9Jean-Michel Trivi#else
320c623c89c0a32c5fc77c998f1742d58e7be69e8c1Glenn Kasten#define INTERFACES_MediaPlayer 7
32192b245bf8828db9e469febebbe8774c00570b5b9Jean-Michel Trivi#endif
3228b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    XAuint8 mInterfaceStates2[INTERFACES_MediaPlayer - INTERFACES_Default];
3238b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
324d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    IDynamicSource mDynamicSource;
32594a37e8117fb72790882dfb815f99e2365754c74Glenn Kasten    IPlay mPlay;
326321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi    IStreamInformation mStreamInfo;
32737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    IVolume mVolume;
32892b245bf8828db9e469febebbe8774c00570b5b9Jean-Michel Trivi    ISeek mSeek;
329c623c89c0a32c5fc77c998f1742d58e7be69e8c1Glenn Kasten    IPrefetchStatus mPrefetchStatus;
330eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi#ifdef ANDROID
331eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    IAndroidBufferQueue mAndroidBufferQueue;
332eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi#endif
333d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    // fields below are per-instance private fields not associated with an interface
3348b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    DataLocatorFormat mDataSource;
3358b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    DataLocatorFormat mBankSource;
3368b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    DataLocatorFormat mAudioSink;
3378b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    DataLocatorFormat mImageVideoSink;
3388b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    DataLocatorFormat mVibraSink;
3398b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    DataLocatorFormat mLEDArraySink;
34099b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten    SLuint8 mNumChannels;   // initially UNKNOWN_NUMCHANNELS, then const once it is known,
341ba0b2c989ecbbae4678903954a4629ef342e1089Glenn Kasten                            // range 1 <= x <= 8 FIXME FCC_8
34294a37e8117fb72790882dfb815f99e2365754c74Glenn Kasten#ifdef ANDROID
34368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    android::sp<android::GenericPlayer> mAVPlayer;
344485a038f9f0f898227b8ab4218e94c5d56b6ed0bGlenn Kasten    android::sp<android::CallbackProtector> mCallbackProtector;
345b05ea38e5131001884aa226f90fd50cf594a23f3Jean-Michel Trivi    enum AndroidObjectType mAndroidObjType;
346f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    /** identifies the initialization and preparation state */
347b05ea38e5131001884aa226f90fd50cf594a23f3Jean-Michel Trivi    enum AndroidObjectState mAndroidObjState;
348f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    /** identifies which group of effects ("session") this player belongs to */
349213c31153b9bda7b5a091f2996da7b655c8ed451Glenn Kasten    audio_session_t mSessionId;
350f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    /** identifies the Android stream type playback will occur on */
3510bfed90f3b312f7c8f2b744efcf62f1992661d6cGlenn Kasten    audio_stream_type_t mStreamType;
35294a37e8117fb72790882dfb815f99e2365754c74Glenn Kasten#endif
3538b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten} CMediaPlayer;
354