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