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