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 namespace android {
     34 
     35 class IMediaRecorder;
     36 class IMediaMetadataRetriever;
     37 class IOMX;
     38 class MediaRecorderClient;
     39 
     40 #define CALLBACK_ANTAGONIZER 0
     41 #if CALLBACK_ANTAGONIZER
     42 class Antagonizer {
     43 public:
     44     Antagonizer(notify_callback_f cb, void* client);
     45     void start() { mActive = true; }
     46     void stop() { mActive = false; }
     47     void kill();
     48 private:
     49     static const int interval;
     50     Antagonizer();
     51     static int callbackThread(void* cookie);
     52     Mutex               mLock;
     53     Condition           mCondition;
     54     bool                mExit;
     55     bool                mActive;
     56     void*               mClient;
     57     notify_callback_f   mCb;
     58 };
     59 #endif
     60 
     61 class MediaPlayerService : public BnMediaPlayerService
     62 {
     63     class Client;
     64 
     65     class AudioOutput : public MediaPlayerBase::AudioSink
     66     {
     67     public:
     68                                 AudioOutput();
     69         virtual                 ~AudioOutput();
     70 
     71         virtual bool            ready() const { return mTrack != NULL; }
     72         virtual bool            realtime() const { return true; }
     73         virtual ssize_t         bufferSize() const;
     74         virtual ssize_t         frameCount() const;
     75         virtual ssize_t         channelCount() const;
     76         virtual ssize_t         frameSize() const;
     77         virtual uint32_t        latency() const;
     78         virtual float           msecsPerFrame() const;
     79         virtual status_t        getPosition(uint32_t *position);
     80 
     81         virtual status_t        open(
     82                 uint32_t sampleRate, int channelCount,
     83                 int format, int bufferCount,
     84                 AudioCallback cb, void *cookie);
     85 
     86         virtual void            start();
     87         virtual ssize_t         write(const void* buffer, size_t size);
     88         virtual void            stop();
     89         virtual void            flush();
     90         virtual void            pause();
     91         virtual void            close();
     92                 void            setAudioStreamType(int streamType) { mStreamType = streamType; }
     93                 void            setVolume(float left, float right);
     94         virtual status_t        dump(int fd, const Vector<String16>& args) const;
     95 
     96         static bool             isOnEmulator();
     97         static int              getMinBufferCount();
     98     private:
     99         static void             setMinBufferCount();
    100         static void             CallbackWrapper(
    101                 int event, void *me, void *info);
    102 
    103         AudioTrack*             mTrack;
    104         AudioCallback           mCallback;
    105         void *                  mCallbackCookie;
    106         int                     mStreamType;
    107         float                   mLeftVolume;
    108         float                   mRightVolume;
    109         float                   mMsecsPerFrame;
    110         uint32_t                mLatency;
    111 
    112         static bool             mIsOnEmulator;
    113         static int              mMinBufferCount;  // 12 for emulator; otherwise 4
    114 
    115         public: // visualization hack support
    116         uint32_t                mNumFramesWritten;
    117         void                    snoopWrite(const void*, size_t);
    118     };
    119 
    120     class AudioCache : public MediaPlayerBase::AudioSink
    121     {
    122     public:
    123                                 AudioCache(const char* name);
    124         virtual                 ~AudioCache() {}
    125 
    126         virtual bool            ready() const { return (mChannelCount > 0) && (mHeap->getHeapID() > 0); }
    127         virtual bool            realtime() const { return false; }
    128         virtual ssize_t         bufferSize() const { return frameSize() * mFrameCount; }
    129         virtual ssize_t         frameCount() const { return mFrameCount; }
    130         virtual ssize_t         channelCount() const { return (ssize_t)mChannelCount; }
    131         virtual ssize_t         frameSize() const { return ssize_t(mChannelCount * ((mFormat == AudioSystem::PCM_16_BIT)?sizeof(int16_t):sizeof(u_int8_t))); }
    132         virtual uint32_t        latency() const;
    133         virtual float           msecsPerFrame() const;
    134         virtual status_t        getPosition(uint32_t *position);
    135 
    136         virtual status_t        open(
    137                 uint32_t sampleRate, int channelCount, int format,
    138                 int bufferCount = 1,
    139                 AudioCallback cb = NULL, void *cookie = NULL);
    140 
    141         virtual void            start();
    142         virtual ssize_t         write(const void* buffer, size_t size);
    143         virtual void            stop();
    144         virtual void            flush() {}
    145         virtual void            pause() {}
    146         virtual void            close() {}
    147                 void            setAudioStreamType(int streamType) {}
    148                 void            setVolume(float left, float right) {}
    149                 uint32_t        sampleRate() const { return mSampleRate; }
    150                 uint32_t        format() const { return (uint32_t)mFormat; }
    151                 size_t          size() const { return mSize; }
    152                 status_t        wait();
    153 
    154                 sp<IMemoryHeap> getHeap() const { return mHeap; }
    155 
    156         static  void            notify(void* cookie, int msg, int ext1, int ext2);
    157         virtual status_t        dump(int fd, const Vector<String16>& args) const;
    158 
    159     private:
    160                                 AudioCache();
    161 
    162         Mutex               mLock;
    163         Condition           mSignal;
    164         sp<MemoryHeapBase>  mHeap;
    165         float               mMsecsPerFrame;
    166         uint16_t            mChannelCount;
    167         uint16_t            mFormat;
    168         ssize_t             mFrameCount;
    169         uint32_t            mSampleRate;
    170         uint32_t            mSize;
    171         int                 mError;
    172         bool                mCommandComplete;
    173 
    174         sp<Thread>          mCallbackThread;
    175     };
    176 
    177 public:
    178     static  void                instantiate();
    179 
    180     // IMediaPlayerService interface
    181     virtual sp<IMediaRecorder>  createMediaRecorder(pid_t pid);
    182     void    removeMediaRecorderClient(wp<MediaRecorderClient> client);
    183     virtual sp<IMediaMetadataRetriever> createMetadataRetriever(pid_t pid);
    184 
    185     // House keeping for media player clients
    186     virtual sp<IMediaPlayer>    create(
    187             pid_t pid, const sp<IMediaPlayerClient>& client, const char* url,
    188             const KeyedVector<String8, String8> *headers);
    189 
    190     virtual sp<IMediaPlayer>    create(pid_t pid, const sp<IMediaPlayerClient>& client, int fd, int64_t offset, int64_t length);
    191     virtual sp<IMemory>         decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, int* pFormat);
    192     virtual sp<IMemory>         decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, int* pFormat);
    193     virtual sp<IMemory>         snoop();
    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 
    201 private:
    202 
    203     class Client : public BnMediaPlayer {
    204 
    205         // IMediaPlayer interface
    206         virtual void            disconnect();
    207         virtual status_t        setVideoSurface(const sp<ISurface>& surface);
    208         virtual status_t        prepareAsync();
    209         virtual status_t        start();
    210         virtual status_t        stop();
    211         virtual status_t        pause();
    212         virtual status_t        isPlaying(bool* state);
    213         virtual status_t        seekTo(int msec);
    214         virtual status_t        getCurrentPosition(int* msec);
    215         virtual status_t        getDuration(int* msec);
    216         virtual status_t        reset();
    217         virtual status_t        setAudioStreamType(int type);
    218         virtual status_t        setLooping(int loop);
    219         virtual status_t        setVolume(float leftVolume, float rightVolume);
    220         virtual status_t        invoke(const Parcel& request, Parcel *reply);
    221         virtual status_t        setMetadataFilter(const Parcel& filter);
    222         virtual status_t        getMetadata(bool update_only,
    223                                             bool apply_filter,
    224                                             Parcel *reply);
    225         virtual status_t        suspend();
    226         virtual status_t        resume();
    227 
    228         sp<MediaPlayerBase>     createPlayer(player_type playerType);
    229 
    230                 status_t        setDataSource(
    231                         const char *url,
    232                         const KeyedVector<String8, String8> *headers);
    233 
    234                 status_t        setDataSource(int fd, int64_t offset, int64_t length);
    235         static  void            notify(void* cookie, int msg, int ext1, int ext2);
    236 
    237                 pid_t           pid() const { return mPid; }
    238         virtual status_t        dump(int fd, const Vector<String16>& args) const;
    239 
    240     private:
    241         friend class MediaPlayerService;
    242                                 Client( const sp<MediaPlayerService>& service,
    243                                         pid_t pid,
    244                                         int32_t connId,
    245                                         const sp<IMediaPlayerClient>& client);
    246                                 Client();
    247         virtual                 ~Client();
    248 
    249                 void            deletePlayer();
    250 
    251         sp<MediaPlayerBase>     getPlayer() const { Mutex::Autolock lock(mLock); return mPlayer; }
    252 
    253 
    254 
    255         // @param type Of the metadata to be tested.
    256         // @return true if the metadata should be dropped according to
    257         //              the filters.
    258         bool shouldDropMetadata(media::Metadata::Type type) const;
    259 
    260         // Add a new element to the set of metadata updated. Noop if
    261         // the element exists already.
    262         // @param type Of the metadata to be recorded.
    263         void addNewMetadataUpdate(media::Metadata::Type type);
    264 
    265         mutable     Mutex                       mLock;
    266                     sp<MediaPlayerBase>         mPlayer;
    267                     sp<MediaPlayerService>      mService;
    268                     sp<IMediaPlayerClient>      mClient;
    269                     sp<AudioOutput>             mAudioOutput;
    270                     pid_t                       mPid;
    271                     status_t                    mStatus;
    272                     bool                        mLoop;
    273                     int32_t                     mConnId;
    274 
    275         // Metadata filters.
    276         media::Metadata::Filter mMetadataAllow;  // protected by mLock
    277         media::Metadata::Filter mMetadataDrop;  // protected by mLock
    278 
    279         // Metadata updated. For each MEDIA_INFO_METADATA_UPDATE
    280         // notification we try to update mMetadataUpdated which is a
    281         // set: no duplicate.
    282         // getMetadata clears this set.
    283         media::Metadata::Filter mMetadataUpdated;  // protected by mLock
    284 
    285 #if CALLBACK_ANTAGONIZER
    286                     Antagonizer*                mAntagonizer;
    287 #endif
    288     };
    289 
    290 // ----------------------------------------------------------------------------
    291 
    292                             MediaPlayerService();
    293     virtual                 ~MediaPlayerService();
    294 
    295     mutable     Mutex                       mLock;
    296                 SortedVector< wp<Client> >  mClients;
    297                 SortedVector< wp<MediaRecorderClient> > mMediaRecorderClients;
    298                 int32_t                     mNextConnId;
    299                 sp<IOMX>                    mOMX;
    300 };
    301 
    302 // ----------------------------------------------------------------------------
    303 
    304 }; // namespace android
    305 
    306 #endif // ANDROID_MEDIAPLAYERSERVICE_H
    307