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