blob: 9ffde4e83e3263af7f322c6bba99b7db6937192a [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>
Wei Jiad399e7e2016-10-26 15:49:11 -070026#include <media/BufferingSettings.h>
Lajos Molnar3a474aa2015-04-24 17:10:07 -070027
Chris Watkins99f31602015-03-20 13:06:33 -070028#include <media/IDataSource.h>
Andreas Huber1b86fe02014-01-29 11:13:26 -080029#include <media/IMediaHTTPService.h>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080030#include <media/IMediaPlayer.h>
Dave Burked681bbb2011-08-30 14:39:17 +010031#include <media/IStreamSource.h>
32
Andy McFadden8ba01022012-12-18 09:46:54 -080033#include <gui/IGraphicBufferProducer.h>
Dave Burked681bbb2011-08-30 14:39:17 +010034#include <utils/String8.h>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080035
36namespace android {
37
38enum {
39 DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
Dave Burked681bbb2011-08-30 14:39:17 +010040 SET_DATA_SOURCE_URL,
41 SET_DATA_SOURCE_FD,
42 SET_DATA_SOURCE_STREAM,
Chris Watkins99f31602015-03-20 13:06:33 -070043 SET_DATA_SOURCE_CALLBACK,
Wei Jiad399e7e2016-10-26 15:49:11 -070044 SET_BUFFERING_SETTINGS,
45 GET_DEFAULT_BUFFERING_SETTINGS,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080046 PREPARE_ASYNC,
47 START,
48 STOP,
49 IS_PLAYING,
Lajos Molnar3a474aa2015-04-24 17:10:07 -070050 SET_PLAYBACK_SETTINGS,
51 GET_PLAYBACK_SETTINGS,
52 SET_SYNC_SETTINGS,
53 GET_SYNC_SETTINGS,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080054 PAUSE,
55 SEEK_TO,
56 GET_CURRENT_POSITION,
57 GET_DURATION,
58 RESET,
59 SET_AUDIO_STREAM_TYPE,
60 SET_LOOPING,
Nicolas Catania1d187f12009-05-12 23:25:55 -070061 SET_VOLUME,
62 INVOKE,
Nicolas Cataniaa7e0e8b2009-07-08 08:57:42 -070063 SET_METADATA_FILTER,
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -070064 GET_METADATA,
Eric Laurent2beeb502010-07-16 07:43:46 -070065 SET_AUX_EFFECT_SEND_LEVEL,
Glenn Kasten11731182011-02-08 17:26:17 -080066 ATTACH_AUX_EFFECT,
67 SET_VIDEO_SURFACETEXTURE,
Gloria Wang4f9e47f2011-04-25 17:28:22 -070068 SET_PARAMETER,
69 GET_PARAMETER,
John Grossmanc795b642012-02-22 15:38:35 -080070 SET_RETRANSMIT_ENDPOINT,
John Grossman44a7e422012-06-21 17:29:24 -070071 GET_RETRANSMIT_ENDPOINT,
Marco Nelissen6b74d672012-02-28 16:07:44 -080072 SET_NEXT_PLAYER,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080073};
74
75class BpMediaPlayer: public BpInterface<IMediaPlayer>
76{
77public:
Chih-Hung Hsieh090ef602016-04-27 10:39:54 -070078 explicit BpMediaPlayer(const sp<IBinder>& impl)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080079 : BpInterface<IMediaPlayer>(impl)
80 {
81 }
82
83 // disconnect from media player service
84 void disconnect()
85 {
86 Parcel data, reply;
87 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
88 remote()->transact(DISCONNECT, data, &reply);
89 }
90
Andreas Huber1b86fe02014-01-29 11:13:26 -080091 status_t setDataSource(
92 const sp<IMediaHTTPService> &httpService,
93 const char* url,
Dave Burked681bbb2011-08-30 14:39:17 +010094 const KeyedVector<String8, String8>* headers)
95 {
96 Parcel data, reply;
97 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Andreas Huber1b86fe02014-01-29 11:13:26 -080098 data.writeInt32(httpService != NULL);
99 if (httpService != NULL) {
Marco Nelissen06b46062014-11-14 07:58:25 -0800100 data.writeStrongBinder(IInterface::asBinder(httpService));
Andreas Huber1b86fe02014-01-29 11:13:26 -0800101 }
Dave Burked681bbb2011-08-30 14:39:17 +0100102 data.writeCString(url);
103 if (headers == NULL) {
104 data.writeInt32(0);
105 } else {
106 // serialize the headers
107 data.writeInt32(headers->size());
108 for (size_t i = 0; i < headers->size(); ++i) {
109 data.writeString8(headers->keyAt(i));
110 data.writeString8(headers->valueAt(i));
111 }
112 }
113 remote()->transact(SET_DATA_SOURCE_URL, data, &reply);
114 return reply.readInt32();
115 }
116
117 status_t setDataSource(int fd, int64_t offset, int64_t length) {
118 Parcel data, reply;
119 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
120 data.writeFileDescriptor(fd);
121 data.writeInt64(offset);
122 data.writeInt64(length);
123 remote()->transact(SET_DATA_SOURCE_FD, data, &reply);
124 return reply.readInt32();
125 }
126
127 status_t setDataSource(const sp<IStreamSource> &source) {
128 Parcel data, reply;
129 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800130 data.writeStrongBinder(IInterface::asBinder(source));
Glenn Kasten8d655102011-09-07 14:40:23 -0700131 remote()->transact(SET_DATA_SOURCE_STREAM, data, &reply);
Dave Burked681bbb2011-08-30 14:39:17 +0100132 return reply.readInt32();
133 }
134
Chris Watkins99f31602015-03-20 13:06:33 -0700135 status_t setDataSource(const sp<IDataSource> &source) {
136 Parcel data, reply;
137 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
138 data.writeStrongBinder(IInterface::asBinder(source));
139 remote()->transact(SET_DATA_SOURCE_CALLBACK, data, &reply);
140 return reply.readInt32();
141 }
142
Andy McFadden8ba01022012-12-18 09:46:54 -0800143 // pass the buffered IGraphicBufferProducer to the media player service
144 status_t setVideoSurfaceTexture(const sp<IGraphicBufferProducer>& bufferProducer)
Glenn Kasten11731182011-02-08 17:26:17 -0800145 {
146 Parcel data, reply;
147 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800148 sp<IBinder> b(IInterface::asBinder(bufferProducer));
Glenn Kasten11731182011-02-08 17:26:17 -0800149 data.writeStrongBinder(b);
150 remote()->transact(SET_VIDEO_SURFACETEXTURE, data, &reply);
151 return reply.readInt32();
152 }
153
Wei Jiad399e7e2016-10-26 15:49:11 -0700154 status_t setBufferingSettings(const BufferingSettings& buffering)
155 {
156 Parcel data, reply;
157 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
158 buffering.writeToParcel(&data);
159 remote()->transact(SET_BUFFERING_SETTINGS, data, &reply);
160 return reply.readInt32();
161 }
162
163 status_t getDefaultBufferingSettings(BufferingSettings* buffering /* nonnull */)
164 {
165 if (buffering == nullptr) {
166 return BAD_VALUE;
167 }
168 Parcel data, reply;
169 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
170 remote()->transact(GET_DEFAULT_BUFFERING_SETTINGS, data, &reply);
171 status_t err = reply.readInt32();
172 if (err == OK) {
173 err = buffering->readFromParcel(&reply);
174 }
175 return err;
176 }
177
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800178 status_t prepareAsync()
179 {
180 Parcel data, reply;
181 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
182 remote()->transact(PREPARE_ASYNC, data, &reply);
183 return reply.readInt32();
184 }
185
186 status_t start()
187 {
188 Parcel data, reply;
189 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
190 remote()->transact(START, data, &reply);
191 return reply.readInt32();
192 }
193
194 status_t stop()
195 {
196 Parcel data, reply;
197 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
198 remote()->transact(STOP, data, &reply);
199 return reply.readInt32();
200 }
201
202 status_t isPlaying(bool* state)
203 {
204 Parcel data, reply;
205 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
206 remote()->transact(IS_PLAYING, data, &reply);
207 *state = reply.readInt32();
208 return reply.readInt32();
209 }
210
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700211 status_t setPlaybackSettings(const AudioPlaybackRate& rate)
Wei Jia98160162015-02-04 17:01:11 -0800212 {
213 Parcel data, reply;
214 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700215 data.writeFloat(rate.mSpeed);
216 data.writeFloat(rate.mPitch);
217 data.writeInt32((int32_t)rate.mFallbackMode);
218 data.writeInt32((int32_t)rate.mStretchMode);
219 remote()->transact(SET_PLAYBACK_SETTINGS, data, &reply);
Wei Jia98160162015-02-04 17:01:11 -0800220 return reply.readInt32();
221 }
222
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700223 status_t getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */)
224 {
225 Parcel data, reply;
226 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
227 remote()->transact(GET_PLAYBACK_SETTINGS, data, &reply);
228 status_t err = reply.readInt32();
229 if (err == OK) {
230 *rate = AUDIO_PLAYBACK_RATE_DEFAULT;
231 rate->mSpeed = reply.readFloat();
232 rate->mPitch = reply.readFloat();
233 rate->mFallbackMode = (AudioTimestretchFallbackMode)reply.readInt32();
234 rate->mStretchMode = (AudioTimestretchStretchMode)reply.readInt32();
235 }
236 return err;
237 }
238
239 status_t setSyncSettings(const AVSyncSettings& sync, float videoFpsHint)
240 {
241 Parcel data, reply;
242 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
243 data.writeInt32((int32_t)sync.mSource);
244 data.writeInt32((int32_t)sync.mAudioAdjustMode);
245 data.writeFloat(sync.mTolerance);
246 data.writeFloat(videoFpsHint);
247 remote()->transact(SET_SYNC_SETTINGS, data, &reply);
248 return reply.readInt32();
249 }
250
251 status_t getSyncSettings(AVSyncSettings* sync /* nonnull */, float* videoFps /* nonnull */)
252 {
253 Parcel data, reply;
254 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
255 remote()->transact(GET_SYNC_SETTINGS, data, &reply);
256 status_t err = reply.readInt32();
257 if (err == OK) {
258 AVSyncSettings settings;
259 settings.mSource = (AVSyncSource)reply.readInt32();
260 settings.mAudioAdjustMode = (AVSyncAudioAdjustMode)reply.readInt32();
261 settings.mTolerance = reply.readFloat();
262 *sync = settings;
263 *videoFps = reply.readFloat();
264 }
265 return err;
266 }
267
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800268 status_t pause()
269 {
270 Parcel data, reply;
271 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
272 remote()->transact(PAUSE, data, &reply);
273 return reply.readInt32();
274 }
275
Wei Jiac5de0912016-11-18 10:22:14 -0800276 status_t seekTo(int msec, MediaPlayerSeekMode mode)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800277 {
278 Parcel data, reply;
279 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
280 data.writeInt32(msec);
Wei Jiac5de0912016-11-18 10:22:14 -0800281 data.writeInt32(mode);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800282 remote()->transact(SEEK_TO, data, &reply);
283 return reply.readInt32();
284 }
285
286 status_t getCurrentPosition(int* msec)
287 {
288 Parcel data, reply;
289 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
290 remote()->transact(GET_CURRENT_POSITION, data, &reply);
291 *msec = reply.readInt32();
292 return reply.readInt32();
293 }
294
295 status_t getDuration(int* msec)
296 {
297 Parcel data, reply;
298 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
299 remote()->transact(GET_DURATION, data, &reply);
300 *msec = reply.readInt32();
301 return reply.readInt32();
302 }
303
304 status_t reset()
305 {
306 Parcel data, reply;
307 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
308 remote()->transact(RESET, data, &reply);
309 return reply.readInt32();
310 }
311
Glenn Kastenfff6d712012-01-12 16:38:12 -0800312 status_t setAudioStreamType(audio_stream_type_t stream)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800313 {
314 Parcel data, reply;
315 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800316 data.writeInt32((int32_t) stream);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800317 remote()->transact(SET_AUDIO_STREAM_TYPE, data, &reply);
318 return reply.readInt32();
319 }
320
321 status_t setLooping(int loop)
322 {
323 Parcel data, reply;
324 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
325 data.writeInt32(loop);
326 remote()->transact(SET_LOOPING, data, &reply);
327 return reply.readInt32();
328 }
329
330 status_t setVolume(float leftVolume, float rightVolume)
331 {
332 Parcel data, reply;
Dave Sparks172fb9a2009-05-26 14:39:29 -0700333 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800334 data.writeFloat(leftVolume);
335 data.writeFloat(rightVolume);
336 remote()->transact(SET_VOLUME, data, &reply);
337 return reply.readInt32();
338 }
Nicolas Catania1d187f12009-05-12 23:25:55 -0700339
340 status_t invoke(const Parcel& request, Parcel *reply)
James Dong040e4a12011-04-06 18:29:01 -0700341 {
342 // Avoid doing any extra copy. The interface descriptor should
343 // have been set by MediaPlayer.java.
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700344 return remote()->transact(INVOKE, request, reply);
Nicolas Catania1d187f12009-05-12 23:25:55 -0700345 }
Nicolas Cataniaa7e0e8b2009-07-08 08:57:42 -0700346
347 status_t setMetadataFilter(const Parcel& request)
348 {
349 Parcel reply;
350 // Avoid doing any extra copy of the request. The interface
351 // descriptor should have been set by MediaPlayer.java.
352 remote()->transact(SET_METADATA_FILTER, request, &reply);
353 return reply.readInt32();
354 }
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700355
356 status_t getMetadata(bool update_only, bool apply_filter, Parcel *reply)
357 {
358 Parcel request;
359 request.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
360 // TODO: Burning 2 ints for 2 boolean. Should probably use flags in an int here.
361 request.writeInt32(update_only);
362 request.writeInt32(apply_filter);
363 remote()->transact(GET_METADATA, request, reply);
364 return reply->readInt32();
365 }
Andreas Huber4e92c7e2010-02-12 12:35:58 -0800366
Eric Laurent2beeb502010-07-16 07:43:46 -0700367 status_t setAuxEffectSendLevel(float level)
368 {
369 Parcel data, reply;
370 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
371 data.writeFloat(level);
372 remote()->transact(SET_AUX_EFFECT_SEND_LEVEL, data, &reply);
373 return reply.readInt32();
374 }
375
376 status_t attachAuxEffect(int effectId)
377 {
378 Parcel data, reply;
379 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
380 data.writeInt32(effectId);
381 remote()->transact(ATTACH_AUX_EFFECT, data, &reply);
382 return reply.readInt32();
383 }
Glenn Kasten11731182011-02-08 17:26:17 -0800384
Gloria Wang4f9e47f2011-04-25 17:28:22 -0700385 status_t setParameter(int key, const Parcel& request)
386 {
387 Parcel data, reply;
388 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
389 data.writeInt32(key);
390 if (request.dataSize() > 0) {
391 data.appendFrom(const_cast<Parcel *>(&request), 0, request.dataSize());
392 }
393 remote()->transact(SET_PARAMETER, data, &reply);
394 return reply.readInt32();
395 }
396
397 status_t getParameter(int key, Parcel *reply)
398 {
399 Parcel data;
400 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
401 data.writeInt32(key);
402 return remote()->transact(GET_PARAMETER, data, reply);
403 }
404
John Grossman44a7e422012-06-21 17:29:24 -0700405 status_t setRetransmitEndpoint(const struct sockaddr_in* endpoint)
406 {
John Grossmanc795b642012-02-22 15:38:35 -0800407 Parcel data, reply;
408 status_t err;
409
410 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
411 if (NULL != endpoint) {
412 data.writeInt32(sizeof(*endpoint));
413 data.write(endpoint, sizeof(*endpoint));
414 } else {
415 data.writeInt32(0);
416 }
417
418 err = remote()->transact(SET_RETRANSMIT_ENDPOINT, data, &reply);
419 if (OK != err) {
420 return err;
421 }
Marco Nelissen6b74d672012-02-28 16:07:44 -0800422 return reply.readInt32();
423 }
John Grossmanc795b642012-02-22 15:38:35 -0800424
Marco Nelissen6b74d672012-02-28 16:07:44 -0800425 status_t setNextPlayer(const sp<IMediaPlayer>& player) {
426 Parcel data, reply;
427 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800428 sp<IBinder> b(IInterface::asBinder(player));
Marco Nelissen6b74d672012-02-28 16:07:44 -0800429 data.writeStrongBinder(b);
430 remote()->transact(SET_NEXT_PLAYER, data, &reply);
John Grossmanc795b642012-02-22 15:38:35 -0800431 return reply.readInt32();
432 }
John Grossman44a7e422012-06-21 17:29:24 -0700433
434 status_t getRetransmitEndpoint(struct sockaddr_in* endpoint)
435 {
436 Parcel data, reply;
437 status_t err;
438
439 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
440 err = remote()->transact(GET_RETRANSMIT_ENDPOINT, data, &reply);
441
442 if ((OK != err) || (OK != (err = reply.readInt32()))) {
443 return err;
444 }
445
446 data.read(endpoint, sizeof(*endpoint));
447
448 return err;
449 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800450};
451
niko56f0cc52009-06-22 08:49:52 -0700452IMPLEMENT_META_INTERFACE(MediaPlayer, "android.media.IMediaPlayer");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800453
454// ----------------------------------------------------------------------
455
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800456status_t BnMediaPlayer::onTransact(
457 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
458{
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700459 switch (code) {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800460 case DISCONNECT: {
461 CHECK_INTERFACE(IMediaPlayer, data, reply);
462 disconnect();
463 return NO_ERROR;
464 } break;
Dave Burked681bbb2011-08-30 14:39:17 +0100465 case SET_DATA_SOURCE_URL: {
466 CHECK_INTERFACE(IMediaPlayer, data, reply);
Andreas Huber1b86fe02014-01-29 11:13:26 -0800467
468 sp<IMediaHTTPService> httpService;
469 if (data.readInt32()) {
470 httpService =
471 interface_cast<IMediaHTTPService>(data.readStrongBinder());
472 }
473
Dave Burked681bbb2011-08-30 14:39:17 +0100474 const char* url = data.readCString();
Wei Jia0ca02a02016-01-14 13:14:31 -0800475 if (url == NULL) {
Wei Jia2afac0c2016-01-07 12:13:07 -0800476 reply->writeInt32(BAD_VALUE);
477 return NO_ERROR;
478 }
Dave Burked681bbb2011-08-30 14:39:17 +0100479 KeyedVector<String8, String8> headers;
480 int32_t numHeaders = data.readInt32();
481 for (int i = 0; i < numHeaders; ++i) {
482 String8 key = data.readString8();
483 String8 value = data.readString8();
484 headers.add(key, value);
485 }
Andreas Huber1b86fe02014-01-29 11:13:26 -0800486 reply->writeInt32(setDataSource(
487 httpService, url, numHeaders > 0 ? &headers : NULL));
Dave Burked681bbb2011-08-30 14:39:17 +0100488 return NO_ERROR;
489 } break;
490 case SET_DATA_SOURCE_FD: {
491 CHECK_INTERFACE(IMediaPlayer, data, reply);
492 int fd = data.readFileDescriptor();
493 int64_t offset = data.readInt64();
494 int64_t length = data.readInt64();
495 reply->writeInt32(setDataSource(fd, offset, length));
496 return NO_ERROR;
497 }
498 case SET_DATA_SOURCE_STREAM: {
499 CHECK_INTERFACE(IMediaPlayer, data, reply);
500 sp<IStreamSource> source =
501 interface_cast<IStreamSource>(data.readStrongBinder());
Wei Jia2afac0c2016-01-07 12:13:07 -0800502 if (source == NULL) {
503 reply->writeInt32(BAD_VALUE);
504 } else {
505 reply->writeInt32(setDataSource(source));
506 }
Dave Burked681bbb2011-08-30 14:39:17 +0100507 return NO_ERROR;
508 }
Chris Watkins99f31602015-03-20 13:06:33 -0700509 case SET_DATA_SOURCE_CALLBACK: {
510 CHECK_INTERFACE(IMediaPlayer, data, reply);
511 sp<IDataSource> source =
512 interface_cast<IDataSource>(data.readStrongBinder());
Wei Jia2afac0c2016-01-07 12:13:07 -0800513 if (source == NULL) {
514 reply->writeInt32(BAD_VALUE);
515 } else {
516 reply->writeInt32(setDataSource(source));
517 }
Chris Watkins99f31602015-03-20 13:06:33 -0700518 return NO_ERROR;
519 }
Glenn Kasten11731182011-02-08 17:26:17 -0800520 case SET_VIDEO_SURFACETEXTURE: {
521 CHECK_INTERFACE(IMediaPlayer, data, reply);
Andy McFadden8ba01022012-12-18 09:46:54 -0800522 sp<IGraphicBufferProducer> bufferProducer =
523 interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
524 reply->writeInt32(setVideoSurfaceTexture(bufferProducer));
Glenn Kasten11731182011-02-08 17:26:17 -0800525 return NO_ERROR;
526 } break;
Wei Jiad399e7e2016-10-26 15:49:11 -0700527 case SET_BUFFERING_SETTINGS: {
528 CHECK_INTERFACE(IMediaPlayer, data, reply);
529 BufferingSettings buffering;
530 buffering.readFromParcel(&data);
531 reply->writeInt32(setBufferingSettings(buffering));
532 return NO_ERROR;
533 } break;
534 case GET_DEFAULT_BUFFERING_SETTINGS: {
535 CHECK_INTERFACE(IMediaPlayer, data, reply);
536 BufferingSettings buffering;
537 status_t err = getDefaultBufferingSettings(&buffering);
538 reply->writeInt32(err);
539 if (err == OK) {
540 buffering.writeToParcel(reply);
541 }
542 return NO_ERROR;
543 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800544 case PREPARE_ASYNC: {
545 CHECK_INTERFACE(IMediaPlayer, data, reply);
546 reply->writeInt32(prepareAsync());
547 return NO_ERROR;
548 } break;
549 case START: {
550 CHECK_INTERFACE(IMediaPlayer, data, reply);
551 reply->writeInt32(start());
552 return NO_ERROR;
553 } break;
554 case STOP: {
555 CHECK_INTERFACE(IMediaPlayer, data, reply);
556 reply->writeInt32(stop());
557 return NO_ERROR;
558 } break;
559 case IS_PLAYING: {
560 CHECK_INTERFACE(IMediaPlayer, data, reply);
561 bool state;
562 status_t ret = isPlaying(&state);
563 reply->writeInt32(state);
564 reply->writeInt32(ret);
565 return NO_ERROR;
566 } break;
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700567 case SET_PLAYBACK_SETTINGS: {
Wei Jia98160162015-02-04 17:01:11 -0800568 CHECK_INTERFACE(IMediaPlayer, data, reply);
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700569 AudioPlaybackRate rate = AUDIO_PLAYBACK_RATE_DEFAULT;
570 rate.mSpeed = data.readFloat();
571 rate.mPitch = data.readFloat();
572 rate.mFallbackMode = (AudioTimestretchFallbackMode)data.readInt32();
573 rate.mStretchMode = (AudioTimestretchStretchMode)data.readInt32();
574 reply->writeInt32(setPlaybackSettings(rate));
575 return NO_ERROR;
576 } break;
577 case GET_PLAYBACK_SETTINGS: {
578 CHECK_INTERFACE(IMediaPlayer, data, reply);
579 AudioPlaybackRate rate = AUDIO_PLAYBACK_RATE_DEFAULT;
580 status_t err = getPlaybackSettings(&rate);
581 reply->writeInt32(err);
582 if (err == OK) {
583 reply->writeFloat(rate.mSpeed);
584 reply->writeFloat(rate.mPitch);
585 reply->writeInt32((int32_t)rate.mFallbackMode);
586 reply->writeInt32((int32_t)rate.mStretchMode);
587 }
588 return NO_ERROR;
589 } break;
590 case SET_SYNC_SETTINGS: {
591 CHECK_INTERFACE(IMediaPlayer, data, reply);
592 AVSyncSettings sync;
593 sync.mSource = (AVSyncSource)data.readInt32();
594 sync.mAudioAdjustMode = (AVSyncAudioAdjustMode)data.readInt32();
595 sync.mTolerance = data.readFloat();
596 float videoFpsHint = data.readFloat();
597 reply->writeInt32(setSyncSettings(sync, videoFpsHint));
598 return NO_ERROR;
599 } break;
600 case GET_SYNC_SETTINGS: {
601 CHECK_INTERFACE(IMediaPlayer, data, reply);
602 AVSyncSettings sync;
603 float videoFps;
604 status_t err = getSyncSettings(&sync, &videoFps);
605 reply->writeInt32(err);
606 if (err == OK) {
607 reply->writeInt32((int32_t)sync.mSource);
608 reply->writeInt32((int32_t)sync.mAudioAdjustMode);
609 reply->writeFloat(sync.mTolerance);
610 reply->writeFloat(videoFps);
611 }
Wei Jia98160162015-02-04 17:01:11 -0800612 return NO_ERROR;
613 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800614 case PAUSE: {
615 CHECK_INTERFACE(IMediaPlayer, data, reply);
616 reply->writeInt32(pause());
617 return NO_ERROR;
618 } break;
619 case SEEK_TO: {
620 CHECK_INTERFACE(IMediaPlayer, data, reply);
Wei Jia67b6dcc2016-10-31 17:01:37 -0700621 int msec = data.readInt32();
Wei Jiac5de0912016-11-18 10:22:14 -0800622 MediaPlayerSeekMode mode = (MediaPlayerSeekMode)data.readInt32();
623 reply->writeInt32(seekTo(msec, mode));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800624 return NO_ERROR;
625 } break;
626 case GET_CURRENT_POSITION: {
627 CHECK_INTERFACE(IMediaPlayer, data, reply);
Robert Shih89235432015-09-02 16:46:59 -0700628 int msec = 0;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800629 status_t ret = getCurrentPosition(&msec);
630 reply->writeInt32(msec);
631 reply->writeInt32(ret);
632 return NO_ERROR;
633 } break;
634 case GET_DURATION: {
635 CHECK_INTERFACE(IMediaPlayer, data, reply);
Robert Shih89235432015-09-02 16:46:59 -0700636 int msec = 0;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800637 status_t ret = getDuration(&msec);
638 reply->writeInt32(msec);
639 reply->writeInt32(ret);
640 return NO_ERROR;
641 } break;
642 case RESET: {
643 CHECK_INTERFACE(IMediaPlayer, data, reply);
644 reply->writeInt32(reset());
645 return NO_ERROR;
646 } break;
647 case SET_AUDIO_STREAM_TYPE: {
648 CHECK_INTERFACE(IMediaPlayer, data, reply);
Glenn Kastenfff6d712012-01-12 16:38:12 -0800649 reply->writeInt32(setAudioStreamType((audio_stream_type_t) data.readInt32()));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800650 return NO_ERROR;
651 } break;
652 case SET_LOOPING: {
653 CHECK_INTERFACE(IMediaPlayer, data, reply);
654 reply->writeInt32(setLooping(data.readInt32()));
655 return NO_ERROR;
656 } break;
657 case SET_VOLUME: {
Dave Sparks172fb9a2009-05-26 14:39:29 -0700658 CHECK_INTERFACE(IMediaPlayer, data, reply);
Gloria Wangde162ff2011-08-01 14:01:29 -0700659 float leftVolume = data.readFloat();
660 float rightVolume = data.readFloat();
661 reply->writeInt32(setVolume(leftVolume, rightVolume));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800662 return NO_ERROR;
663 } break;
Nicolas Catania1d187f12009-05-12 23:25:55 -0700664 case INVOKE: {
665 CHECK_INTERFACE(IMediaPlayer, data, reply);
James Dong040e4a12011-04-06 18:29:01 -0700666 status_t result = invoke(data, reply);
667 return result;
Nicolas Catania1d187f12009-05-12 23:25:55 -0700668 } break;
Nicolas Cataniaa7e0e8b2009-07-08 08:57:42 -0700669 case SET_METADATA_FILTER: {
670 CHECK_INTERFACE(IMediaPlayer, data, reply);
671 reply->writeInt32(setMetadataFilter(data));
672 return NO_ERROR;
673 } break;
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700674 case GET_METADATA: {
675 CHECK_INTERFACE(IMediaPlayer, data, reply);
Gloria Wangde162ff2011-08-01 14:01:29 -0700676 bool update_only = static_cast<bool>(data.readInt32());
677 bool apply_filter = static_cast<bool>(data.readInt32());
678 const status_t retcode = getMetadata(update_only, apply_filter, reply);
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700679 reply->setDataPosition(0);
680 reply->writeInt32(retcode);
681 reply->setDataPosition(0);
682 return NO_ERROR;
683 } break;
Eric Laurent2beeb502010-07-16 07:43:46 -0700684 case SET_AUX_EFFECT_SEND_LEVEL: {
685 CHECK_INTERFACE(IMediaPlayer, data, reply);
686 reply->writeInt32(setAuxEffectSendLevel(data.readFloat()));
687 return NO_ERROR;
688 } break;
689 case ATTACH_AUX_EFFECT: {
690 CHECK_INTERFACE(IMediaPlayer, data, reply);
691 reply->writeInt32(attachAuxEffect(data.readInt32()));
692 return NO_ERROR;
693 } break;
Gloria Wang4f9e47f2011-04-25 17:28:22 -0700694 case SET_PARAMETER: {
695 CHECK_INTERFACE(IMediaPlayer, data, reply);
696 int key = data.readInt32();
697
698 Parcel request;
699 if (data.dataAvail() > 0) {
700 request.appendFrom(
701 const_cast<Parcel *>(&data), data.dataPosition(), data.dataAvail());
702 }
703 request.setDataPosition(0);
704 reply->writeInt32(setParameter(key, request));
705 return NO_ERROR;
706 } break;
707 case GET_PARAMETER: {
708 CHECK_INTERFACE(IMediaPlayer, data, reply);
709 return getParameter(data.readInt32(), reply);
710 } break;
John Grossmanc795b642012-02-22 15:38:35 -0800711 case SET_RETRANSMIT_ENDPOINT: {
712 CHECK_INTERFACE(IMediaPlayer, data, reply);
713
714 struct sockaddr_in endpoint;
Nick Kralevich0981df62015-08-20 09:56:39 -0700715 memset(&endpoint, 0, sizeof(endpoint));
John Grossmanc795b642012-02-22 15:38:35 -0800716 int amt = data.readInt32();
717 if (amt == sizeof(endpoint)) {
718 data.read(&endpoint, sizeof(struct sockaddr_in));
719 reply->writeInt32(setRetransmitEndpoint(&endpoint));
720 } else {
721 reply->writeInt32(setRetransmitEndpoint(NULL));
722 }
John Grossman44a7e422012-06-21 17:29:24 -0700723
724 return NO_ERROR;
725 } break;
726 case GET_RETRANSMIT_ENDPOINT: {
727 CHECK_INTERFACE(IMediaPlayer, data, reply);
728
729 struct sockaddr_in endpoint;
Nick Kralevich0981df62015-08-20 09:56:39 -0700730 memset(&endpoint, 0, sizeof(endpoint));
John Grossman44a7e422012-06-21 17:29:24 -0700731 status_t res = getRetransmitEndpoint(&endpoint);
732
733 reply->writeInt32(res);
734 reply->write(&endpoint, sizeof(endpoint));
735
Marco Nelissen6b74d672012-02-28 16:07:44 -0800736 return NO_ERROR;
737 } break;
738 case SET_NEXT_PLAYER: {
739 CHECK_INTERFACE(IMediaPlayer, data, reply);
740 reply->writeInt32(setNextPlayer(interface_cast<IMediaPlayer>(data.readStrongBinder())));
John Grossman44a7e422012-06-21 17:29:24 -0700741
John Grossmanc795b642012-02-22 15:38:35 -0800742 return NO_ERROR;
743 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800744 default:
745 return BBinder::onTransact(code, data, reply, flags);
746 }
747}
748
749// ----------------------------------------------------------------------------
750
Glenn Kasten40bc9062015-03-20 09:09:33 -0700751} // namespace android