Home | History | Annotate | Download | only in libmediaplayerservice
      1 /*
      2 **
      3 ** Copyright 2008, The Android Open Source Project
      4 **
      5 ** Licensed under the Apache License, Version 2.0 (the "License");
      6 ** you may not use this file except in compliance with the License.
      7 ** You may obtain a copy of the License at
      8 **
      9 **     http://www.apache.org/licenses/LICENSE-2.0
     10 **
     11 ** Unless required by applicable law or agreed to in writing, software
     12 ** distributed under the License is distributed on an "AS IS" BASIS,
     13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 ** See the License for the specific language governing permissions and
     15 ** limitations under the License.
     16 */
     17 
     18 #ifndef ANDROID_MEDIAPLAYERSERVICE_H
     19 #define ANDROID_MEDIAPLAYERSERVICE_H
     20 
     21 #include <utils/Log.h>
     22 #include <utils/threads.h>
     23 #include <utils/List.h>
     24 #include <utils/Errors.h>
     25 #include <utils/KeyedVector.h>
     26 #include <utils/String8.h>
     27 #include <utils/Vector.h>
     28 
     29 #include <media/IMediaPlayerService.h>
     30 #include <media/MediaPlayerInterface.h>
     31 #include <media/Metadata.h>
     32 
     33 #include <system/audio.h>
     34 
     35 namespace android {
     36 
     37 class IMediaRecorder;
     38 class IMediaMetadataRetriever;
     39 class IOMX;
     40 class MediaRecorderClient;
     41 
     42 #define CALLBACK_ANTAGONIZER 0
     43 #if CALLBACK_ANTAGONIZER
     44 class Antagonizer {
     45 public:
     46     Antagonizer(notify_callback_f cb, void* client);
     47     void start() { mActive = true; }
     48     void stop() { mActive = false; }
     49     void kill();
     50 private:
     51     static const int interval;
     52     Antagonizer();
     53     static int callbackThread(void* cookie);
     54     Mutex               mLock;
     55     Condition           mCondition;
     56     bool                mExit;
     57     bool                mActive;
     58     void*               mClient;
     59     notify_callback_f   mCb;
     60 };
     61 #endif
     62 
     63 class MediaPlayerService : public BnMediaPlayerService
     64 {
     65     class Client;
     66 
     67     class AudioOutput : public MediaPlayerBase::AudioSink
     68     {
     69     public:
     70                                 AudioOutput(int sessionId);
     71         virtual                 ~AudioOutput();
     72 
     73         virtual bool            ready() const { return mTrack != NULL; }
     74         virtual bool            realtime() const { return true; }
     75         virtual ssize_t         bufferSize() const;
     76         virtual ssize_t         frameCount() const;
     77         virtual ssize_t         channelCount() const;
     78         virtual ssize_t         frameSize() const;
     79         virtual uint32_t        latency() const;
     80         virtual float           msecsPerFrame() const;
     81         virtual status_t        getPosition(uint32_t *position);
     82         virtual int             getSessionId();
     83 
     84         virtual status_t        open(
     85                 uint32_t sampleRate, int channelCount,
     86                 int format, int bufferCount,
     87                 AudioCallback cb, void *cookie);
     88 
     89         virtual void            start();
     90         virtual ssize_t         write(const void* buffer, size_t size);
     91         virtual void            stop();
     92         virtual void            flush();
     93         virtual void            pause();
     94         virtual void            close();
     95                 void            setAudioStreamType(int streamType) { mStreamType = streamType; }
     96                 void            setVolume(float left, float right);
     97                 status_t        setAuxEffectSendLevel(float level);
     98                 status_t        attachAuxEffect(int effectId);
     99         virtual status_t        dump(int fd, const Vector<String16>& args) const;
    100 
    101         static bool             isOnEmulator();
    102         static int              getMinBufferCount();
    103     private:
    104         static void             setMinBufferCount();
    105         static void             CallbackWrapper(
    106                 int event, void *me, void *info);
    107 
    108         AudioTrack*             mTrack;
    109         AudioCallback           mCallback;
    110         void *                  mCallbackCookie;
    111         int                     mStreamType;
    112         float                   mLeftVolume;
    113         float                   mRightVolume;
    114         float                   mMsecsPerFrame;
    115         int                     mSessionId;
    116         float                   mSendLevel;
    117         int                     mAuxEffectId;
    118         static bool             mIsOnEmulator;
    119         static int              mMinBufferCount;  // 12 for emulator; otherwise 4
    120 
    121     };
    122 
    123     class AudioCache : public MediaPlayerBase::AudioSink
    124     {
    125     public:
    126                                 AudioCache(const char* name);
    127         virtual                 ~AudioCache() {}
    128 
    129         virtual bool            ready() const { return (mChannelCount > 0) && (mHeap->getHeapID() > 0); }
    130         virtual bool            realtime() const { return false; }
    131         virtual ssize_t         bufferSize() const { return frameSize() * mFrameCount; }
    132         virtual ssize_t         frameCount() const { return mFrameCount; }
    133         virtual ssize_t         channelCount() const { return (ssize_t)mChannelCount; }
    134         virtual ssize_t         frameSize() const { return ssize_t(mChannelCount * ((mFormat == AUDIO_FORMAT_PCM_16_BIT)?sizeof(int16_t):sizeof(u_int8_t))); }
    135         virtual uint32_t        latency() const;
    136         virtual float           msecsPerFrame() const;
    137         virtual status_t        getPosition(uint32_t *position);
    138         virtual int             getSessionId();
    139 
    140         virtual status_t        open(
    141                 uint32_t sampleRate, int channelCount, int format,
    142                 int bufferCount = 1,
    143                 AudioCallback cb = NULL, void *cookie = NULL);
    144 
    145         virtual void            start();
    146         virtual ssize_t         write(const void* buffer, size_t size);
    147         virtual void            stop();
    148         virtual void            flush() {}
    149         virtual void            pause() {}
    150         virtual void            close() {}
    151                 void            setAudioStreamType(int streamType) {}
    152                 void            setVolume(float left, float right) {}
    153                 uint32_t        sampleRate() const { return mSampleRate; }
    154                 uint32_t        format() const { return (uint32_t)mFormat; }
    155                 size_t          size() const { return mSize; }
    156                 status_t        wait();
    157 
    158                 sp<IMemoryHeap> getHeap() const { return mHeap; }
    159 
    160         static  void            notify(void* cookie, int msg,
    161                                        int ext1, int ext2, const Parcel *obj);
    162         virtual status_t        dump(int fd, const Vector<String16>& args) const;
    163 
    164     private:
    165                                 AudioCache();
    166 
    167         Mutex               mLock;
    168         Condition           mSignal;
    169         sp<MemoryHeapBase>  mHeap;
    170         float               mMsecsPerFrame;
    171         uint16_t            mChannelCount;
    172         uint16_t            mFormat;
    173         ssize_t             mFrameCount;
    174         uint32_t            mSampleRate;
    175         uint32_t            mSize;
    176         int                 mError;
    177         bool                mCommandComplete;
    178 
    179         sp<Thread>          mCallbackThread;
    180     };
    181 
    182 public:
    183     static  void                instantiate();
    184 
    185     // IMediaPlayerService interface
    186     virtual sp<IMediaRecorder>  createMediaRecorder(pid_t pid);
    187     void    removeMediaRecorderClient(wp<MediaRecorderClient> client);
    188     virtual sp<IMediaMetadataRetriever> createMetadataRetriever(pid_t pid);
    189 
    190     virtual sp<IMediaPlayer>    create(pid_t pid, const sp<IMediaPlayerClient>& client, int audioSessionId);
    191 
    192     virtual sp<IMemory>         decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, int* pFormat);
    193     virtual sp<IMemory>         decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, int* pFormat);
    194     virtual sp<IOMX>            getOMX();
    195 
    196     virtual status_t            dump(int fd, const Vector<String16>& args);
    197 
    198             void                removeClient(wp<Client> client);
    199 
    200     // For battery usage tracking purpose
    201     struct BatteryUsageInfo {
    202         // how many streams are being played by one UID
    203         int     refCount;
    204         // a temp variable to store the duration(ms) of audio codecs
    205         // when we start a audio codec, we minus the system time from audioLastTime
    206         // when we pause it, we add the system time back to the audioLastTime
    207         // so after the pause, audioLastTime = pause time - start time
    208         // if multiple audio streams are played (or recorded), then audioLastTime
    209         // = the total playing time of all the streams
    210         int32_t audioLastTime;
    211         // when all the audio streams are being paused, we assign audioLastTime to
    212         // this variable, so this value could be provided to the battery app
    213         // in the next pullBatteryData call
    214         int32_t audioTotalTime;
    215 
    216         int32_t videoLastTime;
    217         int32_t videoTotalTime;
    218     };
    219     KeyedVector<int, BatteryUsageInfo>    mBatteryData;
    220 
    221     enum {
    222         SPEAKER,
    223         OTHER_AUDIO_DEVICE,
    224         SPEAKER_AND_OTHER,
    225         NUM_AUDIO_DEVICES
    226     };
    227 
    228     struct BatteryAudioFlingerUsageInfo {
    229         int refCount; // how many audio streams are being played
    230         int deviceOn[NUM_AUDIO_DEVICES]; // whether the device is currently used
    231         int32_t lastTime[NUM_AUDIO_DEVICES]; // in ms
    232         // totalTime[]: total time of audio output devices usage
    233         int32_t totalTime[NUM_AUDIO_DEVICES]; // in ms
    234     };
    235 
    236     // This varialble is used to record the usage of audio output device
    237     // for battery app
    238     BatteryAudioFlingerUsageInfo mBatteryAudio;
    239 
    240     // Collect info of the codec usage from media player and media recorder
    241     virtual void                addBatteryData(uint32_t params);
    242     // API for the Battery app to pull the data of codecs usage
    243     virtual status_t            pullBatteryData(Parcel* reply);
    244 private:
    245 
    246     class Client : public BnMediaPlayer {
    247 
    248         // IMediaPlayer interface
    249         virtual void            disconnect();
    250         virtual status_t        setVideoSurfaceTexture(
    251                                         const sp<ISurfaceTexture>& surfaceTexture);
    252         virtual status_t        prepareAsync();
    253         virtual status_t        start();
    254         virtual status_t        stop();
    255         virtual status_t        pause();
    256         virtual status_t        isPlaying(bool* state);
    257         virtual status_t        seekTo(int msec);
    258         virtual status_t        getCurrentPosition(int* msec);
    259         virtual status_t        getDuration(int* msec);
    260         virtual status_t        reset();
    261         virtual status_t        setAudioStreamType(int type);
    262         virtual status_t        setLooping(int loop);
    263         virtual status_t        setVolume(float leftVolume, float rightVolume);
    264         virtual status_t        invoke(const Parcel& request, Parcel *reply);
    265         virtual status_t        setMetadataFilter(const Parcel& filter);
    266         virtual status_t        getMetadata(bool update_only,
    267                                             bool apply_filter,
    268                                             Parcel *reply);
    269         virtual status_t        setAuxEffectSendLevel(float level);
    270         virtual status_t        attachAuxEffect(int effectId);
    271         virtual status_t        setParameter(int key, const Parcel &request);
    272         virtual status_t        getParameter(int key, Parcel *reply);
    273 
    274         sp<MediaPlayerBase>     createPlayer(player_type playerType);
    275 
    276         virtual status_t        setDataSource(
    277                         const char *url,
    278                         const KeyedVector<String8, String8> *headers);
    279 
    280         virtual status_t        setDataSource(int fd, int64_t offset, int64_t length);
    281 
    282         virtual status_t        setDataSource(const sp<IStreamSource> &source);
    283 
    284         static  void            notify(void* cookie, int msg,
    285                                        int ext1, int ext2, const Parcel *obj);
    286 
    287                 pid_t           pid() const { return mPid; }
    288         virtual status_t        dump(int fd, const Vector<String16>& args) const;
    289 
    290                 int             getAudioSessionId() { return mAudioSessionId; }
    291 
    292     private:
    293         friend class MediaPlayerService;
    294                                 Client( const sp<MediaPlayerService>& service,
    295                                         pid_t pid,
    296                                         int32_t connId,
    297                                         const sp<IMediaPlayerClient>& client,
    298                                         int audioSessionId,
    299                                         uid_t uid);
    300                                 Client();
    301         virtual                 ~Client();
    302 
    303                 void            deletePlayer();
    304 
    305         sp<MediaPlayerBase>     getPlayer() const { Mutex::Autolock lock(mLock); return mPlayer; }
    306 
    307 
    308 
    309         // @param type Of the metadata to be tested.
    310         // @return true if the metadata should be dropped according to
    311         //              the filters.
    312         bool shouldDropMetadata(media::Metadata::Type type) const;
    313 
    314         // Add a new element to the set of metadata updated. Noop if
    315         // the element exists already.
    316         // @param type Of the metadata to be recorded.
    317         void addNewMetadataUpdate(media::Metadata::Type type);
    318 
    319         // Disconnect from the currently connected ANativeWindow.
    320         void disconnectNativeWindow();
    321 
    322         mutable     Mutex                       mLock;
    323                     sp<MediaPlayerBase>         mPlayer;
    324                     sp<MediaPlayerService>      mService;
    325                     sp<IMediaPlayerClient>      mClient;
    326                     sp<AudioOutput>             mAudioOutput;
    327                     pid_t                       mPid;
    328                     status_t                    mStatus;
    329                     bool                        mLoop;
    330                     int32_t                     mConnId;
    331                     int                         mAudioSessionId;
    332                     uid_t                       mUID;
    333                     sp<ANativeWindow>           mConnectedWindow;
    334                     sp<IBinder>                 mConnectedWindowBinder;
    335 
    336         // Metadata filters.
    337         media::Metadata::Filter mMetadataAllow;  // protected by mLock
    338         media::Metadata::Filter mMetadataDrop;  // protected by mLock
    339 
    340         // Metadata updated. For each MEDIA_INFO_METADATA_UPDATE
    341         // notification we try to update mMetadataUpdated which is a
    342         // set: no duplicate.
    343         // getMetadata clears this set.
    344         media::Metadata::Filter mMetadataUpdated;  // protected by mLock
    345 
    346 #if CALLBACK_ANTAGONIZER
    347                     Antagonizer*                mAntagonizer;
    348 #endif
    349     };
    350 
    351 // ----------------------------------------------------------------------------
    352 
    353                             MediaPlayerService();
    354     virtual                 ~MediaPlayerService();
    355 
    356     mutable     Mutex                       mLock;
    357                 SortedVector< wp<Client> >  mClients;
    358                 SortedVector< wp<MediaRecorderClient> > mMediaRecorderClients;
    359                 int32_t                     mNextConnId;
    360                 sp<IOMX>                    mOMX;
    361 };
    362 
    363 // ----------------------------------------------------------------------------
    364 
    365 }; // namespace android
    366 
    367 #endif // ANDROID_MEDIAPLAYERSERVICE_H
    368