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