blob: d3e2e198e85ca4367d10e54e9818acc3df817b37 [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>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080020
Andreas Huber20111aa2009-07-14 16:56:47 -070021#include <binder/Parcel.h>
Mathias Agopian75624082009-05-19 19:08:10 -070022#include <binder/IMemory.h>
Andreas Hubered3e3e02012-03-26 11:13:27 -070023#include <media/ICrypto.h>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080024#include <media/IMediaPlayerService.h>
25#include <media/IMediaRecorder.h>
Andreas Huber20111aa2009-07-14 16:56:47 -070026#include <media/IOMX.h>
Andreas Hubere2b10282010-11-23 11:41:34 -080027#include <media/IStreamSource.h>
Andreas Huber20111aa2009-07-14 16:56:47 -070028
29#include <utils/Errors.h> // for status_t
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080030
31namespace android {
32
33enum {
Dave Burked681bbb2011-08-30 14:39:17 +010034 CREATE = IBinder::FIRST_CALL_TRANSACTION,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080035 DECODE_URL,
36 DECODE_FD,
37 CREATE_MEDIA_RECORDER,
38 CREATE_METADATA_RETRIEVER,
Gloria Wang7cf180c2011-02-19 18:37:57 -080039 GET_OMX,
Andreas Hubered3e3e02012-03-26 11:13:27 -070040 MAKE_CRYPTO,
Andreas Huber35213f12012-08-29 11:41:50 -070041 ENABLE_REMOTE_DISPLAY,
Gloria Wang7cf180c2011-02-19 18:37:57 -080042 ADD_BATTERY_DATA,
43 PULL_BATTERY_DATA
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080044};
45
46class BpMediaPlayerService: public BpInterface<IMediaPlayerService>
47{
48public:
49 BpMediaPlayerService(const sp<IBinder>& impl)
50 : BpInterface<IMediaPlayerService>(impl)
51 {
52 }
53
54 virtual sp<IMediaMetadataRetriever> createMetadataRetriever(pid_t pid)
55 {
56 Parcel data, reply;
57 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
58 data.writeInt32(pid);
59 remote()->transact(CREATE_METADATA_RETRIEVER, data, &reply);
60 return interface_cast<IMediaMetadataRetriever>(reply.readStrongBinder());
61 }
62
Andreas Huber2db84552010-01-28 11:19:57 -080063 virtual sp<IMediaPlayer> create(
Dave Burked681bbb2011-08-30 14:39:17 +010064 pid_t pid, const sp<IMediaPlayerClient>& client, int audioSessionId) {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080065 Parcel data, reply;
66 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
67 data.writeInt32(pid);
68 data.writeStrongBinder(client->asBinder());
Eric Laurenta514bdb2010-06-21 09:27:30 -070069 data.writeInt32(audioSessionId);
Andreas Huber2db84552010-01-28 11:19:57 -080070
Dave Burked681bbb2011-08-30 14:39:17 +010071 remote()->transact(CREATE, data, &reply);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080072 return interface_cast<IMediaPlayer>(reply.readStrongBinder());
73 }
74
75 virtual sp<IMediaRecorder> createMediaRecorder(pid_t pid)
76 {
77 Parcel data, reply;
78 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
79 data.writeInt32(pid);
80 remote()->transact(CREATE_MEDIA_RECORDER, data, &reply);
81 return interface_cast<IMediaRecorder>(reply.readStrongBinder());
82 }
83
Glenn Kastene1c39622012-01-04 09:36:37 -080084 virtual sp<IMemory> decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, audio_format_t* pFormat)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080085 {
86 Parcel data, reply;
87 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
88 data.writeCString(url);
89 remote()->transact(DECODE_URL, data, &reply);
90 *pSampleRate = uint32_t(reply.readInt32());
91 *pNumChannels = reply.readInt32();
Glenn Kastene1c39622012-01-04 09:36:37 -080092 *pFormat = (audio_format_t) reply.readInt32();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080093 return interface_cast<IMemory>(reply.readStrongBinder());
94 }
95
Glenn Kastene1c39622012-01-04 09:36:37 -080096 virtual sp<IMemory> decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, audio_format_t* pFormat)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080097 {
98 Parcel data, reply;
99 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
100 data.writeFileDescriptor(fd);
101 data.writeInt64(offset);
102 data.writeInt64(length);
103 remote()->transact(DECODE_FD, data, &reply);
104 *pSampleRate = uint32_t(reply.readInt32());
105 *pNumChannels = reply.readInt32();
Glenn Kastene1c39622012-01-04 09:36:37 -0800106 *pFormat = (audio_format_t) reply.readInt32();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800107 return interface_cast<IMemory>(reply.readStrongBinder());
108 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700109
Andreas Huber318ad9c2009-10-15 13:46:54 -0700110 virtual sp<IOMX> getOMX() {
Andreas Huber20111aa2009-07-14 16:56:47 -0700111 Parcel data, reply;
112 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
Andreas Huber318ad9c2009-10-15 13:46:54 -0700113 remote()->transact(GET_OMX, data, &reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700114 return interface_cast<IOMX>(reply.readStrongBinder());
115 }
Gloria Wang7cf180c2011-02-19 18:37:57 -0800116
Andreas Hubered3e3e02012-03-26 11:13:27 -0700117 virtual sp<ICrypto> makeCrypto() {
118 Parcel data, reply;
119 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
120 remote()->transact(MAKE_CRYPTO, data, &reply);
121 return interface_cast<ICrypto>(reply.readStrongBinder());
122 }
123
Andreas Huberab1bd842012-08-30 14:51:40 -0700124 virtual status_t enableRemoteDisplay(const char *iface) {
Andreas Huber35213f12012-08-29 11:41:50 -0700125 Parcel data, reply;
126 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
Andreas Huberab1bd842012-08-30 14:51:40 -0700127
128 if (iface != NULL) {
129 data.writeInt32(1);
130 data.writeCString(iface);
131 } else {
132 data.writeInt32(0);
133 }
134
Andreas Huber35213f12012-08-29 11:41:50 -0700135 remote()->transact(ENABLE_REMOTE_DISPLAY, data, &reply);
136 return reply.readInt32();
137 }
138
Gloria Wang7cf180c2011-02-19 18:37:57 -0800139 virtual void addBatteryData(uint32_t params) {
140 Parcel data, reply;
141 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
142 data.writeInt32(params);
143 remote()->transact(ADD_BATTERY_DATA, data, &reply);
144 }
145
146 virtual status_t pullBatteryData(Parcel* reply) {
147 Parcel data;
148 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
149 return remote()->transact(PULL_BATTERY_DATA, data, reply);
150 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800151};
152
niko56f0cc52009-06-22 08:49:52 -0700153IMPLEMENT_META_INTERFACE(MediaPlayerService, "android.media.IMediaPlayerService");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800154
155// ----------------------------------------------------------------------
156
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800157status_t BnMediaPlayerService::onTransact(
158 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
159{
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700160 switch (code) {
Dave Burked681bbb2011-08-30 14:39:17 +0100161 case CREATE: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800162 CHECK_INTERFACE(IMediaPlayerService, data, reply);
163 pid_t pid = data.readInt32();
Andreas Huber2db84552010-01-28 11:19:57 -0800164 sp<IMediaPlayerClient> client =
165 interface_cast<IMediaPlayerClient>(data.readStrongBinder());
Eric Laurenta514bdb2010-06-21 09:27:30 -0700166 int audioSessionId = data.readInt32();
Dave Burked681bbb2011-08-30 14:39:17 +0100167 sp<IMediaPlayer> player = create(pid, client, audioSessionId);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800168 reply->writeStrongBinder(player->asBinder());
169 return NO_ERROR;
170 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800171 case DECODE_URL: {
172 CHECK_INTERFACE(IMediaPlayerService, data, reply);
173 const char* url = data.readCString();
174 uint32_t sampleRate;
175 int numChannels;
Glenn Kastene1c39622012-01-04 09:36:37 -0800176 audio_format_t format;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800177 sp<IMemory> player = decode(url, &sampleRate, &numChannels, &format);
178 reply->writeInt32(sampleRate);
179 reply->writeInt32(numChannels);
Glenn Kastene1c39622012-01-04 09:36:37 -0800180 reply->writeInt32((int32_t) format);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800181 reply->writeStrongBinder(player->asBinder());
182 return NO_ERROR;
183 } break;
184 case DECODE_FD: {
185 CHECK_INTERFACE(IMediaPlayerService, data, reply);
186 int fd = dup(data.readFileDescriptor());
187 int64_t offset = data.readInt64();
188 int64_t length = data.readInt64();
189 uint32_t sampleRate;
190 int numChannels;
Glenn Kastene1c39622012-01-04 09:36:37 -0800191 audio_format_t format;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800192 sp<IMemory> player = decode(fd, offset, length, &sampleRate, &numChannels, &format);
193 reply->writeInt32(sampleRate);
194 reply->writeInt32(numChannels);
Glenn Kastene1c39622012-01-04 09:36:37 -0800195 reply->writeInt32((int32_t) format);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800196 reply->writeStrongBinder(player->asBinder());
197 return NO_ERROR;
198 } break;
199 case CREATE_MEDIA_RECORDER: {
200 CHECK_INTERFACE(IMediaPlayerService, data, reply);
201 pid_t pid = data.readInt32();
202 sp<IMediaRecorder> recorder = createMediaRecorder(pid);
203 reply->writeStrongBinder(recorder->asBinder());
204 return NO_ERROR;
205 } break;
206 case CREATE_METADATA_RETRIEVER: {
207 CHECK_INTERFACE(IMediaPlayerService, data, reply);
208 pid_t pid = data.readInt32();
209 sp<IMediaMetadataRetriever> retriever = createMetadataRetriever(pid);
210 reply->writeStrongBinder(retriever->asBinder());
211 return NO_ERROR;
212 } break;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700213 case GET_OMX: {
Andreas Huber20111aa2009-07-14 16:56:47 -0700214 CHECK_INTERFACE(IMediaPlayerService, data, reply);
Andreas Huber318ad9c2009-10-15 13:46:54 -0700215 sp<IOMX> omx = getOMX();
Andreas Huber20111aa2009-07-14 16:56:47 -0700216 reply->writeStrongBinder(omx->asBinder());
217 return NO_ERROR;
218 } break;
Andreas Hubered3e3e02012-03-26 11:13:27 -0700219 case MAKE_CRYPTO: {
220 CHECK_INTERFACE(IMediaPlayerService, data, reply);
221 sp<ICrypto> crypto = makeCrypto();
222 reply->writeStrongBinder(crypto->asBinder());
223 return NO_ERROR;
224 } break;
Andreas Huber35213f12012-08-29 11:41:50 -0700225 case ENABLE_REMOTE_DISPLAY: {
226 CHECK_INTERFACE(IMediaPlayerService, data, reply);
Andreas Huberab1bd842012-08-30 14:51:40 -0700227 const char *iface = NULL;
228 if (data.readInt32()) {
229 iface = data.readCString();
230 }
231 reply->writeInt32(enableRemoteDisplay(iface));
Andreas Huber35213f12012-08-29 11:41:50 -0700232 return NO_ERROR;
233 } break;
Gloria Wang7cf180c2011-02-19 18:37:57 -0800234 case ADD_BATTERY_DATA: {
235 CHECK_INTERFACE(IMediaPlayerService, data, reply);
236 uint32_t params = data.readInt32();
237 addBatteryData(params);
238 return NO_ERROR;
239 } break;
240 case PULL_BATTERY_DATA: {
241 CHECK_INTERFACE(IMediaPlayerService, data, reply);
242 pullBatteryData(reply);
243 return NO_ERROR;
244 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800245 default:
246 return BBinder::onTransact(code, data, reply, flags);
247 }
248}
249
250// ----------------------------------------------------------------------------
251
252}; // namespace android