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