blob: 41969b1b27aa34b5be00c5112748ad0fbd0c36b1 [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 Huber35213f12012-08-29 11:41:50 -0700124 virtual status_t enableRemoteDisplay(bool enable) {
125 Parcel data, reply;
126 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
127 data.writeInt32(enable);
128 remote()->transact(ENABLE_REMOTE_DISPLAY, data, &reply);
129 return reply.readInt32();
130 }
131
Gloria Wang7cf180c2011-02-19 18:37:57 -0800132 virtual void addBatteryData(uint32_t params) {
133 Parcel data, reply;
134 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
135 data.writeInt32(params);
136 remote()->transact(ADD_BATTERY_DATA, data, &reply);
137 }
138
139 virtual status_t pullBatteryData(Parcel* reply) {
140 Parcel data;
141 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
142 return remote()->transact(PULL_BATTERY_DATA, data, reply);
143 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800144};
145
niko56f0cc52009-06-22 08:49:52 -0700146IMPLEMENT_META_INTERFACE(MediaPlayerService, "android.media.IMediaPlayerService");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800147
148// ----------------------------------------------------------------------
149
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800150status_t BnMediaPlayerService::onTransact(
151 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
152{
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700153 switch (code) {
Dave Burked681bbb2011-08-30 14:39:17 +0100154 case CREATE: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800155 CHECK_INTERFACE(IMediaPlayerService, data, reply);
156 pid_t pid = data.readInt32();
Andreas Huber2db84552010-01-28 11:19:57 -0800157 sp<IMediaPlayerClient> client =
158 interface_cast<IMediaPlayerClient>(data.readStrongBinder());
Eric Laurenta514bdb2010-06-21 09:27:30 -0700159 int audioSessionId = data.readInt32();
Dave Burked681bbb2011-08-30 14:39:17 +0100160 sp<IMediaPlayer> player = create(pid, client, audioSessionId);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800161 reply->writeStrongBinder(player->asBinder());
162 return NO_ERROR;
163 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800164 case DECODE_URL: {
165 CHECK_INTERFACE(IMediaPlayerService, data, reply);
166 const char* url = data.readCString();
167 uint32_t sampleRate;
168 int numChannels;
Glenn Kastene1c39622012-01-04 09:36:37 -0800169 audio_format_t format;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800170 sp<IMemory> player = decode(url, &sampleRate, &numChannels, &format);
171 reply->writeInt32(sampleRate);
172 reply->writeInt32(numChannels);
Glenn Kastene1c39622012-01-04 09:36:37 -0800173 reply->writeInt32((int32_t) format);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800174 reply->writeStrongBinder(player->asBinder());
175 return NO_ERROR;
176 } break;
177 case DECODE_FD: {
178 CHECK_INTERFACE(IMediaPlayerService, data, reply);
179 int fd = dup(data.readFileDescriptor());
180 int64_t offset = data.readInt64();
181 int64_t length = data.readInt64();
182 uint32_t sampleRate;
183 int numChannels;
Glenn Kastene1c39622012-01-04 09:36:37 -0800184 audio_format_t format;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800185 sp<IMemory> player = decode(fd, offset, length, &sampleRate, &numChannels, &format);
186 reply->writeInt32(sampleRate);
187 reply->writeInt32(numChannels);
Glenn Kastene1c39622012-01-04 09:36:37 -0800188 reply->writeInt32((int32_t) format);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800189 reply->writeStrongBinder(player->asBinder());
190 return NO_ERROR;
191 } break;
192 case CREATE_MEDIA_RECORDER: {
193 CHECK_INTERFACE(IMediaPlayerService, data, reply);
194 pid_t pid = data.readInt32();
195 sp<IMediaRecorder> recorder = createMediaRecorder(pid);
196 reply->writeStrongBinder(recorder->asBinder());
197 return NO_ERROR;
198 } break;
199 case CREATE_METADATA_RETRIEVER: {
200 CHECK_INTERFACE(IMediaPlayerService, data, reply);
201 pid_t pid = data.readInt32();
202 sp<IMediaMetadataRetriever> retriever = createMetadataRetriever(pid);
203 reply->writeStrongBinder(retriever->asBinder());
204 return NO_ERROR;
205 } break;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700206 case GET_OMX: {
Andreas Huber20111aa2009-07-14 16:56:47 -0700207 CHECK_INTERFACE(IMediaPlayerService, data, reply);
Andreas Huber318ad9c2009-10-15 13:46:54 -0700208 sp<IOMX> omx = getOMX();
Andreas Huber20111aa2009-07-14 16:56:47 -0700209 reply->writeStrongBinder(omx->asBinder());
210 return NO_ERROR;
211 } break;
Andreas Hubered3e3e02012-03-26 11:13:27 -0700212 case MAKE_CRYPTO: {
213 CHECK_INTERFACE(IMediaPlayerService, data, reply);
214 sp<ICrypto> crypto = makeCrypto();
215 reply->writeStrongBinder(crypto->asBinder());
216 return NO_ERROR;
217 } break;
Andreas Huber35213f12012-08-29 11:41:50 -0700218 case ENABLE_REMOTE_DISPLAY: {
219 CHECK_INTERFACE(IMediaPlayerService, data, reply);
220 bool enable = data.readInt32();
221 reply->writeInt32(enableRemoteDisplay(enable));
222 return NO_ERROR;
223 } break;
Gloria Wang7cf180c2011-02-19 18:37:57 -0800224 case ADD_BATTERY_DATA: {
225 CHECK_INTERFACE(IMediaPlayerService, data, reply);
226 uint32_t params = data.readInt32();
227 addBatteryData(params);
228 return NO_ERROR;
229 } break;
230 case PULL_BATTERY_DATA: {
231 CHECK_INTERFACE(IMediaPlayerService, data, reply);
232 pullBatteryData(reply);
233 return NO_ERROR;
234 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800235 default:
236 return BBinder::onTransact(code, data, reply, flags);
237 }
238}
239
240// ----------------------------------------------------------------------------
241
242}; // namespace android