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         uint32_t                mLatency;
    116         int                     mSessionId;
    117         float                   mSendLevel;
    118         int                     mAuxEffectId;
    119         static bool             mIsOnEmulator;
    120         static int              mMinBufferCount;  // 12 for emulator; otherwise 4
    121 
    122     };
    123 
    124     class AudioCache : public MediaPlayerBase::AudioSink
    125     {
    126     public:
    127                                 AudioCache(const char* name);
    128         virtual                 ~AudioCache() {}
    129 
    130         virtual bool            ready() const { return (mChannelCount > 0) && (mHeap->getHeapID() > 0); }
    131         virtual bool            realtime() const { return false; }
    132         virtual ssize_t         bufferSize() const { return frameSize() * mFrameCount; }
    133         virtual ssize_t         frameCount() const { return mFrameCount; }
    134         virtual ssize_t         channelCount() const { return (ssize_t)mChannelCount; }
    135         virtual ssize_t         frameSize() const { return ssize_t(mChannelCount * ((mFormat == AUDIO_FORMAT_PCM_16_BIT)?sizeof(int16_t):sizeof(u_int8_t))); }
    136         virtual uint32_t        latency() const;
    137         virtual float           msecsPerFrame() const;
    138         virtual status_t        getPosition(uint32_t *position);
    139         virtual int             getSessionId();
    140 
    141         virtual status_t        open(
    142                 uint32_t sampleRate, int channelCount, int format,
    143                 int bufferCount = 1,
    144                 AudioCallback cb = NULL, void *cookie = NULL);
    145 
    146         virtual void            start();
    147         virtual ssize_t         write(const void* buffer, size_t size);
    148         virtual void            stop();
    149         virtual void            flush() {}
    150         virtual void            pause() {}
    151         virtual void            close() {}
    152                 void            setAudioStreamType(int streamType) {}
    153                 void            setVolume(float left, float right) {}
    154                 uint32_t        sampleRate() const { return mSampleRate; }
    155                 uint32_t        format() const { return (uint32_t)mFormat; }
    156                 size_t          size() const { return mSize; }
    157                 status_t        wait();
    158 
    159                 sp<IMemoryHeap> getHeap() const { return mHeap; }
    160 
    161         static  void            notify(void* cookie, int msg,
    162                                        int ext1, int ext2, const Parcel *obj);
    163         virtual status_t        dump(int fd, const Vector<String16>& args) const;
    164 
    165     private:
    166                                 AudioCache();
    167 
    168         Mutex               mLock;
    169         Condition           mSignal;
    170         sp<MemoryHeapBase>  mHeap;
    171         float               mMsecsPerFrame;
    172         uint16_t            mChannelCount;
    173         uint16_t            mFormat;
    174         ssize_t             mFrameCount;
    175         uint32_t            mSampleRate;
    176         uint32_t            mSize;
    177         int                 mError;
    178         bool                mCommandComplete;
    179 
    180         sp<Thread>          mCallbackThread;
    181     };
    182 
    183 public:
    184     static  void                instantiate();
    185 
    186     // IMediaPlayerService interface
    187     virtual sp<IMediaRecorder>  createMediaRecorder(pid_t pid);
    188     void    removeMediaRecorderClient(wp<MediaRecorderClient> client);
    189     virtual sp<IMediaMetadataRetriever> createMetadataRetriever(pid_t pid);
    190 
    191     virtual sp<IMediaPlayer>    create(pid_t pid, const sp<IMediaPlayerClient>& client, int audioSessionId);
    192 
    193     virtual sp<IMemory>         decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, int* pFormat);
    194     virtual sp<IMemory>         decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, int* pFormat);
    195     virtual sp<IOMX>            getOMX();
    196 
    197     virtual status_t            dump(int fd, const Vector<String16>& args);
    198 
    199             void                removeClient(wp<Client> client);
    200 
    201     // For battery usage tracking purpose
    202     struct BatteryUsageInfo {
    203         // how many streams are being played by one UID
    204         int     refCount;
    205         // a temp variable to store the duration(ms) of audio codecs
    206         // when we start a audio codec, we minus the system time from audioLastTime
    207         // when we pause it, we add the system time back to the audioLastTime
    208         // so after the pause, audioLastTime = pause time - start time
    209         // if multiple audio streams are played (or recorded), then audioLastTime
    210         // = the total playing time of all the streams
    211         int32_t audioLastTime;
    212         // when all the audio streams are being paused, we assign audioLastTime to
    213         // this variable, so this value could be provided to the battery app
    214         // in the next pullBatteryData call
    215         int32_t audioTotalTime;
    216 
    217         int32_t videoLastTime;
    218         int32_t videoTotalTime;
    219     };
    220     KeyedVector<int, BatteryUsageInfo>    mBatteryData;
    221 
    222     enum {
    223         SPEAKER,
    224         OTHER_AUDIO_DEVICE,
    225         SPEAKER_AND_OTHER,
    226         NUM_AUDIO_DEVICES
    227     };
    228 
    229     struct BatteryAudioFlingerUsageInfo {
    230         int refCount; // how many audio streams are being played
    231         int deviceOn[NUM_AUDIO_DEVICES]; // whether the device is currently used
    232         int32_t lastTime[NUM_AUDIO_DEVICES]; // in ms
    233         // totalTime[]: total time of audio output devices usage
    234         int32_t totalTime[NUM_AUDIO_DEVICES]; // in ms
    235     };
    236 
    237     // This varialble is used to record the usage of audio output device
    238     // for battery app
    239     BatteryAudioFlingerUsageInfo mBatteryAudio;
    240 
    241     // Collect info of the codec usage from media player and media recorder
    242     virtual void                addBatteryData(uint32_t params);
    243     // API for the Battery app to pull the data of codecs usage
    244     virtual status_t            pullBatteryData(Parcel* reply);
    245 private:
    246 
    247     class Client : public BnMediaPlayer {
    248 
    249         // IMediaPlayer interface
    250         virtual void            disconnect();
    251         virtual status_t        setVideoSurfaceTexture(
    252                                         const sp<ISurfaceTexture>& surfaceTexture);
    253         virtual status_t        prepareAsync();
    254         virtual status_t        start();
    255         virtual status_t        stop();
    256         virtual status_t        pause();
    257         virtual status_t        isPlaying(bool* state);
    258         virtual status_t        seekTo(int msec);
    259         virtual status_t        getCurrentPosition(int* msec);
    260         virtual status_t        getDuration(int* msec);
    261         virtual status_t        reset();
    262         virtual status_t        setAudioStreamType(int type);
    263         virtual status_t        setLooping(int loop);
    264         virtual status_t        setVolume(float leftVolume, float rightVolume);
    265         virtual status_t        invoke(const Parcel& request, Parcel *reply);
    266         virtual status_t        setMetadataFilter(const Parcel& filter);
    267         virtual status_t        getMetadata(bool update_only,
    268                                             bool apply_filter,
    269                                             Parcel *reply);
    270         virtual status_t        setAuxEffectSendLevel(float level);
    271         virtual status_t        attachAuxEffect(int effectId);
    272         virtual status_t        setParameter(int key, const Parcel &request);
    273         virtual status_t        getParameter(int key, Parcel *reply);
    274 
    275         sp<MediaPlayerBase>     createPlayer(player_type playerType);
    276 
    277         virtual status_t        setDataSource(
    278                         const char *url,
    279                         const KeyedVector<String8, String8> *headers);
    280 
    281         virtual status_t        setDataSource(int fd, int64_t offset, int64_t length);
    282 
    283         virtual status_t        setDataSource(const sp<IStreamSource> &source);
    284 
    285         static  void            notify(void* cookie, int msg,
    286                                        int ext1, int ext2, const Parcel *obj);
    287 
    288                 pid_t           pid() const { return mPid; }
    289         virtual status_t        dump(int fd, const Vector<String16>& args) const;
    290 
    291                 int             getAudioSessionId() { return mAudioSessionId; }
    292 
    293     private:
    294         friend class MediaPlayerService;
    295                                 Client( const sp<MediaPlayerService>& service,
    296                                         pid_t pid,
    297                                         int32_t connId,
    298                                         const sp<IMediaPlayerClient>& client,
    299                                         int audioSessionId,
    300                                         uid_t uid);
    301                                 Client();
    302         virtual                 ~Client();
    303 
    304                 void            deletePlayer();
    305 
    306         sp<MediaPlayerBase>     getPlayer() const { Mutex::Autolock lock(mLock); return mPlayer; }
    307 
    308 
    309 
    310         // @param type Of the metadata to be tested.
    311         // @return true if the metadata should be dropped according to
    312         //              the filters.
    313         bool shouldDropMetadata(media::Metadata::Type type) const;
    314 
    315         // Add a new element to the set of metadata updated. Noop if
    316         // the element exists already.
    317         // @param type Of the metadata to be recorded.
    318         void addNewMetadataUpdate(media::Metadata::Type type);
    319 
    320         // Disconnect from the currently connected ANativeWindow.
    321         void disconnectNativeWindow();
    322 
    323         mutable     Mutex                       mLock;
    324                     sp<MediaPlayerBase>         mPlayer;
    325                     sp<MediaPlayerService>      mService;
    326                     sp<IMediaPlayerClient>      mClient;
    327                     sp<AudioOutput>             mAudioOutput;
    328                     pid_t                       mPid;
    329                     status_t                    mStatus;
    330                     bool                        mLoop;
    331                     int32_t                     mConnId;
    332                     int                         mAudioSessionId;
    333                     uid_t                       mUID;
    334                     sp<ANativeWindow>           mConnectedWindow;
    335                     sp<IBinder>                 mConnectedWindowBinder;
    336 
    337         // Metadata filters.
    338         media::Metadata::Filter mMetadataAllow;  // protected by mLock
    339         media::Metadata::Filter mMetadataDrop;  // protected by mLock
    340 
    341         // Metadata updated. For each MEDIA_INFO_METADATA_UPDATE
    342         // notification we try to update mMetadataUpdated which is a
    343         // set: no duplicate.
    344         // getMetadata clears this set.
    345         media::Metadata::Filter mMetadataUpdated;  // protected by mLock
    346 
    347 #if CALLBACK_ANTAGONIZER
    348                     Antagonizer*                mAntagonizer;
    349 #endif
    350     };
    351 
    352 // ----------------------------------------------------------------------------
    353 
    354                             MediaPlayerService();
    355     virtual                 ~MediaPlayerService();
    356 
    357     mutable     Mutex                       mLock;
    358                 SortedVector< wp<Client> >  mClients;
    359                 SortedVector< wp<MediaRecorderClient> > mMediaRecorderClients;
    360                 int32_t                     mNextConnId;
    361                 sp<IOMX>                    mOMX;
    362 };
    363 
    364 // ----------------------------------------------------------------------------
    365 
    366 }; // namespace android
    367 
    368 #endif // ANDROID_MEDIAPLAYERSERVICE_H
    369