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