blob: 17a0362862e0535274f5d93594aa214ddb5c5525 [file] [log] [blame]
The Android Open Source Project9066cfe2009-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>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080020
Andreas Hubere46b7be2009-07-14 16:56:47 -070021#include <binder/Parcel.h>
Mathias Agopian07952722009-05-19 19:08:10 -070022#include <binder/IMemory.h>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080023#include <media/IMediaPlayerService.h>
24#include <media/IMediaRecorder.h>
Andreas Hubere46b7be2009-07-14 16:56:47 -070025#include <media/IOMX.h>
Andreas Huber52b52cd2010-11-23 11:41:34 -080026#include <media/IStreamSource.h>
Andreas Hubere46b7be2009-07-14 16:56:47 -070027
28#include <utils/Errors.h> // for status_t
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080029
30namespace android {
31
32enum {
33 CREATE_URL = IBinder::FIRST_CALL_TRANSACTION,
34 CREATE_FD,
Andreas Huber52b52cd2010-11-23 11:41:34 -080035 CREATE_STREAM,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080036 DECODE_URL,
37 DECODE_FD,
38 CREATE_MEDIA_RECORDER,
39 CREATE_METADATA_RETRIEVER,
Gloria Wangd211f412011-02-19 18:37:57 -080040 GET_OMX,
41 ADD_BATTERY_DATA,
42 PULL_BATTERY_DATA
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080043};
44
45class BpMediaPlayerService: public BpInterface<IMediaPlayerService>
46{
47public:
48 BpMediaPlayerService(const sp<IBinder>& impl)
49 : BpInterface<IMediaPlayerService>(impl)
50 {
51 }
52
53 virtual sp<IMediaMetadataRetriever> createMetadataRetriever(pid_t pid)
54 {
55 Parcel data, reply;
56 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
57 data.writeInt32(pid);
58 remote()->transact(CREATE_METADATA_RETRIEVER, data, &reply);
59 return interface_cast<IMediaMetadataRetriever>(reply.readStrongBinder());
60 }
61
Andreas Huber25643002010-01-28 11:19:57 -080062 virtual sp<IMediaPlayer> create(
63 pid_t pid, const sp<IMediaPlayerClient>& client,
Eric Laurent619346f2010-06-21 09:27:30 -070064 const char* url, const KeyedVector<String8, String8> *headers, int audioSessionId) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080065 Parcel data, reply;
66 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
67 data.writeInt32(pid);
68 data.writeStrongBinder(client->asBinder());
69 data.writeCString(url);
Andreas Huber25643002010-01-28 11:19:57 -080070
71 if (headers == NULL) {
72 data.writeInt32(0);
73 } else {
74 // serialize the headers
75 data.writeInt32(headers->size());
76 for (size_t i = 0; i < headers->size(); ++i) {
77 data.writeString8(headers->keyAt(i));
78 data.writeString8(headers->valueAt(i));
79 }
80 }
Eric Laurent619346f2010-06-21 09:27:30 -070081 data.writeInt32(audioSessionId);
Andreas Huber25643002010-01-28 11:19:57 -080082
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080083 remote()->transact(CREATE_URL, data, &reply);
Eric Laurent619346f2010-06-21 09:27:30 -070084
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080085 return interface_cast<IMediaPlayer>(reply.readStrongBinder());
86 }
87
88 virtual sp<IMediaRecorder> createMediaRecorder(pid_t pid)
89 {
90 Parcel data, reply;
91 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
92 data.writeInt32(pid);
93 remote()->transact(CREATE_MEDIA_RECORDER, data, &reply);
94 return interface_cast<IMediaRecorder>(reply.readStrongBinder());
95 }
96
Eric Laurent619346f2010-06-21 09:27:30 -070097 virtual sp<IMediaPlayer> create(pid_t pid, const sp<IMediaPlayerClient>& client, int fd,
98 int64_t offset, int64_t length, int audioSessionId)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080099 {
100 Parcel data, reply;
101 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
102 data.writeInt32(pid);
103 data.writeStrongBinder(client->asBinder());
104 data.writeFileDescriptor(fd);
105 data.writeInt64(offset);
106 data.writeInt64(length);
Eric Laurent619346f2010-06-21 09:27:30 -0700107 data.writeInt32(audioSessionId);
108
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800109 remote()->transact(CREATE_FD, data, &reply);
Eric Laurent619346f2010-06-21 09:27:30 -0700110
111 return interface_cast<IMediaPlayer>(reply.readStrongBinder());;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800112 }
113
Andreas Huber52b52cd2010-11-23 11:41:34 -0800114 virtual sp<IMediaPlayer> create(
115 pid_t pid, const sp<IMediaPlayerClient> &client,
116 const sp<IStreamSource> &source, int audioSessionId) {
117 Parcel data, reply;
118 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
119 data.writeInt32(static_cast<int32_t>(pid));
120 data.writeStrongBinder(client->asBinder());
121 data.writeStrongBinder(source->asBinder());
122 data.writeInt32(static_cast<int32_t>(audioSessionId));
123
124 remote()->transact(CREATE_STREAM, data, &reply);
125
126 return interface_cast<IMediaPlayer>(reply.readStrongBinder());;
127 }
128
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800129 virtual sp<IMemory> decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, int* pFormat)
130 {
131 Parcel data, reply;
132 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
133 data.writeCString(url);
134 remote()->transact(DECODE_URL, data, &reply);
135 *pSampleRate = uint32_t(reply.readInt32());
136 *pNumChannels = reply.readInt32();
137 *pFormat = reply.readInt32();
138 return interface_cast<IMemory>(reply.readStrongBinder());
139 }
140
141 virtual sp<IMemory> decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, int* pFormat)
142 {
143 Parcel data, reply;
144 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
145 data.writeFileDescriptor(fd);
146 data.writeInt64(offset);
147 data.writeInt64(length);
148 remote()->transact(DECODE_FD, data, &reply);
149 *pSampleRate = uint32_t(reply.readInt32());
150 *pNumChannels = reply.readInt32();
151 *pFormat = reply.readInt32();
152 return interface_cast<IMemory>(reply.readStrongBinder());
153 }
Andreas Hubere46b7be2009-07-14 16:56:47 -0700154
Andreas Huber784202e2009-10-15 13:46:54 -0700155 virtual sp<IOMX> getOMX() {
Andreas Hubere46b7be2009-07-14 16:56:47 -0700156 Parcel data, reply;
157 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
Andreas Huber784202e2009-10-15 13:46:54 -0700158 remote()->transact(GET_OMX, data, &reply);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700159 return interface_cast<IOMX>(reply.readStrongBinder());
160 }
Gloria Wangd211f412011-02-19 18:37:57 -0800161
162 virtual void addBatteryData(uint32_t params) {
163 Parcel data, reply;
164 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
165 data.writeInt32(params);
166 remote()->transact(ADD_BATTERY_DATA, data, &reply);
167 }
168
169 virtual status_t pullBatteryData(Parcel* reply) {
170 Parcel data;
171 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
172 return remote()->transact(PULL_BATTERY_DATA, data, reply);
173 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800174};
175
nikodcd810d2009-06-22 08:49:52 -0700176IMPLEMENT_META_INTERFACE(MediaPlayerService, "android.media.IMediaPlayerService");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800177
178// ----------------------------------------------------------------------
179
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800180status_t BnMediaPlayerService::onTransact(
181 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
182{
183 switch(code) {
184 case CREATE_URL: {
185 CHECK_INTERFACE(IMediaPlayerService, data, reply);
186 pid_t pid = data.readInt32();
Andreas Huber25643002010-01-28 11:19:57 -0800187 sp<IMediaPlayerClient> client =
188 interface_cast<IMediaPlayerClient>(data.readStrongBinder());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800189 const char* url = data.readCString();
Andreas Huber25643002010-01-28 11:19:57 -0800190
191 KeyedVector<String8, String8> headers;
192 int32_t numHeaders = data.readInt32();
193 for (int i = 0; i < numHeaders; ++i) {
194 String8 key = data.readString8();
195 String8 value = data.readString8();
196 headers.add(key, value);
197 }
Eric Laurent619346f2010-06-21 09:27:30 -0700198 int audioSessionId = data.readInt32();
Andreas Huber25643002010-01-28 11:19:57 -0800199
200 sp<IMediaPlayer> player = create(
Eric Laurent619346f2010-06-21 09:27:30 -0700201 pid, client, url, numHeaders > 0 ? &headers : NULL, audioSessionId);
Andreas Huber25643002010-01-28 11:19:57 -0800202
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800203 reply->writeStrongBinder(player->asBinder());
204 return NO_ERROR;
205 } break;
206 case CREATE_FD: {
207 CHECK_INTERFACE(IMediaPlayerService, data, reply);
208 pid_t pid = data.readInt32();
209 sp<IMediaPlayerClient> client = interface_cast<IMediaPlayerClient>(data.readStrongBinder());
210 int fd = dup(data.readFileDescriptor());
211 int64_t offset = data.readInt64();
212 int64_t length = data.readInt64();
Eric Laurent619346f2010-06-21 09:27:30 -0700213 int audioSessionId = data.readInt32();
214
215 sp<IMediaPlayer> player = create(pid, client, fd, offset, length, audioSessionId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800216 reply->writeStrongBinder(player->asBinder());
217 return NO_ERROR;
218 } break;
Andreas Huber52b52cd2010-11-23 11:41:34 -0800219 case CREATE_STREAM:
220 {
221 CHECK_INTERFACE(IMediaPlayerService, data, reply);
222
223 pid_t pid = static_cast<pid_t>(data.readInt32());
224
225 sp<IMediaPlayerClient> client =
226 interface_cast<IMediaPlayerClient>(data.readStrongBinder());
227
228 sp<IStreamSource> source =
229 interface_cast<IStreamSource>(data.readStrongBinder());
230
231 int audioSessionId = static_cast<int>(data.readInt32());
232
233 sp<IMediaPlayer> player =
234 create(pid, client, source, audioSessionId);
235
236 reply->writeStrongBinder(player->asBinder());
237 return OK;
238 break;
239 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800240 case DECODE_URL: {
241 CHECK_INTERFACE(IMediaPlayerService, data, reply);
242 const char* url = data.readCString();
243 uint32_t sampleRate;
244 int numChannels;
245 int format;
246 sp<IMemory> player = decode(url, &sampleRate, &numChannels, &format);
247 reply->writeInt32(sampleRate);
248 reply->writeInt32(numChannels);
249 reply->writeInt32(format);
250 reply->writeStrongBinder(player->asBinder());
251 return NO_ERROR;
252 } break;
253 case DECODE_FD: {
254 CHECK_INTERFACE(IMediaPlayerService, data, reply);
255 int fd = dup(data.readFileDescriptor());
256 int64_t offset = data.readInt64();
257 int64_t length = data.readInt64();
258 uint32_t sampleRate;
259 int numChannels;
260 int format;
261 sp<IMemory> player = decode(fd, offset, length, &sampleRate, &numChannels, &format);
262 reply->writeInt32(sampleRate);
263 reply->writeInt32(numChannels);
264 reply->writeInt32(format);
265 reply->writeStrongBinder(player->asBinder());
266 return NO_ERROR;
267 } break;
268 case CREATE_MEDIA_RECORDER: {
269 CHECK_INTERFACE(IMediaPlayerService, data, reply);
270 pid_t pid = data.readInt32();
271 sp<IMediaRecorder> recorder = createMediaRecorder(pid);
272 reply->writeStrongBinder(recorder->asBinder());
273 return NO_ERROR;
274 } break;
275 case CREATE_METADATA_RETRIEVER: {
276 CHECK_INTERFACE(IMediaPlayerService, data, reply);
277 pid_t pid = data.readInt32();
278 sp<IMediaMetadataRetriever> retriever = createMetadataRetriever(pid);
279 reply->writeStrongBinder(retriever->asBinder());
280 return NO_ERROR;
281 } break;
Andreas Huber784202e2009-10-15 13:46:54 -0700282 case GET_OMX: {
Andreas Hubere46b7be2009-07-14 16:56:47 -0700283 CHECK_INTERFACE(IMediaPlayerService, data, reply);
Andreas Huber784202e2009-10-15 13:46:54 -0700284 sp<IOMX> omx = getOMX();
Andreas Hubere46b7be2009-07-14 16:56:47 -0700285 reply->writeStrongBinder(omx->asBinder());
286 return NO_ERROR;
287 } break;
Gloria Wangd211f412011-02-19 18:37:57 -0800288 case ADD_BATTERY_DATA: {
289 CHECK_INTERFACE(IMediaPlayerService, data, reply);
290 uint32_t params = data.readInt32();
291 addBatteryData(params);
292 return NO_ERROR;
293 } break;
294 case PULL_BATTERY_DATA: {
295 CHECK_INTERFACE(IMediaPlayerService, data, reply);
296 pullBatteryData(reply);
297 return NO_ERROR;
298 } break;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800299 default:
300 return BBinder::onTransact(code, data, reply, flags);
301 }
302}
303
304// ----------------------------------------------------------------------------
305
306}; // namespace android