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 <arpa/inet.h>
     22 
     23 #include <utils/Log.h>
     24 #include <utils/threads.h>
     25 #include <utils/List.h>
     26 #include <utils/Errors.h>
     27 #include <utils/KeyedVector.h>
     28 #include <utils/String8.h>
     29 #include <utils/Vector.h>
     30 
     31 #include <media/IMediaPlayerService.h>
     32 #include <media/MediaPlayerInterface.h>
     33 #include <media/Metadata.h>
     34 #include <media/stagefright/foundation/ABase.h>
     35 
     36 #include <system/audio.h>
     37 
     38 namespace android {
     39 
     40 class AudioTrack;
     41 class IMediaRecorder;
     42 class IMediaMetadataRetriever;
     43 class IOMX;
     44 class MediaRecorderClient;
     45 
     46 #define CALLBACK_ANTAGONIZER 0
     47 #if CALLBACK_ANTAGONIZER
     48 class Antagonizer {
     49 public:
     50     Antagonizer(notify_callback_f cb, void* client);
     51     void start() { mActive = true; }
     52     void stop() { mActive = false; }
     53     void kill();
     54 private:
     55     static const int interval;
     56     Antagonizer();
     57     static int callbackThread(void* cookie);
     58     Mutex               mLock;
     59     Condition           mCondition;
     60     bool                mExit;
     61     bool                mActive;
     62     void*               mClient;
     63     notify_callback_f   mCb;
     64 };
     65 #endif
     66 
     67 class MediaPlayerService : public BnMediaPlayerService
     68 {
     69     class Client;
     70 
     71     class AudioOutput : public MediaPlayerBase::AudioSink
     72     {
     73         class CallbackData;
     74 
     75      public:
     76                                 AudioOutput(int sessionId);
     77         virtual                 ~AudioOutput();
     78 
     79         virtual bool            ready() const { return mTrack != NULL; }
     80         virtual bool            realtime() const { return true; }
     81         virtual ssize_t         bufferSize() const;
     82         virtual ssize_t         frameCount() const;
     83         virtual ssize_t         channelCount() const;
     84         virtual ssize_t         frameSize() const;
     85         virtual uint32_t        latency() const;
     86         virtual float           msecsPerFrame() const;
     87         virtual status_t        getPosition(uint32_t *position) const;
     88         virtual status_t        getFramesWritten(uint32_t *frameswritten) const;
     89         virtual int             getSessionId() const;
     90 
     91         virtual status_t        open(
     92                 uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask,
     93                 audio_format_t format, int bufferCount,
     94                 AudioCallback cb, void *cookie,
     95                 audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE);
     96 
     97         virtual void            start();
     98         virtual ssize_t         write(const void* buffer, size_t size);
     99         virtual void            stop();
    100         virtual void            flush();
    101         virtual void            pause();
    102         virtual void            close();
    103                 void            setAudioStreamType(audio_stream_type_t streamType) { mStreamType = streamType; }
    104                 void            setVolume(float left, float right);
    105         virtual status_t        setPlaybackRatePermille(int32_t ratePermille);
    106                 status_t        setAuxEffectSendLevel(float level);
    107                 status_t        attachAuxEffect(int effectId);
    108         virtual status_t        dump(int fd, const Vector<String16>& args) const;
    109 
    110         static bool             isOnEmulator();
    111         static int              getMinBufferCount();
    112                 void            setNextOutput(const sp<AudioOutput>& nextOutput);
    113                 void            switchToNextOutput();
    114         virtual bool            needsTrailingPadding() { return mNextOutput == NULL; }
    115 
    116     private:
    117         static void             setMinBufferCount();
    118         static void             CallbackWrapper(
    119                 int event, void *me, void *info);
    120 
    121         AudioTrack*             mTrack;
    122         AudioTrack*             mRecycledTrack;
    123         sp<AudioOutput>         mNextOutput;
    124         AudioCallback           mCallback;
    125         void *                  mCallbackCookie;
    126         CallbackData *          mCallbackData;
    127         uint64_t                mBytesWritten;
    128         audio_stream_type_t     mStreamType;
    129         float                   mLeftVolume;
    130         float                   mRightVolume;
    131         int32_t                 mPlaybackRatePermille;
    132         uint32_t                mSampleRateHz; // sample rate of the content, as set in open()
    133         float                   mMsecsPerFrame;
    134         int                     mSessionId;
    135         float                   mSendLevel;
    136         int                     mAuxEffectId;
    137         static bool             mIsOnEmulator;
    138         static int              mMinBufferCount;  // 12 for emulator; otherwise 4
    139         audio_output_flags_t    mFlags;
    140 
    141         // CallbackData is what is passed to the AudioTrack as the "user" data.
    142         // We need to be able to target this to a different Output on the fly,
    143         // so we can't use the Output itself for this.
    144         class CallbackData {
    145         public:
    146             CallbackData(AudioOutput *cookie) {
    147                 mData = cookie;
    148                 mSwitching = false;
    149             }
    150             AudioOutput *   getOutput() { return mData;}
    151             void            setOutput(AudioOutput* newcookie) { mData = newcookie; }
    152             // lock/unlock are used by the callback before accessing the payload of this object
    153             void            lock() { mLock.lock(); }
    154             void            unlock() { mLock.unlock(); }
    155             // beginTrackSwitch/endTrackSwitch are used when this object is being handed over
    156             // to the next sink.
    157             void            beginTrackSwitch() { mLock.lock(); mSwitching = true; }
    158             void            endTrackSwitch() {
    159                 if (mSwitching) {
    160                     mLock.unlock();
    161                 }
    162                 mSwitching = false;
    163             }
    164         private:
    165             AudioOutput *   mData;
    166             mutable Mutex   mLock;
    167             bool            mSwitching;
    168             DISALLOW_EVIL_CONSTRUCTORS(CallbackData);
    169         };
    170 
    171     }; // AudioOutput
    172 
    173 
    174     class AudioCache : public MediaPlayerBase::AudioSink
    175     {
    176     public:
    177                                 AudioCache(const char* name);
    178         virtual                 ~AudioCache() {}
    179 
    180         virtual bool            ready() const { return (mChannelCount > 0) && (mHeap->getHeapID() > 0); }
    181         virtual bool            realtime() const { return false; }
    182         virtual ssize_t         bufferSize() const { return frameSize() * mFrameCount; }
    183         virtual ssize_t         frameCount() const { return mFrameCount; }
    184         virtual ssize_t         channelCount() const { return (ssize_t)mChannelCount; }
    185         virtual ssize_t         frameSize() const { return ssize_t(mChannelCount * ((mFormat == AUDIO_FORMAT_PCM_16_BIT)?sizeof(int16_t):sizeof(u_int8_t))); }
    186         virtual uint32_t        latency() const;
    187         virtual float           msecsPerFrame() const;
    188         virtual status_t        getPosition(uint32_t *position) const;
    189         virtual status_t        getFramesWritten(uint32_t *frameswritten) const;
    190         virtual int             getSessionId() const;
    191 
    192         virtual status_t        open(
    193                 uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask,
    194                 audio_format_t format, int bufferCount = 1,
    195                 AudioCallback cb = NULL, void *cookie = NULL,
    196                 audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE);
    197 
    198         virtual void            start();
    199         virtual ssize_t         write(const void* buffer, size_t size);
    200         virtual void            stop();
    201         virtual void            flush() {}
    202         virtual void            pause() {}
    203         virtual void            close() {}
    204                 void            setAudioStreamType(audio_stream_type_t streamType) {}
    205                 void            setVolume(float left, float right) {}
    206         virtual status_t        setPlaybackRatePermille(int32_t ratePermille) { return INVALID_OPERATION; }
    207                 uint32_t        sampleRate() const { return mSampleRate; }
    208                 audio_format_t  format() const { return mFormat; }
    209                 size_t          size() const { return mSize; }
    210                 status_t        wait();
    211 
    212                 sp<IMemoryHeap> getHeap() const { return mHeap; }
    213 
    214         static  void            notify(void* cookie, int msg,
    215                                        int ext1, int ext2, const Parcel *obj);
    216         virtual status_t        dump(int fd, const Vector<String16>& args) const;
    217 
    218     private:
    219                                 AudioCache();
    220 
    221         Mutex               mLock;
    222         Condition           mSignal;
    223         sp<MemoryHeapBase>  mHeap;
    224         float               mMsecsPerFrame;
    225         uint16_t            mChannelCount;
    226         audio_format_t      mFormat;
    227         ssize_t             mFrameCount;
    228         uint32_t            mSampleRate;
    229         uint32_t            mSize;
    230         int                 mError;
    231         bool                mCommandComplete;
    232 
    233         sp<Thread>          mCallbackThread;
    234     }; // AudioCache
    235 
    236 public:
    237     static  void                instantiate();
    238 
    239     // IMediaPlayerService interface
    240     virtual sp<IMediaRecorder>  createMediaRecorder(pid_t pid);
    241     void    removeMediaRecorderClient(wp<MediaRecorderClient> client);
    242     virtual sp<IMediaMetadataRetriever> createMetadataRetriever(pid_t pid);
    243 
    244     virtual sp<IMediaPlayer>    create(pid_t pid, const sp<IMediaPlayerClient>& client, int audioSessionId);
    245 
    246     virtual sp<IMemory>         decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, audio_format_t* pFormat);
    247     virtual sp<IMemory>         decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, audio_format_t* pFormat);
    248     virtual sp<IOMX>            getOMX();
    249     virtual sp<ICrypto>         makeCrypto();
    250 
    251     virtual status_t            dump(int fd, const Vector<String16>& args);
    252 
    253             void                removeClient(wp<Client> client);
    254 
    255     // For battery usage tracking purpose
    256     struct BatteryUsageInfo {
    257         // how many streams are being played by one UID
    258         int     refCount;
    259         // a temp variable to store the duration(ms) of audio codecs
    260         // when we start a audio codec, we minus the system time from audioLastTime
    261         // when we pause it, we add the system time back to the audioLastTime
    262         // so after the pause, audioLastTime = pause time - start time
    263         // if multiple audio streams are played (or recorded), then audioLastTime
    264         // = the total playing time of all the streams
    265         int32_t audioLastTime;
    266         // when all the audio streams are being paused, we assign audioLastTime to
    267         // this variable, so this value could be provided to the battery app
    268         // in the next pullBatteryData call
    269         int32_t audioTotalTime;
    270 
    271         int32_t videoLastTime;
    272         int32_t videoTotalTime;
    273     };
    274     KeyedVector<int, BatteryUsageInfo>    mBatteryData;
    275 
    276     enum {
    277         SPEAKER,
    278         OTHER_AUDIO_DEVICE,
    279         SPEAKER_AND_OTHER,
    280         NUM_AUDIO_DEVICES
    281     };
    282 
    283     struct BatteryAudioFlingerUsageInfo {
    284         int refCount; // how many audio streams are being played
    285         int deviceOn[NUM_AUDIO_DEVICES]; // whether the device is currently used
    286         int32_t lastTime[NUM_AUDIO_DEVICES]; // in ms
    287         // totalTime[]: total time of audio output devices usage
    288         int32_t totalTime[NUM_AUDIO_DEVICES]; // in ms
    289     };
    290 
    291     // This varialble is used to record the usage of audio output device
    292     // for battery app
    293     BatteryAudioFlingerUsageInfo mBatteryAudio;
    294 
    295     // Collect info of the codec usage from media player and media recorder
    296     virtual void                addBatteryData(uint32_t params);
    297     // API for the Battery app to pull the data of codecs usage
    298     virtual status_t            pullBatteryData(Parcel* reply);
    299 private:
    300 
    301     class Client : public BnMediaPlayer {
    302 
    303         // IMediaPlayer interface
    304         virtual void            disconnect();
    305         virtual status_t        setVideoSurfaceTexture(
    306                                         const sp<ISurfaceTexture>& surfaceTexture);
    307         virtual status_t        prepareAsync();
    308         virtual status_t        start();
    309         virtual status_t        stop();
    310         virtual status_t        pause();
    311         virtual status_t        isPlaying(bool* state);
    312         virtual status_t        seekTo(int msec);
    313         virtual status_t        getCurrentPosition(int* msec);
    314         virtual status_t        getDuration(int* msec);
    315         virtual status_t        reset();
    316         virtual status_t        setAudioStreamType(audio_stream_type_t type);
    317         virtual status_t        setLooping(int loop);
    318         virtual status_t        setVolume(float leftVolume, float rightVolume);
    319         virtual status_t        invoke(const Parcel& request, Parcel *reply);
    320         virtual status_t        setMetadataFilter(const Parcel& filter);
    321         virtual status_t        getMetadata(bool update_only,
    322                                             bool apply_filter,
    323                                             Parcel *reply);
    324         virtual status_t        setAuxEffectSendLevel(float level);
    325         virtual status_t        attachAuxEffect(int effectId);
    326         virtual status_t        setParameter(int key, const Parcel &request);
    327         virtual status_t        getParameter(int key, Parcel *reply);
    328         virtual status_t        setRetransmitEndpoint(const struct sockaddr_in* endpoint);
    329         virtual status_t        setNextPlayer(const sp<IMediaPlayer>& player);
    330 
    331         sp<MediaPlayerBase>     createPlayer(player_type playerType);
    332 
    333         virtual status_t        setDataSource(
    334                         const char *url,
    335                         const KeyedVector<String8, String8> *headers);
    336 
    337         virtual status_t        setDataSource(int fd, int64_t offset, int64_t length);
    338 
    339         virtual status_t        setDataSource(const sp<IStreamSource> &source);
    340 
    341         sp<MediaPlayerBase>     setDataSource_pre(player_type playerType);
    342         void                    setDataSource_post(const sp<MediaPlayerBase>& p,
    343                                                    status_t status);
    344 
    345         player_type             getPlayerType(int fd, int64_t offset, int64_t length);
    346         player_type             getPlayerType(const char* url);
    347         player_type             getPlayerType(const sp<IStreamSource> &source);
    348 
    349         static  void            notify(void* cookie, int msg,
    350                                        int ext1, int ext2, const Parcel *obj);
    351 
    352                 pid_t           pid() const { return mPid; }
    353         virtual status_t        dump(int fd, const Vector<String16>& args) const;
    354 
    355                 int             getAudioSessionId() { return mAudioSessionId; }
    356 
    357     private:
    358         friend class MediaPlayerService;
    359                                 Client( const sp<MediaPlayerService>& service,
    360                                         pid_t pid,
    361                                         int32_t connId,
    362                                         const sp<IMediaPlayerClient>& client,
    363                                         int audioSessionId,
    364                                         uid_t uid);
    365                                 Client();
    366         virtual                 ~Client();
    367 
    368                 void            deletePlayer();
    369 
    370         sp<MediaPlayerBase>     getPlayer() const { Mutex::Autolock lock(mLock); return mPlayer; }
    371 
    372 
    373 
    374         // @param type Of the metadata to be tested.
    375         // @return true if the metadata should be dropped according to
    376         //              the filters.
    377         bool shouldDropMetadata(media::Metadata::Type type) const;
    378 
    379         // Add a new element to the set of metadata updated. Noop if
    380         // the element exists already.
    381         // @param type Of the metadata to be recorded.
    382         void addNewMetadataUpdate(media::Metadata::Type type);
    383 
    384         // Disconnect from the currently connected ANativeWindow.
    385         void disconnectNativeWindow();
    386 
    387         mutable     Mutex                       mLock;
    388                     sp<MediaPlayerBase>         mPlayer;
    389                     sp<MediaPlayerService>      mService;
    390                     sp<IMediaPlayerClient>      mClient;
    391                     sp<AudioOutput>             mAudioOutput;
    392                     pid_t                       mPid;
    393                     status_t                    mStatus;
    394                     bool                        mLoop;
    395                     int32_t                     mConnId;
    396                     int                         mAudioSessionId;
    397                     uid_t                       mUID;
    398                     sp<ANativeWindow>           mConnectedWindow;
    399                     sp<IBinder>                 mConnectedWindowBinder;
    400                     struct sockaddr_in          mRetransmitEndpoint;
    401                     bool                        mRetransmitEndpointValid;
    402                     sp<Client>                  mNextClient;
    403 
    404         // Metadata filters.
    405         media::Metadata::Filter mMetadataAllow;  // protected by mLock
    406         media::Metadata::Filter mMetadataDrop;  // protected by mLock
    407 
    408         // Metadata updated. For each MEDIA_INFO_METADATA_UPDATE
    409         // notification we try to update mMetadataUpdated which is a
    410         // set: no duplicate.
    411         // getMetadata clears this set.
    412         media::Metadata::Filter mMetadataUpdated;  // protected by mLock
    413 
    414 #if CALLBACK_ANTAGONIZER
    415                     Antagonizer*                mAntagonizer;
    416 #endif
    417     }; // Client
    418 
    419 // ----------------------------------------------------------------------------
    420 
    421                             MediaPlayerService();
    422     virtual                 ~MediaPlayerService();
    423 
    424     mutable     Mutex                       mLock;
    425                 SortedVector< wp<Client> >  mClients;
    426                 SortedVector< wp<MediaRecorderClient> > mMediaRecorderClients;
    427                 int32_t                     mNextConnId;
    428                 sp<IOMX>                    mOMX;
    429                 sp<ICrypto>                 mCrypto;
    430 };
    431 
    432 // ----------------------------------------------------------------------------
    433 
    434 }; // namespace android
    435 
    436 #endif // ANDROID_MEDIAPLAYERSERVICE_H
    437