blob: 20bc23d4f7fedb8bd1844994e37f5d6295940eac [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
Marco Nelissendab79b32019-11-18 08:25:47 -080022#include <android/IDataSource.h>
Mathias Agopian75624082009-05-19 19:08:10 -070023#include <binder/Parcel.h>
Marco Nelissendab79b32019-11-18 08:25:47 -080024#include <gui/IGraphicBufferProducer.h>
Lajos Molnar3a474aa2015-04-24 17:10:07 -070025#include <media/AudioResamplerPublic.h>
26#include <media/AVSyncSettings.h>
Wei Jiad399e7e2016-10-26 15:49:11 -070027#include <media/BufferingSettings.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>
Dave Burked681bbb2011-08-30 14:39:17 +010031#include <utils/String8.h>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080032
33namespace android {
34
Ivan Lozano8cf3a072017-08-09 09:01:33 -070035using media::VolumeShaper;
36
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080037enum {
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,
Wei Jiad399e7e2016-10-26 15:49:11 -070043 SET_BUFFERING_SETTINGS,
Wei Jia9bb38032017-03-23 18:00:38 -070044 GET_BUFFERING_SETTINGS,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080045 PREPARE_ASYNC,
46 START,
47 STOP,
48 IS_PLAYING,
Lajos Molnar3a474aa2015-04-24 17:10:07 -070049 SET_PLAYBACK_SETTINGS,
50 GET_PLAYBACK_SETTINGS,
51 SET_SYNC_SETTINGS,
52 GET_SYNC_SETTINGS,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080053 PAUSE,
54 SEEK_TO,
55 GET_CURRENT_POSITION,
56 GET_DURATION,
57 RESET,
Wei Jia52c28512017-09-13 18:17:51 -070058 NOTIFY_AT,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080059 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,
Andy Hung9fc8b5c2017-01-24 13:36:48 -080073 APPLY_VOLUME_SHAPER,
74 GET_VOLUME_SHAPER_STATE,
Hassan Shojaniacefac142017-02-06 21:02:02 -080075 // Modular DRM
Hassan Shojania071437a2017-01-23 09:19:40 -080076 PREPARE_DRM,
77 RELEASE_DRM,
jiabin156c6872017-10-06 09:47:15 -070078 // AudioRouting
79 SET_OUTPUT_DEVICE,
80 GET_ROUTED_DEVICE_ID,
81 ENABLE_AUDIO_DEVICE_CALLBACK,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080082};
83
Hassan Shojania071437a2017-01-23 09:19:40 -080084// ModDrm helpers
85static void readVector(const Parcel& reply, Vector<uint8_t>& vector) {
86 uint32_t size = reply.readUint32();
87 vector.insertAt((size_t)0, size);
88 reply.read(vector.editArray(), size);
89}
90
91static void writeVector(Parcel& data, Vector<uint8_t> const& vector) {
92 data.writeUint32(vector.size());
93 data.write(vector.array(), vector.size());
94}
95
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080096class BpMediaPlayer: public BpInterface<IMediaPlayer>
97{
98public:
Chih-Hung Hsieh090ef602016-04-27 10:39:54 -070099 explicit BpMediaPlayer(const sp<IBinder>& impl)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800100 : BpInterface<IMediaPlayer>(impl)
101 {
102 }
103
104 // disconnect from media player service
105 void disconnect()
106 {
107 Parcel data, reply;
108 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
109 remote()->transact(DISCONNECT, data, &reply);
110 }
111
Andreas Huber1b86fe02014-01-29 11:13:26 -0800112 status_t setDataSource(
113 const sp<IMediaHTTPService> &httpService,
114 const char* url,
Dave Burked681bbb2011-08-30 14:39:17 +0100115 const KeyedVector<String8, String8>* headers)
116 {
117 Parcel data, reply;
118 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Andreas Huber1b86fe02014-01-29 11:13:26 -0800119 data.writeInt32(httpService != NULL);
120 if (httpService != NULL) {
Marco Nelissen06b46062014-11-14 07:58:25 -0800121 data.writeStrongBinder(IInterface::asBinder(httpService));
Andreas Huber1b86fe02014-01-29 11:13:26 -0800122 }
Dave Burked681bbb2011-08-30 14:39:17 +0100123 data.writeCString(url);
124 if (headers == NULL) {
125 data.writeInt32(0);
126 } else {
127 // serialize the headers
128 data.writeInt32(headers->size());
129 for (size_t i = 0; i < headers->size(); ++i) {
130 data.writeString8(headers->keyAt(i));
131 data.writeString8(headers->valueAt(i));
132 }
133 }
134 remote()->transact(SET_DATA_SOURCE_URL, data, &reply);
135 return reply.readInt32();
136 }
137
138 status_t setDataSource(int fd, int64_t offset, int64_t length) {
139 Parcel data, reply;
140 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
141 data.writeFileDescriptor(fd);
142 data.writeInt64(offset);
143 data.writeInt64(length);
144 remote()->transact(SET_DATA_SOURCE_FD, data, &reply);
145 return reply.readInt32();
146 }
147
148 status_t setDataSource(const sp<IStreamSource> &source) {
149 Parcel data, reply;
150 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800151 data.writeStrongBinder(IInterface::asBinder(source));
Glenn Kasten8d655102011-09-07 14:40:23 -0700152 remote()->transact(SET_DATA_SOURCE_STREAM, data, &reply);
Dave Burked681bbb2011-08-30 14:39:17 +0100153 return reply.readInt32();
154 }
155
Chris Watkins99f31602015-03-20 13:06:33 -0700156 status_t setDataSource(const sp<IDataSource> &source) {
157 Parcel data, reply;
158 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
159 data.writeStrongBinder(IInterface::asBinder(source));
160 remote()->transact(SET_DATA_SOURCE_CALLBACK, data, &reply);
161 return reply.readInt32();
162 }
163
Andy McFadden8ba01022012-12-18 09:46:54 -0800164 // pass the buffered IGraphicBufferProducer to the media player service
165 status_t setVideoSurfaceTexture(const sp<IGraphicBufferProducer>& bufferProducer)
Glenn Kasten11731182011-02-08 17:26:17 -0800166 {
167 Parcel data, reply;
168 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800169 sp<IBinder> b(IInterface::asBinder(bufferProducer));
Glenn Kasten11731182011-02-08 17:26:17 -0800170 data.writeStrongBinder(b);
171 remote()->transact(SET_VIDEO_SURFACETEXTURE, data, &reply);
172 return reply.readInt32();
173 }
174
Wei Jiad399e7e2016-10-26 15:49:11 -0700175 status_t setBufferingSettings(const BufferingSettings& buffering)
176 {
177 Parcel data, reply;
178 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Dongwon Kang79e33732019-01-25 16:35:26 -0800179 data.writeInt32(buffering.mInitialMarkMs);
180 data.writeInt32(buffering.mResumePlaybackMarkMs);
Wei Jiad399e7e2016-10-26 15:49:11 -0700181 remote()->transact(SET_BUFFERING_SETTINGS, data, &reply);
182 return reply.readInt32();
183 }
184
Wei Jia9bb38032017-03-23 18:00:38 -0700185 status_t getBufferingSettings(BufferingSettings* buffering /* nonnull */)
Wei Jiad399e7e2016-10-26 15:49:11 -0700186 {
187 if (buffering == nullptr) {
188 return BAD_VALUE;
189 }
190 Parcel data, reply;
191 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Wei Jia9bb38032017-03-23 18:00:38 -0700192 remote()->transact(GET_BUFFERING_SETTINGS, data, &reply);
Wei Jiad399e7e2016-10-26 15:49:11 -0700193 status_t err = reply.readInt32();
194 if (err == OK) {
Dongwon Kang79e33732019-01-25 16:35:26 -0800195 buffering->mInitialMarkMs = reply.readInt32();
196 buffering->mResumePlaybackMarkMs = reply.readInt32();
Wei Jiad399e7e2016-10-26 15:49:11 -0700197 }
198 return err;
199 }
200
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800201 status_t prepareAsync()
202 {
203 Parcel data, reply;
204 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
205 remote()->transact(PREPARE_ASYNC, data, &reply);
206 return reply.readInt32();
207 }
208
209 status_t start()
210 {
211 Parcel data, reply;
212 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
213 remote()->transact(START, data, &reply);
214 return reply.readInt32();
215 }
216
217 status_t stop()
218 {
219 Parcel data, reply;
220 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
221 remote()->transact(STOP, data, &reply);
222 return reply.readInt32();
223 }
224
225 status_t isPlaying(bool* state)
226 {
227 Parcel data, reply;
228 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
229 remote()->transact(IS_PLAYING, data, &reply);
230 *state = reply.readInt32();
231 return reply.readInt32();
232 }
233
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700234 status_t setPlaybackSettings(const AudioPlaybackRate& rate)
Wei Jia98160162015-02-04 17:01:11 -0800235 {
236 Parcel data, reply;
237 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700238 data.writeFloat(rate.mSpeed);
239 data.writeFloat(rate.mPitch);
240 data.writeInt32((int32_t)rate.mFallbackMode);
241 data.writeInt32((int32_t)rate.mStretchMode);
242 remote()->transact(SET_PLAYBACK_SETTINGS, data, &reply);
Wei Jia98160162015-02-04 17:01:11 -0800243 return reply.readInt32();
244 }
245
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700246 status_t getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */)
247 {
248 Parcel data, reply;
249 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
250 remote()->transact(GET_PLAYBACK_SETTINGS, data, &reply);
251 status_t err = reply.readInt32();
252 if (err == OK) {
253 *rate = AUDIO_PLAYBACK_RATE_DEFAULT;
254 rate->mSpeed = reply.readFloat();
255 rate->mPitch = reply.readFloat();
256 rate->mFallbackMode = (AudioTimestretchFallbackMode)reply.readInt32();
257 rate->mStretchMode = (AudioTimestretchStretchMode)reply.readInt32();
258 }
259 return err;
260 }
261
262 status_t setSyncSettings(const AVSyncSettings& sync, float videoFpsHint)
263 {
264 Parcel data, reply;
265 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
266 data.writeInt32((int32_t)sync.mSource);
267 data.writeInt32((int32_t)sync.mAudioAdjustMode);
268 data.writeFloat(sync.mTolerance);
269 data.writeFloat(videoFpsHint);
270 remote()->transact(SET_SYNC_SETTINGS, data, &reply);
271 return reply.readInt32();
272 }
273
274 status_t getSyncSettings(AVSyncSettings* sync /* nonnull */, float* videoFps /* nonnull */)
275 {
276 Parcel data, reply;
277 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
278 remote()->transact(GET_SYNC_SETTINGS, data, &reply);
279 status_t err = reply.readInt32();
280 if (err == OK) {
281 AVSyncSettings settings;
282 settings.mSource = (AVSyncSource)reply.readInt32();
283 settings.mAudioAdjustMode = (AVSyncAudioAdjustMode)reply.readInt32();
284 settings.mTolerance = reply.readFloat();
285 *sync = settings;
286 *videoFps = reply.readFloat();
287 }
288 return err;
289 }
290
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800291 status_t pause()
292 {
293 Parcel data, reply;
294 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
295 remote()->transact(PAUSE, data, &reply);
296 return reply.readInt32();
297 }
298
Wei Jiac5de0912016-11-18 10:22:14 -0800299 status_t seekTo(int msec, MediaPlayerSeekMode mode)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800300 {
301 Parcel data, reply;
302 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
303 data.writeInt32(msec);
Wei Jiac5de0912016-11-18 10:22:14 -0800304 data.writeInt32(mode);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800305 remote()->transact(SEEK_TO, data, &reply);
306 return reply.readInt32();
307 }
308
309 status_t getCurrentPosition(int* msec)
310 {
311 Parcel data, reply;
312 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
313 remote()->transact(GET_CURRENT_POSITION, data, &reply);
314 *msec = reply.readInt32();
315 return reply.readInt32();
316 }
317
318 status_t getDuration(int* msec)
319 {
320 Parcel data, reply;
321 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
322 remote()->transact(GET_DURATION, data, &reply);
323 *msec = reply.readInt32();
324 return reply.readInt32();
325 }
326
327 status_t reset()
328 {
329 Parcel data, reply;
330 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
331 remote()->transact(RESET, data, &reply);
332 return reply.readInt32();
333 }
334
Wei Jia52c28512017-09-13 18:17:51 -0700335 status_t notifyAt(int64_t mediaTimeUs)
336 {
337 Parcel data, reply;
338 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
339 data.writeInt64(mediaTimeUs);
340 remote()->transact(NOTIFY_AT, data, &reply);
341 return reply.readInt32();
342 }
343
Glenn Kastenfff6d712012-01-12 16:38:12 -0800344 status_t setAudioStreamType(audio_stream_type_t stream)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800345 {
346 Parcel data, reply;
347 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800348 data.writeInt32((int32_t) stream);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800349 remote()->transact(SET_AUDIO_STREAM_TYPE, data, &reply);
350 return reply.readInt32();
351 }
352
353 status_t setLooping(int loop)
354 {
355 Parcel data, reply;
356 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
357 data.writeInt32(loop);
358 remote()->transact(SET_LOOPING, data, &reply);
359 return reply.readInt32();
360 }
361
362 status_t setVolume(float leftVolume, float rightVolume)
363 {
364 Parcel data, reply;
Dave Sparks172fb9a2009-05-26 14:39:29 -0700365 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800366 data.writeFloat(leftVolume);
367 data.writeFloat(rightVolume);
368 remote()->transact(SET_VOLUME, data, &reply);
369 return reply.readInt32();
370 }
Nicolas Catania1d187f12009-05-12 23:25:55 -0700371
372 status_t invoke(const Parcel& request, Parcel *reply)
James Dong040e4a12011-04-06 18:29:01 -0700373 {
374 // Avoid doing any extra copy. The interface descriptor should
375 // have been set by MediaPlayer.java.
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700376 return remote()->transact(INVOKE, request, reply);
Nicolas Catania1d187f12009-05-12 23:25:55 -0700377 }
Nicolas Cataniaa7e0e8b2009-07-08 08:57:42 -0700378
379 status_t setMetadataFilter(const Parcel& request)
380 {
381 Parcel reply;
382 // Avoid doing any extra copy of the request. The interface
383 // descriptor should have been set by MediaPlayer.java.
384 remote()->transact(SET_METADATA_FILTER, request, &reply);
385 return reply.readInt32();
386 }
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700387
388 status_t getMetadata(bool update_only, bool apply_filter, Parcel *reply)
389 {
390 Parcel request;
391 request.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
392 // TODO: Burning 2 ints for 2 boolean. Should probably use flags in an int here.
393 request.writeInt32(update_only);
394 request.writeInt32(apply_filter);
395 remote()->transact(GET_METADATA, request, reply);
396 return reply->readInt32();
397 }
Andreas Huber4e92c7e2010-02-12 12:35:58 -0800398
Eric Laurent2beeb502010-07-16 07:43:46 -0700399 status_t setAuxEffectSendLevel(float level)
400 {
401 Parcel data, reply;
402 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
403 data.writeFloat(level);
404 remote()->transact(SET_AUX_EFFECT_SEND_LEVEL, data, &reply);
405 return reply.readInt32();
406 }
407
408 status_t attachAuxEffect(int effectId)
409 {
410 Parcel data, reply;
411 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
412 data.writeInt32(effectId);
413 remote()->transact(ATTACH_AUX_EFFECT, data, &reply);
414 return reply.readInt32();
415 }
Glenn Kasten11731182011-02-08 17:26:17 -0800416
Gloria Wang4f9e47f2011-04-25 17:28:22 -0700417 status_t setParameter(int key, const Parcel& request)
418 {
419 Parcel data, reply;
420 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
421 data.writeInt32(key);
422 if (request.dataSize() > 0) {
423 data.appendFrom(const_cast<Parcel *>(&request), 0, request.dataSize());
424 }
425 remote()->transact(SET_PARAMETER, data, &reply);
426 return reply.readInt32();
427 }
428
429 status_t getParameter(int key, Parcel *reply)
430 {
431 Parcel data;
432 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
433 data.writeInt32(key);
434 return remote()->transact(GET_PARAMETER, data, reply);
435 }
436
John Grossman44a7e422012-06-21 17:29:24 -0700437 status_t setRetransmitEndpoint(const struct sockaddr_in* endpoint)
438 {
John Grossmanc795b642012-02-22 15:38:35 -0800439 Parcel data, reply;
440 status_t err;
441
442 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
443 if (NULL != endpoint) {
444 data.writeInt32(sizeof(*endpoint));
445 data.write(endpoint, sizeof(*endpoint));
446 } else {
447 data.writeInt32(0);
448 }
449
450 err = remote()->transact(SET_RETRANSMIT_ENDPOINT, data, &reply);
451 if (OK != err) {
452 return err;
453 }
Marco Nelissen6b74d672012-02-28 16:07:44 -0800454 return reply.readInt32();
455 }
John Grossmanc795b642012-02-22 15:38:35 -0800456
Marco Nelissen6b74d672012-02-28 16:07:44 -0800457 status_t setNextPlayer(const sp<IMediaPlayer>& player) {
458 Parcel data, reply;
459 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800460 sp<IBinder> b(IInterface::asBinder(player));
Marco Nelissen6b74d672012-02-28 16:07:44 -0800461 data.writeStrongBinder(b);
462 remote()->transact(SET_NEXT_PLAYER, data, &reply);
John Grossmanc795b642012-02-22 15:38:35 -0800463 return reply.readInt32();
464 }
John Grossman44a7e422012-06-21 17:29:24 -0700465
466 status_t getRetransmitEndpoint(struct sockaddr_in* endpoint)
467 {
468 Parcel data, reply;
469 status_t err;
470
471 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
472 err = remote()->transact(GET_RETRANSMIT_ENDPOINT, data, &reply);
473
474 if ((OK != err) || (OK != (err = reply.readInt32()))) {
475 return err;
476 }
477
478 data.read(endpoint, sizeof(*endpoint));
479
480 return err;
481 }
Hassan Shojania071437a2017-01-23 09:19:40 -0800482
Andy Hung9fc8b5c2017-01-24 13:36:48 -0800483 virtual VolumeShaper::Status applyVolumeShaper(
484 const sp<VolumeShaper::Configuration>& configuration,
485 const sp<VolumeShaper::Operation>& operation) {
486 Parcel data, reply;
487 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
488
489 status_t tmp;
490 status_t status = configuration.get() == nullptr
491 ? data.writeInt32(0)
492 : (tmp = data.writeInt32(1)) != NO_ERROR
493 ? tmp : configuration->writeToParcel(&data);
494 if (status != NO_ERROR) {
495 return VolumeShaper::Status(status);
496 }
497
498 status = operation.get() == nullptr
499 ? status = data.writeInt32(0)
500 : (tmp = data.writeInt32(1)) != NO_ERROR
501 ? tmp : operation->writeToParcel(&data);
502 if (status != NO_ERROR) {
503 return VolumeShaper::Status(status);
504 }
505
506 int32_t remoteVolumeShaperStatus;
507 status = remote()->transact(APPLY_VOLUME_SHAPER, data, &reply);
508 if (status == NO_ERROR) {
509 status = reply.readInt32(&remoteVolumeShaperStatus);
510 }
511 if (status != NO_ERROR) {
512 return VolumeShaper::Status(status);
513 }
514 return VolumeShaper::Status(remoteVolumeShaperStatus);
515 }
516
517 virtual sp<VolumeShaper::State> getVolumeShaperState(int id) {
518 Parcel data, reply;
519 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
520
521 data.writeInt32(id);
522 status_t status = remote()->transact(GET_VOLUME_SHAPER_STATE, data, &reply);
523 if (status != NO_ERROR) {
524 return nullptr;
525 }
526 sp<VolumeShaper::State> state = new VolumeShaper::State();
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700527 status = state->readFromParcel(&reply);
Andy Hung9fc8b5c2017-01-24 13:36:48 -0800528 if (status != NO_ERROR) {
529 return nullptr;
530 }
531 return state;
532 }
533
Hassan Shojaniacefac142017-02-06 21:02:02 -0800534 // Modular DRM
535 status_t prepareDrm(const uint8_t uuid[16], const Vector<uint8_t>& drmSessionId)
Hassan Shojania071437a2017-01-23 09:19:40 -0800536 {
537 Parcel data, reply;
538 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
539
540 data.write(uuid, 16);
Hassan Shojaniacefac142017-02-06 21:02:02 -0800541 writeVector(data, drmSessionId);
Hassan Shojania071437a2017-01-23 09:19:40 -0800542
543 status_t status = remote()->transact(PREPARE_DRM, data, &reply);
544 if (status != OK) {
545 ALOGE("prepareDrm: binder call failed: %d", status);
546 return status;
547 }
548
549 return reply.readInt32();
550 }
551
552 status_t releaseDrm()
553 {
554 Parcel data, reply;
555 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
556
557 status_t status = remote()->transact(RELEASE_DRM, data, &reply);
558 if (status != OK) {
559 ALOGE("releaseDrm: binder call failed: %d", status);
560 return status;
561 }
562
563 return reply.readInt32();
564 }
jiabin156c6872017-10-06 09:47:15 -0700565
566 status_t setOutputDevice(audio_port_handle_t deviceId)
567 {
568 Parcel data, reply;
569 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
570
571 data.writeInt32(deviceId);
572
573 status_t status = remote()->transact(SET_OUTPUT_DEVICE, data, &reply);
574 if (status != OK) {
575 ALOGE("setOutputDevice: binder call failed: %d", status);
576 return status;
577 }
578
579 return reply.readInt32();
580 }
581
582 status_t getRoutedDeviceId(audio_port_handle_t* deviceId)
583 {
584 Parcel data, reply;
585 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
586
587 status_t status = remote()->transact(GET_ROUTED_DEVICE_ID, data, &reply);
588 if (status != OK) {
589 ALOGE("getRoutedDeviceid: binder call failed: %d", status);
590 *deviceId = AUDIO_PORT_HANDLE_NONE;
591 return status;
592 }
593
594 status = reply.readInt32();
595 if (status != NO_ERROR) {
596 *deviceId = AUDIO_PORT_HANDLE_NONE;
597 } else {
598 *deviceId = reply.readInt32();
599 }
600 return status;
601 }
602
603 status_t enableAudioDeviceCallback(bool enabled)
604 {
605 Parcel data, reply;
606 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
607
608 data.writeBool(enabled);
609
610 status_t status = remote()->transact(ENABLE_AUDIO_DEVICE_CALLBACK, data, &reply);
611 if (status != OK) {
612 ALOGE("enableAudioDeviceCallback: binder call failed: %d, %d", enabled, status);
613 return status;
614 }
615
616 return reply.readInt32();
617 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800618};
619
niko56f0cc52009-06-22 08:49:52 -0700620IMPLEMENT_META_INTERFACE(MediaPlayer, "android.media.IMediaPlayer");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800621
622// ----------------------------------------------------------------------
623
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800624status_t BnMediaPlayer::onTransact(
625 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
626{
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700627 switch (code) {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800628 case DISCONNECT: {
629 CHECK_INTERFACE(IMediaPlayer, data, reply);
630 disconnect();
631 return NO_ERROR;
632 } break;
Dave Burked681bbb2011-08-30 14:39:17 +0100633 case SET_DATA_SOURCE_URL: {
634 CHECK_INTERFACE(IMediaPlayer, data, reply);
Andreas Huber1b86fe02014-01-29 11:13:26 -0800635
636 sp<IMediaHTTPService> httpService;
637 if (data.readInt32()) {
638 httpService =
639 interface_cast<IMediaHTTPService>(data.readStrongBinder());
640 }
641
Dave Burked681bbb2011-08-30 14:39:17 +0100642 const char* url = data.readCString();
Wei Jia0ca02a02016-01-14 13:14:31 -0800643 if (url == NULL) {
Wei Jia2afac0c2016-01-07 12:13:07 -0800644 reply->writeInt32(BAD_VALUE);
645 return NO_ERROR;
646 }
Dave Burked681bbb2011-08-30 14:39:17 +0100647 KeyedVector<String8, String8> headers;
648 int32_t numHeaders = data.readInt32();
649 for (int i = 0; i < numHeaders; ++i) {
650 String8 key = data.readString8();
651 String8 value = data.readString8();
652 headers.add(key, value);
653 }
Andreas Huber1b86fe02014-01-29 11:13:26 -0800654 reply->writeInt32(setDataSource(
655 httpService, url, numHeaders > 0 ? &headers : NULL));
Dave Burked681bbb2011-08-30 14:39:17 +0100656 return NO_ERROR;
657 } break;
658 case SET_DATA_SOURCE_FD: {
659 CHECK_INTERFACE(IMediaPlayer, data, reply);
660 int fd = data.readFileDescriptor();
661 int64_t offset = data.readInt64();
662 int64_t length = data.readInt64();
663 reply->writeInt32(setDataSource(fd, offset, length));
664 return NO_ERROR;
665 }
666 case SET_DATA_SOURCE_STREAM: {
667 CHECK_INTERFACE(IMediaPlayer, data, reply);
668 sp<IStreamSource> source =
669 interface_cast<IStreamSource>(data.readStrongBinder());
Wei Jia2afac0c2016-01-07 12:13:07 -0800670 if (source == NULL) {
671 reply->writeInt32(BAD_VALUE);
672 } else {
673 reply->writeInt32(setDataSource(source));
674 }
Dave Burked681bbb2011-08-30 14:39:17 +0100675 return NO_ERROR;
676 }
Chris Watkins99f31602015-03-20 13:06:33 -0700677 case SET_DATA_SOURCE_CALLBACK: {
678 CHECK_INTERFACE(IMediaPlayer, data, reply);
679 sp<IDataSource> source =
680 interface_cast<IDataSource>(data.readStrongBinder());
Wei Jia2afac0c2016-01-07 12:13:07 -0800681 if (source == NULL) {
682 reply->writeInt32(BAD_VALUE);
683 } else {
684 reply->writeInt32(setDataSource(source));
685 }
Chris Watkins99f31602015-03-20 13:06:33 -0700686 return NO_ERROR;
687 }
Glenn Kasten11731182011-02-08 17:26:17 -0800688 case SET_VIDEO_SURFACETEXTURE: {
689 CHECK_INTERFACE(IMediaPlayer, data, reply);
Andy McFadden8ba01022012-12-18 09:46:54 -0800690 sp<IGraphicBufferProducer> bufferProducer =
691 interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
692 reply->writeInt32(setVideoSurfaceTexture(bufferProducer));
Glenn Kasten11731182011-02-08 17:26:17 -0800693 return NO_ERROR;
694 } break;
Wei Jiad399e7e2016-10-26 15:49:11 -0700695 case SET_BUFFERING_SETTINGS: {
696 CHECK_INTERFACE(IMediaPlayer, data, reply);
697 BufferingSettings buffering;
Dongwon Kang79e33732019-01-25 16:35:26 -0800698 buffering.mInitialMarkMs = data.readInt32();
699 buffering.mResumePlaybackMarkMs = data.readInt32();
Wei Jiad399e7e2016-10-26 15:49:11 -0700700 reply->writeInt32(setBufferingSettings(buffering));
701 return NO_ERROR;
702 } break;
Wei Jia9bb38032017-03-23 18:00:38 -0700703 case GET_BUFFERING_SETTINGS: {
Wei Jiad399e7e2016-10-26 15:49:11 -0700704 CHECK_INTERFACE(IMediaPlayer, data, reply);
705 BufferingSettings buffering;
Wei Jia9bb38032017-03-23 18:00:38 -0700706 status_t err = getBufferingSettings(&buffering);
Wei Jiad399e7e2016-10-26 15:49:11 -0700707 reply->writeInt32(err);
708 if (err == OK) {
Dongwon Kang79e33732019-01-25 16:35:26 -0800709 reply->writeInt32(buffering.mInitialMarkMs);
710 reply->writeInt32(buffering.mResumePlaybackMarkMs);
Wei Jiad399e7e2016-10-26 15:49:11 -0700711 }
712 return NO_ERROR;
713 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800714 case PREPARE_ASYNC: {
715 CHECK_INTERFACE(IMediaPlayer, data, reply);
716 reply->writeInt32(prepareAsync());
717 return NO_ERROR;
718 } break;
719 case START: {
720 CHECK_INTERFACE(IMediaPlayer, data, reply);
721 reply->writeInt32(start());
722 return NO_ERROR;
723 } break;
724 case STOP: {
725 CHECK_INTERFACE(IMediaPlayer, data, reply);
726 reply->writeInt32(stop());
727 return NO_ERROR;
728 } break;
729 case IS_PLAYING: {
730 CHECK_INTERFACE(IMediaPlayer, data, reply);
731 bool state;
732 status_t ret = isPlaying(&state);
733 reply->writeInt32(state);
734 reply->writeInt32(ret);
735 return NO_ERROR;
736 } break;
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700737 case SET_PLAYBACK_SETTINGS: {
Wei Jia98160162015-02-04 17:01:11 -0800738 CHECK_INTERFACE(IMediaPlayer, data, reply);
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700739 AudioPlaybackRate rate = AUDIO_PLAYBACK_RATE_DEFAULT;
740 rate.mSpeed = data.readFloat();
741 rate.mPitch = data.readFloat();
742 rate.mFallbackMode = (AudioTimestretchFallbackMode)data.readInt32();
743 rate.mStretchMode = (AudioTimestretchStretchMode)data.readInt32();
744 reply->writeInt32(setPlaybackSettings(rate));
745 return NO_ERROR;
746 } break;
747 case GET_PLAYBACK_SETTINGS: {
748 CHECK_INTERFACE(IMediaPlayer, data, reply);
749 AudioPlaybackRate rate = AUDIO_PLAYBACK_RATE_DEFAULT;
750 status_t err = getPlaybackSettings(&rate);
751 reply->writeInt32(err);
752 if (err == OK) {
753 reply->writeFloat(rate.mSpeed);
754 reply->writeFloat(rate.mPitch);
755 reply->writeInt32((int32_t)rate.mFallbackMode);
756 reply->writeInt32((int32_t)rate.mStretchMode);
757 }
758 return NO_ERROR;
759 } break;
760 case SET_SYNC_SETTINGS: {
761 CHECK_INTERFACE(IMediaPlayer, data, reply);
762 AVSyncSettings sync;
763 sync.mSource = (AVSyncSource)data.readInt32();
764 sync.mAudioAdjustMode = (AVSyncAudioAdjustMode)data.readInt32();
765 sync.mTolerance = data.readFloat();
766 float videoFpsHint = data.readFloat();
767 reply->writeInt32(setSyncSettings(sync, videoFpsHint));
768 return NO_ERROR;
769 } break;
770 case GET_SYNC_SETTINGS: {
771 CHECK_INTERFACE(IMediaPlayer, data, reply);
772 AVSyncSettings sync;
773 float videoFps;
774 status_t err = getSyncSettings(&sync, &videoFps);
775 reply->writeInt32(err);
776 if (err == OK) {
777 reply->writeInt32((int32_t)sync.mSource);
778 reply->writeInt32((int32_t)sync.mAudioAdjustMode);
779 reply->writeFloat(sync.mTolerance);
780 reply->writeFloat(videoFps);
781 }
Wei Jia98160162015-02-04 17:01:11 -0800782 return NO_ERROR;
783 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800784 case PAUSE: {
785 CHECK_INTERFACE(IMediaPlayer, data, reply);
786 reply->writeInt32(pause());
787 return NO_ERROR;
788 } break;
789 case SEEK_TO: {
790 CHECK_INTERFACE(IMediaPlayer, data, reply);
Wei Jia67b6dcc2016-10-31 17:01:37 -0700791 int msec = data.readInt32();
Wei Jiac5de0912016-11-18 10:22:14 -0800792 MediaPlayerSeekMode mode = (MediaPlayerSeekMode)data.readInt32();
793 reply->writeInt32(seekTo(msec, mode));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800794 return NO_ERROR;
795 } break;
796 case GET_CURRENT_POSITION: {
797 CHECK_INTERFACE(IMediaPlayer, data, reply);
Robert Shih89235432015-09-02 16:46:59 -0700798 int msec = 0;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800799 status_t ret = getCurrentPosition(&msec);
800 reply->writeInt32(msec);
801 reply->writeInt32(ret);
802 return NO_ERROR;
803 } break;
804 case GET_DURATION: {
805 CHECK_INTERFACE(IMediaPlayer, data, reply);
Robert Shih89235432015-09-02 16:46:59 -0700806 int msec = 0;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800807 status_t ret = getDuration(&msec);
808 reply->writeInt32(msec);
809 reply->writeInt32(ret);
810 return NO_ERROR;
811 } break;
812 case RESET: {
813 CHECK_INTERFACE(IMediaPlayer, data, reply);
814 reply->writeInt32(reset());
815 return NO_ERROR;
816 } break;
Wei Jia52c28512017-09-13 18:17:51 -0700817 case NOTIFY_AT: {
818 CHECK_INTERFACE(IMediaPlayer, data, reply);
819 reply->writeInt32(notifyAt(data.readInt64()));
820 return NO_ERROR;
821 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800822 case SET_AUDIO_STREAM_TYPE: {
823 CHECK_INTERFACE(IMediaPlayer, data, reply);
Glenn Kastenfff6d712012-01-12 16:38:12 -0800824 reply->writeInt32(setAudioStreamType((audio_stream_type_t) data.readInt32()));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800825 return NO_ERROR;
826 } break;
827 case SET_LOOPING: {
828 CHECK_INTERFACE(IMediaPlayer, data, reply);
829 reply->writeInt32(setLooping(data.readInt32()));
830 return NO_ERROR;
831 } break;
832 case SET_VOLUME: {
Dave Sparks172fb9a2009-05-26 14:39:29 -0700833 CHECK_INTERFACE(IMediaPlayer, data, reply);
Gloria Wangde162ff2011-08-01 14:01:29 -0700834 float leftVolume = data.readFloat();
835 float rightVolume = data.readFloat();
836 reply->writeInt32(setVolume(leftVolume, rightVolume));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800837 return NO_ERROR;
838 } break;
Nicolas Catania1d187f12009-05-12 23:25:55 -0700839 case INVOKE: {
840 CHECK_INTERFACE(IMediaPlayer, data, reply);
James Dong040e4a12011-04-06 18:29:01 -0700841 status_t result = invoke(data, reply);
842 return result;
Nicolas Catania1d187f12009-05-12 23:25:55 -0700843 } break;
Nicolas Cataniaa7e0e8b2009-07-08 08:57:42 -0700844 case SET_METADATA_FILTER: {
845 CHECK_INTERFACE(IMediaPlayer, data, reply);
846 reply->writeInt32(setMetadataFilter(data));
847 return NO_ERROR;
848 } break;
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700849 case GET_METADATA: {
850 CHECK_INTERFACE(IMediaPlayer, data, reply);
Gloria Wangde162ff2011-08-01 14:01:29 -0700851 bool update_only = static_cast<bool>(data.readInt32());
852 bool apply_filter = static_cast<bool>(data.readInt32());
853 const status_t retcode = getMetadata(update_only, apply_filter, reply);
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700854 reply->setDataPosition(0);
855 reply->writeInt32(retcode);
856 reply->setDataPosition(0);
857 return NO_ERROR;
858 } break;
Eric Laurent2beeb502010-07-16 07:43:46 -0700859 case SET_AUX_EFFECT_SEND_LEVEL: {
860 CHECK_INTERFACE(IMediaPlayer, data, reply);
861 reply->writeInt32(setAuxEffectSendLevel(data.readFloat()));
862 return NO_ERROR;
863 } break;
864 case ATTACH_AUX_EFFECT: {
865 CHECK_INTERFACE(IMediaPlayer, data, reply);
866 reply->writeInt32(attachAuxEffect(data.readInt32()));
867 return NO_ERROR;
868 } break;
Gloria Wang4f9e47f2011-04-25 17:28:22 -0700869 case SET_PARAMETER: {
870 CHECK_INTERFACE(IMediaPlayer, data, reply);
871 int key = data.readInt32();
872
873 Parcel request;
874 if (data.dataAvail() > 0) {
875 request.appendFrom(
876 const_cast<Parcel *>(&data), data.dataPosition(), data.dataAvail());
877 }
878 request.setDataPosition(0);
879 reply->writeInt32(setParameter(key, request));
880 return NO_ERROR;
881 } break;
882 case GET_PARAMETER: {
883 CHECK_INTERFACE(IMediaPlayer, data, reply);
884 return getParameter(data.readInt32(), reply);
885 } break;
John Grossmanc795b642012-02-22 15:38:35 -0800886 case SET_RETRANSMIT_ENDPOINT: {
887 CHECK_INTERFACE(IMediaPlayer, data, reply);
888
889 struct sockaddr_in endpoint;
Nick Kralevich0981df62015-08-20 09:56:39 -0700890 memset(&endpoint, 0, sizeof(endpoint));
John Grossmanc795b642012-02-22 15:38:35 -0800891 int amt = data.readInt32();
892 if (amt == sizeof(endpoint)) {
893 data.read(&endpoint, sizeof(struct sockaddr_in));
894 reply->writeInt32(setRetransmitEndpoint(&endpoint));
895 } else {
896 reply->writeInt32(setRetransmitEndpoint(NULL));
897 }
John Grossman44a7e422012-06-21 17:29:24 -0700898
899 return NO_ERROR;
900 } break;
901 case GET_RETRANSMIT_ENDPOINT: {
902 CHECK_INTERFACE(IMediaPlayer, data, reply);
903
904 struct sockaddr_in endpoint;
Nick Kralevich0981df62015-08-20 09:56:39 -0700905 memset(&endpoint, 0, sizeof(endpoint));
John Grossman44a7e422012-06-21 17:29:24 -0700906 status_t res = getRetransmitEndpoint(&endpoint);
907
908 reply->writeInt32(res);
909 reply->write(&endpoint, sizeof(endpoint));
910
Marco Nelissen6b74d672012-02-28 16:07:44 -0800911 return NO_ERROR;
912 } break;
913 case SET_NEXT_PLAYER: {
914 CHECK_INTERFACE(IMediaPlayer, data, reply);
915 reply->writeInt32(setNextPlayer(interface_cast<IMediaPlayer>(data.readStrongBinder())));
John Grossman44a7e422012-06-21 17:29:24 -0700916
John Grossmanc795b642012-02-22 15:38:35 -0800917 return NO_ERROR;
918 } break;
Hassan Shojania071437a2017-01-23 09:19:40 -0800919
Andy Hung9fc8b5c2017-01-24 13:36:48 -0800920 case APPLY_VOLUME_SHAPER: {
921 CHECK_INTERFACE(IMediaPlayer, data, reply);
922 sp<VolumeShaper::Configuration> configuration;
923 sp<VolumeShaper::Operation> operation;
924
925 int32_t present;
926 status_t status = data.readInt32(&present);
927 if (status == NO_ERROR && present != 0) {
928 configuration = new VolumeShaper::Configuration();
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700929 status = configuration->readFromParcel(&data);
Andy Hung9fc8b5c2017-01-24 13:36:48 -0800930 }
931 if (status == NO_ERROR) {
932 status = data.readInt32(&present);
933 }
934 if (status == NO_ERROR && present != 0) {
935 operation = new VolumeShaper::Operation();
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700936 status = operation->readFromParcel(&data);
Andy Hung9fc8b5c2017-01-24 13:36:48 -0800937 }
938 if (status == NO_ERROR) {
939 status = (status_t)applyVolumeShaper(configuration, operation);
940 }
941 reply->writeInt32(status);
942 return NO_ERROR;
943 } break;
944 case GET_VOLUME_SHAPER_STATE: {
945 CHECK_INTERFACE(IMediaPlayer, data, reply);
946 int id;
947 status_t status = data.readInt32(&id);
948 if (status == NO_ERROR) {
949 sp<VolumeShaper::State> state = getVolumeShaperState(id);
950 if (state.get() != nullptr) {
951 status = state->writeToParcel(reply);
952 }
953 }
954 return NO_ERROR;
955 } break;
956
Hassan Shojaniacefac142017-02-06 21:02:02 -0800957 // Modular DRM
Hassan Shojania071437a2017-01-23 09:19:40 -0800958 case PREPARE_DRM: {
959 CHECK_INTERFACE(IMediaPlayer, data, reply);
Hassan Shojaniacefac142017-02-06 21:02:02 -0800960
Hassan Shojania071437a2017-01-23 09:19:40 -0800961 uint8_t uuid[16];
962 data.read(uuid, sizeof(uuid));
Hassan Shojaniacefac142017-02-06 21:02:02 -0800963 Vector<uint8_t> drmSessionId;
964 readVector(data, drmSessionId);
Hassan Shojania071437a2017-01-23 09:19:40 -0800965
Hassan Shojaniacefac142017-02-06 21:02:02 -0800966 uint32_t result = prepareDrm(uuid, drmSessionId);
Hassan Shojania071437a2017-01-23 09:19:40 -0800967 reply->writeInt32(result);
968 return OK;
969 }
970 case RELEASE_DRM: {
971 CHECK_INTERFACE(IMediaPlayer, data, reply);
972
973 uint32_t result = releaseDrm();
974 reply->writeInt32(result);
975 return OK;
976 }
jiabin156c6872017-10-06 09:47:15 -0700977
978 // AudioRouting
979 case SET_OUTPUT_DEVICE: {
980 CHECK_INTERFACE(IMediaPlayer, data, reply);
981 int deviceId;
982 status_t status = data.readInt32(&deviceId);
983 if (status == NO_ERROR) {
984 reply->writeInt32(setOutputDevice(deviceId));
985 } else {
986 reply->writeInt32(BAD_VALUE);
987 }
988 return NO_ERROR;
989 }
990 case GET_ROUTED_DEVICE_ID: {
991 CHECK_INTERFACE(IMediaPlayer, data, reply);
992 audio_port_handle_t deviceId;
993 status_t ret = getRoutedDeviceId(&deviceId);
994 reply->writeInt32(ret);
995 if (ret == NO_ERROR) {
996 reply->writeInt32(deviceId);
997 }
998 return NO_ERROR;
999 } break;
1000 case ENABLE_AUDIO_DEVICE_CALLBACK: {
1001 CHECK_INTERFACE(IMediaPlayer, data, reply);
1002 bool enabled;
1003 status_t status = data.readBool(&enabled);
1004 if (status == NO_ERROR) {
1005 reply->writeInt32(enableAudioDeviceCallback(enabled));
1006 } else {
1007 reply->writeInt32(BAD_VALUE);
1008 }
1009 return NO_ERROR;
1010 } break;
1011
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001012 default:
1013 return BBinder::onTransact(code, data, reply, flags);
1014 }
1015}
1016
1017// ----------------------------------------------------------------------------
1018
Glenn Kasten40bc9062015-03-20 09:09:33 -07001019} // namespace android