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