blob: dda2570c19a0bd7722abd212cdb467ebc4aa9199 [file] [log] [blame]
The Android Open Source Project89fa4ad2009-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
John Grossmanc795b642012-02-22 15:38:35 -080018#include <arpa/inet.h>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080019#include <stdint.h>
20#include <sys/types.h>
21
Mathias Agopian75624082009-05-19 19:08:10 -070022#include <binder/Parcel.h>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080023
Lajos Molnar3a474aa2015-04-24 17:10:07 -070024#include <media/AudioResamplerPublic.h>
25#include <media/AVSyncSettings.h>
26
Chris Watkins99f31602015-03-20 13:06:33 -070027#include <media/IDataSource.h>
Andreas Huber1b86fe02014-01-29 11:13:26 -080028#include <media/IMediaHTTPService.h>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080029#include <media/IMediaPlayer.h>
Dave Burked681bbb2011-08-30 14:39:17 +010030#include <media/IStreamSource.h>
31
Andy McFadden8ba01022012-12-18 09:46:54 -080032#include <gui/IGraphicBufferProducer.h>
Dave Burked681bbb2011-08-30 14:39:17 +010033#include <utils/String8.h>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080034
35namespace android {
36
37enum {
38 DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
Dave Burked681bbb2011-08-30 14:39:17 +010039 SET_DATA_SOURCE_URL,
40 SET_DATA_SOURCE_FD,
41 SET_DATA_SOURCE_STREAM,
Chris Watkins99f31602015-03-20 13:06:33 -070042 SET_DATA_SOURCE_CALLBACK,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080043 PREPARE_ASYNC,
44 START,
45 STOP,
46 IS_PLAYING,
Lajos Molnar3a474aa2015-04-24 17:10:07 -070047 SET_PLAYBACK_SETTINGS,
48 GET_PLAYBACK_SETTINGS,
49 SET_SYNC_SETTINGS,
50 GET_SYNC_SETTINGS,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080051 PAUSE,
52 SEEK_TO,
53 GET_CURRENT_POSITION,
54 GET_DURATION,
55 RESET,
56 SET_AUDIO_STREAM_TYPE,
57 SET_LOOPING,
Nicolas Catania1d187f12009-05-12 23:25:55 -070058 SET_VOLUME,
59 INVOKE,
Nicolas Cataniaa7e0e8b2009-07-08 08:57:42 -070060 SET_METADATA_FILTER,
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -070061 GET_METADATA,
Eric Laurent2beeb502010-07-16 07:43:46 -070062 SET_AUX_EFFECT_SEND_LEVEL,
Glenn Kasten11731182011-02-08 17:26:17 -080063 ATTACH_AUX_EFFECT,
64 SET_VIDEO_SURFACETEXTURE,
Gloria Wang4f9e47f2011-04-25 17:28:22 -070065 SET_PARAMETER,
66 GET_PARAMETER,
John Grossmanc795b642012-02-22 15:38:35 -080067 SET_RETRANSMIT_ENDPOINT,
John Grossman44a7e422012-06-21 17:29:24 -070068 GET_RETRANSMIT_ENDPOINT,
Marco Nelissen6b74d672012-02-28 16:07:44 -080069 SET_NEXT_PLAYER,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080070};
71
72class BpMediaPlayer: public BpInterface<IMediaPlayer>
73{
74public:
Chih-Hung Hsieh090ef602016-04-27 10:39:54 -070075 explicit BpMediaPlayer(const sp<IBinder>& impl)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080076 : BpInterface<IMediaPlayer>(impl)
77 {
78 }
79
80 // disconnect from media player service
81 void disconnect()
82 {
83 Parcel data, reply;
84 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
85 remote()->transact(DISCONNECT, data, &reply);
86 }
87
Andreas Huber1b86fe02014-01-29 11:13:26 -080088 status_t setDataSource(
89 const sp<IMediaHTTPService> &httpService,
90 const char* url,
Dave Burked681bbb2011-08-30 14:39:17 +010091 const KeyedVector<String8, String8>* headers)
92 {
93 Parcel data, reply;
94 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Andreas Huber1b86fe02014-01-29 11:13:26 -080095 data.writeInt32(httpService != NULL);
96 if (httpService != NULL) {
Marco Nelissen06b46062014-11-14 07:58:25 -080097 data.writeStrongBinder(IInterface::asBinder(httpService));
Andreas Huber1b86fe02014-01-29 11:13:26 -080098 }
Dave Burked681bbb2011-08-30 14:39:17 +010099 data.writeCString(url);
100 if (headers == NULL) {
101 data.writeInt32(0);
102 } else {
103 // serialize the headers
104 data.writeInt32(headers->size());
105 for (size_t i = 0; i < headers->size(); ++i) {
106 data.writeString8(headers->keyAt(i));
107 data.writeString8(headers->valueAt(i));
108 }
109 }
110 remote()->transact(SET_DATA_SOURCE_URL, data, &reply);
111 return reply.readInt32();
112 }
113
114 status_t setDataSource(int fd, int64_t offset, int64_t length) {
115 Parcel data, reply;
116 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
117 data.writeFileDescriptor(fd);
118 data.writeInt64(offset);
119 data.writeInt64(length);
120 remote()->transact(SET_DATA_SOURCE_FD, data, &reply);
121 return reply.readInt32();
122 }
123
124 status_t setDataSource(const sp<IStreamSource> &source) {
125 Parcel data, reply;
126 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800127 data.writeStrongBinder(IInterface::asBinder(source));
Glenn Kasten8d655102011-09-07 14:40:23 -0700128 remote()->transact(SET_DATA_SOURCE_STREAM, data, &reply);
Dave Burked681bbb2011-08-30 14:39:17 +0100129 return reply.readInt32();
130 }
131
Chris Watkins99f31602015-03-20 13:06:33 -0700132 status_t setDataSource(const sp<IDataSource> &source) {
133 Parcel data, reply;
134 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
135 data.writeStrongBinder(IInterface::asBinder(source));
136 remote()->transact(SET_DATA_SOURCE_CALLBACK, data, &reply);
137 return reply.readInt32();
138 }
139
Andy McFadden8ba01022012-12-18 09:46:54 -0800140 // pass the buffered IGraphicBufferProducer to the media player service
141 status_t setVideoSurfaceTexture(const sp<IGraphicBufferProducer>& bufferProducer)
Glenn Kasten11731182011-02-08 17:26:17 -0800142 {
143 Parcel data, reply;
144 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800145 sp<IBinder> b(IInterface::asBinder(bufferProducer));
Glenn Kasten11731182011-02-08 17:26:17 -0800146 data.writeStrongBinder(b);
147 remote()->transact(SET_VIDEO_SURFACETEXTURE, data, &reply);
148 return reply.readInt32();
149 }
150
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800151 status_t prepareAsync()
152 {
153 Parcel data, reply;
154 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
155 remote()->transact(PREPARE_ASYNC, data, &reply);
156 return reply.readInt32();
157 }
158
159 status_t start()
160 {
161 Parcel data, reply;
162 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
163 remote()->transact(START, data, &reply);
164 return reply.readInt32();
165 }
166
167 status_t stop()
168 {
169 Parcel data, reply;
170 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
171 remote()->transact(STOP, data, &reply);
172 return reply.readInt32();
173 }
174
175 status_t isPlaying(bool* state)
176 {
177 Parcel data, reply;
178 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
179 remote()->transact(IS_PLAYING, data, &reply);
180 *state = reply.readInt32();
181 return reply.readInt32();
182 }
183
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700184 status_t setPlaybackSettings(const AudioPlaybackRate& rate)
Wei Jia98160162015-02-04 17:01:11 -0800185 {
186 Parcel data, reply;
187 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700188 data.writeFloat(rate.mSpeed);
189 data.writeFloat(rate.mPitch);
190 data.writeInt32((int32_t)rate.mFallbackMode);
191 data.writeInt32((int32_t)rate.mStretchMode);
192 remote()->transact(SET_PLAYBACK_SETTINGS, data, &reply);
Wei Jia98160162015-02-04 17:01:11 -0800193 return reply.readInt32();
194 }
195
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700196 status_t getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */)
197 {
198 Parcel data, reply;
199 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
200 remote()->transact(GET_PLAYBACK_SETTINGS, data, &reply);
201 status_t err = reply.readInt32();
202 if (err == OK) {
203 *rate = AUDIO_PLAYBACK_RATE_DEFAULT;
204 rate->mSpeed = reply.readFloat();
205 rate->mPitch = reply.readFloat();
206 rate->mFallbackMode = (AudioTimestretchFallbackMode)reply.readInt32();
207 rate->mStretchMode = (AudioTimestretchStretchMode)reply.readInt32();
208 }
209 return err;
210 }
211
212 status_t setSyncSettings(const AVSyncSettings& sync, float videoFpsHint)
213 {
214 Parcel data, reply;
215 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
216 data.writeInt32((int32_t)sync.mSource);
217 data.writeInt32((int32_t)sync.mAudioAdjustMode);
218 data.writeFloat(sync.mTolerance);
219 data.writeFloat(videoFpsHint);
220 remote()->transact(SET_SYNC_SETTINGS, data, &reply);
221 return reply.readInt32();
222 }
223
224 status_t getSyncSettings(AVSyncSettings* sync /* nonnull */, float* videoFps /* nonnull */)
225 {
226 Parcel data, reply;
227 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
228 remote()->transact(GET_SYNC_SETTINGS, data, &reply);
229 status_t err = reply.readInt32();
230 if (err == OK) {
231 AVSyncSettings settings;
232 settings.mSource = (AVSyncSource)reply.readInt32();
233 settings.mAudioAdjustMode = (AVSyncAudioAdjustMode)reply.readInt32();
234 settings.mTolerance = reply.readFloat();
235 *sync = settings;
236 *videoFps = reply.readFloat();
237 }
238 return err;
239 }
240
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800241 status_t pause()
242 {
243 Parcel data, reply;
244 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
245 remote()->transact(PAUSE, data, &reply);
246 return reply.readInt32();
247 }
248
Wei Jiac5de0912016-11-18 10:22:14 -0800249 status_t seekTo(int msec, MediaPlayerSeekMode mode)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800250 {
251 Parcel data, reply;
252 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
253 data.writeInt32(msec);
Wei Jiac5de0912016-11-18 10:22:14 -0800254 data.writeInt32(mode);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800255 remote()->transact(SEEK_TO, data, &reply);
256 return reply.readInt32();
257 }
258
259 status_t getCurrentPosition(int* msec)
260 {
261 Parcel data, reply;
262 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
263 remote()->transact(GET_CURRENT_POSITION, data, &reply);
264 *msec = reply.readInt32();
265 return reply.readInt32();
266 }
267
268 status_t getDuration(int* msec)
269 {
270 Parcel data, reply;
271 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
272 remote()->transact(GET_DURATION, data, &reply);
273 *msec = reply.readInt32();
274 return reply.readInt32();
275 }
276
277 status_t reset()
278 {
279 Parcel data, reply;
280 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
281 remote()->transact(RESET, data, &reply);
282 return reply.readInt32();
283 }
284
Glenn Kastenfff6d712012-01-12 16:38:12 -0800285 status_t setAudioStreamType(audio_stream_type_t stream)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800286 {
287 Parcel data, reply;
288 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800289 data.writeInt32((int32_t) stream);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800290 remote()->transact(SET_AUDIO_STREAM_TYPE, data, &reply);
291 return reply.readInt32();
292 }
293
294 status_t setLooping(int loop)
295 {
296 Parcel data, reply;
297 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
298 data.writeInt32(loop);
299 remote()->transact(SET_LOOPING, data, &reply);
300 return reply.readInt32();
301 }
302
303 status_t setVolume(float leftVolume, float rightVolume)
304 {
305 Parcel data, reply;
Dave Sparks172fb9a2009-05-26 14:39:29 -0700306 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800307 data.writeFloat(leftVolume);
308 data.writeFloat(rightVolume);
309 remote()->transact(SET_VOLUME, data, &reply);
310 return reply.readInt32();
311 }
Nicolas Catania1d187f12009-05-12 23:25:55 -0700312
313 status_t invoke(const Parcel& request, Parcel *reply)
James Dong040e4a12011-04-06 18:29:01 -0700314 {
315 // Avoid doing any extra copy. The interface descriptor should
316 // have been set by MediaPlayer.java.
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700317 return remote()->transact(INVOKE, request, reply);
Nicolas Catania1d187f12009-05-12 23:25:55 -0700318 }
Nicolas Cataniaa7e0e8b2009-07-08 08:57:42 -0700319
320 status_t setMetadataFilter(const Parcel& request)
321 {
322 Parcel reply;
323 // Avoid doing any extra copy of the request. The interface
324 // descriptor should have been set by MediaPlayer.java.
325 remote()->transact(SET_METADATA_FILTER, request, &reply);
326 return reply.readInt32();
327 }
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700328
329 status_t getMetadata(bool update_only, bool apply_filter, Parcel *reply)
330 {
331 Parcel request;
332 request.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
333 // TODO: Burning 2 ints for 2 boolean. Should probably use flags in an int here.
334 request.writeInt32(update_only);
335 request.writeInt32(apply_filter);
336 remote()->transact(GET_METADATA, request, reply);
337 return reply->readInt32();
338 }
Andreas Huber4e92c7e2010-02-12 12:35:58 -0800339
Eric Laurent2beeb502010-07-16 07:43:46 -0700340 status_t setAuxEffectSendLevel(float level)
341 {
342 Parcel data, reply;
343 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
344 data.writeFloat(level);
345 remote()->transact(SET_AUX_EFFECT_SEND_LEVEL, data, &reply);
346 return reply.readInt32();
347 }
348
349 status_t attachAuxEffect(int effectId)
350 {
351 Parcel data, reply;
352 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
353 data.writeInt32(effectId);
354 remote()->transact(ATTACH_AUX_EFFECT, data, &reply);
355 return reply.readInt32();
356 }
Glenn Kasten11731182011-02-08 17:26:17 -0800357
Gloria Wang4f9e47f2011-04-25 17:28:22 -0700358 status_t setParameter(int key, const Parcel& request)
359 {
360 Parcel data, reply;
361 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
362 data.writeInt32(key);
363 if (request.dataSize() > 0) {
364 data.appendFrom(const_cast<Parcel *>(&request), 0, request.dataSize());
365 }
366 remote()->transact(SET_PARAMETER, data, &reply);
367 return reply.readInt32();
368 }
369
370 status_t getParameter(int key, Parcel *reply)
371 {
372 Parcel data;
373 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
374 data.writeInt32(key);
375 return remote()->transact(GET_PARAMETER, data, reply);
376 }
377
John Grossman44a7e422012-06-21 17:29:24 -0700378 status_t setRetransmitEndpoint(const struct sockaddr_in* endpoint)
379 {
John Grossmanc795b642012-02-22 15:38:35 -0800380 Parcel data, reply;
381 status_t err;
382
383 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
384 if (NULL != endpoint) {
385 data.writeInt32(sizeof(*endpoint));
386 data.write(endpoint, sizeof(*endpoint));
387 } else {
388 data.writeInt32(0);
389 }
390
391 err = remote()->transact(SET_RETRANSMIT_ENDPOINT, data, &reply);
392 if (OK != err) {
393 return err;
394 }
Marco Nelissen6b74d672012-02-28 16:07:44 -0800395 return reply.readInt32();
396 }
John Grossmanc795b642012-02-22 15:38:35 -0800397
Marco Nelissen6b74d672012-02-28 16:07:44 -0800398 status_t setNextPlayer(const sp<IMediaPlayer>& player) {
399 Parcel data, reply;
400 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800401 sp<IBinder> b(IInterface::asBinder(player));
Marco Nelissen6b74d672012-02-28 16:07:44 -0800402 data.writeStrongBinder(b);
403 remote()->transact(SET_NEXT_PLAYER, data, &reply);
John Grossmanc795b642012-02-22 15:38:35 -0800404 return reply.readInt32();
405 }
John Grossman44a7e422012-06-21 17:29:24 -0700406
407 status_t getRetransmitEndpoint(struct sockaddr_in* endpoint)
408 {
409 Parcel data, reply;
410 status_t err;
411
412 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
413 err = remote()->transact(GET_RETRANSMIT_ENDPOINT, data, &reply);
414
415 if ((OK != err) || (OK != (err = reply.readInt32()))) {
416 return err;
417 }
418
419 data.read(endpoint, sizeof(*endpoint));
420
421 return err;
422 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800423};
424
niko56f0cc52009-06-22 08:49:52 -0700425IMPLEMENT_META_INTERFACE(MediaPlayer, "android.media.IMediaPlayer");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800426
427// ----------------------------------------------------------------------
428
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800429status_t BnMediaPlayer::onTransact(
430 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
431{
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700432 switch (code) {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800433 case DISCONNECT: {
434 CHECK_INTERFACE(IMediaPlayer, data, reply);
435 disconnect();
436 return NO_ERROR;
437 } break;
Dave Burked681bbb2011-08-30 14:39:17 +0100438 case SET_DATA_SOURCE_URL: {
439 CHECK_INTERFACE(IMediaPlayer, data, reply);
Andreas Huber1b86fe02014-01-29 11:13:26 -0800440
441 sp<IMediaHTTPService> httpService;
442 if (data.readInt32()) {
443 httpService =
444 interface_cast<IMediaHTTPService>(data.readStrongBinder());
445 }
446
Dave Burked681bbb2011-08-30 14:39:17 +0100447 const char* url = data.readCString();
Wei Jia0ca02a02016-01-14 13:14:31 -0800448 if (url == NULL) {
Wei Jia2afac0c2016-01-07 12:13:07 -0800449 reply->writeInt32(BAD_VALUE);
450 return NO_ERROR;
451 }
Dave Burked681bbb2011-08-30 14:39:17 +0100452 KeyedVector<String8, String8> headers;
453 int32_t numHeaders = data.readInt32();
454 for (int i = 0; i < numHeaders; ++i) {
455 String8 key = data.readString8();
456 String8 value = data.readString8();
457 headers.add(key, value);
458 }
Andreas Huber1b86fe02014-01-29 11:13:26 -0800459 reply->writeInt32(setDataSource(
460 httpService, url, numHeaders > 0 ? &headers : NULL));
Dave Burked681bbb2011-08-30 14:39:17 +0100461 return NO_ERROR;
462 } break;
463 case SET_DATA_SOURCE_FD: {
464 CHECK_INTERFACE(IMediaPlayer, data, reply);
465 int fd = data.readFileDescriptor();
466 int64_t offset = data.readInt64();
467 int64_t length = data.readInt64();
468 reply->writeInt32(setDataSource(fd, offset, length));
469 return NO_ERROR;
470 }
471 case SET_DATA_SOURCE_STREAM: {
472 CHECK_INTERFACE(IMediaPlayer, data, reply);
473 sp<IStreamSource> source =
474 interface_cast<IStreamSource>(data.readStrongBinder());
Wei Jia2afac0c2016-01-07 12:13:07 -0800475 if (source == NULL) {
476 reply->writeInt32(BAD_VALUE);
477 } else {
478 reply->writeInt32(setDataSource(source));
479 }
Dave Burked681bbb2011-08-30 14:39:17 +0100480 return NO_ERROR;
481 }
Chris Watkins99f31602015-03-20 13:06:33 -0700482 case SET_DATA_SOURCE_CALLBACK: {
483 CHECK_INTERFACE(IMediaPlayer, data, reply);
484 sp<IDataSource> source =
485 interface_cast<IDataSource>(data.readStrongBinder());
Wei Jia2afac0c2016-01-07 12:13:07 -0800486 if (source == NULL) {
487 reply->writeInt32(BAD_VALUE);
488 } else {
489 reply->writeInt32(setDataSource(source));
490 }
Chris Watkins99f31602015-03-20 13:06:33 -0700491 return NO_ERROR;
492 }
Glenn Kasten11731182011-02-08 17:26:17 -0800493 case SET_VIDEO_SURFACETEXTURE: {
494 CHECK_INTERFACE(IMediaPlayer, data, reply);
Andy McFadden8ba01022012-12-18 09:46:54 -0800495 sp<IGraphicBufferProducer> bufferProducer =
496 interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
497 reply->writeInt32(setVideoSurfaceTexture(bufferProducer));
Glenn Kasten11731182011-02-08 17:26:17 -0800498 return NO_ERROR;
499 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800500 case PREPARE_ASYNC: {
501 CHECK_INTERFACE(IMediaPlayer, data, reply);
502 reply->writeInt32(prepareAsync());
503 return NO_ERROR;
504 } break;
505 case START: {
506 CHECK_INTERFACE(IMediaPlayer, data, reply);
507 reply->writeInt32(start());
508 return NO_ERROR;
509 } break;
510 case STOP: {
511 CHECK_INTERFACE(IMediaPlayer, data, reply);
512 reply->writeInt32(stop());
513 return NO_ERROR;
514 } break;
515 case IS_PLAYING: {
516 CHECK_INTERFACE(IMediaPlayer, data, reply);
517 bool state;
518 status_t ret = isPlaying(&state);
519 reply->writeInt32(state);
520 reply->writeInt32(ret);
521 return NO_ERROR;
522 } break;
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700523 case SET_PLAYBACK_SETTINGS: {
Wei Jia98160162015-02-04 17:01:11 -0800524 CHECK_INTERFACE(IMediaPlayer, data, reply);
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700525 AudioPlaybackRate rate = AUDIO_PLAYBACK_RATE_DEFAULT;
526 rate.mSpeed = data.readFloat();
527 rate.mPitch = data.readFloat();
528 rate.mFallbackMode = (AudioTimestretchFallbackMode)data.readInt32();
529 rate.mStretchMode = (AudioTimestretchStretchMode)data.readInt32();
530 reply->writeInt32(setPlaybackSettings(rate));
531 return NO_ERROR;
532 } break;
533 case GET_PLAYBACK_SETTINGS: {
534 CHECK_INTERFACE(IMediaPlayer, data, reply);
535 AudioPlaybackRate rate = AUDIO_PLAYBACK_RATE_DEFAULT;
536 status_t err = getPlaybackSettings(&rate);
537 reply->writeInt32(err);
538 if (err == OK) {
539 reply->writeFloat(rate.mSpeed);
540 reply->writeFloat(rate.mPitch);
541 reply->writeInt32((int32_t)rate.mFallbackMode);
542 reply->writeInt32((int32_t)rate.mStretchMode);
543 }
544 return NO_ERROR;
545 } break;
546 case SET_SYNC_SETTINGS: {
547 CHECK_INTERFACE(IMediaPlayer, data, reply);
548 AVSyncSettings sync;
549 sync.mSource = (AVSyncSource)data.readInt32();
550 sync.mAudioAdjustMode = (AVSyncAudioAdjustMode)data.readInt32();
551 sync.mTolerance = data.readFloat();
552 float videoFpsHint = data.readFloat();
553 reply->writeInt32(setSyncSettings(sync, videoFpsHint));
554 return NO_ERROR;
555 } break;
556 case GET_SYNC_SETTINGS: {
557 CHECK_INTERFACE(IMediaPlayer, data, reply);
558 AVSyncSettings sync;
559 float videoFps;
560 status_t err = getSyncSettings(&sync, &videoFps);
561 reply->writeInt32(err);
562 if (err == OK) {
563 reply->writeInt32((int32_t)sync.mSource);
564 reply->writeInt32((int32_t)sync.mAudioAdjustMode);
565 reply->writeFloat(sync.mTolerance);
566 reply->writeFloat(videoFps);
567 }
Wei Jia98160162015-02-04 17:01:11 -0800568 return NO_ERROR;
569 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800570 case PAUSE: {
571 CHECK_INTERFACE(IMediaPlayer, data, reply);
572 reply->writeInt32(pause());
573 return NO_ERROR;
574 } break;
575 case SEEK_TO: {
576 CHECK_INTERFACE(IMediaPlayer, data, reply);
Wei Jia67b6dcc2016-10-31 17:01:37 -0700577 int msec = data.readInt32();
Wei Jiac5de0912016-11-18 10:22:14 -0800578 MediaPlayerSeekMode mode = (MediaPlayerSeekMode)data.readInt32();
579 reply->writeInt32(seekTo(msec, mode));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800580 return NO_ERROR;
581 } break;
582 case GET_CURRENT_POSITION: {
583 CHECK_INTERFACE(IMediaPlayer, data, reply);
Robert Shih89235432015-09-02 16:46:59 -0700584 int msec = 0;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800585 status_t ret = getCurrentPosition(&msec);
586 reply->writeInt32(msec);
587 reply->writeInt32(ret);
588 return NO_ERROR;
589 } break;
590 case GET_DURATION: {
591 CHECK_INTERFACE(IMediaPlayer, data, reply);
Robert Shih89235432015-09-02 16:46:59 -0700592 int msec = 0;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800593 status_t ret = getDuration(&msec);
594 reply->writeInt32(msec);
595 reply->writeInt32(ret);
596 return NO_ERROR;
597 } break;
598 case RESET: {
599 CHECK_INTERFACE(IMediaPlayer, data, reply);
600 reply->writeInt32(reset());
601 return NO_ERROR;
602 } break;
603 case SET_AUDIO_STREAM_TYPE: {
604 CHECK_INTERFACE(IMediaPlayer, data, reply);
Glenn Kastenfff6d712012-01-12 16:38:12 -0800605 reply->writeInt32(setAudioStreamType((audio_stream_type_t) data.readInt32()));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800606 return NO_ERROR;
607 } break;
608 case SET_LOOPING: {
609 CHECK_INTERFACE(IMediaPlayer, data, reply);
610 reply->writeInt32(setLooping(data.readInt32()));
611 return NO_ERROR;
612 } break;
613 case SET_VOLUME: {
Dave Sparks172fb9a2009-05-26 14:39:29 -0700614 CHECK_INTERFACE(IMediaPlayer, data, reply);
Gloria Wangde162ff2011-08-01 14:01:29 -0700615 float leftVolume = data.readFloat();
616 float rightVolume = data.readFloat();
617 reply->writeInt32(setVolume(leftVolume, rightVolume));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800618 return NO_ERROR;
619 } break;
Nicolas Catania1d187f12009-05-12 23:25:55 -0700620 case INVOKE: {
621 CHECK_INTERFACE(IMediaPlayer, data, reply);
James Dong040e4a12011-04-06 18:29:01 -0700622 status_t result = invoke(data, reply);
623 return result;
Nicolas Catania1d187f12009-05-12 23:25:55 -0700624 } break;
Nicolas Cataniaa7e0e8b2009-07-08 08:57:42 -0700625 case SET_METADATA_FILTER: {
626 CHECK_INTERFACE(IMediaPlayer, data, reply);
627 reply->writeInt32(setMetadataFilter(data));
628 return NO_ERROR;
629 } break;
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700630 case GET_METADATA: {
631 CHECK_INTERFACE(IMediaPlayer, data, reply);
Gloria Wangde162ff2011-08-01 14:01:29 -0700632 bool update_only = static_cast<bool>(data.readInt32());
633 bool apply_filter = static_cast<bool>(data.readInt32());
634 const status_t retcode = getMetadata(update_only, apply_filter, reply);
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700635 reply->setDataPosition(0);
636 reply->writeInt32(retcode);
637 reply->setDataPosition(0);
638 return NO_ERROR;
639 } break;
Eric Laurent2beeb502010-07-16 07:43:46 -0700640 case SET_AUX_EFFECT_SEND_LEVEL: {
641 CHECK_INTERFACE(IMediaPlayer, data, reply);
642 reply->writeInt32(setAuxEffectSendLevel(data.readFloat()));
643 return NO_ERROR;
644 } break;
645 case ATTACH_AUX_EFFECT: {
646 CHECK_INTERFACE(IMediaPlayer, data, reply);
647 reply->writeInt32(attachAuxEffect(data.readInt32()));
648 return NO_ERROR;
649 } break;
Gloria Wang4f9e47f2011-04-25 17:28:22 -0700650 case SET_PARAMETER: {
651 CHECK_INTERFACE(IMediaPlayer, data, reply);
652 int key = data.readInt32();
653
654 Parcel request;
655 if (data.dataAvail() > 0) {
656 request.appendFrom(
657 const_cast<Parcel *>(&data), data.dataPosition(), data.dataAvail());
658 }
659 request.setDataPosition(0);
660 reply->writeInt32(setParameter(key, request));
661 return NO_ERROR;
662 } break;
663 case GET_PARAMETER: {
664 CHECK_INTERFACE(IMediaPlayer, data, reply);
665 return getParameter(data.readInt32(), reply);
666 } break;
John Grossmanc795b642012-02-22 15:38:35 -0800667 case SET_RETRANSMIT_ENDPOINT: {
668 CHECK_INTERFACE(IMediaPlayer, data, reply);
669
670 struct sockaddr_in endpoint;
Nick Kralevich0981df62015-08-20 09:56:39 -0700671 memset(&endpoint, 0, sizeof(endpoint));
John Grossmanc795b642012-02-22 15:38:35 -0800672 int amt = data.readInt32();
673 if (amt == sizeof(endpoint)) {
674 data.read(&endpoint, sizeof(struct sockaddr_in));
675 reply->writeInt32(setRetransmitEndpoint(&endpoint));
676 } else {
677 reply->writeInt32(setRetransmitEndpoint(NULL));
678 }
John Grossman44a7e422012-06-21 17:29:24 -0700679
680 return NO_ERROR;
681 } break;
682 case GET_RETRANSMIT_ENDPOINT: {
683 CHECK_INTERFACE(IMediaPlayer, data, reply);
684
685 struct sockaddr_in endpoint;
Nick Kralevich0981df62015-08-20 09:56:39 -0700686 memset(&endpoint, 0, sizeof(endpoint));
John Grossman44a7e422012-06-21 17:29:24 -0700687 status_t res = getRetransmitEndpoint(&endpoint);
688
689 reply->writeInt32(res);
690 reply->write(&endpoint, sizeof(endpoint));
691
Marco Nelissen6b74d672012-02-28 16:07:44 -0800692 return NO_ERROR;
693 } break;
694 case SET_NEXT_PLAYER: {
695 CHECK_INTERFACE(IMediaPlayer, data, reply);
696 reply->writeInt32(setNextPlayer(interface_cast<IMediaPlayer>(data.readStrongBinder())));
John Grossman44a7e422012-06-21 17:29:24 -0700697
John Grossmanc795b642012-02-22 15:38:35 -0800698 return NO_ERROR;
699 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800700 default:
701 return BBinder::onTransact(code, data, reply, flags);
702 }
703}
704
705// ----------------------------------------------------------------------------
706
Glenn Kasten40bc9062015-03-20 09:09:33 -0700707} // namespace android