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