blob: 3f278f401b507ac4a9288132945c41da850d8bf4 [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
18#include <stdint.h>
19#include <sys/types.h>
20
Mathias Agopian75624082009-05-19 19:08:10 -070021#include <binder/Parcel.h>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080022
23#include <media/IMediaPlayer.h>
24#include <ui/ISurface.h>
25
26namespace android {
27
28enum {
29 DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
30 SET_VIDEO_SURFACE,
31 PREPARE_ASYNC,
32 START,
33 STOP,
34 IS_PLAYING,
35 PAUSE,
36 SEEK_TO,
37 GET_CURRENT_POSITION,
38 GET_DURATION,
39 RESET,
40 SET_AUDIO_STREAM_TYPE,
41 SET_LOOPING,
Nicolas Catania1d187f12009-05-12 23:25:55 -070042 SET_VOLUME,
43 INVOKE,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080044};
45
46class BpMediaPlayer: public BpInterface<IMediaPlayer>
47{
48public:
49 BpMediaPlayer(const sp<IBinder>& impl)
50 : BpInterface<IMediaPlayer>(impl)
51 {
52 }
53
54 // disconnect from media player service
55 void disconnect()
56 {
57 Parcel data, reply;
58 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
59 remote()->transact(DISCONNECT, data, &reply);
60 }
61
62 status_t setVideoSurface(const sp<ISurface>& surface)
63 {
64 Parcel data, reply;
65 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
66 data.writeStrongBinder(surface->asBinder());
67 remote()->transact(SET_VIDEO_SURFACE, data, &reply);
68 return reply.readInt32();
69 }
70
71 status_t prepareAsync()
72 {
73 Parcel data, reply;
74 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
75 remote()->transact(PREPARE_ASYNC, data, &reply);
76 return reply.readInt32();
77 }
78
79 status_t start()
80 {
81 Parcel data, reply;
82 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
83 remote()->transact(START, data, &reply);
84 return reply.readInt32();
85 }
86
87 status_t stop()
88 {
89 Parcel data, reply;
90 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
91 remote()->transact(STOP, data, &reply);
92 return reply.readInt32();
93 }
94
95 status_t isPlaying(bool* state)
96 {
97 Parcel data, reply;
98 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
99 remote()->transact(IS_PLAYING, data, &reply);
100 *state = reply.readInt32();
101 return reply.readInt32();
102 }
103
104 status_t pause()
105 {
106 Parcel data, reply;
107 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
108 remote()->transact(PAUSE, data, &reply);
109 return reply.readInt32();
110 }
111
112 status_t seekTo(int msec)
113 {
114 Parcel data, reply;
115 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
116 data.writeInt32(msec);
117 remote()->transact(SEEK_TO, data, &reply);
118 return reply.readInt32();
119 }
120
121 status_t getCurrentPosition(int* msec)
122 {
123 Parcel data, reply;
124 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
125 remote()->transact(GET_CURRENT_POSITION, data, &reply);
126 *msec = reply.readInt32();
127 return reply.readInt32();
128 }
129
130 status_t getDuration(int* msec)
131 {
132 Parcel data, reply;
133 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
134 remote()->transact(GET_DURATION, data, &reply);
135 *msec = reply.readInt32();
136 return reply.readInt32();
137 }
138
139 status_t reset()
140 {
141 Parcel data, reply;
142 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
143 remote()->transact(RESET, data, &reply);
144 return reply.readInt32();
145 }
146
147 status_t setAudioStreamType(int type)
148 {
149 Parcel data, reply;
150 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
151 data.writeInt32(type);
152 remote()->transact(SET_AUDIO_STREAM_TYPE, data, &reply);
153 return reply.readInt32();
154 }
155
156 status_t setLooping(int loop)
157 {
158 Parcel data, reply;
159 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
160 data.writeInt32(loop);
161 remote()->transact(SET_LOOPING, data, &reply);
162 return reply.readInt32();
163 }
164
165 status_t setVolume(float leftVolume, float rightVolume)
166 {
167 Parcel data, reply;
Dave Sparks172fb9a2009-05-26 14:39:29 -0700168 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800169 data.writeFloat(leftVolume);
170 data.writeFloat(rightVolume);
171 remote()->transact(SET_VOLUME, data, &reply);
172 return reply.readInt32();
173 }
Nicolas Catania1d187f12009-05-12 23:25:55 -0700174
175 status_t invoke(const Parcel& request, Parcel *reply)
176 { // Avoid doing any extra copy. The interface descriptor should
177 // have been set by MediaPlayer.java.
178 status_t retcode = remote()->transact(INVOKE, request, reply);
179 return retcode;
180 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800181};
182
niko56f0cc52009-06-22 08:49:52 -0700183IMPLEMENT_META_INTERFACE(MediaPlayer, "android.media.IMediaPlayer");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800184
185// ----------------------------------------------------------------------
186
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800187status_t BnMediaPlayer::onTransact(
188 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
189{
190 switch(code) {
191 case DISCONNECT: {
192 CHECK_INTERFACE(IMediaPlayer, data, reply);
193 disconnect();
194 return NO_ERROR;
195 } break;
196 case SET_VIDEO_SURFACE: {
197 CHECK_INTERFACE(IMediaPlayer, data, reply);
198 sp<ISurface> surface = interface_cast<ISurface>(data.readStrongBinder());
199 reply->writeInt32(setVideoSurface(surface));
200 return NO_ERROR;
201 } break;
202 case PREPARE_ASYNC: {
203 CHECK_INTERFACE(IMediaPlayer, data, reply);
204 reply->writeInt32(prepareAsync());
205 return NO_ERROR;
206 } break;
207 case START: {
208 CHECK_INTERFACE(IMediaPlayer, data, reply);
209 reply->writeInt32(start());
210 return NO_ERROR;
211 } break;
212 case STOP: {
213 CHECK_INTERFACE(IMediaPlayer, data, reply);
214 reply->writeInt32(stop());
215 return NO_ERROR;
216 } break;
217 case IS_PLAYING: {
218 CHECK_INTERFACE(IMediaPlayer, data, reply);
219 bool state;
220 status_t ret = isPlaying(&state);
221 reply->writeInt32(state);
222 reply->writeInt32(ret);
223 return NO_ERROR;
224 } break;
225 case PAUSE: {
226 CHECK_INTERFACE(IMediaPlayer, data, reply);
227 reply->writeInt32(pause());
228 return NO_ERROR;
229 } break;
230 case SEEK_TO: {
231 CHECK_INTERFACE(IMediaPlayer, data, reply);
232 reply->writeInt32(seekTo(data.readInt32()));
233 return NO_ERROR;
234 } break;
235 case GET_CURRENT_POSITION: {
236 CHECK_INTERFACE(IMediaPlayer, data, reply);
237 int msec;
238 status_t ret = getCurrentPosition(&msec);
239 reply->writeInt32(msec);
240 reply->writeInt32(ret);
241 return NO_ERROR;
242 } break;
243 case GET_DURATION: {
244 CHECK_INTERFACE(IMediaPlayer, data, reply);
245 int msec;
246 status_t ret = getDuration(&msec);
247 reply->writeInt32(msec);
248 reply->writeInt32(ret);
249 return NO_ERROR;
250 } break;
251 case RESET: {
252 CHECK_INTERFACE(IMediaPlayer, data, reply);
253 reply->writeInt32(reset());
254 return NO_ERROR;
255 } break;
256 case SET_AUDIO_STREAM_TYPE: {
257 CHECK_INTERFACE(IMediaPlayer, data, reply);
258 reply->writeInt32(setAudioStreamType(data.readInt32()));
259 return NO_ERROR;
260 } break;
261 case SET_LOOPING: {
262 CHECK_INTERFACE(IMediaPlayer, data, reply);
263 reply->writeInt32(setLooping(data.readInt32()));
264 return NO_ERROR;
265 } break;
266 case SET_VOLUME: {
Dave Sparks172fb9a2009-05-26 14:39:29 -0700267 CHECK_INTERFACE(IMediaPlayer, data, reply);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800268 reply->writeInt32(setVolume(data.readFloat(), data.readFloat()));
269 return NO_ERROR;
270 } break;
Nicolas Catania1d187f12009-05-12 23:25:55 -0700271 case INVOKE: {
272 CHECK_INTERFACE(IMediaPlayer, data, reply);
273 invoke(data, reply);
274 return NO_ERROR;
275 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800276 default:
277 return BBinder::onTransact(code, data, reply, flags);
278 }
279}
280
281// ----------------------------------------------------------------------------
282
283}; // namespace android