/* * 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;