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