classes.h revision e5ede1a139fcedbf075675179d919fbe731898f0
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
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 11 // 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#endif
141    // remaining are per-instance private fields not associated with an interface
142    DataLocatorFormat mDataSource;
143    DataLocatorFormat mDataSink;
144    // cached data for this instance
145    SLuint8 mNumChannels;   // initially UNKNOWN_NUMCHANNELS, then const once it is known,
146                            // range 1 <= x <= 8
147    SLuint32 mSampleRateMilliHz;// initially UNKNOWN_SAMPLERATE, then const once it is known
148    // implementation-specific data for this instance
149#ifdef ANDROID
150    // FIXME consolidate the next several variables into ARecorder class to avoid placement new
151    enum AndroidObjectType mAndroidObjType;
152    android::sp<android::AudioRecord> mAudioRecord;
153    audio_source_t mRecordSource;
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    audio_stream_type_t mStreamType;
345#endif
346} CMediaPlayer;
347