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