blob: dcd5670f6a8f1231685d668cd7472ceb36ad4390 [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
Andreas Huber1b86fe02014-01-29 11:13:26 -080024#include <media/IMediaHTTPService.h>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080025#include <media/IMediaPlayer.h>
Dave Burked681bbb2011-08-30 14:39:17 +010026#include <media/IStreamSource.h>
27
Andy McFadden8ba01022012-12-18 09:46:54 -080028#include <gui/IGraphicBufferProducer.h>
Dave Burked681bbb2011-08-30 14:39:17 +010029#include <utils/String8.h>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080030
31namespace android {
32
33enum {
34 DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
Dave Burked681bbb2011-08-30 14:39:17 +010035 SET_DATA_SOURCE_URL,
36 SET_DATA_SOURCE_FD,
37 SET_DATA_SOURCE_STREAM,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080038 PREPARE_ASYNC,
39 START,
40 STOP,
41 IS_PLAYING,
Wei Jia98160162015-02-04 17:01:11 -080042 SET_PLAYBACK_RATE,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080043 PAUSE,
44 SEEK_TO,
45 GET_CURRENT_POSITION,
46 GET_DURATION,
47 RESET,
48 SET_AUDIO_STREAM_TYPE,
49 SET_LOOPING,
Nicolas Catania1d187f12009-05-12 23:25:55 -070050 SET_VOLUME,
51 INVOKE,
Nicolas Cataniaa7e0e8b2009-07-08 08:57:42 -070052 SET_METADATA_FILTER,
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -070053 GET_METADATA,
Eric Laurent2beeb502010-07-16 07:43:46 -070054 SET_AUX_EFFECT_SEND_LEVEL,
Glenn Kasten11731182011-02-08 17:26:17 -080055 ATTACH_AUX_EFFECT,
56 SET_VIDEO_SURFACETEXTURE,
Gloria Wang4f9e47f2011-04-25 17:28:22 -070057 SET_PARAMETER,
58 GET_PARAMETER,
John Grossmanc795b642012-02-22 15:38:35 -080059 SET_RETRANSMIT_ENDPOINT,
John Grossman44a7e422012-06-21 17:29:24 -070060 GET_RETRANSMIT_ENDPOINT,
Marco Nelissen6b74d672012-02-28 16:07:44 -080061 SET_NEXT_PLAYER,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080062};
63
64class BpMediaPlayer: public BpInterface<IMediaPlayer>
65{
66public:
67 BpMediaPlayer(const sp<IBinder>& impl)
68 : BpInterface<IMediaPlayer>(impl)
69 {
70 }
71
72 // disconnect from media player service
73 void disconnect()
74 {
75 Parcel data, reply;
76 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
77 remote()->transact(DISCONNECT, data, &reply);
78 }
79
Andreas Huber1b86fe02014-01-29 11:13:26 -080080 status_t setDataSource(
81 const sp<IMediaHTTPService> &httpService,
82 const char* url,
Dave Burked681bbb2011-08-30 14:39:17 +010083 const KeyedVector<String8, String8>* headers)
84 {
85 Parcel data, reply;
86 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Andreas Huber1b86fe02014-01-29 11:13:26 -080087 data.writeInt32(httpService != NULL);
88 if (httpService != NULL) {
Marco Nelissen06b46062014-11-14 07:58:25 -080089 data.writeStrongBinder(IInterface::asBinder(httpService));
Andreas Huber1b86fe02014-01-29 11:13:26 -080090 }
Dave Burked681bbb2011-08-30 14:39:17 +010091 data.writeCString(url);
92 if (headers == NULL) {
93 data.writeInt32(0);
94 } else {
95 // serialize the headers
96 data.writeInt32(headers->size());
97 for (size_t i = 0; i < headers->size(); ++i) {
98 data.writeString8(headers->keyAt(i));
99 data.writeString8(headers->valueAt(i));
100 }
101 }
102 remote()->transact(SET_DATA_SOURCE_URL, data, &reply);
103 return reply.readInt32();
104 }
105
106 status_t setDataSource(int fd, int64_t offset, int64_t length) {
107 Parcel data, reply;
108 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
109 data.writeFileDescriptor(fd);
110 data.writeInt64(offset);
111 data.writeInt64(length);
112 remote()->transact(SET_DATA_SOURCE_FD, data, &reply);
113 return reply.readInt32();
114 }
115
116 status_t setDataSource(const sp<IStreamSource> &source) {
117 Parcel data, reply;
118 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800119 data.writeStrongBinder(IInterface::asBinder(source));
Glenn Kasten8d655102011-09-07 14:40:23 -0700120 remote()->transact(SET_DATA_SOURCE_STREAM, data, &reply);
Dave Burked681bbb2011-08-30 14:39:17 +0100121 return reply.readInt32();
122 }
123
Andy McFadden8ba01022012-12-18 09:46:54 -0800124 // pass the buffered IGraphicBufferProducer to the media player service
125 status_t setVideoSurfaceTexture(const sp<IGraphicBufferProducer>& bufferProducer)
Glenn Kasten11731182011-02-08 17:26:17 -0800126 {
127 Parcel data, reply;
128 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800129 sp<IBinder> b(IInterface::asBinder(bufferProducer));
Glenn Kasten11731182011-02-08 17:26:17 -0800130 data.writeStrongBinder(b);
131 remote()->transact(SET_VIDEO_SURFACETEXTURE, data, &reply);
132 return reply.readInt32();
133 }
134
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800135 status_t prepareAsync()
136 {
137 Parcel data, reply;
138 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
139 remote()->transact(PREPARE_ASYNC, data, &reply);
140 return reply.readInt32();
141 }
142
143 status_t start()
144 {
145 Parcel data, reply;
146 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
147 remote()->transact(START, data, &reply);
148 return reply.readInt32();
149 }
150
151 status_t stop()
152 {
153 Parcel data, reply;
154 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
155 remote()->transact(STOP, data, &reply);
156 return reply.readInt32();
157 }
158
159 status_t isPlaying(bool* state)
160 {
161 Parcel data, reply;
162 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
163 remote()->transact(IS_PLAYING, data, &reply);
164 *state = reply.readInt32();
165 return reply.readInt32();
166 }
167
Wei Jia98160162015-02-04 17:01:11 -0800168 status_t setPlaybackRate(float rate)
169 {
170 Parcel data, reply;
171 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
172 data.writeFloat(rate);
173 remote()->transact(SET_PLAYBACK_RATE, data, &reply);
174 return reply.readInt32();
175 }
176
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800177 status_t pause()
178 {
179 Parcel data, reply;
180 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
181 remote()->transact(PAUSE, data, &reply);
182 return reply.readInt32();
183 }
184
185 status_t seekTo(int msec)
186 {
187 Parcel data, reply;
188 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
189 data.writeInt32(msec);
190 remote()->transact(SEEK_TO, data, &reply);
191 return reply.readInt32();
192 }
193
194 status_t getCurrentPosition(int* msec)
195 {
196 Parcel data, reply;
197 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
198 remote()->transact(GET_CURRENT_POSITION, data, &reply);
199 *msec = reply.readInt32();
200 return reply.readInt32();
201 }
202
203 status_t getDuration(int* msec)
204 {
205 Parcel data, reply;
206 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
207 remote()->transact(GET_DURATION, data, &reply);
208 *msec = reply.readInt32();
209 return reply.readInt32();
210 }
211
212 status_t reset()
213 {
214 Parcel data, reply;
215 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
216 remote()->transact(RESET, data, &reply);
217 return reply.readInt32();
218 }
219
Glenn Kastenfff6d712012-01-12 16:38:12 -0800220 status_t setAudioStreamType(audio_stream_type_t stream)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800221 {
222 Parcel data, reply;
223 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800224 data.writeInt32((int32_t) stream);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800225 remote()->transact(SET_AUDIO_STREAM_TYPE, data, &reply);
226 return reply.readInt32();
227 }
228
229 status_t setLooping(int loop)
230 {
231 Parcel data, reply;
232 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
233 data.writeInt32(loop);
234 remote()->transact(SET_LOOPING, data, &reply);
235 return reply.readInt32();
236 }
237
238 status_t setVolume(float leftVolume, float rightVolume)
239 {
240 Parcel data, reply;
Dave Sparks172fb9a2009-05-26 14:39:29 -0700241 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800242 data.writeFloat(leftVolume);
243 data.writeFloat(rightVolume);
244 remote()->transact(SET_VOLUME, data, &reply);
245 return reply.readInt32();
246 }
Nicolas Catania1d187f12009-05-12 23:25:55 -0700247
248 status_t invoke(const Parcel& request, Parcel *reply)
James Dong040e4a12011-04-06 18:29:01 -0700249 {
250 // Avoid doing any extra copy. The interface descriptor should
251 // have been set by MediaPlayer.java.
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700252 return remote()->transact(INVOKE, request, reply);
Nicolas Catania1d187f12009-05-12 23:25:55 -0700253 }
Nicolas Cataniaa7e0e8b2009-07-08 08:57:42 -0700254
255 status_t setMetadataFilter(const Parcel& request)
256 {
257 Parcel reply;
258 // Avoid doing any extra copy of the request. The interface
259 // descriptor should have been set by MediaPlayer.java.
260 remote()->transact(SET_METADATA_FILTER, request, &reply);
261 return reply.readInt32();
262 }
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700263
264 status_t getMetadata(bool update_only, bool apply_filter, Parcel *reply)
265 {
266 Parcel request;
267 request.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
268 // TODO: Burning 2 ints for 2 boolean. Should probably use flags in an int here.
269 request.writeInt32(update_only);
270 request.writeInt32(apply_filter);
271 remote()->transact(GET_METADATA, request, reply);
272 return reply->readInt32();
273 }
Andreas Huber4e92c7e2010-02-12 12:35:58 -0800274
Eric Laurent2beeb502010-07-16 07:43:46 -0700275 status_t setAuxEffectSendLevel(float level)
276 {
277 Parcel data, reply;
278 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
279 data.writeFloat(level);
280 remote()->transact(SET_AUX_EFFECT_SEND_LEVEL, data, &reply);
281 return reply.readInt32();
282 }
283
284 status_t attachAuxEffect(int effectId)
285 {
286 Parcel data, reply;
287 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
288 data.writeInt32(effectId);
289 remote()->transact(ATTACH_AUX_EFFECT, data, &reply);
290 return reply.readInt32();
291 }
Glenn Kasten11731182011-02-08 17:26:17 -0800292
Gloria Wang4f9e47f2011-04-25 17:28:22 -0700293 status_t setParameter(int key, const Parcel& request)
294 {
295 Parcel data, reply;
296 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
297 data.writeInt32(key);
298 if (request.dataSize() > 0) {
299 data.appendFrom(const_cast<Parcel *>(&request), 0, request.dataSize());
300 }
301 remote()->transact(SET_PARAMETER, data, &reply);
302 return reply.readInt32();
303 }
304
305 status_t getParameter(int key, Parcel *reply)
306 {
307 Parcel data;
308 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
309 data.writeInt32(key);
310 return remote()->transact(GET_PARAMETER, data, reply);
311 }
312
John Grossman44a7e422012-06-21 17:29:24 -0700313 status_t setRetransmitEndpoint(const struct sockaddr_in* endpoint)
314 {
John Grossmanc795b642012-02-22 15:38:35 -0800315 Parcel data, reply;
316 status_t err;
317
318 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
319 if (NULL != endpoint) {
320 data.writeInt32(sizeof(*endpoint));
321 data.write(endpoint, sizeof(*endpoint));
322 } else {
323 data.writeInt32(0);
324 }
325
326 err = remote()->transact(SET_RETRANSMIT_ENDPOINT, data, &reply);
327 if (OK != err) {
328 return err;
329 }
Marco Nelissen6b74d672012-02-28 16:07:44 -0800330 return reply.readInt32();
331 }
John Grossmanc795b642012-02-22 15:38:35 -0800332
Marco Nelissen6b74d672012-02-28 16:07:44 -0800333 status_t setNextPlayer(const sp<IMediaPlayer>& player) {
334 Parcel data, reply;
335 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800336 sp<IBinder> b(IInterface::asBinder(player));
Marco Nelissen6b74d672012-02-28 16:07:44 -0800337 data.writeStrongBinder(b);
338 remote()->transact(SET_NEXT_PLAYER, data, &reply);
John Grossmanc795b642012-02-22 15:38:35 -0800339 return reply.readInt32();
340 }
John Grossman44a7e422012-06-21 17:29:24 -0700341
342 status_t getRetransmitEndpoint(struct sockaddr_in* endpoint)
343 {
344 Parcel data, reply;
345 status_t err;
346
347 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
348 err = remote()->transact(GET_RETRANSMIT_ENDPOINT, data, &reply);
349
350 if ((OK != err) || (OK != (err = reply.readInt32()))) {
351 return err;
352 }
353
354 data.read(endpoint, sizeof(*endpoint));
355
356 return err;
357 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800358};
359
niko56f0cc52009-06-22 08:49:52 -0700360IMPLEMENT_META_INTERFACE(MediaPlayer, "android.media.IMediaPlayer");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800361
362// ----------------------------------------------------------------------
363
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800364status_t BnMediaPlayer::onTransact(
365 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
366{
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700367 switch (code) {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800368 case DISCONNECT: {
369 CHECK_INTERFACE(IMediaPlayer, data, reply);
370 disconnect();
371 return NO_ERROR;
372 } break;
Dave Burked681bbb2011-08-30 14:39:17 +0100373 case SET_DATA_SOURCE_URL: {
374 CHECK_INTERFACE(IMediaPlayer, data, reply);
Andreas Huber1b86fe02014-01-29 11:13:26 -0800375
376 sp<IMediaHTTPService> httpService;
377 if (data.readInt32()) {
378 httpService =
379 interface_cast<IMediaHTTPService>(data.readStrongBinder());
380 }
381
Dave Burked681bbb2011-08-30 14:39:17 +0100382 const char* url = data.readCString();
383 KeyedVector<String8, String8> headers;
384 int32_t numHeaders = data.readInt32();
385 for (int i = 0; i < numHeaders; ++i) {
386 String8 key = data.readString8();
387 String8 value = data.readString8();
388 headers.add(key, value);
389 }
Andreas Huber1b86fe02014-01-29 11:13:26 -0800390 reply->writeInt32(setDataSource(
391 httpService, url, numHeaders > 0 ? &headers : NULL));
Dave Burked681bbb2011-08-30 14:39:17 +0100392 return NO_ERROR;
393 } break;
394 case SET_DATA_SOURCE_FD: {
395 CHECK_INTERFACE(IMediaPlayer, data, reply);
396 int fd = data.readFileDescriptor();
397 int64_t offset = data.readInt64();
398 int64_t length = data.readInt64();
399 reply->writeInt32(setDataSource(fd, offset, length));
400 return NO_ERROR;
401 }
402 case SET_DATA_SOURCE_STREAM: {
403 CHECK_INTERFACE(IMediaPlayer, data, reply);
404 sp<IStreamSource> source =
405 interface_cast<IStreamSource>(data.readStrongBinder());
406 reply->writeInt32(setDataSource(source));
407 return NO_ERROR;
408 }
Glenn Kasten11731182011-02-08 17:26:17 -0800409 case SET_VIDEO_SURFACETEXTURE: {
410 CHECK_INTERFACE(IMediaPlayer, data, reply);
Andy McFadden8ba01022012-12-18 09:46:54 -0800411 sp<IGraphicBufferProducer> bufferProducer =
412 interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
413 reply->writeInt32(setVideoSurfaceTexture(bufferProducer));
Glenn Kasten11731182011-02-08 17:26:17 -0800414 return NO_ERROR;
415 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800416 case PREPARE_ASYNC: {
417 CHECK_INTERFACE(IMediaPlayer, data, reply);
418 reply->writeInt32(prepareAsync());
419 return NO_ERROR;
420 } break;
421 case START: {
422 CHECK_INTERFACE(IMediaPlayer, data, reply);
423 reply->writeInt32(start());
424 return NO_ERROR;
425 } break;
426 case STOP: {
427 CHECK_INTERFACE(IMediaPlayer, data, reply);
428 reply->writeInt32(stop());
429 return NO_ERROR;
430 } break;
431 case IS_PLAYING: {
432 CHECK_INTERFACE(IMediaPlayer, data, reply);
433 bool state;
434 status_t ret = isPlaying(&state);
435 reply->writeInt32(state);
436 reply->writeInt32(ret);
437 return NO_ERROR;
438 } break;
Wei Jia98160162015-02-04 17:01:11 -0800439 case SET_PLAYBACK_RATE: {
440 CHECK_INTERFACE(IMediaPlayer, data, reply);
441 reply->writeInt32(setPlaybackRate(data.readFloat()));
442 return NO_ERROR;
443 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800444 case PAUSE: {
445 CHECK_INTERFACE(IMediaPlayer, data, reply);
446 reply->writeInt32(pause());
447 return NO_ERROR;
448 } break;
449 case SEEK_TO: {
450 CHECK_INTERFACE(IMediaPlayer, data, reply);
451 reply->writeInt32(seekTo(data.readInt32()));
452 return NO_ERROR;
453 } break;
454 case GET_CURRENT_POSITION: {
455 CHECK_INTERFACE(IMediaPlayer, data, reply);
456 int msec;
457 status_t ret = getCurrentPosition(&msec);
458 reply->writeInt32(msec);
459 reply->writeInt32(ret);
460 return NO_ERROR;
461 } break;
462 case GET_DURATION: {
463 CHECK_INTERFACE(IMediaPlayer, data, reply);
464 int msec;
465 status_t ret = getDuration(&msec);
466 reply->writeInt32(msec);
467 reply->writeInt32(ret);
468 return NO_ERROR;
469 } break;
470 case RESET: {
471 CHECK_INTERFACE(IMediaPlayer, data, reply);
472 reply->writeInt32(reset());
473 return NO_ERROR;
474 } break;
475 case SET_AUDIO_STREAM_TYPE: {
476 CHECK_INTERFACE(IMediaPlayer, data, reply);
Glenn Kastenfff6d712012-01-12 16:38:12 -0800477 reply->writeInt32(setAudioStreamType((audio_stream_type_t) data.readInt32()));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800478 return NO_ERROR;
479 } break;
480 case SET_LOOPING: {
481 CHECK_INTERFACE(IMediaPlayer, data, reply);
482 reply->writeInt32(setLooping(data.readInt32()));
483 return NO_ERROR;
484 } break;
485 case SET_VOLUME: {
Dave Sparks172fb9a2009-05-26 14:39:29 -0700486 CHECK_INTERFACE(IMediaPlayer, data, reply);
Gloria Wangde162ff2011-08-01 14:01:29 -0700487 float leftVolume = data.readFloat();
488 float rightVolume = data.readFloat();
489 reply->writeInt32(setVolume(leftVolume, rightVolume));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800490 return NO_ERROR;
491 } break;
Nicolas Catania1d187f12009-05-12 23:25:55 -0700492 case INVOKE: {
493 CHECK_INTERFACE(IMediaPlayer, data, reply);
James Dong040e4a12011-04-06 18:29:01 -0700494 status_t result = invoke(data, reply);
495 return result;
Nicolas Catania1d187f12009-05-12 23:25:55 -0700496 } break;
Nicolas Cataniaa7e0e8b2009-07-08 08:57:42 -0700497 case SET_METADATA_FILTER: {
498 CHECK_INTERFACE(IMediaPlayer, data, reply);
499 reply->writeInt32(setMetadataFilter(data));
500 return NO_ERROR;
501 } break;
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700502 case GET_METADATA: {
503 CHECK_INTERFACE(IMediaPlayer, data, reply);
Gloria Wangde162ff2011-08-01 14:01:29 -0700504 bool update_only = static_cast<bool>(data.readInt32());
505 bool apply_filter = static_cast<bool>(data.readInt32());
506 const status_t retcode = getMetadata(update_only, apply_filter, reply);
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700507 reply->setDataPosition(0);
508 reply->writeInt32(retcode);
509 reply->setDataPosition(0);
510 return NO_ERROR;
511 } break;
Eric Laurent2beeb502010-07-16 07:43:46 -0700512 case SET_AUX_EFFECT_SEND_LEVEL: {
513 CHECK_INTERFACE(IMediaPlayer, data, reply);
514 reply->writeInt32(setAuxEffectSendLevel(data.readFloat()));
515 return NO_ERROR;
516 } break;
517 case ATTACH_AUX_EFFECT: {
518 CHECK_INTERFACE(IMediaPlayer, data, reply);
519 reply->writeInt32(attachAuxEffect(data.readInt32()));
520 return NO_ERROR;
521 } break;
Gloria Wang4f9e47f2011-04-25 17:28:22 -0700522 case SET_PARAMETER: {
523 CHECK_INTERFACE(IMediaPlayer, data, reply);
524 int key = data.readInt32();
525
526 Parcel request;
527 if (data.dataAvail() > 0) {
528 request.appendFrom(
529 const_cast<Parcel *>(&data), data.dataPosition(), data.dataAvail());
530 }
531 request.setDataPosition(0);
532 reply->writeInt32(setParameter(key, request));
533 return NO_ERROR;
534 } break;
535 case GET_PARAMETER: {
536 CHECK_INTERFACE(IMediaPlayer, data, reply);
537 return getParameter(data.readInt32(), reply);
538 } break;
John Grossmanc795b642012-02-22 15:38:35 -0800539 case SET_RETRANSMIT_ENDPOINT: {
540 CHECK_INTERFACE(IMediaPlayer, data, reply);
541
542 struct sockaddr_in endpoint;
543 int amt = data.readInt32();
544 if (amt == sizeof(endpoint)) {
545 data.read(&endpoint, sizeof(struct sockaddr_in));
546 reply->writeInt32(setRetransmitEndpoint(&endpoint));
547 } else {
548 reply->writeInt32(setRetransmitEndpoint(NULL));
549 }
John Grossman44a7e422012-06-21 17:29:24 -0700550
551 return NO_ERROR;
552 } break;
553 case GET_RETRANSMIT_ENDPOINT: {
554 CHECK_INTERFACE(IMediaPlayer, data, reply);
555
556 struct sockaddr_in endpoint;
557 status_t res = getRetransmitEndpoint(&endpoint);
558
559 reply->writeInt32(res);
560 reply->write(&endpoint, sizeof(endpoint));
561
Marco Nelissen6b74d672012-02-28 16:07:44 -0800562 return NO_ERROR;
563 } break;
564 case SET_NEXT_PLAYER: {
565 CHECK_INTERFACE(IMediaPlayer, data, reply);
566 reply->writeInt32(setNextPlayer(interface_cast<IMediaPlayer>(data.readStrongBinder())));
John Grossman44a7e422012-06-21 17:29:24 -0700567
John Grossmanc795b642012-02-22 15:38:35 -0800568 return NO_ERROR;
569 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800570 default:
571 return BBinder::onTransact(code, data, reply, flags);
572 }
573}
574
575// ----------------------------------------------------------------------------
576
577}; // namespace android