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#endif
117} /*CAudioPlayer*/;
118
119
120/*typedef*/ struct CAudioRecorder_struct {
121    // mandated interfaces
122    IObject mObject;
123#ifdef ANDROID
124#define INTERFACES_AudioRecorder 14 // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces
125#else
126#define INTERFACES_AudioRecorder 9  // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces
127#endif
128    SLuint8 mInterfaceStates2[INTERFACES_AudioRecorder - INTERFACES_Default];
129    IDynamicInterfaceManagement mDynamicInterfaceManagement;
130    IRecord mRecord;
131    IAudioEncoder mAudioEncoder;
132    // optional interfaces
133    IBassBoost mBassBoost;
134    IDynamicSource mDynamicSource;
135    IEqualizer mEqualizer;
136    IVisualization mVisualization;
137    IVolume mVolume;
138#ifdef ANDROID
139    IBufferQueue mBufferQueue;
140    IAndroidConfiguration mAndroidConfiguration;
141    IAndroidAcousticEchoCancellation  mAcousticEchoCancellation;
142    IAndroidAutomaticGainControl mAutomaticGainControl;
143    IAndroidNoiseSuppression mNoiseSuppression;
144#endif
145    // remaining are per-instance private fields not associated with an interface
146    DataLocatorFormat mDataSource;
147    DataLocatorFormat mDataSink;
148    // cached data for this instance
149    SLuint8 mNumChannels;   // initially UNKNOWN_NUMCHANNELS, then const once it is known,
150                            // range 1 <= x <= FCC_8
151    SLuint32 mSampleRateMilliHz;// initially UNKNOWN_SAMPLERATE, then const once it is known
152    // implementation-specific data for this instance
153#ifdef ANDROID
154    // FIXME consolidate the next several variables into ARecorder class to avoid placement new
155    enum AndroidObjectType mAndroidObjType;
156    android::sp<android::AudioRecord> mAudioRecord;
157    android::sp<android::CallbackProtector> mCallbackProtector;
158    audio_source_t mRecordSource;
159#endif
160} /*CAudioRecorder*/;
161
162
163/*typedef*/ struct CEngine_struct {
164    // mandated implicit interfaces
165    IObject mObject;
166#ifdef ANDROID
167#define INTERFACES_Engine 13 // see MPH_to_Engine in MPH_to.c for list of interfaces
168#else
169#define INTERFACES_Engine 12 // see MPH_to_Engine in MPH_to.c for list of interfaces
170#endif
171    SLuint8 mInterfaceStates2[INTERFACES_Engine - INTERFACES_Default];
172    IDynamicInterfaceManagement mDynamicInterfaceManagement;
173    IEngine mEngine;
174    IEngineCapabilities mEngineCapabilities;
175    IThreadSync mThreadSync;
176    // mandated explicit interfaces
177    IAudioIODeviceCapabilities mAudioIODeviceCapabilities;
178    IAudioDecoderCapabilities mAudioDecoderCapabilities;
179    IAudioEncoderCapabilities mAudioEncoderCapabilities;
180    I3DCommit m3DCommit;
181    // optional interfaces
182    IDeviceVolume mDeviceVolume;
183    // OpenMAX AL mandated implicit interfaces
184    IXAEngine mXAEngine;
185#ifdef ANDROID
186    IAndroidEffectCapabilities mAndroidEffectCapabilities;
187#endif
188    // OpenMAX AL explicit interfaces
189    IVideoDecoderCapabilities mVideoDecoderCapabilities;
190    // remaining are per-instance private fields not associated with an interface
191    ThreadPool mThreadPool; // for asynchronous operations
192    pthread_t mSyncThread;
193#if defined(ANDROID)
194    // FIXME number of presets will only be saved in IEqualizer, preset names will not be stored
195    SLuint32 mEqNumPresets;
196    char** mEqPresetNames;
197#endif
198} /*CEngine*/;
199
200typedef struct {
201    // mandated interfaces
202    IObject mObject;
203#define INTERFACES_LEDDevice 3 // see MPH_to_LEDDevice in MPH_to.c for list of interfaces
204    SLuint8 mInterfaceStates2[INTERFACES_LEDDevice - INTERFACES_Default];
205    IDynamicInterfaceManagement mDynamicInterfaceManagement;
206    ILEDArray mLEDArray;
207    // remaining are per-instance private fields not associated with an interface
208    SLuint32 mDeviceID;
209} CLEDDevice;
210
211typedef struct {
212    // mandated interfaces
213    IObject mObject;
214#define INTERFACES_Listener 4 // see MPH_to_Listener in MPH_to.c for list of interfaces
215    SLuint8 mInterfaceStates2[INTERFACES_Listener - INTERFACES_Default];
216    IDynamicInterfaceManagement mDynamicInterfaceManagement;
217    I3DDoppler m3DDoppler;
218    I3DLocation m3DLocation;
219    // remaining are per-instance private fields not associated with an interface
220} CListener;
221
222typedef struct {
223    // mandated interfaces
224    IObject mObject;
225#define INTERFACES_MetadataExtractor 5 // see MPH_to_MetadataExtractor in MPH_to.c for list of
226                                       // interfaces
227    SLuint8 mInterfaceStates2[INTERFACES_MetadataExtractor - INTERFACES_Default];
228    IDynamicInterfaceManagement mDynamicInterfaceManagement;
229    IDynamicSource mDynamicSource;
230    IMetadataExtraction mMetadataExtraction;
231    IMetadataTraversal mMetadataTraversal;
232    // remaining are per-instance private fields not associated with an interface
233} CMetadataExtractor;
234
235typedef struct {
236    // mandated interfaces
237    IObject mObject;
238
239#define INTERFACES_MidiPlayer 29 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces
240    SLuint8 mInterfaceStates2[INTERFACES_MidiPlayer - INTERFACES_Default];
241    IDynamicInterfaceManagement mDynamicInterfaceManagement;
242    IPlay mPlay;
243    I3DDoppler m3DDoppler;
244    I3DGrouping m3DGrouping;
245    I3DLocation m3DLocation;
246    I3DSource m3DSource;
247    IBufferQueue mBufferQueue;
248    IEffectSend mEffectSend;
249    IMetadataExtraction mMetadataExtraction;
250    IMetadataTraversal mMetadataTraversal;
251    IMIDIMessage mMIDIMessage;
252    IMIDITime mMIDITime;
253    IMIDITempo mMIDITempo;
254    IMIDIMuteSolo mMIDIMuteSolo;
255    IPrefetchStatus mPrefetchStatus;
256    ISeek mSeek;
257    IVolume mVolume;
258    IMuteSolo mMuteSolo;
259    // optional interfaces
260    I3DMacroscopic m3DMacroscopic;
261    IBassBoost mBassBoost;
262    IDynamicSource mDynamicSource;
263    IEnvironmentalReverb mEnvironmentalReverb;
264    IEqualizer mEqualizer;
265    IPitch mPitch;
266    IPresetReverb mPresetReverb;
267    IPlaybackRate mPlaybackRate;
268    IVirtualizer mVirtualizer;
269    IVisualization mVisualization;
270    // remaining are per-instance private fields not associated with an interface
271} CMidiPlayer;
272
273/*typedef*/ struct COutputMix_struct {
274    // mandated interfaces
275    IObject mObject;
276#ifdef ANDROID
277#define INTERFACES_OutputMix 12 // see MPH_to_OutputMix in MPH_to.c for list of interfaces
278#else
279#define INTERFACES_OutputMix 11 // see MPH_to_OutputMix in MPH_to.c for list of interfaces
280#endif
281    SLuint8 mInterfaceStates2[INTERFACES_OutputMix - INTERFACES_Default];
282    IDynamicInterfaceManagement mDynamicInterfaceManagement;
283    IOutputMix mOutputMix;
284#ifdef USE_OUTPUTMIXEXT
285    IOutputMixExt mOutputMixExt;
286#endif
287    IEnvironmentalReverb mEnvironmentalReverb;
288    IEqualizer mEqualizer;
289    IPresetReverb mPresetReverb;
290    IVirtualizer mVirtualizer;
291    IVolume mVolume;
292    // optional interfaces
293    IBassBoost mBassBoost;
294    IVisualization mVisualization;
295#ifdef ANDROID
296    IAndroidEffect mAndroidEffect;
297#endif
298    // remaining are per-instance private fields not associated with an interface
299} /*COutputMix*/;
300
301typedef struct {
302    // mandated interfaces
303    IObject mObject;
304#define INTERFACES_VibraDevice 3 // see MPH_to_VibraDevice in MPH_to.c for list of interfaces
305    SLuint8 mInterfaceStates2[INTERFACES_VibraDevice - INTERFACES_Default];
306    IDynamicInterfaceManagement mDynamicInterfaceManagement;
307    IVibra mVibra;
308    // remaining are per-instance private fields not associated with an interface
309    SLuint32 mDeviceID;
310} CVibraDevice;
311
312
313typedef struct CMediaPlayer_struct {
314    IObject mObject;
315#ifdef ANDROID
316#define INTERFACES_MediaPlayer 8
317#else
318#define INTERFACES_MediaPlayer 7
319#endif
320    XAuint8 mInterfaceStates2[INTERFACES_MediaPlayer - INTERFACES_Default];
321    IDynamicInterfaceManagement mDynamicInterfaceManagement;
322    IDynamicSource mDynamicSource;
323    IPlay mPlay;
324    IStreamInformation mStreamInfo;
325    IVolume mVolume;
326    ISeek mSeek;
327    IPrefetchStatus mPrefetchStatus;
328#ifdef ANDROID
329    IAndroidBufferQueue mAndroidBufferQueue;
330#endif
331    // fields below are per-instance private fields not associated with an interface
332    DataLocatorFormat mDataSource;
333    DataLocatorFormat mBankSource;
334    DataLocatorFormat mAudioSink;
335    DataLocatorFormat mImageVideoSink;
336    DataLocatorFormat mVibraSink;
337    DataLocatorFormat mLEDArraySink;
338    SLuint8 mNumChannels;   // initially UNKNOWN_NUMCHANNELS, then const once it is known,
339                            // range 1 <= x <= 8 FIXME FCC_8
340#ifdef ANDROID
341    android::sp<android::GenericPlayer> mAVPlayer;
342    android::sp<android::CallbackProtector> mCallbackProtector;
343    enum AndroidObjectType mAndroidObjType;
344    /** identifies the initialization and preparation state */
345    enum AndroidObjectState mAndroidObjState;
346    /** identifies which group of effects ("session") this player belongs to */
347    audio_session_t mSessionId;
348    /** identifies the Android stream type playback will occur on */
349    audio_stream_type_t mStreamType;
350#endif
351} CMediaPlayer;
352