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