blob: 85cec220c471884993dca6ec24f5291c50ff3ad5 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
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
John Grossman720aa282012-02-22 15:38:35 -080021#include <arpa/inet.h>
22
Mathias Agopian3b4062e2009-05-31 19:13:00 -070023#include <utils/Log.h>
24#include <utils/threads.h>
25#include <utils/List.h>
26#include <utils/Errors.h>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080027#include <utils/KeyedVector.h>
Andreas Huber25643002010-01-28 11:19:57 -080028#include <utils/String8.h>
Nicolas Cataniab2c69392009-07-08 08:57:42 -070029#include <utils/Vector.h>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080030
31#include <media/IMediaPlayerService.h>
32#include <media/MediaPlayerInterface.h>
nikobc726922009-07-20 15:07:26 -070033#include <media/Metadata.h>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080034
Dima Zavin34bb4192011-05-11 14:15:23 -070035#include <system/audio.h>
Dima Zavin24fc2fb2011-04-19 22:30:36 -070036
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080037namespace android {
38
Glenn Kastena6dafea2012-01-18 14:54:46 -080039class AudioTrack;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080040class IMediaRecorder;
41class IMediaMetadataRetriever;
Andreas Hubere46b7be2009-07-14 16:56:47 -070042class IOMX;
Gloria Wang608a2632009-10-29 15:46:37 -070043class MediaRecorderClient;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080044
45#define CALLBACK_ANTAGONIZER 0
46#if CALLBACK_ANTAGONIZER
47class Antagonizer {
48public:
49 Antagonizer(notify_callback_f cb, void* client);
50 void start() { mActive = true; }
51 void stop() { mActive = false; }
52 void kill();
53private:
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
66class MediaPlayerService : public BnMediaPlayerService
67{
68 class Client;
69
70 class AudioOutput : public MediaPlayerBase::AudioSink
71 {
72 public:
Eric Laurent619346f2010-06-21 09:27:30 -070073 AudioOutput(int sessionId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080074 virtual ~AudioOutput();
75
76 virtual bool ready() const { return mTrack != NULL; }
77 virtual bool realtime() const { return true; }
78 virtual ssize_t bufferSize() const;
79 virtual ssize_t frameCount() const;
80 virtual ssize_t channelCount() const;
81 virtual ssize_t frameSize() const;
82 virtual uint32_t latency() const;
83 virtual float msecsPerFrame() const;
Eric Laurent0986e792010-01-19 17:37:09 -080084 virtual status_t getPosition(uint32_t *position);
Eric Laurentb3bdf3f2010-10-07 18:23:03 -070085 virtual int getSessionId();
Andreas Hubere46b7be2009-07-14 16:56:47 -070086
87 virtual status_t open(
Jean-Michel Trivi4ed260f2012-03-02 14:54:07 -080088 uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask,
Glenn Kasten1c5a89d2012-01-04 09:36:37 -080089 audio_format_t format, int bufferCount,
Andreas Hubere46b7be2009-07-14 16:56:47 -070090 AudioCallback cb, void *cookie);
91
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080092 virtual void start();
93 virtual ssize_t write(const void* buffer, size_t size);
94 virtual void stop();
95 virtual void flush();
96 virtual void pause();
97 virtual void close();
Glenn Kastenbc1d77b2012-01-12 16:38:12 -080098 void setAudioStreamType(audio_stream_type_t streamType) { mStreamType = streamType; }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080099 void setVolume(float left, float right);
Jean-Michel Trivie901a5c2012-02-02 09:06:31 -0800100 virtual status_t setPlaybackRatePermille(int32_t ratePermille);
Eric Laurent7070b362010-07-16 07:43:46 -0700101 status_t setAuxEffectSendLevel(float level);
102 status_t attachAuxEffect(int effectId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800103 virtual status_t dump(int fd, const Vector<String16>& args) const;
104
105 static bool isOnEmulator();
106 static int getMinBufferCount();
107 private:
108 static void setMinBufferCount();
Andreas Hubere46b7be2009-07-14 16:56:47 -0700109 static void CallbackWrapper(
Glenn Kastene46a86f2011-06-01 15:20:35 -0700110 int event, void *me, void *info);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800111
112 AudioTrack* mTrack;
Andreas Hubere46b7be2009-07-14 16:56:47 -0700113 AudioCallback mCallback;
114 void * mCallbackCookie;
Glenn Kastenbc1d77b2012-01-12 16:38:12 -0800115 audio_stream_type_t mStreamType;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800116 float mLeftVolume;
117 float mRightVolume;
Jean-Michel Trivie901a5c2012-02-02 09:06:31 -0800118 int32_t mPlaybackRatePermille;
119 uint32_t mSampleRateHz; // sample rate of the content, as set in open()
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800120 float mMsecsPerFrame;
Eric Laurent619346f2010-06-21 09:27:30 -0700121 int mSessionId;
Eric Laurent7070b362010-07-16 07:43:46 -0700122 float mSendLevel;
123 int mAuxEffectId;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800124 static bool mIsOnEmulator;
125 static int mMinBufferCount; // 12 for emulator; otherwise 4
126
127 };
128
129 class AudioCache : public MediaPlayerBase::AudioSink
130 {
131 public:
132 AudioCache(const char* name);
133 virtual ~AudioCache() {}
134
135 virtual bool ready() const { return (mChannelCount > 0) && (mHeap->getHeapID() > 0); }
136 virtual bool realtime() const { return false; }
137 virtual ssize_t bufferSize() const { return frameSize() * mFrameCount; }
138 virtual ssize_t frameCount() const { return mFrameCount; }
139 virtual ssize_t channelCount() const { return (ssize_t)mChannelCount; }
Dima Zavin24fc2fb2011-04-19 22:30:36 -0700140 virtual ssize_t frameSize() const { return ssize_t(mChannelCount * ((mFormat == AUDIO_FORMAT_PCM_16_BIT)?sizeof(int16_t):sizeof(u_int8_t))); }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800141 virtual uint32_t latency() const;
142 virtual float msecsPerFrame() const;
Eric Laurent0986e792010-01-19 17:37:09 -0800143 virtual status_t getPosition(uint32_t *position);
Eric Laurentb3bdf3f2010-10-07 18:23:03 -0700144 virtual int getSessionId();
Andreas Hubere46b7be2009-07-14 16:56:47 -0700145
146 virtual status_t open(
Jean-Michel Trivi4ed260f2012-03-02 14:54:07 -0800147 uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask,
148 audio_format_t format, int bufferCount = 1,
Andreas Hubere46b7be2009-07-14 16:56:47 -0700149 AudioCallback cb = NULL, void *cookie = NULL);
150
Andreas Huber6ed937e2010-02-09 16:59:18 -0800151 virtual void start();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800152 virtual ssize_t write(const void* buffer, size_t size);
Andreas Huber6ed937e2010-02-09 16:59:18 -0800153 virtual void stop();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800154 virtual void flush() {}
155 virtual void pause() {}
156 virtual void close() {}
Glenn Kastenbc1d77b2012-01-12 16:38:12 -0800157 void setAudioStreamType(audio_stream_type_t streamType) {}
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800158 void setVolume(float left, float right) {}
Jean-Michel Trivie901a5c2012-02-02 09:06:31 -0800159 virtual status_t setPlaybackRatePermille(int32_t ratePermille) { return INVALID_OPERATION; }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800160 uint32_t sampleRate() const { return mSampleRate; }
Glenn Kasten1c5a89d2012-01-04 09:36:37 -0800161 audio_format_t format() const { return mFormat; }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800162 size_t size() const { return mSize; }
163 status_t wait();
164
165 sp<IMemoryHeap> getHeap() const { return mHeap; }
166
Gloria Wang162ee492011-04-11 17:23:27 -0700167 static void notify(void* cookie, int msg,
168 int ext1, int ext2, const Parcel *obj);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800169 virtual status_t dump(int fd, const Vector<String16>& args) const;
170
171 private:
172 AudioCache();
173
174 Mutex mLock;
175 Condition mSignal;
176 sp<MemoryHeapBase> mHeap;
177 float mMsecsPerFrame;
178 uint16_t mChannelCount;
Glenn Kasten1c5a89d2012-01-04 09:36:37 -0800179 audio_format_t mFormat;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800180 ssize_t mFrameCount;
181 uint32_t mSampleRate;
182 uint32_t mSize;
183 int mError;
184 bool mCommandComplete;
Andreas Huber6ed937e2010-02-09 16:59:18 -0800185
186 sp<Thread> mCallbackThread;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800187 };
188
189public:
190 static void instantiate();
191
192 // IMediaPlayerService interface
193 virtual sp<IMediaRecorder> createMediaRecorder(pid_t pid);
Gloria Wang608a2632009-10-29 15:46:37 -0700194 void removeMediaRecorderClient(wp<MediaRecorderClient> client);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800195 virtual sp<IMediaMetadataRetriever> createMetadataRetriever(pid_t pid);
196
Dave Burkefc301b02011-08-30 14:39:17 +0100197 virtual sp<IMediaPlayer> create(pid_t pid, const sp<IMediaPlayerClient>& client, int audioSessionId);
Andreas Huber52b52cd2010-11-23 11:41:34 -0800198
Glenn Kasten1c5a89d2012-01-04 09:36:37 -0800199 virtual sp<IMemory> decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, audio_format_t* pFormat);
200 virtual sp<IMemory> decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, audio_format_t* pFormat);
Andreas Huber784202e2009-10-15 13:46:54 -0700201 virtual sp<IOMX> getOMX();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800202
203 virtual status_t dump(int fd, const Vector<String16>& args);
204
205 void removeClient(wp<Client> client);
206
Gloria Wangd211f412011-02-19 18:37:57 -0800207 // For battery usage tracking purpose
208 struct BatteryUsageInfo {
209 // how many streams are being played by one UID
210 int refCount;
211 // a temp variable to store the duration(ms) of audio codecs
212 // when we start a audio codec, we minus the system time from audioLastTime
213 // when we pause it, we add the system time back to the audioLastTime
214 // so after the pause, audioLastTime = pause time - start time
215 // if multiple audio streams are played (or recorded), then audioLastTime
216 // = the total playing time of all the streams
217 int32_t audioLastTime;
218 // when all the audio streams are being paused, we assign audioLastTime to
219 // this variable, so this value could be provided to the battery app
220 // in the next pullBatteryData call
221 int32_t audioTotalTime;
Nicolas Cataniab2c69392009-07-08 08:57:42 -0700222
Gloria Wangd211f412011-02-19 18:37:57 -0800223 int32_t videoLastTime;
224 int32_t videoTotalTime;
225 };
226 KeyedVector<int, BatteryUsageInfo> mBatteryData;
227
Gloria Wang9b3f1522011-02-24 14:51:45 -0800228 enum {
229 SPEAKER,
230 OTHER_AUDIO_DEVICE,
231 SPEAKER_AND_OTHER,
232 NUM_AUDIO_DEVICES
233 };
234
235 struct BatteryAudioFlingerUsageInfo {
236 int refCount; // how many audio streams are being played
237 int deviceOn[NUM_AUDIO_DEVICES]; // whether the device is currently used
238 int32_t lastTime[NUM_AUDIO_DEVICES]; // in ms
239 // totalTime[]: total time of audio output devices usage
240 int32_t totalTime[NUM_AUDIO_DEVICES]; // in ms
241 };
242
243 // This varialble is used to record the usage of audio output device
244 // for battery app
245 BatteryAudioFlingerUsageInfo mBatteryAudio;
246
Gloria Wangd211f412011-02-19 18:37:57 -0800247 // Collect info of the codec usage from media player and media recorder
248 virtual void addBatteryData(uint32_t params);
249 // API for the Battery app to pull the data of codecs usage
250 virtual status_t pullBatteryData(Parcel* reply);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800251private:
252
253 class Client : public BnMediaPlayer {
254
255 // IMediaPlayer interface
256 virtual void disconnect();
Glenn Kastencc562a32011-02-08 17:26:17 -0800257 virtual status_t setVideoSurfaceTexture(
258 const sp<ISurfaceTexture>& surfaceTexture);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800259 virtual status_t prepareAsync();
260 virtual status_t start();
261 virtual status_t stop();
262 virtual status_t pause();
263 virtual status_t isPlaying(bool* state);
264 virtual status_t seekTo(int msec);
265 virtual status_t getCurrentPosition(int* msec);
266 virtual status_t getDuration(int* msec);
267 virtual status_t reset();
Glenn Kastenbc1d77b2012-01-12 16:38:12 -0800268 virtual status_t setAudioStreamType(audio_stream_type_t type);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800269 virtual status_t setLooping(int loop);
270 virtual status_t setVolume(float leftVolume, float rightVolume);
Nicolas Catania20cb94e2009-05-12 23:25:55 -0700271 virtual status_t invoke(const Parcel& request, Parcel *reply);
Nicolas Cataniab2c69392009-07-08 08:57:42 -0700272 virtual status_t setMetadataFilter(const Parcel& filter);
Nicolas Catania4df8b2c2009-07-10 13:53:06 -0700273 virtual status_t getMetadata(bool update_only,
274 bool apply_filter,
275 Parcel *reply);
Eric Laurent7070b362010-07-16 07:43:46 -0700276 virtual status_t setAuxEffectSendLevel(float level);
277 virtual status_t attachAuxEffect(int effectId);
Gloria Wangd01ec6e2011-04-25 17:28:22 -0700278 virtual status_t setParameter(int key, const Parcel &request);
279 virtual status_t getParameter(int key, Parcel *reply);
John Grossman720aa282012-02-22 15:38:35 -0800280 virtual status_t setRetransmitEndpoint(const struct sockaddr_in* endpoint);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800281
282 sp<MediaPlayerBase> createPlayer(player_type playerType);
Andreas Huber25643002010-01-28 11:19:57 -0800283
Dave Burkefc301b02011-08-30 14:39:17 +0100284 virtual status_t setDataSource(
Andreas Huber25643002010-01-28 11:19:57 -0800285 const char *url,
286 const KeyedVector<String8, String8> *headers);
287
Dave Burkefc301b02011-08-30 14:39:17 +0100288 virtual status_t setDataSource(int fd, int64_t offset, int64_t length);
Andreas Huber52b52cd2010-11-23 11:41:34 -0800289
Dave Burkefc301b02011-08-30 14:39:17 +0100290 virtual status_t setDataSource(const sp<IStreamSource> &source);
Andreas Huber52b52cd2010-11-23 11:41:34 -0800291
John Grossman720aa282012-02-22 15:38:35 -0800292 sp<MediaPlayerBase> setDataSource_pre(player_type playerType);
293 void setDataSource_post(const sp<MediaPlayerBase>& p,
294 status_t status);
295
296 player_type getPlayerType(int fd, int64_t offset, int64_t length);
297 player_type getPlayerType(const char* url);
298 player_type getPlayerType(const sp<IStreamSource> &source);
299
Gloria Wang162ee492011-04-11 17:23:27 -0700300 static void notify(void* cookie, int msg,
301 int ext1, int ext2, const Parcel *obj);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800302
303 pid_t pid() const { return mPid; }
304 virtual status_t dump(int fd, const Vector<String16>& args) const;
305
Eric Laurent619346f2010-06-21 09:27:30 -0700306 int getAudioSessionId() { return mAudioSessionId; }
307
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800308 private:
309 friend class MediaPlayerService;
310 Client( const sp<MediaPlayerService>& service,
311 pid_t pid,
312 int32_t connId,
Eric Laurent619346f2010-06-21 09:27:30 -0700313 const sp<IMediaPlayerClient>& client,
Andreas Huber603d7392011-06-30 15:47:02 -0700314 int audioSessionId,
315 uid_t uid);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800316 Client();
317 virtual ~Client();
318
319 void deletePlayer();
320
321 sp<MediaPlayerBase> getPlayer() const { Mutex::Autolock lock(mLock); return mPlayer; }
322
Nicolas Cataniab2c69392009-07-08 08:57:42 -0700323
Nicolas Catania4df8b2c2009-07-10 13:53:06 -0700324
325 // @param type Of the metadata to be tested.
326 // @return true if the metadata should be dropped according to
327 // the filters.
nikobc726922009-07-20 15:07:26 -0700328 bool shouldDropMetadata(media::Metadata::Type type) const;
Nicolas Catania4df8b2c2009-07-10 13:53:06 -0700329
330 // Add a new element to the set of metadata updated. Noop if
331 // the element exists already.
332 // @param type Of the metadata to be recorded.
nikobc726922009-07-20 15:07:26 -0700333 void addNewMetadataUpdate(media::Metadata::Type type);
Nicolas Cataniab2c69392009-07-08 08:57:42 -0700334
Jamie Gennis2fa0ac22011-10-26 18:36:31 -0700335 // Disconnect from the currently connected ANativeWindow.
336 void disconnectNativeWindow();
337
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800338 mutable Mutex mLock;
339 sp<MediaPlayerBase> mPlayer;
340 sp<MediaPlayerService> mService;
341 sp<IMediaPlayerClient> mClient;
342 sp<AudioOutput> mAudioOutput;
343 pid_t mPid;
344 status_t mStatus;
345 bool mLoop;
346 int32_t mConnId;
Eric Laurent619346f2010-06-21 09:27:30 -0700347 int mAudioSessionId;
Andreas Huber603d7392011-06-30 15:47:02 -0700348 uid_t mUID;
Jamie Gennis2fa0ac22011-10-26 18:36:31 -0700349 sp<ANativeWindow> mConnectedWindow;
350 sp<IBinder> mConnectedWindowBinder;
John Grossman720aa282012-02-22 15:38:35 -0800351 struct sockaddr_in mRetransmitEndpoint;
352 bool mRetransmitEndpointValid;
Nicolas Catania4df8b2c2009-07-10 13:53:06 -0700353
Nicolas Cataniab2c69392009-07-08 08:57:42 -0700354 // Metadata filters.
nikobc726922009-07-20 15:07:26 -0700355 media::Metadata::Filter mMetadataAllow; // protected by mLock
356 media::Metadata::Filter mMetadataDrop; // protected by mLock
Nicolas Catania4df8b2c2009-07-10 13:53:06 -0700357
358 // Metadata updated. For each MEDIA_INFO_METADATA_UPDATE
359 // notification we try to update mMetadataUpdated which is a
360 // set: no duplicate.
361 // getMetadata clears this set.
nikobc726922009-07-20 15:07:26 -0700362 media::Metadata::Filter mMetadataUpdated; // protected by mLock
Nicolas Catania4df8b2c2009-07-10 13:53:06 -0700363
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800364#if CALLBACK_ANTAGONIZER
365 Antagonizer* mAntagonizer;
366#endif
367 };
368
369// ----------------------------------------------------------------------------
370
371 MediaPlayerService();
372 virtual ~MediaPlayerService();
373
374 mutable Mutex mLock;
375 SortedVector< wp<Client> > mClients;
Gloria Wang608a2632009-10-29 15:46:37 -0700376 SortedVector< wp<MediaRecorderClient> > mMediaRecorderClients;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800377 int32_t mNextConnId;
Andreas Huber784202e2009-10-15 13:46:54 -0700378 sp<IOMX> mOMX;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800379};
380
381// ----------------------------------------------------------------------------
382
383}; // namespace android
384
385#endif // ANDROID_MEDIAPLAYERSERVICE_H