blob: 0091078d61c599ba6c60a9700cf798e66fd84949 [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
Chris Watkins99f31602015-03-20 13:06:33 -070024#include <media/IDataSource.h>
Andreas Huber1b86fe02014-01-29 11:13:26 -080025#include <media/IMediaHTTPService.h>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080026#include <media/IMediaPlayer.h>
Dave Burked681bbb2011-08-30 14:39:17 +010027#include <media/IStreamSource.h>
28
Andy McFadden8ba01022012-12-18 09:46:54 -080029#include <gui/IGraphicBufferProducer.h>
Dave Burked681bbb2011-08-30 14:39:17 +010030#include <utils/String8.h>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080031
32namespace android {
33
34enum {
35 DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
Dave Burked681bbb2011-08-30 14:39:17 +010036 SET_DATA_SOURCE_URL,
37 SET_DATA_SOURCE_FD,
38 SET_DATA_SOURCE_STREAM,
Chris Watkins99f31602015-03-20 13:06:33 -070039 SET_DATA_SOURCE_CALLBACK,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080040 PREPARE_ASYNC,
41 START,
42 STOP,
43 IS_PLAYING,
Wei Jia98160162015-02-04 17:01:11 -080044 SET_PLAYBACK_RATE,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080045 PAUSE,
46 SEEK_TO,
47 GET_CURRENT_POSITION,
48 GET_DURATION,
49 RESET,
50 SET_AUDIO_STREAM_TYPE,
51 SET_LOOPING,
Nicolas Catania1d187f12009-05-12 23:25:55 -070052 SET_VOLUME,
53 INVOKE,
Nicolas Cataniaa7e0e8b2009-07-08 08:57:42 -070054 SET_METADATA_FILTER,
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -070055 GET_METADATA,
Eric Laurent2beeb502010-07-16 07:43:46 -070056 SET_AUX_EFFECT_SEND_LEVEL,
Glenn Kasten11731182011-02-08 17:26:17 -080057 ATTACH_AUX_EFFECT,
58 SET_VIDEO_SURFACETEXTURE,
Gloria Wang4f9e47f2011-04-25 17:28:22 -070059 SET_PARAMETER,
60 GET_PARAMETER,
John Grossmanc795b642012-02-22 15:38:35 -080061 SET_RETRANSMIT_ENDPOINT,
John Grossman44a7e422012-06-21 17:29:24 -070062 GET_RETRANSMIT_ENDPOINT,
Marco Nelissen6b74d672012-02-28 16:07:44 -080063 SET_NEXT_PLAYER,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080064};
65
66class BpMediaPlayer: public BpInterface<IMediaPlayer>
67{
68public:
69 BpMediaPlayer(const sp<IBinder>& impl)
70 : BpInterface<IMediaPlayer>(impl)
71 {
72 }
73
74 // disconnect from media player service
75 void disconnect()
76 {
77 Parcel data, reply;
78 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
79 remote()->transact(DISCONNECT, data, &reply);
80 }
81
Andreas Huber1b86fe02014-01-29 11:13:26 -080082 status_t setDataSource(
83 const sp<IMediaHTTPService> &httpService,
84 const char* url,
Dave Burked681bbb2011-08-30 14:39:17 +010085 const KeyedVector<String8, String8>* headers)
86 {
87 Parcel data, reply;
88 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Andreas Huber1b86fe02014-01-29 11:13:26 -080089 data.writeInt32(httpService != NULL);
90 if (httpService != NULL) {
Marco Nelissen06b46062014-11-14 07:58:25 -080091 data.writeStrongBinder(IInterface::asBinder(httpService));
Andreas Huber1b86fe02014-01-29 11:13:26 -080092 }
Dave Burked681bbb2011-08-30 14:39:17 +010093 data.writeCString(url);
94 if (headers == NULL) {
95 data.writeInt32(0);
96 } else {
97 // serialize the headers
98 data.writeInt32(headers->size());
99 for (size_t i = 0; i < headers->size(); ++i) {
100 data.writeString8(headers->keyAt(i));
101 data.writeString8(headers->valueAt(i));
102 }
103 }
104 remote()->transact(SET_DATA_SOURCE_URL, data, &reply);
105 return reply.readInt32();
106 }
107
108 status_t setDataSource(int fd, int64_t offset, int64_t length) {
109 Parcel data, reply;
110 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
111 data.writeFileDescriptor(fd);
112 data.writeInt64(offset);
113 data.writeInt64(length);
114 remote()->transact(SET_DATA_SOURCE_FD, data, &reply);
115 return reply.readInt32();
116 }
117
118 status_t setDataSource(const sp<IStreamSource> &source) {
119 Parcel data, reply;
120 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800121 data.writeStrongBinder(IInterface::asBinder(source));
Glenn Kasten8d655102011-09-07 14:40:23 -0700122 remote()->transact(SET_DATA_SOURCE_STREAM, data, &reply);
Dave Burked681bbb2011-08-30 14:39:17 +0100123 return reply.readInt32();
124 }
125
Chris Watkins99f31602015-03-20 13:06:33 -0700126 status_t setDataSource(const sp<IDataSource> &source) {
127 Parcel data, reply;
128 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
129 data.writeStrongBinder(IInterface::asBinder(source));
130 remote()->transact(SET_DATA_SOURCE_CALLBACK, data, &reply);
131 return reply.readInt32();
132 }
133
Andy McFadden8ba01022012-12-18 09:46:54 -0800134 // pass the buffered IGraphicBufferProducer to the media player service
135 status_t setVideoSurfaceTexture(const sp<IGraphicBufferProducer>& bufferProducer)
Glenn Kasten11731182011-02-08 17:26:17 -0800136 {
137 Parcel data, reply;
138 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800139 sp<IBinder> b(IInterface::asBinder(bufferProducer));
Glenn Kasten11731182011-02-08 17:26:17 -0800140 data.writeStrongBinder(b);
141 remote()->transact(SET_VIDEO_SURFACETEXTURE, data, &reply);
142 return reply.readInt32();
143 }
144
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800145 status_t prepareAsync()
146 {
147 Parcel data, reply;
148 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
149 remote()->transact(PREPARE_ASYNC, data, &reply);
150 return reply.readInt32();
151 }
152
153 status_t start()
154 {
155 Parcel data, reply;
156 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
157 remote()->transact(START, data, &reply);
158 return reply.readInt32();
159 }
160
161 status_t stop()
162 {
163 Parcel data, reply;
164 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
165 remote()->transact(STOP, data, &reply);
166 return reply.readInt32();
167 }
168
169 status_t isPlaying(bool* state)
170 {
171 Parcel data, reply;
172 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
173 remote()->transact(IS_PLAYING, data, &reply);
174 *state = reply.readInt32();
175 return reply.readInt32();
176 }
177
Wei Jia98160162015-02-04 17:01:11 -0800178 status_t setPlaybackRate(float rate)
179 {
180 Parcel data, reply;
181 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
182 data.writeFloat(rate);
183 remote()->transact(SET_PLAYBACK_RATE, data, &reply);
184 return reply.readInt32();
185 }
186
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800187 status_t pause()
188 {
189 Parcel data, reply;
190 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
191 remote()->transact(PAUSE, data, &reply);
192 return reply.readInt32();
193 }
194
195 status_t seekTo(int msec)
196 {
197 Parcel data, reply;
198 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
199 data.writeInt32(msec);
200 remote()->transact(SEEK_TO, data, &reply);
201 return reply.readInt32();
202 }
203
204 status_t getCurrentPosition(int* msec)
205 {
206 Parcel data, reply;
207 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
208 remote()->transact(GET_CURRENT_POSITION, data, &reply);
209 *msec = reply.readInt32();
210 return reply.readInt32();
211 }
212
213 status_t getDuration(int* msec)
214 {
215 Parcel data, reply;
216 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
217 remote()->transact(GET_DURATION, data, &reply);
218 *msec = reply.readInt32();
219 return reply.readInt32();
220 }
221
222 status_t reset()
223 {
224 Parcel data, reply;
225 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
226 remote()->transact(RESET, data, &reply);
227 return reply.readInt32();
228 }
229
Glenn Kastenfff6d712012-01-12 16:38:12 -0800230 status_t setAudioStreamType(audio_stream_type_t stream)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800231 {
232 Parcel data, reply;
233 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800234 data.writeInt32((int32_t) stream);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800235 remote()->transact(SET_AUDIO_STREAM_TYPE, data, &reply);
236 return reply.readInt32();
237 }
238
239 status_t setLooping(int loop)
240 {
241 Parcel data, reply;
242 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
243 data.writeInt32(loop);
244 remote()->transact(SET_LOOPING, data, &reply);
245 return reply.readInt32();
246 }
247
248 status_t setVolume(float leftVolume, float rightVolume)
249 {
250 Parcel data, reply;
Dave Sparks172fb9a2009-05-26 14:39:29 -0700251 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800252 data.writeFloat(leftVolume);
253 data.writeFloat(rightVolume);
254 remote()->transact(SET_VOLUME, data, &reply);
255 return reply.readInt32();
256 }
Nicolas Catania1d187f12009-05-12 23:25:55 -0700257
258 status_t invoke(const Parcel& request, Parcel *reply)
James Dong040e4a12011-04-06 18:29:01 -0700259 {
260 // Avoid doing any extra copy. The interface descriptor should
261 // have been set by MediaPlayer.java.
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700262 return remote()->transact(INVOKE, request, reply);
Nicolas Catania1d187f12009-05-12 23:25:55 -0700263 }
Nicolas Cataniaa7e0e8b2009-07-08 08:57:42 -0700264
265 status_t setMetadataFilter(const Parcel& request)
266 {
267 Parcel reply;
268 // Avoid doing any extra copy of the request. The interface
269 // descriptor should have been set by MediaPlayer.java.
270 remote()->transact(SET_METADATA_FILTER, request, &reply);
271 return reply.readInt32();
272 }
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700273
274 status_t getMetadata(bool update_only, bool apply_filter, Parcel *reply)
275 {
276 Parcel request;
277 request.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
278 // TODO: Burning 2 ints for 2 boolean. Should probably use flags in an int here.
279 request.writeInt32(update_only);
280 request.writeInt32(apply_filter);
281 remote()->transact(GET_METADATA, request, reply);
282 return reply->readInt32();
283 }
Andreas Huber4e92c7e2010-02-12 12:35:58 -0800284
Eric Laurent2beeb502010-07-16 07:43:46 -0700285 status_t setAuxEffectSendLevel(float level)
286 {
287 Parcel data, reply;
288 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
289 data.writeFloat(level);
290 remote()->transact(SET_AUX_EFFECT_SEND_LEVEL, data, &reply);
291 return reply.readInt32();
292 }
293
294 status_t attachAuxEffect(int effectId)
295 {
296 Parcel data, reply;
297 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
298 data.writeInt32(effectId);
299 remote()->transact(ATTACH_AUX_EFFECT, data, &reply);
300 return reply.readInt32();
301 }
Glenn Kasten11731182011-02-08 17:26:17 -0800302
Gloria Wang4f9e47f2011-04-25 17:28:22 -0700303 status_t setParameter(int key, const Parcel& request)
304 {
305 Parcel data, reply;
306 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
307 data.writeInt32(key);
308 if (request.dataSize() > 0) {
309 data.appendFrom(const_cast<Parcel *>(&request), 0, request.dataSize());
310 }
311 remote()->transact(SET_PARAMETER, data, &reply);
312 return reply.readInt32();
313 }
314
315 status_t getParameter(int key, Parcel *reply)
316 {
317 Parcel data;
318 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
319 data.writeInt32(key);
320 return remote()->transact(GET_PARAMETER, data, reply);
321 }
322
John Grossman44a7e422012-06-21 17:29:24 -0700323 status_t setRetransmitEndpoint(const struct sockaddr_in* endpoint)
324 {
John Grossmanc795b642012-02-22 15:38:35 -0800325 Parcel data, reply;
326 status_t err;
327
328 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
329 if (NULL != endpoint) {
330 data.writeInt32(sizeof(*endpoint));
331 data.write(endpoint, sizeof(*endpoint));
332 } else {
333 data.writeInt32(0);
334 }
335
336 err = remote()->transact(SET_RETRANSMIT_ENDPOINT, data, &reply);
337 if (OK != err) {
338 return err;
339 }
Marco Nelissen6b74d672012-02-28 16:07:44 -0800340 return reply.readInt32();
341 }
John Grossmanc795b642012-02-22 15:38:35 -0800342
Marco Nelissen6b74d672012-02-28 16:07:44 -0800343 status_t setNextPlayer(const sp<IMediaPlayer>& player) {
344 Parcel data, reply;
345 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800346 sp<IBinder> b(IInterface::asBinder(player));
Marco Nelissen6b74d672012-02-28 16:07:44 -0800347 data.writeStrongBinder(b);
348 remote()->transact(SET_NEXT_PLAYER, data, &reply);
John Grossmanc795b642012-02-22 15:38:35 -0800349 return reply.readInt32();
350 }
John Grossman44a7e422012-06-21 17:29:24 -0700351
352 status_t getRetransmitEndpoint(struct sockaddr_in* endpoint)
353 {
354 Parcel data, reply;
355 status_t err;
356
357 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
358 err = remote()->transact(GET_RETRANSMIT_ENDPOINT, data, &reply);
359
360 if ((OK != err) || (OK != (err = reply.readInt32()))) {
361 return err;
362 }
363
364 data.read(endpoint, sizeof(*endpoint));
365
366 return err;
367 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800368};
369
niko56f0cc52009-06-22 08:49:52 -0700370IMPLEMENT_META_INTERFACE(MediaPlayer, "android.media.IMediaPlayer");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800371
372// ----------------------------------------------------------------------
373
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800374status_t BnMediaPlayer::onTransact(
375 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
376{
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700377 switch (code) {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800378 case DISCONNECT: {
379 CHECK_INTERFACE(IMediaPlayer, data, reply);
380 disconnect();
381 return NO_ERROR;
382 } break;
Dave Burked681bbb2011-08-30 14:39:17 +0100383 case SET_DATA_SOURCE_URL: {
384 CHECK_INTERFACE(IMediaPlayer, data, reply);
Andreas Huber1b86fe02014-01-29 11:13:26 -0800385
386 sp<IMediaHTTPService> httpService;
387 if (data.readInt32()) {
388 httpService =
389 interface_cast<IMediaHTTPService>(data.readStrongBinder());
390 }
391
Dave Burked681bbb2011-08-30 14:39:17 +0100392 const char* url = data.readCString();
393 KeyedVector<String8, String8> headers;
394 int32_t numHeaders = data.readInt32();
395 for (int i = 0; i < numHeaders; ++i) {
396 String8 key = data.readString8();
397 String8 value = data.readString8();
398 headers.add(key, value);
399 }
Andreas Huber1b86fe02014-01-29 11:13:26 -0800400 reply->writeInt32(setDataSource(
401 httpService, url, numHeaders > 0 ? &headers : NULL));
Dave Burked681bbb2011-08-30 14:39:17 +0100402 return NO_ERROR;
403 } break;
404 case SET_DATA_SOURCE_FD: {
405 CHECK_INTERFACE(IMediaPlayer, data, reply);
406 int fd = data.readFileDescriptor();
407 int64_t offset = data.readInt64();
408 int64_t length = data.readInt64();
409 reply->writeInt32(setDataSource(fd, offset, length));
410 return NO_ERROR;
411 }
412 case SET_DATA_SOURCE_STREAM: {
413 CHECK_INTERFACE(IMediaPlayer, data, reply);
414 sp<IStreamSource> source =
415 interface_cast<IStreamSource>(data.readStrongBinder());
416 reply->writeInt32(setDataSource(source));
417 return NO_ERROR;
418 }
Chris Watkins99f31602015-03-20 13:06:33 -0700419 case SET_DATA_SOURCE_CALLBACK: {
420 CHECK_INTERFACE(IMediaPlayer, data, reply);
421 sp<IDataSource> source =
422 interface_cast<IDataSource>(data.readStrongBinder());
423 reply->writeInt32(setDataSource(source));
424 return NO_ERROR;
425 }
Glenn Kasten11731182011-02-08 17:26:17 -0800426 case SET_VIDEO_SURFACETEXTURE: {
427 CHECK_INTERFACE(IMediaPlayer, data, reply);
Andy McFadden8ba01022012-12-18 09:46:54 -0800428 sp<IGraphicBufferProducer> bufferProducer =
429 interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
430 reply->writeInt32(setVideoSurfaceTexture(bufferProducer));
Glenn Kasten11731182011-02-08 17:26:17 -0800431 return NO_ERROR;
432 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800433 case PREPARE_ASYNC: {
434 CHECK_INTERFACE(IMediaPlayer, data, reply);
435 reply->writeInt32(prepareAsync());
436 return NO_ERROR;
437 } break;
438 case START: {
439 CHECK_INTERFACE(IMediaPlayer, data, reply);
440 reply->writeInt32(start());
441 return NO_ERROR;
442 } break;
443 case STOP: {
444 CHECK_INTERFACE(IMediaPlayer, data, reply);
445 reply->writeInt32(stop());
446 return NO_ERROR;
447 } break;
448 case IS_PLAYING: {
449 CHECK_INTERFACE(IMediaPlayer, data, reply);
450 bool state;
451 status_t ret = isPlaying(&state);
452 reply->writeInt32(state);
453 reply->writeInt32(ret);
454 return NO_ERROR;
455 } break;
Wei Jia98160162015-02-04 17:01:11 -0800456 case SET_PLAYBACK_RATE: {
457 CHECK_INTERFACE(IMediaPlayer, data, reply);
458 reply->writeInt32(setPlaybackRate(data.readFloat()));
459 return NO_ERROR;
460 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800461 case PAUSE: {
462 CHECK_INTERFACE(IMediaPlayer, data, reply);
463 reply->writeInt32(pause());
464 return NO_ERROR;
465 } break;
466 case SEEK_TO: {
467 CHECK_INTERFACE(IMediaPlayer, data, reply);
468 reply->writeInt32(seekTo(data.readInt32()));
469 return NO_ERROR;
470 } break;
471 case GET_CURRENT_POSITION: {
472 CHECK_INTERFACE(IMediaPlayer, data, reply);
473 int msec;
474 status_t ret = getCurrentPosition(&msec);
475 reply->writeInt32(msec);
476 reply->writeInt32(ret);
477 return NO_ERROR;
478 } break;
479 case GET_DURATION: {
480 CHECK_INTERFACE(IMediaPlayer, data, reply);
481 int msec;
482 status_t ret = getDuration(&msec);
483 reply->writeInt32(msec);
484 reply->writeInt32(ret);
485 return NO_ERROR;
486 } break;
487 case RESET: {
488 CHECK_INTERFACE(IMediaPlayer, data, reply);
489 reply->writeInt32(reset());
490 return NO_ERROR;
491 } break;
492 case SET_AUDIO_STREAM_TYPE: {
493 CHECK_INTERFACE(IMediaPlayer, data, reply);
Glenn Kastenfff6d712012-01-12 16:38:12 -0800494 reply->writeInt32(setAudioStreamType((audio_stream_type_t) data.readInt32()));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800495 return NO_ERROR;
496 } break;
497 case SET_LOOPING: {
498 CHECK_INTERFACE(IMediaPlayer, data, reply);
499 reply->writeInt32(setLooping(data.readInt32()));
500 return NO_ERROR;
501 } break;
502 case SET_VOLUME: {
Dave Sparks172fb9a2009-05-26 14:39:29 -0700503 CHECK_INTERFACE(IMediaPlayer, data, reply);
Gloria Wangde162ff2011-08-01 14:01:29 -0700504 float leftVolume = data.readFloat();
505 float rightVolume = data.readFloat();
506 reply->writeInt32(setVolume(leftVolume, rightVolume));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800507 return NO_ERROR;
508 } break;
Nicolas Catania1d187f12009-05-12 23:25:55 -0700509 case INVOKE: {
510 CHECK_INTERFACE(IMediaPlayer, data, reply);
James Dong040e4a12011-04-06 18:29:01 -0700511 status_t result = invoke(data, reply);
512 return result;
Nicolas Catania1d187f12009-05-12 23:25:55 -0700513 } break;
Nicolas Cataniaa7e0e8b2009-07-08 08:57:42 -0700514 case SET_METADATA_FILTER: {
515 CHECK_INTERFACE(IMediaPlayer, data, reply);
516 reply->writeInt32(setMetadataFilter(data));
517 return NO_ERROR;
518 } break;
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700519 case GET_METADATA: {
520 CHECK_INTERFACE(IMediaPlayer, data, reply);
Gloria Wangde162ff2011-08-01 14:01:29 -0700521 bool update_only = static_cast<bool>(data.readInt32());
522 bool apply_filter = static_cast<bool>(data.readInt32());
523 const status_t retcode = getMetadata(update_only, apply_filter, reply);
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700524 reply->setDataPosition(0);
525 reply->writeInt32(retcode);
526 reply->setDataPosition(0);
527 return NO_ERROR;
528 } break;
Eric Laurent2beeb502010-07-16 07:43:46 -0700529 case SET_AUX_EFFECT_SEND_LEVEL: {
530 CHECK_INTERFACE(IMediaPlayer, data, reply);
531 reply->writeInt32(setAuxEffectSendLevel(data.readFloat()));
532 return NO_ERROR;
533 } break;
534 case ATTACH_AUX_EFFECT: {
535 CHECK_INTERFACE(IMediaPlayer, data, reply);
536 reply->writeInt32(attachAuxEffect(data.readInt32()));
537 return NO_ERROR;
538 } break;
Gloria Wang4f9e47f2011-04-25 17:28:22 -0700539 case SET_PARAMETER: {
540 CHECK_INTERFACE(IMediaPlayer, data, reply);
541 int key = data.readInt32();
542
543 Parcel request;
544 if (data.dataAvail() > 0) {
545 request.appendFrom(
546 const_cast<Parcel *>(&data), data.dataPosition(), data.dataAvail());
547 }
548 request.setDataPosition(0);
549 reply->writeInt32(setParameter(key, request));
550 return NO_ERROR;
551 } break;
552 case GET_PARAMETER: {
553 CHECK_INTERFACE(IMediaPlayer, data, reply);
554 return getParameter(data.readInt32(), reply);
555 } break;
John Grossmanc795b642012-02-22 15:38:35 -0800556 case SET_RETRANSMIT_ENDPOINT: {
557 CHECK_INTERFACE(IMediaPlayer, data, reply);
558
559 struct sockaddr_in endpoint;
560 int amt = data.readInt32();
561 if (amt == sizeof(endpoint)) {
562 data.read(&endpoint, sizeof(struct sockaddr_in));
563 reply->writeInt32(setRetransmitEndpoint(&endpoint));
564 } else {
565 reply->writeInt32(setRetransmitEndpoint(NULL));
566 }
John Grossman44a7e422012-06-21 17:29:24 -0700567
568 return NO_ERROR;
569 } break;
570 case GET_RETRANSMIT_ENDPOINT: {
571 CHECK_INTERFACE(IMediaPlayer, data, reply);
572
573 struct sockaddr_in endpoint;
574 status_t res = getRetransmitEndpoint(&endpoint);
575
576 reply->writeInt32(res);
577 reply->write(&endpoint, sizeof(endpoint));
578
Marco Nelissen6b74d672012-02-28 16:07:44 -0800579 return NO_ERROR;
580 } break;
581 case SET_NEXT_PLAYER: {
582 CHECK_INTERFACE(IMediaPlayer, data, reply);
583 reply->writeInt32(setNextPlayer(interface_cast<IMediaPlayer>(data.readStrongBinder())));
John Grossman44a7e422012-06-21 17:29:24 -0700584
John Grossmanc795b642012-02-22 15:38:35 -0800585 return NO_ERROR;
586 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800587 default:
588 return BBinder::onTransact(code, data, reply, flags);
589 }
590}
591
592// ----------------------------------------------------------------------------
593
Glenn Kasten40bc9062015-03-20 09:09:33 -0700594} // namespace android