xref: /aosp_15_r20/frameworks/av/media/libmedia/IMediaPlayer.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker **
3*ec779b8eSAndroid Build Coastguard Worker ** Copyright 2008, The Android Open Source Project
4*ec779b8eSAndroid Build Coastguard Worker **
5*ec779b8eSAndroid Build Coastguard Worker ** Licensed under the Apache License, Version 2.0 (the "License");
6*ec779b8eSAndroid Build Coastguard Worker ** you may not use this file except in compliance with the License.
7*ec779b8eSAndroid Build Coastguard Worker ** You may obtain a copy of the License at
8*ec779b8eSAndroid Build Coastguard Worker **
9*ec779b8eSAndroid Build Coastguard Worker **     http://www.apache.org/licenses/LICENSE-2.0
10*ec779b8eSAndroid Build Coastguard Worker **
11*ec779b8eSAndroid Build Coastguard Worker ** Unless required by applicable law or agreed to in writing, software
12*ec779b8eSAndroid Build Coastguard Worker ** distributed under the License is distributed on an "AS IS" BASIS,
13*ec779b8eSAndroid Build Coastguard Worker ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*ec779b8eSAndroid Build Coastguard Worker ** See the License for the specific language governing permissions and
15*ec779b8eSAndroid Build Coastguard Worker ** limitations under the License.
16*ec779b8eSAndroid Build Coastguard Worker */
17*ec779b8eSAndroid Build Coastguard Worker 
18*ec779b8eSAndroid Build Coastguard Worker #include <arpa/inet.h>
19*ec779b8eSAndroid Build Coastguard Worker #include <stdint.h>
20*ec779b8eSAndroid Build Coastguard Worker 
21*ec779b8eSAndroid Build Coastguard Worker #include <android/IDataSource.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <binder/IPCThreadState.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <binder/Parcel.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <gui/IGraphicBufferProducer.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioResamplerPublic.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <media/AVSyncSettings.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <media/BufferingSettings.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <media/IMediaHTTPService.h>
29*ec779b8eSAndroid Build Coastguard Worker #include <media/IMediaPlayer.h>
30*ec779b8eSAndroid Build Coastguard Worker #include <media/IStreamSource.h>
31*ec779b8eSAndroid Build Coastguard Worker #include <utils/String8.h>
32*ec779b8eSAndroid Build Coastguard Worker 
33*ec779b8eSAndroid Build Coastguard Worker namespace android {
34*ec779b8eSAndroid Build Coastguard Worker 
35*ec779b8eSAndroid Build Coastguard Worker using media::VolumeShaper;
36*ec779b8eSAndroid Build Coastguard Worker 
37*ec779b8eSAndroid Build Coastguard Worker // ModDrm helpers
readVector(const Parcel & reply,Vector<uint8_t> & vector)38*ec779b8eSAndroid Build Coastguard Worker static status_t readVector(const Parcel& reply, Vector<uint8_t>& vector) {
39*ec779b8eSAndroid Build Coastguard Worker     uint32_t size = 0;
40*ec779b8eSAndroid Build Coastguard Worker     status_t status = reply.readUint32(&size);
41*ec779b8eSAndroid Build Coastguard Worker     if (status == OK) {
42*ec779b8eSAndroid Build Coastguard Worker         status = size <= reply.dataAvail() ? OK : BAD_VALUE;
43*ec779b8eSAndroid Build Coastguard Worker     }
44*ec779b8eSAndroid Build Coastguard Worker     if (status == OK) {
45*ec779b8eSAndroid Build Coastguard Worker         status = vector.insertAt((size_t) 0, size) >= 0 ? OK : NO_MEMORY;
46*ec779b8eSAndroid Build Coastguard Worker     }
47*ec779b8eSAndroid Build Coastguard Worker     if (status == OK) {
48*ec779b8eSAndroid Build Coastguard Worker         status = reply.read(vector.editArray(), size);
49*ec779b8eSAndroid Build Coastguard Worker     }
50*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
51*ec779b8eSAndroid Build Coastguard Worker         char errorMsg[100];
52*ec779b8eSAndroid Build Coastguard Worker         char buganizerId[] = "173720767";
53*ec779b8eSAndroid Build Coastguard Worker         snprintf(errorMsg,
54*ec779b8eSAndroid Build Coastguard Worker                 sizeof(errorMsg),
55*ec779b8eSAndroid Build Coastguard Worker                 "%s: failed to read array. Size: %d, status: %d.",
56*ec779b8eSAndroid Build Coastguard Worker                 __func__,
57*ec779b8eSAndroid Build Coastguard Worker                 size,
58*ec779b8eSAndroid Build Coastguard Worker                 status);
59*ec779b8eSAndroid Build Coastguard Worker         android_errorWriteWithInfoLog(
60*ec779b8eSAndroid Build Coastguard Worker                 /* safetyNet tag= */ 0x534e4554,
61*ec779b8eSAndroid Build Coastguard Worker                 buganizerId,
62*ec779b8eSAndroid Build Coastguard Worker                 IPCThreadState::self()->getCallingUid(),
63*ec779b8eSAndroid Build Coastguard Worker                 errorMsg,
64*ec779b8eSAndroid Build Coastguard Worker                 strlen(errorMsg));
65*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s (b/%s)", errorMsg, buganizerId);
66*ec779b8eSAndroid Build Coastguard Worker     }
67*ec779b8eSAndroid Build Coastguard Worker     return status;
68*ec779b8eSAndroid Build Coastguard Worker }
69*ec779b8eSAndroid Build Coastguard Worker 
writeVector(Parcel & data,Vector<uint8_t> const & vector)70*ec779b8eSAndroid Build Coastguard Worker static void writeVector(Parcel& data, Vector<uint8_t> const& vector) {
71*ec779b8eSAndroid Build Coastguard Worker     data.writeUint32(vector.size());
72*ec779b8eSAndroid Build Coastguard Worker     data.write(vector.array(), vector.size());
73*ec779b8eSAndroid Build Coastguard Worker }
74*ec779b8eSAndroid Build Coastguard Worker 
75*ec779b8eSAndroid Build Coastguard Worker class BpMediaPlayer: public BpInterface<IMediaPlayer>
76*ec779b8eSAndroid Build Coastguard Worker {
77*ec779b8eSAndroid Build Coastguard Worker public:
BpMediaPlayer(const sp<IBinder> & impl)78*ec779b8eSAndroid Build Coastguard Worker     explicit BpMediaPlayer(const sp<IBinder>& impl)
79*ec779b8eSAndroid Build Coastguard Worker         : BpInterface<IMediaPlayer>(impl)
80*ec779b8eSAndroid Build Coastguard Worker     {
81*ec779b8eSAndroid Build Coastguard Worker     }
82*ec779b8eSAndroid Build Coastguard Worker 
83*ec779b8eSAndroid Build Coastguard Worker     // disconnect from media player service
disconnect()84*ec779b8eSAndroid Build Coastguard Worker     void disconnect()
85*ec779b8eSAndroid Build Coastguard Worker     {
86*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
87*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
88*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(DISCONNECT, data, &reply);
89*ec779b8eSAndroid Build Coastguard Worker     }
90*ec779b8eSAndroid Build Coastguard Worker 
setDataSource(const sp<IMediaHTTPService> & httpService,const char * url,const KeyedVector<String8,String8> * headers)91*ec779b8eSAndroid Build Coastguard Worker     status_t setDataSource(
92*ec779b8eSAndroid Build Coastguard Worker             const sp<IMediaHTTPService> &httpService,
93*ec779b8eSAndroid Build Coastguard Worker             const char* url,
94*ec779b8eSAndroid Build Coastguard Worker             const KeyedVector<String8, String8>* headers)
95*ec779b8eSAndroid Build Coastguard Worker     {
96*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
97*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
98*ec779b8eSAndroid Build Coastguard Worker         data.writeInt32(httpService != NULL);
99*ec779b8eSAndroid Build Coastguard Worker         if (httpService != NULL) {
100*ec779b8eSAndroid Build Coastguard Worker             data.writeStrongBinder(IInterface::asBinder(httpService));
101*ec779b8eSAndroid Build Coastguard Worker         }
102*ec779b8eSAndroid Build Coastguard Worker         data.writeCString(url);
103*ec779b8eSAndroid Build Coastguard Worker         if (headers == NULL) {
104*ec779b8eSAndroid Build Coastguard Worker             data.writeInt32(0);
105*ec779b8eSAndroid Build Coastguard Worker         } else {
106*ec779b8eSAndroid Build Coastguard Worker             // serialize the headers
107*ec779b8eSAndroid Build Coastguard Worker             data.writeInt32(headers->size());
108*ec779b8eSAndroid Build Coastguard Worker             for (size_t i = 0; i < headers->size(); ++i) {
109*ec779b8eSAndroid Build Coastguard Worker                 data.writeString8(headers->keyAt(i));
110*ec779b8eSAndroid Build Coastguard Worker                 data.writeString8(headers->valueAt(i));
111*ec779b8eSAndroid Build Coastguard Worker             }
112*ec779b8eSAndroid Build Coastguard Worker         }
113*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(SET_DATA_SOURCE_URL, data, &reply);
114*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
115*ec779b8eSAndroid Build Coastguard Worker     }
116*ec779b8eSAndroid Build Coastguard Worker 
setDataSource(int fd,int64_t offset,int64_t length)117*ec779b8eSAndroid Build Coastguard Worker     status_t setDataSource(int fd, int64_t offset, int64_t length) {
118*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
119*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
120*ec779b8eSAndroid Build Coastguard Worker         data.writeFileDescriptor(fd);
121*ec779b8eSAndroid Build Coastguard Worker         data.writeInt64(offset);
122*ec779b8eSAndroid Build Coastguard Worker         data.writeInt64(length);
123*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(SET_DATA_SOURCE_FD, data, &reply);
124*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
125*ec779b8eSAndroid Build Coastguard Worker     }
126*ec779b8eSAndroid Build Coastguard Worker 
setDataSource(const sp<IStreamSource> & source)127*ec779b8eSAndroid Build Coastguard Worker     status_t setDataSource(const sp<IStreamSource> &source) {
128*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
129*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
130*ec779b8eSAndroid Build Coastguard Worker         data.writeStrongBinder(IInterface::asBinder(source));
131*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(SET_DATA_SOURCE_STREAM, data, &reply);
132*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
133*ec779b8eSAndroid Build Coastguard Worker     }
134*ec779b8eSAndroid Build Coastguard Worker 
setDataSource(const sp<IDataSource> & source)135*ec779b8eSAndroid Build Coastguard Worker     status_t setDataSource(const sp<IDataSource> &source) {
136*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
137*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
138*ec779b8eSAndroid Build Coastguard Worker         data.writeStrongBinder(IInterface::asBinder(source));
139*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(SET_DATA_SOURCE_CALLBACK, data, &reply);
140*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
141*ec779b8eSAndroid Build Coastguard Worker     }
142*ec779b8eSAndroid Build Coastguard Worker 
setDataSource(const String8 & rtpParams)143*ec779b8eSAndroid Build Coastguard Worker     status_t setDataSource(const String8& rtpParams) {
144*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
145*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
146*ec779b8eSAndroid Build Coastguard Worker         data.writeString8(rtpParams);
147*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(SET_DATA_SOURCE_RTP, data, &reply);
148*ec779b8eSAndroid Build Coastguard Worker 
149*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
150*ec779b8eSAndroid Build Coastguard Worker     }
151*ec779b8eSAndroid Build Coastguard Worker 
152*ec779b8eSAndroid Build Coastguard Worker     // pass the buffered IGraphicBufferProducer to the media player service
setVideoSurfaceTexture(const sp<IGraphicBufferProducer> & bufferProducer)153*ec779b8eSAndroid Build Coastguard Worker     status_t setVideoSurfaceTexture(const sp<IGraphicBufferProducer>& bufferProducer)
154*ec779b8eSAndroid Build Coastguard Worker     {
155*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
156*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
157*ec779b8eSAndroid Build Coastguard Worker         sp<IBinder> b(IInterface::asBinder(bufferProducer));
158*ec779b8eSAndroid Build Coastguard Worker         data.writeStrongBinder(b);
159*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(SET_VIDEO_SURFACETEXTURE, data, &reply);
160*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
161*ec779b8eSAndroid Build Coastguard Worker     }
162*ec779b8eSAndroid Build Coastguard Worker 
setBufferingSettings(const BufferingSettings & buffering)163*ec779b8eSAndroid Build Coastguard Worker     status_t setBufferingSettings(const BufferingSettings& buffering)
164*ec779b8eSAndroid Build Coastguard Worker     {
165*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
166*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
167*ec779b8eSAndroid Build Coastguard Worker         data.writeInt32(buffering.mInitialMarkMs);
168*ec779b8eSAndroid Build Coastguard Worker         data.writeInt32(buffering.mResumePlaybackMarkMs);
169*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(SET_BUFFERING_SETTINGS, data, &reply);
170*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
171*ec779b8eSAndroid Build Coastguard Worker     }
172*ec779b8eSAndroid Build Coastguard Worker 
getBufferingSettings(BufferingSettings * buffering)173*ec779b8eSAndroid Build Coastguard Worker     status_t getBufferingSettings(BufferingSettings* buffering /* nonnull */)
174*ec779b8eSAndroid Build Coastguard Worker     {
175*ec779b8eSAndroid Build Coastguard Worker         if (buffering == nullptr) {
176*ec779b8eSAndroid Build Coastguard Worker             return BAD_VALUE;
177*ec779b8eSAndroid Build Coastguard Worker         }
178*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
179*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
180*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(GET_BUFFERING_SETTINGS, data, &reply);
181*ec779b8eSAndroid Build Coastguard Worker         status_t err = reply.readInt32();
182*ec779b8eSAndroid Build Coastguard Worker         if (err == OK) {
183*ec779b8eSAndroid Build Coastguard Worker             buffering->mInitialMarkMs = reply.readInt32();
184*ec779b8eSAndroid Build Coastguard Worker             buffering->mResumePlaybackMarkMs = reply.readInt32();
185*ec779b8eSAndroid Build Coastguard Worker         }
186*ec779b8eSAndroid Build Coastguard Worker         return err;
187*ec779b8eSAndroid Build Coastguard Worker     }
188*ec779b8eSAndroid Build Coastguard Worker 
prepareAsync()189*ec779b8eSAndroid Build Coastguard Worker     status_t prepareAsync()
190*ec779b8eSAndroid Build Coastguard Worker     {
191*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
192*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
193*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(PREPARE_ASYNC, data, &reply);
194*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
195*ec779b8eSAndroid Build Coastguard Worker     }
196*ec779b8eSAndroid Build Coastguard Worker 
start()197*ec779b8eSAndroid Build Coastguard Worker     status_t start()
198*ec779b8eSAndroid Build Coastguard Worker     {
199*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
200*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
201*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(START, data, &reply);
202*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
203*ec779b8eSAndroid Build Coastguard Worker     }
204*ec779b8eSAndroid Build Coastguard Worker 
stop()205*ec779b8eSAndroid Build Coastguard Worker     status_t stop()
206*ec779b8eSAndroid Build Coastguard Worker     {
207*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
208*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
209*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(STOP, data, &reply);
210*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
211*ec779b8eSAndroid Build Coastguard Worker     }
212*ec779b8eSAndroid Build Coastguard Worker 
isPlaying(bool * state)213*ec779b8eSAndroid Build Coastguard Worker     status_t isPlaying(bool* state)
214*ec779b8eSAndroid Build Coastguard Worker     {
215*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
216*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
217*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(IS_PLAYING, data, &reply);
218*ec779b8eSAndroid Build Coastguard Worker         *state = reply.readInt32();
219*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
220*ec779b8eSAndroid Build Coastguard Worker     }
221*ec779b8eSAndroid Build Coastguard Worker 
setPlaybackSettings(const AudioPlaybackRate & rate)222*ec779b8eSAndroid Build Coastguard Worker     status_t setPlaybackSettings(const AudioPlaybackRate& rate)
223*ec779b8eSAndroid Build Coastguard Worker     {
224*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
225*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
226*ec779b8eSAndroid Build Coastguard Worker         data.writeFloat(rate.mSpeed);
227*ec779b8eSAndroid Build Coastguard Worker         data.writeFloat(rate.mPitch);
228*ec779b8eSAndroid Build Coastguard Worker         data.writeInt32((int32_t)rate.mFallbackMode);
229*ec779b8eSAndroid Build Coastguard Worker         data.writeInt32((int32_t)rate.mStretchMode);
230*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(SET_PLAYBACK_SETTINGS, data, &reply);
231*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
232*ec779b8eSAndroid Build Coastguard Worker     }
233*ec779b8eSAndroid Build Coastguard Worker 
getPlaybackSettings(AudioPlaybackRate * rate)234*ec779b8eSAndroid Build Coastguard Worker     status_t getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */)
235*ec779b8eSAndroid Build Coastguard Worker     {
236*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
237*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
238*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(GET_PLAYBACK_SETTINGS, data, &reply);
239*ec779b8eSAndroid Build Coastguard Worker         status_t err = reply.readInt32();
240*ec779b8eSAndroid Build Coastguard Worker         if (err == OK) {
241*ec779b8eSAndroid Build Coastguard Worker             *rate = AUDIO_PLAYBACK_RATE_DEFAULT;
242*ec779b8eSAndroid Build Coastguard Worker             rate->mSpeed = reply.readFloat();
243*ec779b8eSAndroid Build Coastguard Worker             rate->mPitch = reply.readFloat();
244*ec779b8eSAndroid Build Coastguard Worker             rate->mFallbackMode = (AudioTimestretchFallbackMode)reply.readInt32();
245*ec779b8eSAndroid Build Coastguard Worker             rate->mStretchMode = (AudioTimestretchStretchMode)reply.readInt32();
246*ec779b8eSAndroid Build Coastguard Worker         }
247*ec779b8eSAndroid Build Coastguard Worker         return err;
248*ec779b8eSAndroid Build Coastguard Worker     }
249*ec779b8eSAndroid Build Coastguard Worker 
setSyncSettings(const AVSyncSettings & sync,float videoFpsHint)250*ec779b8eSAndroid Build Coastguard Worker     status_t setSyncSettings(const AVSyncSettings& sync, float videoFpsHint)
251*ec779b8eSAndroid Build Coastguard Worker     {
252*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
253*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
254*ec779b8eSAndroid Build Coastguard Worker         data.writeInt32((int32_t)sync.mSource);
255*ec779b8eSAndroid Build Coastguard Worker         data.writeInt32((int32_t)sync.mAudioAdjustMode);
256*ec779b8eSAndroid Build Coastguard Worker         data.writeFloat(sync.mTolerance);
257*ec779b8eSAndroid Build Coastguard Worker         data.writeFloat(videoFpsHint);
258*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(SET_SYNC_SETTINGS, data, &reply);
259*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
260*ec779b8eSAndroid Build Coastguard Worker     }
261*ec779b8eSAndroid Build Coastguard Worker 
getSyncSettings(AVSyncSettings * sync,float * videoFps)262*ec779b8eSAndroid Build Coastguard Worker     status_t getSyncSettings(AVSyncSettings* sync /* nonnull */, float* videoFps /* nonnull */)
263*ec779b8eSAndroid Build Coastguard Worker     {
264*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
265*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
266*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(GET_SYNC_SETTINGS, data, &reply);
267*ec779b8eSAndroid Build Coastguard Worker         status_t err = reply.readInt32();
268*ec779b8eSAndroid Build Coastguard Worker         if (err == OK) {
269*ec779b8eSAndroid Build Coastguard Worker             AVSyncSettings settings;
270*ec779b8eSAndroid Build Coastguard Worker             settings.mSource = (AVSyncSource)reply.readInt32();
271*ec779b8eSAndroid Build Coastguard Worker             settings.mAudioAdjustMode = (AVSyncAudioAdjustMode)reply.readInt32();
272*ec779b8eSAndroid Build Coastguard Worker             settings.mTolerance = reply.readFloat();
273*ec779b8eSAndroid Build Coastguard Worker             *sync = settings;
274*ec779b8eSAndroid Build Coastguard Worker             *videoFps = reply.readFloat();
275*ec779b8eSAndroid Build Coastguard Worker         }
276*ec779b8eSAndroid Build Coastguard Worker         return err;
277*ec779b8eSAndroid Build Coastguard Worker     }
278*ec779b8eSAndroid Build Coastguard Worker 
pause()279*ec779b8eSAndroid Build Coastguard Worker     status_t pause()
280*ec779b8eSAndroid Build Coastguard Worker     {
281*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
282*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
283*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(PAUSE, data, &reply);
284*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
285*ec779b8eSAndroid Build Coastguard Worker     }
286*ec779b8eSAndroid Build Coastguard Worker 
seekTo(int msec,MediaPlayerSeekMode mode)287*ec779b8eSAndroid Build Coastguard Worker     status_t seekTo(int msec, MediaPlayerSeekMode mode)
288*ec779b8eSAndroid Build Coastguard Worker     {
289*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
290*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
291*ec779b8eSAndroid Build Coastguard Worker         data.writeInt32(msec);
292*ec779b8eSAndroid Build Coastguard Worker         data.writeInt32(mode);
293*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(SEEK_TO, data, &reply);
294*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
295*ec779b8eSAndroid Build Coastguard Worker     }
296*ec779b8eSAndroid Build Coastguard Worker 
getCurrentPosition(int * msec)297*ec779b8eSAndroid Build Coastguard Worker     status_t getCurrentPosition(int* msec)
298*ec779b8eSAndroid Build Coastguard Worker     {
299*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
300*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
301*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(GET_CURRENT_POSITION, data, &reply);
302*ec779b8eSAndroid Build Coastguard Worker         *msec = reply.readInt32();
303*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
304*ec779b8eSAndroid Build Coastguard Worker     }
305*ec779b8eSAndroid Build Coastguard Worker 
getDuration(int * msec)306*ec779b8eSAndroid Build Coastguard Worker     status_t getDuration(int* msec)
307*ec779b8eSAndroid Build Coastguard Worker     {
308*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
309*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
310*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(GET_DURATION, data, &reply);
311*ec779b8eSAndroid Build Coastguard Worker         *msec = reply.readInt32();
312*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
313*ec779b8eSAndroid Build Coastguard Worker     }
314*ec779b8eSAndroid Build Coastguard Worker 
reset()315*ec779b8eSAndroid Build Coastguard Worker     status_t reset()
316*ec779b8eSAndroid Build Coastguard Worker     {
317*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
318*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
319*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(RESET, data, &reply);
320*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
321*ec779b8eSAndroid Build Coastguard Worker     }
322*ec779b8eSAndroid Build Coastguard Worker 
notifyAt(int64_t mediaTimeUs)323*ec779b8eSAndroid Build Coastguard Worker     status_t notifyAt(int64_t mediaTimeUs)
324*ec779b8eSAndroid Build Coastguard Worker     {
325*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
326*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
327*ec779b8eSAndroid Build Coastguard Worker         data.writeInt64(mediaTimeUs);
328*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(NOTIFY_AT, data, &reply);
329*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
330*ec779b8eSAndroid Build Coastguard Worker     }
331*ec779b8eSAndroid Build Coastguard Worker 
setAudioStreamType(audio_stream_type_t stream)332*ec779b8eSAndroid Build Coastguard Worker     status_t setAudioStreamType(audio_stream_type_t stream)
333*ec779b8eSAndroid Build Coastguard Worker     {
334*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
335*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
336*ec779b8eSAndroid Build Coastguard Worker         data.writeInt32((int32_t) stream);
337*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(SET_AUDIO_STREAM_TYPE, data, &reply);
338*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
339*ec779b8eSAndroid Build Coastguard Worker     }
340*ec779b8eSAndroid Build Coastguard Worker 
setLooping(int loop)341*ec779b8eSAndroid Build Coastguard Worker     status_t setLooping(int loop)
342*ec779b8eSAndroid Build Coastguard Worker     {
343*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
344*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
345*ec779b8eSAndroid Build Coastguard Worker         data.writeInt32(loop);
346*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(SET_LOOPING, data, &reply);
347*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
348*ec779b8eSAndroid Build Coastguard Worker     }
349*ec779b8eSAndroid Build Coastguard Worker 
setVolume(float leftVolume,float rightVolume)350*ec779b8eSAndroid Build Coastguard Worker     status_t setVolume(float leftVolume, float rightVolume)
351*ec779b8eSAndroid Build Coastguard Worker     {
352*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
353*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
354*ec779b8eSAndroid Build Coastguard Worker         data.writeFloat(leftVolume);
355*ec779b8eSAndroid Build Coastguard Worker         data.writeFloat(rightVolume);
356*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(SET_VOLUME, data, &reply);
357*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
358*ec779b8eSAndroid Build Coastguard Worker     }
359*ec779b8eSAndroid Build Coastguard Worker 
invoke(const Parcel & request,Parcel * reply)360*ec779b8eSAndroid Build Coastguard Worker     status_t invoke(const Parcel& request, Parcel *reply)
361*ec779b8eSAndroid Build Coastguard Worker     {
362*ec779b8eSAndroid Build Coastguard Worker         // Avoid doing any extra copy. The interface descriptor should
363*ec779b8eSAndroid Build Coastguard Worker         // have been set by MediaPlayer.java.
364*ec779b8eSAndroid Build Coastguard Worker         return remote()->transact(INVOKE, request, reply);
365*ec779b8eSAndroid Build Coastguard Worker     }
366*ec779b8eSAndroid Build Coastguard Worker 
setMetadataFilter(const Parcel & request)367*ec779b8eSAndroid Build Coastguard Worker     status_t setMetadataFilter(const Parcel& request)
368*ec779b8eSAndroid Build Coastguard Worker     {
369*ec779b8eSAndroid Build Coastguard Worker         Parcel reply;
370*ec779b8eSAndroid Build Coastguard Worker         // Avoid doing any extra copy of the request. The interface
371*ec779b8eSAndroid Build Coastguard Worker         // descriptor should have been set by MediaPlayer.java.
372*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(SET_METADATA_FILTER, request, &reply);
373*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
374*ec779b8eSAndroid Build Coastguard Worker     }
375*ec779b8eSAndroid Build Coastguard Worker 
getMetadata(bool update_only,bool apply_filter,Parcel * reply)376*ec779b8eSAndroid Build Coastguard Worker     status_t getMetadata(bool update_only, bool apply_filter, Parcel *reply)
377*ec779b8eSAndroid Build Coastguard Worker     {
378*ec779b8eSAndroid Build Coastguard Worker         Parcel request;
379*ec779b8eSAndroid Build Coastguard Worker         request.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
380*ec779b8eSAndroid Build Coastguard Worker         // TODO: Burning 2 ints for 2 boolean. Should probably use flags in an int here.
381*ec779b8eSAndroid Build Coastguard Worker         request.writeInt32(update_only);
382*ec779b8eSAndroid Build Coastguard Worker         request.writeInt32(apply_filter);
383*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(GET_METADATA, request, reply);
384*ec779b8eSAndroid Build Coastguard Worker         return reply->readInt32();
385*ec779b8eSAndroid Build Coastguard Worker     }
386*ec779b8eSAndroid Build Coastguard Worker 
setAuxEffectSendLevel(float level)387*ec779b8eSAndroid Build Coastguard Worker     status_t setAuxEffectSendLevel(float level)
388*ec779b8eSAndroid Build Coastguard Worker     {
389*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
390*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
391*ec779b8eSAndroid Build Coastguard Worker         data.writeFloat(level);
392*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(SET_AUX_EFFECT_SEND_LEVEL, data, &reply);
393*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
394*ec779b8eSAndroid Build Coastguard Worker     }
395*ec779b8eSAndroid Build Coastguard Worker 
attachAuxEffect(int effectId)396*ec779b8eSAndroid Build Coastguard Worker     status_t attachAuxEffect(int effectId)
397*ec779b8eSAndroid Build Coastguard Worker     {
398*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
399*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
400*ec779b8eSAndroid Build Coastguard Worker         data.writeInt32(effectId);
401*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(ATTACH_AUX_EFFECT, data, &reply);
402*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
403*ec779b8eSAndroid Build Coastguard Worker     }
404*ec779b8eSAndroid Build Coastguard Worker 
setParameter(int key,const Parcel & request)405*ec779b8eSAndroid Build Coastguard Worker     status_t setParameter(int key, const Parcel& request)
406*ec779b8eSAndroid Build Coastguard Worker     {
407*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
408*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
409*ec779b8eSAndroid Build Coastguard Worker         data.writeInt32(key);
410*ec779b8eSAndroid Build Coastguard Worker         if (request.dataSize() > 0) {
411*ec779b8eSAndroid Build Coastguard Worker             data.appendFrom(const_cast<Parcel *>(&request), 0, request.dataSize());
412*ec779b8eSAndroid Build Coastguard Worker         }
413*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(SET_PARAMETER, data, &reply);
414*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
415*ec779b8eSAndroid Build Coastguard Worker     }
416*ec779b8eSAndroid Build Coastguard Worker 
getParameter(int key,Parcel * reply)417*ec779b8eSAndroid Build Coastguard Worker     status_t getParameter(int key, Parcel *reply)
418*ec779b8eSAndroid Build Coastguard Worker     {
419*ec779b8eSAndroid Build Coastguard Worker         Parcel data;
420*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
421*ec779b8eSAndroid Build Coastguard Worker         data.writeInt32(key);
422*ec779b8eSAndroid Build Coastguard Worker         return remote()->transact(GET_PARAMETER, data, reply);
423*ec779b8eSAndroid Build Coastguard Worker     }
424*ec779b8eSAndroid Build Coastguard Worker 
setRetransmitEndpoint(const struct sockaddr_in * endpoint)425*ec779b8eSAndroid Build Coastguard Worker     status_t setRetransmitEndpoint(const struct sockaddr_in* endpoint)
426*ec779b8eSAndroid Build Coastguard Worker     {
427*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
428*ec779b8eSAndroid Build Coastguard Worker         status_t err;
429*ec779b8eSAndroid Build Coastguard Worker 
430*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
431*ec779b8eSAndroid Build Coastguard Worker         if (NULL != endpoint) {
432*ec779b8eSAndroid Build Coastguard Worker             data.writeInt32(sizeof(*endpoint));
433*ec779b8eSAndroid Build Coastguard Worker             data.write(endpoint, sizeof(*endpoint));
434*ec779b8eSAndroid Build Coastguard Worker         } else {
435*ec779b8eSAndroid Build Coastguard Worker             data.writeInt32(0);
436*ec779b8eSAndroid Build Coastguard Worker         }
437*ec779b8eSAndroid Build Coastguard Worker 
438*ec779b8eSAndroid Build Coastguard Worker         err = remote()->transact(SET_RETRANSMIT_ENDPOINT, data, &reply);
439*ec779b8eSAndroid Build Coastguard Worker         if (OK != err) {
440*ec779b8eSAndroid Build Coastguard Worker             return err;
441*ec779b8eSAndroid Build Coastguard Worker         }
442*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
443*ec779b8eSAndroid Build Coastguard Worker     }
444*ec779b8eSAndroid Build Coastguard Worker 
setNextPlayer(const sp<IMediaPlayer> & player)445*ec779b8eSAndroid Build Coastguard Worker     status_t setNextPlayer(const sp<IMediaPlayer>& player) {
446*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
447*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
448*ec779b8eSAndroid Build Coastguard Worker         sp<IBinder> b(IInterface::asBinder(player));
449*ec779b8eSAndroid Build Coastguard Worker         data.writeStrongBinder(b);
450*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(SET_NEXT_PLAYER, data, &reply);
451*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
452*ec779b8eSAndroid Build Coastguard Worker     }
453*ec779b8eSAndroid Build Coastguard Worker 
getRetransmitEndpoint(struct sockaddr_in * endpoint)454*ec779b8eSAndroid Build Coastguard Worker     status_t getRetransmitEndpoint(struct sockaddr_in* endpoint)
455*ec779b8eSAndroid Build Coastguard Worker     {
456*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
457*ec779b8eSAndroid Build Coastguard Worker         status_t err;
458*ec779b8eSAndroid Build Coastguard Worker 
459*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
460*ec779b8eSAndroid Build Coastguard Worker         err = remote()->transact(GET_RETRANSMIT_ENDPOINT, data, &reply);
461*ec779b8eSAndroid Build Coastguard Worker 
462*ec779b8eSAndroid Build Coastguard Worker         if ((OK != err) || (OK != (err = reply.readInt32()))) {
463*ec779b8eSAndroid Build Coastguard Worker             return err;
464*ec779b8eSAndroid Build Coastguard Worker         }
465*ec779b8eSAndroid Build Coastguard Worker 
466*ec779b8eSAndroid Build Coastguard Worker         data.read(endpoint, sizeof(*endpoint));
467*ec779b8eSAndroid Build Coastguard Worker 
468*ec779b8eSAndroid Build Coastguard Worker         return err;
469*ec779b8eSAndroid Build Coastguard Worker     }
470*ec779b8eSAndroid Build Coastguard Worker 
applyVolumeShaper(const sp<VolumeShaper::Configuration> & configuration,const sp<VolumeShaper::Operation> & operation)471*ec779b8eSAndroid Build Coastguard Worker     virtual VolumeShaper::Status applyVolumeShaper(
472*ec779b8eSAndroid Build Coastguard Worker             const sp<VolumeShaper::Configuration>& configuration,
473*ec779b8eSAndroid Build Coastguard Worker             const sp<VolumeShaper::Operation>& operation) {
474*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
475*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
476*ec779b8eSAndroid Build Coastguard Worker 
477*ec779b8eSAndroid Build Coastguard Worker         status_t tmp;
478*ec779b8eSAndroid Build Coastguard Worker         status_t status = configuration.get() == nullptr
479*ec779b8eSAndroid Build Coastguard Worker                 ? data.writeInt32(0)
480*ec779b8eSAndroid Build Coastguard Worker                 : (tmp = data.writeInt32(1)) != NO_ERROR
481*ec779b8eSAndroid Build Coastguard Worker                     ? tmp : configuration->writeToParcel(&data);
482*ec779b8eSAndroid Build Coastguard Worker         if (status != NO_ERROR) {
483*ec779b8eSAndroid Build Coastguard Worker             return VolumeShaper::Status(status);
484*ec779b8eSAndroid Build Coastguard Worker         }
485*ec779b8eSAndroid Build Coastguard Worker 
486*ec779b8eSAndroid Build Coastguard Worker         status = operation.get() == nullptr
487*ec779b8eSAndroid Build Coastguard Worker                 ? status = data.writeInt32(0)
488*ec779b8eSAndroid Build Coastguard Worker                 : (tmp = data.writeInt32(1)) != NO_ERROR
489*ec779b8eSAndroid Build Coastguard Worker                     ? tmp : operation->writeToParcel(&data);
490*ec779b8eSAndroid Build Coastguard Worker         if (status != NO_ERROR) {
491*ec779b8eSAndroid Build Coastguard Worker             return VolumeShaper::Status(status);
492*ec779b8eSAndroid Build Coastguard Worker         }
493*ec779b8eSAndroid Build Coastguard Worker 
494*ec779b8eSAndroid Build Coastguard Worker         int32_t remoteVolumeShaperStatus;
495*ec779b8eSAndroid Build Coastguard Worker         status = remote()->transact(APPLY_VOLUME_SHAPER, data, &reply);
496*ec779b8eSAndroid Build Coastguard Worker         if (status == NO_ERROR) {
497*ec779b8eSAndroid Build Coastguard Worker             status = reply.readInt32(&remoteVolumeShaperStatus);
498*ec779b8eSAndroid Build Coastguard Worker         }
499*ec779b8eSAndroid Build Coastguard Worker         if (status != NO_ERROR) {
500*ec779b8eSAndroid Build Coastguard Worker             return VolumeShaper::Status(status);
501*ec779b8eSAndroid Build Coastguard Worker         }
502*ec779b8eSAndroid Build Coastguard Worker         return VolumeShaper::Status(remoteVolumeShaperStatus);
503*ec779b8eSAndroid Build Coastguard Worker     }
504*ec779b8eSAndroid Build Coastguard Worker 
getVolumeShaperState(int id)505*ec779b8eSAndroid Build Coastguard Worker     virtual sp<VolumeShaper::State> getVolumeShaperState(int id) {
506*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
507*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
508*ec779b8eSAndroid Build Coastguard Worker 
509*ec779b8eSAndroid Build Coastguard Worker         data.writeInt32(id);
510*ec779b8eSAndroid Build Coastguard Worker         status_t status = remote()->transact(GET_VOLUME_SHAPER_STATE, data, &reply);
511*ec779b8eSAndroid Build Coastguard Worker         if (status != NO_ERROR) {
512*ec779b8eSAndroid Build Coastguard Worker             return nullptr;
513*ec779b8eSAndroid Build Coastguard Worker         }
514*ec779b8eSAndroid Build Coastguard Worker         sp<VolumeShaper::State> state = new VolumeShaper::State();
515*ec779b8eSAndroid Build Coastguard Worker         status = state->readFromParcel(&reply);
516*ec779b8eSAndroid Build Coastguard Worker         if (status != NO_ERROR) {
517*ec779b8eSAndroid Build Coastguard Worker             return nullptr;
518*ec779b8eSAndroid Build Coastguard Worker         }
519*ec779b8eSAndroid Build Coastguard Worker         return state;
520*ec779b8eSAndroid Build Coastguard Worker     }
521*ec779b8eSAndroid Build Coastguard Worker 
522*ec779b8eSAndroid Build Coastguard Worker     // Modular DRM
prepareDrm(const uint8_t uuid[16],const Vector<uint8_t> & drmSessionId)523*ec779b8eSAndroid Build Coastguard Worker     status_t prepareDrm(const uint8_t uuid[16], const Vector<uint8_t>& drmSessionId)
524*ec779b8eSAndroid Build Coastguard Worker     {
525*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
526*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
527*ec779b8eSAndroid Build Coastguard Worker 
528*ec779b8eSAndroid Build Coastguard Worker         data.write(uuid, 16);
529*ec779b8eSAndroid Build Coastguard Worker         writeVector(data, drmSessionId);
530*ec779b8eSAndroid Build Coastguard Worker 
531*ec779b8eSAndroid Build Coastguard Worker         status_t status = remote()->transact(PREPARE_DRM, data, &reply);
532*ec779b8eSAndroid Build Coastguard Worker         if (status != OK) {
533*ec779b8eSAndroid Build Coastguard Worker             ALOGE("prepareDrm: binder call failed: %d", status);
534*ec779b8eSAndroid Build Coastguard Worker             return status;
535*ec779b8eSAndroid Build Coastguard Worker         }
536*ec779b8eSAndroid Build Coastguard Worker 
537*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
538*ec779b8eSAndroid Build Coastguard Worker     }
539*ec779b8eSAndroid Build Coastguard Worker 
releaseDrm()540*ec779b8eSAndroid Build Coastguard Worker     status_t releaseDrm()
541*ec779b8eSAndroid Build Coastguard Worker     {
542*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
543*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
544*ec779b8eSAndroid Build Coastguard Worker 
545*ec779b8eSAndroid Build Coastguard Worker         status_t status = remote()->transact(RELEASE_DRM, data, &reply);
546*ec779b8eSAndroid Build Coastguard Worker         if (status != OK) {
547*ec779b8eSAndroid Build Coastguard Worker             ALOGE("releaseDrm: binder call failed: %d", status);
548*ec779b8eSAndroid Build Coastguard Worker             return status;
549*ec779b8eSAndroid Build Coastguard Worker         }
550*ec779b8eSAndroid Build Coastguard Worker 
551*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
552*ec779b8eSAndroid Build Coastguard Worker     }
553*ec779b8eSAndroid Build Coastguard Worker 
setOutputDevice(audio_port_handle_t deviceId)554*ec779b8eSAndroid Build Coastguard Worker     status_t setOutputDevice(audio_port_handle_t deviceId)
555*ec779b8eSAndroid Build Coastguard Worker     {
556*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
557*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
558*ec779b8eSAndroid Build Coastguard Worker 
559*ec779b8eSAndroid Build Coastguard Worker         data.writeInt32(deviceId);
560*ec779b8eSAndroid Build Coastguard Worker 
561*ec779b8eSAndroid Build Coastguard Worker         status_t status = remote()->transact(SET_OUTPUT_DEVICE, data, &reply);
562*ec779b8eSAndroid Build Coastguard Worker         if (status != OK) {
563*ec779b8eSAndroid Build Coastguard Worker             ALOGE("setOutputDevice: binder call failed: %d", status);
564*ec779b8eSAndroid Build Coastguard Worker             return status;
565*ec779b8eSAndroid Build Coastguard Worker         }
566*ec779b8eSAndroid Build Coastguard Worker 
567*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
568*ec779b8eSAndroid Build Coastguard Worker     }
569*ec779b8eSAndroid Build Coastguard Worker 
getRoutedDeviceIds(DeviceIdVector & deviceIds)570*ec779b8eSAndroid Build Coastguard Worker     status_t getRoutedDeviceIds(DeviceIdVector& deviceIds)
571*ec779b8eSAndroid Build Coastguard Worker     {
572*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
573*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
574*ec779b8eSAndroid Build Coastguard Worker         deviceIds.clear();
575*ec779b8eSAndroid Build Coastguard Worker 
576*ec779b8eSAndroid Build Coastguard Worker         status_t status = remote()->transact(GET_ROUTED_DEVICE_IDS, data, &reply);
577*ec779b8eSAndroid Build Coastguard Worker         if (status != OK) {
578*ec779b8eSAndroid Build Coastguard Worker             ALOGE("getRoutedDeviceIds: binder call failed: %d", status);
579*ec779b8eSAndroid Build Coastguard Worker             return status;
580*ec779b8eSAndroid Build Coastguard Worker         }
581*ec779b8eSAndroid Build Coastguard Worker 
582*ec779b8eSAndroid Build Coastguard Worker         status = reply.readInt32();
583*ec779b8eSAndroid Build Coastguard Worker         if (status == NO_ERROR) {
584*ec779b8eSAndroid Build Coastguard Worker             int size = reply.readInt32();
585*ec779b8eSAndroid Build Coastguard Worker             for (int i = 0; i < size; i++) {
586*ec779b8eSAndroid Build Coastguard Worker                 deviceIds.push_back(reply.readInt32());
587*ec779b8eSAndroid Build Coastguard Worker             }
588*ec779b8eSAndroid Build Coastguard Worker         }
589*ec779b8eSAndroid Build Coastguard Worker         return status;
590*ec779b8eSAndroid Build Coastguard Worker     }
591*ec779b8eSAndroid Build Coastguard Worker 
enableAudioDeviceCallback(bool enabled)592*ec779b8eSAndroid Build Coastguard Worker     status_t enableAudioDeviceCallback(bool enabled)
593*ec779b8eSAndroid Build Coastguard Worker     {
594*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
595*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
596*ec779b8eSAndroid Build Coastguard Worker 
597*ec779b8eSAndroid Build Coastguard Worker         data.writeBool(enabled);
598*ec779b8eSAndroid Build Coastguard Worker 
599*ec779b8eSAndroid Build Coastguard Worker         status_t status = remote()->transact(ENABLE_AUDIO_DEVICE_CALLBACK, data, &reply);
600*ec779b8eSAndroid Build Coastguard Worker         if (status != OK) {
601*ec779b8eSAndroid Build Coastguard Worker             ALOGE("enableAudioDeviceCallback: binder call failed: %d, %d", enabled, status);
602*ec779b8eSAndroid Build Coastguard Worker             return status;
603*ec779b8eSAndroid Build Coastguard Worker         }
604*ec779b8eSAndroid Build Coastguard Worker 
605*ec779b8eSAndroid Build Coastguard Worker         return reply.readInt32();
606*ec779b8eSAndroid Build Coastguard Worker     }
607*ec779b8eSAndroid Build Coastguard Worker };
608*ec779b8eSAndroid Build Coastguard Worker 
609*ec779b8eSAndroid Build Coastguard Worker IMPLEMENT_META_INTERFACE(MediaPlayer, "android.media.IMediaPlayer");
610*ec779b8eSAndroid Build Coastguard Worker 
611*ec779b8eSAndroid Build Coastguard Worker // ----------------------------------------------------------------------
612*ec779b8eSAndroid Build Coastguard Worker 
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)613*ec779b8eSAndroid Build Coastguard Worker status_t BnMediaPlayer::onTransact(
614*ec779b8eSAndroid Build Coastguard Worker     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
615*ec779b8eSAndroid Build Coastguard Worker {
616*ec779b8eSAndroid Build Coastguard Worker     switch (code) {
617*ec779b8eSAndroid Build Coastguard Worker         case DISCONNECT: {
618*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
619*ec779b8eSAndroid Build Coastguard Worker             disconnect();
620*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
621*ec779b8eSAndroid Build Coastguard Worker         } break;
622*ec779b8eSAndroid Build Coastguard Worker         case SET_DATA_SOURCE_URL: {
623*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
624*ec779b8eSAndroid Build Coastguard Worker 
625*ec779b8eSAndroid Build Coastguard Worker             sp<IMediaHTTPService> httpService;
626*ec779b8eSAndroid Build Coastguard Worker             if (data.readInt32()) {
627*ec779b8eSAndroid Build Coastguard Worker                 httpService =
628*ec779b8eSAndroid Build Coastguard Worker                     interface_cast<IMediaHTTPService>(data.readStrongBinder());
629*ec779b8eSAndroid Build Coastguard Worker             }
630*ec779b8eSAndroid Build Coastguard Worker 
631*ec779b8eSAndroid Build Coastguard Worker             const char* url = data.readCString();
632*ec779b8eSAndroid Build Coastguard Worker             if (url == NULL) {
633*ec779b8eSAndroid Build Coastguard Worker                 reply->writeInt32(BAD_VALUE);
634*ec779b8eSAndroid Build Coastguard Worker                 return NO_ERROR;
635*ec779b8eSAndroid Build Coastguard Worker             }
636*ec779b8eSAndroid Build Coastguard Worker             KeyedVector<String8, String8> headers;
637*ec779b8eSAndroid Build Coastguard Worker             int32_t numHeaders = data.readInt32();
638*ec779b8eSAndroid Build Coastguard Worker             for (int i = 0; i < numHeaders; ++i) {
639*ec779b8eSAndroid Build Coastguard Worker                 String8 key = data.readString8();
640*ec779b8eSAndroid Build Coastguard Worker                 String8 value = data.readString8();
641*ec779b8eSAndroid Build Coastguard Worker                 headers.add(key, value);
642*ec779b8eSAndroid Build Coastguard Worker             }
643*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(setDataSource(
644*ec779b8eSAndroid Build Coastguard Worker                         httpService, url, numHeaders > 0 ? &headers : NULL));
645*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
646*ec779b8eSAndroid Build Coastguard Worker         } break;
647*ec779b8eSAndroid Build Coastguard Worker         case SET_DATA_SOURCE_FD: {
648*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
649*ec779b8eSAndroid Build Coastguard Worker             int fd = data.readFileDescriptor();
650*ec779b8eSAndroid Build Coastguard Worker             int64_t offset = data.readInt64();
651*ec779b8eSAndroid Build Coastguard Worker             int64_t length = data.readInt64();
652*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(setDataSource(fd, offset, length));
653*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
654*ec779b8eSAndroid Build Coastguard Worker         }
655*ec779b8eSAndroid Build Coastguard Worker         case SET_DATA_SOURCE_STREAM: {
656*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
657*ec779b8eSAndroid Build Coastguard Worker             sp<IStreamSource> source =
658*ec779b8eSAndroid Build Coastguard Worker                 interface_cast<IStreamSource>(data.readStrongBinder());
659*ec779b8eSAndroid Build Coastguard Worker             if (source == NULL) {
660*ec779b8eSAndroid Build Coastguard Worker                 reply->writeInt32(BAD_VALUE);
661*ec779b8eSAndroid Build Coastguard Worker             } else {
662*ec779b8eSAndroid Build Coastguard Worker                 reply->writeInt32(setDataSource(source));
663*ec779b8eSAndroid Build Coastguard Worker             }
664*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
665*ec779b8eSAndroid Build Coastguard Worker         }
666*ec779b8eSAndroid Build Coastguard Worker         case SET_DATA_SOURCE_CALLBACK: {
667*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
668*ec779b8eSAndroid Build Coastguard Worker             sp<IDataSource> source =
669*ec779b8eSAndroid Build Coastguard Worker                 interface_cast<IDataSource>(data.readStrongBinder());
670*ec779b8eSAndroid Build Coastguard Worker             if (source == NULL) {
671*ec779b8eSAndroid Build Coastguard Worker                 reply->writeInt32(BAD_VALUE);
672*ec779b8eSAndroid Build Coastguard Worker             } else {
673*ec779b8eSAndroid Build Coastguard Worker                 reply->writeInt32(setDataSource(source));
674*ec779b8eSAndroid Build Coastguard Worker             }
675*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
676*ec779b8eSAndroid Build Coastguard Worker         }
677*ec779b8eSAndroid Build Coastguard Worker         case SET_DATA_SOURCE_RTP: {
678*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
679*ec779b8eSAndroid Build Coastguard Worker             String8 rtpParams = data.readString8();
680*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(setDataSource(rtpParams));
681*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
682*ec779b8eSAndroid Build Coastguard Worker         }
683*ec779b8eSAndroid Build Coastguard Worker         case SET_VIDEO_SURFACETEXTURE: {
684*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
685*ec779b8eSAndroid Build Coastguard Worker             sp<IGraphicBufferProducer> bufferProducer =
686*ec779b8eSAndroid Build Coastguard Worker                     interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
687*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(setVideoSurfaceTexture(bufferProducer));
688*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
689*ec779b8eSAndroid Build Coastguard Worker         } break;
690*ec779b8eSAndroid Build Coastguard Worker         case SET_BUFFERING_SETTINGS: {
691*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
692*ec779b8eSAndroid Build Coastguard Worker             BufferingSettings buffering;
693*ec779b8eSAndroid Build Coastguard Worker             buffering.mInitialMarkMs = data.readInt32();
694*ec779b8eSAndroid Build Coastguard Worker             buffering.mResumePlaybackMarkMs = data.readInt32();
695*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(setBufferingSettings(buffering));
696*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
697*ec779b8eSAndroid Build Coastguard Worker         } break;
698*ec779b8eSAndroid Build Coastguard Worker         case GET_BUFFERING_SETTINGS: {
699*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
700*ec779b8eSAndroid Build Coastguard Worker             BufferingSettings buffering;
701*ec779b8eSAndroid Build Coastguard Worker             status_t err = getBufferingSettings(&buffering);
702*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(err);
703*ec779b8eSAndroid Build Coastguard Worker             if (err == OK) {
704*ec779b8eSAndroid Build Coastguard Worker                 reply->writeInt32(buffering.mInitialMarkMs);
705*ec779b8eSAndroid Build Coastguard Worker                 reply->writeInt32(buffering.mResumePlaybackMarkMs);
706*ec779b8eSAndroid Build Coastguard Worker             }
707*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
708*ec779b8eSAndroid Build Coastguard Worker         } break;
709*ec779b8eSAndroid Build Coastguard Worker         case PREPARE_ASYNC: {
710*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
711*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(prepareAsync());
712*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
713*ec779b8eSAndroid Build Coastguard Worker         } break;
714*ec779b8eSAndroid Build Coastguard Worker         case START: {
715*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
716*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(start());
717*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
718*ec779b8eSAndroid Build Coastguard Worker         } break;
719*ec779b8eSAndroid Build Coastguard Worker         case STOP: {
720*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
721*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(stop());
722*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
723*ec779b8eSAndroid Build Coastguard Worker         } break;
724*ec779b8eSAndroid Build Coastguard Worker         case IS_PLAYING: {
725*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
726*ec779b8eSAndroid Build Coastguard Worker             bool state;
727*ec779b8eSAndroid Build Coastguard Worker             status_t ret = isPlaying(&state);
728*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(state);
729*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(ret);
730*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
731*ec779b8eSAndroid Build Coastguard Worker         } break;
732*ec779b8eSAndroid Build Coastguard Worker         case SET_PLAYBACK_SETTINGS: {
733*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
734*ec779b8eSAndroid Build Coastguard Worker             AudioPlaybackRate rate = AUDIO_PLAYBACK_RATE_DEFAULT;
735*ec779b8eSAndroid Build Coastguard Worker             rate.mSpeed = data.readFloat();
736*ec779b8eSAndroid Build Coastguard Worker             rate.mPitch = data.readFloat();
737*ec779b8eSAndroid Build Coastguard Worker             rate.mFallbackMode = (AudioTimestretchFallbackMode)data.readInt32();
738*ec779b8eSAndroid Build Coastguard Worker             rate.mStretchMode = (AudioTimestretchStretchMode)data.readInt32();
739*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(setPlaybackSettings(rate));
740*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
741*ec779b8eSAndroid Build Coastguard Worker         } break;
742*ec779b8eSAndroid Build Coastguard Worker         case GET_PLAYBACK_SETTINGS: {
743*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
744*ec779b8eSAndroid Build Coastguard Worker             AudioPlaybackRate rate = AUDIO_PLAYBACK_RATE_DEFAULT;
745*ec779b8eSAndroid Build Coastguard Worker             status_t err = getPlaybackSettings(&rate);
746*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(err);
747*ec779b8eSAndroid Build Coastguard Worker             if (err == OK) {
748*ec779b8eSAndroid Build Coastguard Worker                 reply->writeFloat(rate.mSpeed);
749*ec779b8eSAndroid Build Coastguard Worker                 reply->writeFloat(rate.mPitch);
750*ec779b8eSAndroid Build Coastguard Worker                 reply->writeInt32((int32_t)rate.mFallbackMode);
751*ec779b8eSAndroid Build Coastguard Worker                 reply->writeInt32((int32_t)rate.mStretchMode);
752*ec779b8eSAndroid Build Coastguard Worker             }
753*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
754*ec779b8eSAndroid Build Coastguard Worker         } break;
755*ec779b8eSAndroid Build Coastguard Worker         case SET_SYNC_SETTINGS: {
756*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
757*ec779b8eSAndroid Build Coastguard Worker             AVSyncSettings sync;
758*ec779b8eSAndroid Build Coastguard Worker             sync.mSource = (AVSyncSource)data.readInt32();
759*ec779b8eSAndroid Build Coastguard Worker             sync.mAudioAdjustMode = (AVSyncAudioAdjustMode)data.readInt32();
760*ec779b8eSAndroid Build Coastguard Worker             sync.mTolerance = data.readFloat();
761*ec779b8eSAndroid Build Coastguard Worker             float videoFpsHint = data.readFloat();
762*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(setSyncSettings(sync, videoFpsHint));
763*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
764*ec779b8eSAndroid Build Coastguard Worker         } break;
765*ec779b8eSAndroid Build Coastguard Worker         case GET_SYNC_SETTINGS: {
766*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
767*ec779b8eSAndroid Build Coastguard Worker             AVSyncSettings sync;
768*ec779b8eSAndroid Build Coastguard Worker             float videoFps;
769*ec779b8eSAndroid Build Coastguard Worker             status_t err = getSyncSettings(&sync, &videoFps);
770*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(err);
771*ec779b8eSAndroid Build Coastguard Worker             if (err == OK) {
772*ec779b8eSAndroid Build Coastguard Worker                 reply->writeInt32((int32_t)sync.mSource);
773*ec779b8eSAndroid Build Coastguard Worker                 reply->writeInt32((int32_t)sync.mAudioAdjustMode);
774*ec779b8eSAndroid Build Coastguard Worker                 reply->writeFloat(sync.mTolerance);
775*ec779b8eSAndroid Build Coastguard Worker                 reply->writeFloat(videoFps);
776*ec779b8eSAndroid Build Coastguard Worker             }
777*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
778*ec779b8eSAndroid Build Coastguard Worker         } break;
779*ec779b8eSAndroid Build Coastguard Worker         case PAUSE: {
780*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
781*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(pause());
782*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
783*ec779b8eSAndroid Build Coastguard Worker         } break;
784*ec779b8eSAndroid Build Coastguard Worker         case SEEK_TO: {
785*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
786*ec779b8eSAndroid Build Coastguard Worker             int msec = data.readInt32();
787*ec779b8eSAndroid Build Coastguard Worker             MediaPlayerSeekMode mode = (MediaPlayerSeekMode)data.readInt32();
788*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(seekTo(msec, mode));
789*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
790*ec779b8eSAndroid Build Coastguard Worker         } break;
791*ec779b8eSAndroid Build Coastguard Worker         case GET_CURRENT_POSITION: {
792*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
793*ec779b8eSAndroid Build Coastguard Worker             int msec = 0;
794*ec779b8eSAndroid Build Coastguard Worker             status_t ret = getCurrentPosition(&msec);
795*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(msec);
796*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(ret);
797*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
798*ec779b8eSAndroid Build Coastguard Worker         } break;
799*ec779b8eSAndroid Build Coastguard Worker         case GET_DURATION: {
800*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
801*ec779b8eSAndroid Build Coastguard Worker             int msec = 0;
802*ec779b8eSAndroid Build Coastguard Worker             status_t ret = getDuration(&msec);
803*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(msec);
804*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(ret);
805*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
806*ec779b8eSAndroid Build Coastguard Worker         } break;
807*ec779b8eSAndroid Build Coastguard Worker         case RESET: {
808*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
809*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(reset());
810*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
811*ec779b8eSAndroid Build Coastguard Worker         } break;
812*ec779b8eSAndroid Build Coastguard Worker         case NOTIFY_AT: {
813*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
814*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(notifyAt(data.readInt64()));
815*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
816*ec779b8eSAndroid Build Coastguard Worker         } break;
817*ec779b8eSAndroid Build Coastguard Worker         case SET_AUDIO_STREAM_TYPE: {
818*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
819*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(setAudioStreamType((audio_stream_type_t) data.readInt32()));
820*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
821*ec779b8eSAndroid Build Coastguard Worker         } break;
822*ec779b8eSAndroid Build Coastguard Worker         case SET_LOOPING: {
823*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
824*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(setLooping(data.readInt32()));
825*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
826*ec779b8eSAndroid Build Coastguard Worker         } break;
827*ec779b8eSAndroid Build Coastguard Worker         case SET_VOLUME: {
828*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
829*ec779b8eSAndroid Build Coastguard Worker             float leftVolume = data.readFloat();
830*ec779b8eSAndroid Build Coastguard Worker             float rightVolume = data.readFloat();
831*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(setVolume(leftVolume, rightVolume));
832*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
833*ec779b8eSAndroid Build Coastguard Worker         } break;
834*ec779b8eSAndroid Build Coastguard Worker         case INVOKE: {
835*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
836*ec779b8eSAndroid Build Coastguard Worker             status_t result = invoke(data, reply);
837*ec779b8eSAndroid Build Coastguard Worker             return result;
838*ec779b8eSAndroid Build Coastguard Worker         } break;
839*ec779b8eSAndroid Build Coastguard Worker         case SET_METADATA_FILTER: {
840*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
841*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(setMetadataFilter(data));
842*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
843*ec779b8eSAndroid Build Coastguard Worker         } break;
844*ec779b8eSAndroid Build Coastguard Worker         case GET_METADATA: {
845*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
846*ec779b8eSAndroid Build Coastguard Worker             bool update_only = static_cast<bool>(data.readInt32());
847*ec779b8eSAndroid Build Coastguard Worker             bool apply_filter = static_cast<bool>(data.readInt32());
848*ec779b8eSAndroid Build Coastguard Worker             const status_t retcode = getMetadata(update_only, apply_filter, reply);
849*ec779b8eSAndroid Build Coastguard Worker             reply->setDataPosition(0);
850*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(retcode);
851*ec779b8eSAndroid Build Coastguard Worker             reply->setDataPosition(0);
852*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
853*ec779b8eSAndroid Build Coastguard Worker         } break;
854*ec779b8eSAndroid Build Coastguard Worker         case SET_AUX_EFFECT_SEND_LEVEL: {
855*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
856*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(setAuxEffectSendLevel(data.readFloat()));
857*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
858*ec779b8eSAndroid Build Coastguard Worker         } break;
859*ec779b8eSAndroid Build Coastguard Worker         case ATTACH_AUX_EFFECT: {
860*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
861*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(attachAuxEffect(data.readInt32()));
862*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
863*ec779b8eSAndroid Build Coastguard Worker         } break;
864*ec779b8eSAndroid Build Coastguard Worker         case SET_PARAMETER: {
865*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
866*ec779b8eSAndroid Build Coastguard Worker             int key = data.readInt32();
867*ec779b8eSAndroid Build Coastguard Worker 
868*ec779b8eSAndroid Build Coastguard Worker             Parcel request;
869*ec779b8eSAndroid Build Coastguard Worker             if (data.dataAvail() > 0) {
870*ec779b8eSAndroid Build Coastguard Worker                 request.appendFrom(
871*ec779b8eSAndroid Build Coastguard Worker                         const_cast<Parcel *>(&data), data.dataPosition(), data.dataAvail());
872*ec779b8eSAndroid Build Coastguard Worker             }
873*ec779b8eSAndroid Build Coastguard Worker             request.setDataPosition(0);
874*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(setParameter(key, request));
875*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
876*ec779b8eSAndroid Build Coastguard Worker         } break;
877*ec779b8eSAndroid Build Coastguard Worker         case GET_PARAMETER: {
878*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
879*ec779b8eSAndroid Build Coastguard Worker             return getParameter(data.readInt32(), reply);
880*ec779b8eSAndroid Build Coastguard Worker         } break;
881*ec779b8eSAndroid Build Coastguard Worker         case SET_RETRANSMIT_ENDPOINT: {
882*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
883*ec779b8eSAndroid Build Coastguard Worker 
884*ec779b8eSAndroid Build Coastguard Worker             struct sockaddr_in endpoint;
885*ec779b8eSAndroid Build Coastguard Worker             memset(&endpoint, 0, sizeof(endpoint));
886*ec779b8eSAndroid Build Coastguard Worker             int amt = data.readInt32();
887*ec779b8eSAndroid Build Coastguard Worker             if (amt == sizeof(endpoint)) {
888*ec779b8eSAndroid Build Coastguard Worker                 data.read(&endpoint, sizeof(struct sockaddr_in));
889*ec779b8eSAndroid Build Coastguard Worker                 reply->writeInt32(setRetransmitEndpoint(&endpoint));
890*ec779b8eSAndroid Build Coastguard Worker             } else {
891*ec779b8eSAndroid Build Coastguard Worker                 reply->writeInt32(setRetransmitEndpoint(NULL));
892*ec779b8eSAndroid Build Coastguard Worker             }
893*ec779b8eSAndroid Build Coastguard Worker 
894*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
895*ec779b8eSAndroid Build Coastguard Worker         } break;
896*ec779b8eSAndroid Build Coastguard Worker         case GET_RETRANSMIT_ENDPOINT: {
897*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
898*ec779b8eSAndroid Build Coastguard Worker 
899*ec779b8eSAndroid Build Coastguard Worker             struct sockaddr_in endpoint;
900*ec779b8eSAndroid Build Coastguard Worker             memset(&endpoint, 0, sizeof(endpoint));
901*ec779b8eSAndroid Build Coastguard Worker             status_t res = getRetransmitEndpoint(&endpoint);
902*ec779b8eSAndroid Build Coastguard Worker 
903*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(res);
904*ec779b8eSAndroid Build Coastguard Worker             reply->write(&endpoint, sizeof(endpoint));
905*ec779b8eSAndroid Build Coastguard Worker 
906*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
907*ec779b8eSAndroid Build Coastguard Worker         } break;
908*ec779b8eSAndroid Build Coastguard Worker         case SET_NEXT_PLAYER: {
909*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
910*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(setNextPlayer(interface_cast<IMediaPlayer>(data.readStrongBinder())));
911*ec779b8eSAndroid Build Coastguard Worker 
912*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
913*ec779b8eSAndroid Build Coastguard Worker         } break;
914*ec779b8eSAndroid Build Coastguard Worker 
915*ec779b8eSAndroid Build Coastguard Worker         case APPLY_VOLUME_SHAPER: {
916*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
917*ec779b8eSAndroid Build Coastguard Worker             sp<VolumeShaper::Configuration> configuration;
918*ec779b8eSAndroid Build Coastguard Worker             sp<VolumeShaper::Operation> operation;
919*ec779b8eSAndroid Build Coastguard Worker 
920*ec779b8eSAndroid Build Coastguard Worker             int32_t present;
921*ec779b8eSAndroid Build Coastguard Worker             status_t status = data.readInt32(&present);
922*ec779b8eSAndroid Build Coastguard Worker             if (status == NO_ERROR && present != 0) {
923*ec779b8eSAndroid Build Coastguard Worker                 configuration = new VolumeShaper::Configuration();
924*ec779b8eSAndroid Build Coastguard Worker                 status = configuration->readFromParcel(&data);
925*ec779b8eSAndroid Build Coastguard Worker             }
926*ec779b8eSAndroid Build Coastguard Worker             if (status == NO_ERROR) {
927*ec779b8eSAndroid Build Coastguard Worker                 status = data.readInt32(&present);
928*ec779b8eSAndroid Build Coastguard Worker             }
929*ec779b8eSAndroid Build Coastguard Worker             if (status == NO_ERROR && present != 0) {
930*ec779b8eSAndroid Build Coastguard Worker                 operation = new VolumeShaper::Operation();
931*ec779b8eSAndroid Build Coastguard Worker                 status = operation->readFromParcel(&data);
932*ec779b8eSAndroid Build Coastguard Worker             }
933*ec779b8eSAndroid Build Coastguard Worker             if (status == NO_ERROR) {
934*ec779b8eSAndroid Build Coastguard Worker                 status = (status_t)applyVolumeShaper(configuration, operation);
935*ec779b8eSAndroid Build Coastguard Worker             }
936*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(status);
937*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
938*ec779b8eSAndroid Build Coastguard Worker         } break;
939*ec779b8eSAndroid Build Coastguard Worker         case GET_VOLUME_SHAPER_STATE: {
940*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
941*ec779b8eSAndroid Build Coastguard Worker             int id;
942*ec779b8eSAndroid Build Coastguard Worker             status_t status = data.readInt32(&id);
943*ec779b8eSAndroid Build Coastguard Worker             if (status == NO_ERROR) {
944*ec779b8eSAndroid Build Coastguard Worker                 sp<VolumeShaper::State> state = getVolumeShaperState(id);
945*ec779b8eSAndroid Build Coastguard Worker                 if (state.get() != nullptr) {
946*ec779b8eSAndroid Build Coastguard Worker                      status = state->writeToParcel(reply);
947*ec779b8eSAndroid Build Coastguard Worker                 }
948*ec779b8eSAndroid Build Coastguard Worker             }
949*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
950*ec779b8eSAndroid Build Coastguard Worker         } break;
951*ec779b8eSAndroid Build Coastguard Worker 
952*ec779b8eSAndroid Build Coastguard Worker         // Modular DRM
953*ec779b8eSAndroid Build Coastguard Worker         case PREPARE_DRM: {
954*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
955*ec779b8eSAndroid Build Coastguard Worker 
956*ec779b8eSAndroid Build Coastguard Worker             uint8_t uuid[16] = {};
957*ec779b8eSAndroid Build Coastguard Worker             data.read(uuid, sizeof(uuid));
958*ec779b8eSAndroid Build Coastguard Worker             Vector<uint8_t> drmSessionId;
959*ec779b8eSAndroid Build Coastguard Worker             status_t status = readVector(data, drmSessionId);
960*ec779b8eSAndroid Build Coastguard Worker             if (status != OK) {
961*ec779b8eSAndroid Build Coastguard Worker               return status;
962*ec779b8eSAndroid Build Coastguard Worker             }
963*ec779b8eSAndroid Build Coastguard Worker             uint32_t result = prepareDrm(uuid, drmSessionId);
964*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(result);
965*ec779b8eSAndroid Build Coastguard Worker             return OK;
966*ec779b8eSAndroid Build Coastguard Worker         }
967*ec779b8eSAndroid Build Coastguard Worker         case RELEASE_DRM: {
968*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
969*ec779b8eSAndroid Build Coastguard Worker 
970*ec779b8eSAndroid Build Coastguard Worker             uint32_t result = releaseDrm();
971*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(result);
972*ec779b8eSAndroid Build Coastguard Worker             return OK;
973*ec779b8eSAndroid Build Coastguard Worker         }
974*ec779b8eSAndroid Build Coastguard Worker 
975*ec779b8eSAndroid Build Coastguard Worker         // AudioRouting
976*ec779b8eSAndroid Build Coastguard Worker         case SET_OUTPUT_DEVICE: {
977*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
978*ec779b8eSAndroid Build Coastguard Worker             int deviceId;
979*ec779b8eSAndroid Build Coastguard Worker             status_t status = data.readInt32(&deviceId);
980*ec779b8eSAndroid Build Coastguard Worker             if (status == NO_ERROR) {
981*ec779b8eSAndroid Build Coastguard Worker                 reply->writeInt32(setOutputDevice(deviceId));
982*ec779b8eSAndroid Build Coastguard Worker             } else {
983*ec779b8eSAndroid Build Coastguard Worker                 reply->writeInt32(BAD_VALUE);
984*ec779b8eSAndroid Build Coastguard Worker             }
985*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
986*ec779b8eSAndroid Build Coastguard Worker         }
987*ec779b8eSAndroid Build Coastguard Worker         case GET_ROUTED_DEVICE_IDS: {
988*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
989*ec779b8eSAndroid Build Coastguard Worker             DeviceIdVector deviceIds;
990*ec779b8eSAndroid Build Coastguard Worker             status_t ret = getRoutedDeviceIds(deviceIds);
991*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(ret);
992*ec779b8eSAndroid Build Coastguard Worker             if (ret == NO_ERROR) {
993*ec779b8eSAndroid Build Coastguard Worker                 reply->writeInt32(deviceIds.size());
994*ec779b8eSAndroid Build Coastguard Worker                 for (auto deviceId : deviceIds) {
995*ec779b8eSAndroid Build Coastguard Worker                     reply->writeInt32(deviceId);
996*ec779b8eSAndroid Build Coastguard Worker                 }
997*ec779b8eSAndroid Build Coastguard Worker             }
998*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
999*ec779b8eSAndroid Build Coastguard Worker         } break;
1000*ec779b8eSAndroid Build Coastguard Worker         case ENABLE_AUDIO_DEVICE_CALLBACK: {
1001*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayer, data, reply);
1002*ec779b8eSAndroid Build Coastguard Worker             bool enabled;
1003*ec779b8eSAndroid Build Coastguard Worker             status_t status = data.readBool(&enabled);
1004*ec779b8eSAndroid Build Coastguard Worker             if (status == NO_ERROR) {
1005*ec779b8eSAndroid Build Coastguard Worker                 reply->writeInt32(enableAudioDeviceCallback(enabled));
1006*ec779b8eSAndroid Build Coastguard Worker             } else {
1007*ec779b8eSAndroid Build Coastguard Worker                 reply->writeInt32(BAD_VALUE);
1008*ec779b8eSAndroid Build Coastguard Worker             }
1009*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
1010*ec779b8eSAndroid Build Coastguard Worker         } break;
1011*ec779b8eSAndroid Build Coastguard Worker 
1012*ec779b8eSAndroid Build Coastguard Worker         default:
1013*ec779b8eSAndroid Build Coastguard Worker             return BBinder::onTransact(code, data, reply, flags);
1014*ec779b8eSAndroid Build Coastguard Worker     }
1015*ec779b8eSAndroid Build Coastguard Worker }
1016*ec779b8eSAndroid Build Coastguard Worker 
1017*ec779b8eSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
1018*ec779b8eSAndroid Build Coastguard Worker 
1019*ec779b8eSAndroid Build Coastguard Worker } // namespace android
1020