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