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