| /* |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifdef ANDROID |
| #include "android/CallbackProtector.h" |
| #include "android/android_Effect.h" |
| #include "android/android_GenericPlayer.h" |
| #endif |
| |
| // Class structures |
| |
| |
| /*typedef*/ struct CAudioPlayer_struct { |
| IObject mObject; |
| #ifdef ANDROID |
| #define INTERFACES_AudioPlayer 30 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces |
| #else |
| #define INTERFACES_AudioPlayer 26 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces |
| #endif |
| SLuint8 mInterfaceStates2[INTERFACES_AudioPlayer - INTERFACES_Default]; |
| IDynamicInterfaceManagement mDynamicInterfaceManagement; |
| IPlay mPlay; |
| I3DDoppler m3DDoppler; |
| I3DGrouping m3DGrouping; |
| I3DLocation m3DLocation; |
| I3DSource m3DSource; |
| IBufferQueue mBufferQueue; |
| IEffectSend mEffectSend; |
| IMetadataExtraction mMetadataExtraction; |
| IMetadataTraversal mMetadataTraversal; |
| IPrefetchStatus mPrefetchStatus; |
| IRatePitch mRatePitch; |
| ISeek mSeek; |
| IVolume mVolume; |
| IMuteSolo mMuteSolo; |
| #ifdef ANDROID |
| IAndroidEffect mAndroidEffect; |
| IAndroidEffectSend mAndroidEffectSend; |
| IAndroidConfiguration mAndroidConfiguration; |
| IAndroidBufferQueue mAndroidBufferQueue; |
| #endif |
| // optional interfaces |
| I3DMacroscopic m3DMacroscopic; |
| IBassBoost mBassBoost; |
| IDynamicSource mDynamicSource; |
| IEnvironmentalReverb mEnvironmentalReverb; |
| IEqualizer mEqualizer; |
| IPitch mPitch; |
| IPresetReverb mPresetReverb; |
| IPlaybackRate mPlaybackRate; |
| IVirtualizer mVirtualizer; |
| IVisualization mVisualization; |
| // fields below are per-instance private fields not associated with an interface |
| DataLocatorFormat mDataSource; |
| DataLocatorFormat mDataSink; |
| // cached data for this instance |
| // Formerly at IMuteSolo |
| SLuint8 mMuteMask; // Mask for which channels are muted: bit 0=left, 1=right |
| SLuint8 mSoloMask; // Mask for which channels are soloed: bit 0=left, 1=right |
| SLuint8 mNumChannels; // initially UNKNOWN_NUMCHANNELS, then const once it is known, |
| // range 1 <= x <= 8 |
| // End of former IMuteSolo fields |
| SLuint32 mSampleRateMilliHz;// initially UNKNOWN_SAMPLERATE, then const once it is known |
| // Formerly at IEffectSend |
| /** |
| * Dry volume modified by effect send interfaces: SLEffectSendItf and SLAndroidEffectSendItf |
| */ |
| SLmillibel mDirectLevel; |
| // implementation-specific data for this instance |
| #ifdef USE_OUTPUTMIXEXT |
| Track *mTrack; |
| float mGains[STEREO_CHANNELS]; ///< Computed gain based on volume, mute, solo, stereo position |
| SLboolean mDestroyRequested; ///< Mixer to acknowledge application's call to Object::Destroy |
| #endif |
| #ifdef USE_SNDFILE |
| struct SndFile mSndFile; |
| #endif // USE_SNDFILE |
| #ifdef ANDROID |
| enum AndroidObjectType mAndroidObjType; |
| /** identifies the initialization and preparation state */ |
| enum AndroidObjectState mAndroidObjState; |
| /** identifies which group of effects ("session") this player belongs to */ |
| int mSessionId; |
| /** identifies the Android stream type playback will occur on */ |
| audio_stream_type_t mStreamType; |
| // FIXME consolidate the next several variables into one class to avoid placement new |
| /** plays the PCM data for this player */ |
| android::sp<android::AudioTrack> mAudioTrack; |
| android::sp<android::CallbackProtector> mCallbackProtector; |
| android::sp<android::GenericPlayer> mAPlayer; |
| /** aux effect the AudioTrack will be attached to if aux send enabled */ |
| android::sp<android::AudioEffect> mAuxEffect; |
| // FIXME all levels below need to be encapsulated in a field of type AndroidAudioLevels |
| /** send level to aux effect, there's a single aux bus, so there's a single level */ |
| SLmillibel mAuxSendLevel; |
| /** |
| * Attenuation factor derived from direct level |
| */ |
| float mAmplFromDirectLevel; |
| /** FIXME whether to call AudioTrack::start() at the next safe opportunity */ |
| bool mDeferredStart; |
| #endif |
| } /*CAudioPlayer*/; |
| |
| |
| /*typedef*/ struct CAudioRecorder_struct { |
| // mandated interfaces |
| IObject mObject; |
| #ifdef ANDROID |
| #define INTERFACES_AudioRecorder 11 // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces |
| #else |
| #define INTERFACES_AudioRecorder 9 // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces |
| #endif |
| SLuint8 mInterfaceStates2[INTERFACES_AudioRecorder - INTERFACES_Default]; |
| IDynamicInterfaceManagement mDynamicInterfaceManagement; |
| IRecord mRecord; |
| IAudioEncoder mAudioEncoder; |
| // optional interfaces |
| IBassBoost mBassBoost; |
| IDynamicSource mDynamicSource; |
| IEqualizer mEqualizer; |
| IVisualization mVisualization; |
| IVolume mVolume; |
| #ifdef ANDROID |
| IBufferQueue mBufferQueue; |
| IAndroidConfiguration mAndroidConfiguration; |
| #endif |
| // remaining are per-instance private fields not associated with an interface |
| DataLocatorFormat mDataSource; |
| DataLocatorFormat mDataSink; |
| // cached data for this instance |
| SLuint8 mNumChannels; // initially UNKNOWN_NUMCHANNELS, then const once it is known, |
| // range 1 <= x <= 8 |
| SLuint32 mSampleRateMilliHz;// initially UNKNOWN_SAMPLERATE, then const once it is known |
| // implementation-specific data for this instance |
| #ifdef ANDROID |
| enum AndroidObjectType mAndroidObjType; |
| android::AudioRecord *mAudioRecord; //FIXME candidate to be encapsulated in a ARecorder subclass |
| audio_source_t mRecordSource; //FIXME candidate to be encapsulated in a ARecorder subclass |
| #endif |
| } /*CAudioRecorder*/; |
| |
| |
| /*typedef*/ struct CEngine_struct { |
| // mandated implicit interfaces |
| IObject mObject; |
| #ifdef ANDROID |
| #define INTERFACES_Engine 13 // see MPH_to_Engine in MPH_to.c for list of interfaces |
| #else |
| #define INTERFACES_Engine 12 // see MPH_to_Engine in MPH_to.c for list of interfaces |
| #endif |
| SLuint8 mInterfaceStates2[INTERFACES_Engine - INTERFACES_Default]; |
| IDynamicInterfaceManagement mDynamicInterfaceManagement; |
| IEngine mEngine; |
| IEngineCapabilities mEngineCapabilities; |
| IThreadSync mThreadSync; |
| // mandated explicit interfaces |
| IAudioIODeviceCapabilities mAudioIODeviceCapabilities; |
| IAudioDecoderCapabilities mAudioDecoderCapabilities; |
| IAudioEncoderCapabilities mAudioEncoderCapabilities; |
| I3DCommit m3DCommit; |
| // optional interfaces |
| IDeviceVolume mDeviceVolume; |
| // OpenMAX AL mandated implicit interfaces |
| IXAEngine mXAEngine; |
| #ifdef ANDROID |
| IAndroidEffectCapabilities mAndroidEffectCapabilities; |
| #endif |
| // OpenMAX AL explicit interfaces |
| IVideoDecoderCapabilities mVideoDecoderCapabilities; |
| // remaining are per-instance private fields not associated with an interface |
| ThreadPool mThreadPool; // for asynchronous operations |
| pthread_t mSyncThread; |
| #if defined(ANDROID) |
| // FIXME number of presets will only be saved in IEqualizer, preset names will not be stored |
| SLuint32 mEqNumPresets; |
| char** mEqPresetNames; |
| #endif |
| } /*CEngine*/; |
| |
| typedef struct { |
| // mandated interfaces |
| IObject mObject; |
| #define INTERFACES_LEDDevice 3 // see MPH_to_LEDDevice in MPH_to.c for list of interfaces |
| SLuint8 mInterfaceStates2[INTERFACES_LEDDevice - INTERFACES_Default]; |
| IDynamicInterfaceManagement mDynamicInterfaceManagement; |
| ILEDArray mLEDArray; |
| // remaining are per-instance private fields not associated with an interface |
| SLuint32 mDeviceID; |
| } CLEDDevice; |
| |
| typedef struct { |
| // mandated interfaces |
| IObject mObject; |
| #define INTERFACES_Listener 4 // see MPH_to_Listener in MPH_to.c for list of interfaces |
| SLuint8 mInterfaceStates2[INTERFACES_Listener - INTERFACES_Default]; |
| IDynamicInterfaceManagement mDynamicInterfaceManagement; |
| I3DDoppler m3DDoppler; |
| I3DLocation m3DLocation; |
| // remaining are per-instance private fields not associated with an interface |
| } CListener; |
| |
| typedef struct { |
| // mandated interfaces |
| IObject mObject; |
| #define INTERFACES_MetadataExtractor 5 // see MPH_to_MetadataExtractor in MPH_to.c for list of |
| // interfaces |
| SLuint8 mInterfaceStates2[INTERFACES_MetadataExtractor - INTERFACES_Default]; |
| IDynamicInterfaceManagement mDynamicInterfaceManagement; |
| IDynamicSource mDynamicSource; |
| IMetadataExtraction mMetadataExtraction; |
| IMetadataTraversal mMetadataTraversal; |
| // remaining are per-instance private fields not associated with an interface |
| } CMetadataExtractor; |
| |
| typedef struct { |
| // mandated interfaces |
| IObject mObject; |
| |
| #define INTERFACES_MidiPlayer 29 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces |
| SLuint8 mInterfaceStates2[INTERFACES_MidiPlayer - INTERFACES_Default]; |
| IDynamicInterfaceManagement mDynamicInterfaceManagement; |
| IPlay mPlay; |
| I3DDoppler m3DDoppler; |
| I3DGrouping m3DGrouping; |
| I3DLocation m3DLocation; |
| I3DSource m3DSource; |
| IBufferQueue mBufferQueue; |
| IEffectSend mEffectSend; |
| IMetadataExtraction mMetadataExtraction; |
| IMetadataTraversal mMetadataTraversal; |
| IMIDIMessage mMIDIMessage; |
| IMIDITime mMIDITime; |
| IMIDITempo mMIDITempo; |
| IMIDIMuteSolo mMIDIMuteSolo; |
| IPrefetchStatus mPrefetchStatus; |
| ISeek mSeek; |
| IVolume mVolume; |
| IMuteSolo mMuteSolo; |
| // optional interfaces |
| I3DMacroscopic m3DMacroscopic; |
| IBassBoost mBassBoost; |
| IDynamicSource mDynamicSource; |
| IEnvironmentalReverb mEnvironmentalReverb; |
| IEqualizer mEqualizer; |
| IPitch mPitch; |
| IPresetReverb mPresetReverb; |
| IPlaybackRate mPlaybackRate; |
| IVirtualizer mVirtualizer; |
| IVisualization mVisualization; |
| // remaining are per-instance private fields not associated with an interface |
| } CMidiPlayer; |
| |
| /*typedef*/ struct COutputMix_struct { |
| // mandated interfaces |
| IObject mObject; |
| #ifdef ANDROID |
| #define INTERFACES_OutputMix 12 // see MPH_to_OutputMix in MPH_to.c for list of interfaces |
| #else |
| #define INTERFACES_OutputMix 11 // see MPH_to_OutputMix in MPH_to.c for list of interfaces |
| #endif |
| SLuint8 mInterfaceStates2[INTERFACES_OutputMix - INTERFACES_Default]; |
| IDynamicInterfaceManagement mDynamicInterfaceManagement; |
| IOutputMix mOutputMix; |
| #ifdef USE_OUTPUTMIXEXT |
| IOutputMixExt mOutputMixExt; |
| #endif |
| IEnvironmentalReverb mEnvironmentalReverb; |
| IEqualizer mEqualizer; |
| IPresetReverb mPresetReverb; |
| IVirtualizer mVirtualizer; |
| IVolume mVolume; |
| // optional interfaces |
| IBassBoost mBassBoost; |
| IVisualization mVisualization; |
| #ifdef ANDROID |
| IAndroidEffect mAndroidEffect; |
| #endif |
| // remaining are per-instance private fields not associated with an interface |
| } /*COutputMix*/; |
| |
| typedef struct { |
| // mandated interfaces |
| IObject mObject; |
| #define INTERFACES_VibraDevice 3 // see MPH_to_VibraDevice in MPH_to.c for list of interfaces |
| SLuint8 mInterfaceStates2[INTERFACES_VibraDevice - INTERFACES_Default]; |
| IDynamicInterfaceManagement mDynamicInterfaceManagement; |
| IVibra mVibra; |
| // remaining are per-instance private fields not associated with an interface |
| SLuint32 mDeviceID; |
| } CVibraDevice; |
| |
| |
| typedef struct CMediaPlayer_struct { |
| IObject mObject; |
| #ifdef ANDROID |
| #define INTERFACES_MediaPlayer 8 |
| #else |
| #define INTERFACES_MediaPlayer 7 |
| #endif |
| XAuint8 mInterfaceStates2[INTERFACES_MediaPlayer - INTERFACES_Default]; |
| IDynamicInterfaceManagement mDynamicInterfaceManagement; |
| IDynamicSource mDynamicSource; |
| IPlay mPlay; |
| IStreamInformation mStreamInfo; |
| IVolume mVolume; |
| ISeek mSeek; |
| IPrefetchStatus mPrefetchStatus; |
| #ifdef ANDROID |
| IAndroidBufferQueue mAndroidBufferQueue; |
| #endif |
| // fields below are per-instance private fields not associated with an interface |
| DataLocatorFormat mDataSource; |
| DataLocatorFormat mBankSource; |
| DataLocatorFormat mAudioSink; |
| DataLocatorFormat mImageVideoSink; |
| DataLocatorFormat mVibraSink; |
| DataLocatorFormat mLEDArraySink; |
| SLuint8 mNumChannels; // initially UNKNOWN_NUMCHANNELS, then const once it is known, |
| // range 1 <= x <= 8 |
| #ifdef ANDROID |
| android::sp<android::GenericPlayer> mAVPlayer; |
| android::sp<android::CallbackProtector> mCallbackProtector; |
| enum AndroidObjectType mAndroidObjType; |
| /** identifies the initialization and preparation state */ |
| enum AndroidObjectState mAndroidObjState; |
| /** identifies which group of effects ("session") this player belongs to */ |
| int mSessionId; |
| /** identifies the Android stream type playback will occur on */ |
| audio_stream_type_t mStreamType; |
| #endif |
| } CMediaPlayer; |