blob: 912061738bfe84cd70e6a1fa922074e925f7269c [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>
Andreas Huber9b8e4962012-03-26 11:13:27 -070023#include <media/ICrypto.h>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080024#include <media/IMediaPlayerService.h>
25#include <media/IMediaRecorder.h>
Andreas Hubere46b7be2009-07-14 16:56:47 -070026#include <media/IOMX.h>
Andreas Huber52b52cd2010-11-23 11:41:34 -080027#include <media/IStreamSource.h>
Andreas Hubere46b7be2009-07-14 16:56:47 -070028
29#include <utils/Errors.h> // for status_t
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080030
31namespace android {
32
33enum {
Dave Burkefc301b02011-08-30 14:39:17 +010034 CREATE = IBinder::FIRST_CALL_TRANSACTION,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080035 DECODE_URL,
36 DECODE_FD,
37 CREATE_MEDIA_RECORDER,
38 CREATE_METADATA_RETRIEVER,
Gloria Wangd211f412011-02-19 18:37:57 -080039 GET_OMX,
Andreas Huber9b8e4962012-03-26 11:13:27 -070040 MAKE_CRYPTO,
Gloria Wangd211f412011-02-19 18:37:57 -080041 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(
Dave Burkefc301b02011-08-30 14:39:17 +010063 pid_t pid, const sp<IMediaPlayerClient>& client, int audioSessionId) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080064 Parcel data, reply;
65 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
66 data.writeInt32(pid);
67 data.writeStrongBinder(client->asBinder());
Eric Laurent619346f2010-06-21 09:27:30 -070068 data.writeInt32(audioSessionId);
Andreas Huber25643002010-01-28 11:19:57 -080069
Dave Burkefc301b02011-08-30 14:39:17 +010070 remote()->transact(CREATE, data, &reply);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080071 return interface_cast<IMediaPlayer>(reply.readStrongBinder());
72 }
73
74 virtual sp<IMediaRecorder> createMediaRecorder(pid_t pid)
75 {
76 Parcel data, reply;
77 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
78 data.writeInt32(pid);
79 remote()->transact(CREATE_MEDIA_RECORDER, data, &reply);
80 return interface_cast<IMediaRecorder>(reply.readStrongBinder());
81 }
82
Glenn Kasten1c5a89d2012-01-04 09:36:37 -080083 virtual sp<IMemory> decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, audio_format_t* pFormat)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080084 {
85 Parcel data, reply;
86 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
87 data.writeCString(url);
88 remote()->transact(DECODE_URL, data, &reply);
89 *pSampleRate = uint32_t(reply.readInt32());
90 *pNumChannels = reply.readInt32();
Glenn Kasten1c5a89d2012-01-04 09:36:37 -080091 *pFormat = (audio_format_t) reply.readInt32();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080092 return interface_cast<IMemory>(reply.readStrongBinder());
93 }
94
Glenn Kasten1c5a89d2012-01-04 09:36:37 -080095 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 Project9066cfe2009-03-03 19:31:44 -080096 {
97 Parcel data, reply;
98 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
99 data.writeFileDescriptor(fd);
100 data.writeInt64(offset);
101 data.writeInt64(length);
102 remote()->transact(DECODE_FD, data, &reply);
103 *pSampleRate = uint32_t(reply.readInt32());
104 *pNumChannels = reply.readInt32();
Glenn Kasten1c5a89d2012-01-04 09:36:37 -0800105 *pFormat = (audio_format_t) reply.readInt32();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800106 return interface_cast<IMemory>(reply.readStrongBinder());
107 }
Andreas Hubere46b7be2009-07-14 16:56:47 -0700108
Andreas Huber784202e2009-10-15 13:46:54 -0700109 virtual sp<IOMX> getOMX() {
Andreas Hubere46b7be2009-07-14 16:56:47 -0700110 Parcel data, reply;
111 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
Andreas Huber784202e2009-10-15 13:46:54 -0700112 remote()->transact(GET_OMX, data, &reply);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700113 return interface_cast<IOMX>(reply.readStrongBinder());
114 }
Gloria Wangd211f412011-02-19 18:37:57 -0800115
Andreas Huber9b8e4962012-03-26 11:13:27 -0700116 virtual sp<ICrypto> makeCrypto() {
117 Parcel data, reply;
118 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
119 remote()->transact(MAKE_CRYPTO, data, &reply);
120 return interface_cast<ICrypto>(reply.readStrongBinder());
121 }
122
Gloria Wangd211f412011-02-19 18:37:57 -0800123 virtual void addBatteryData(uint32_t params) {
124 Parcel data, reply;
125 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
126 data.writeInt32(params);
127 remote()->transact(ADD_BATTERY_DATA, data, &reply);
128 }
129
130 virtual status_t pullBatteryData(Parcel* reply) {
131 Parcel data;
132 data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
133 return remote()->transact(PULL_BATTERY_DATA, data, reply);
134 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800135};
136
nikodcd810d2009-06-22 08:49:52 -0700137IMPLEMENT_META_INTERFACE(MediaPlayerService, "android.media.IMediaPlayerService");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800138
139// ----------------------------------------------------------------------
140
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800141status_t BnMediaPlayerService::onTransact(
142 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
143{
Glenn Kasten18db49a2012-03-12 16:29:55 -0700144 switch (code) {
Dave Burkefc301b02011-08-30 14:39:17 +0100145 case CREATE: {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800146 CHECK_INTERFACE(IMediaPlayerService, data, reply);
147 pid_t pid = data.readInt32();
Andreas Huber25643002010-01-28 11:19:57 -0800148 sp<IMediaPlayerClient> client =
149 interface_cast<IMediaPlayerClient>(data.readStrongBinder());
Eric Laurent619346f2010-06-21 09:27:30 -0700150 int audioSessionId = data.readInt32();
Dave Burkefc301b02011-08-30 14:39:17 +0100151 sp<IMediaPlayer> player = create(pid, client, audioSessionId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800152 reply->writeStrongBinder(player->asBinder());
153 return NO_ERROR;
154 } break;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800155 case DECODE_URL: {
156 CHECK_INTERFACE(IMediaPlayerService, data, reply);
157 const char* url = data.readCString();
158 uint32_t sampleRate;
159 int numChannels;
Glenn Kasten1c5a89d2012-01-04 09:36:37 -0800160 audio_format_t format;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800161 sp<IMemory> player = decode(url, &sampleRate, &numChannels, &format);
162 reply->writeInt32(sampleRate);
163 reply->writeInt32(numChannels);
Glenn Kasten1c5a89d2012-01-04 09:36:37 -0800164 reply->writeInt32((int32_t) format);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800165 reply->writeStrongBinder(player->asBinder());
166 return NO_ERROR;
167 } break;
168 case DECODE_FD: {
169 CHECK_INTERFACE(IMediaPlayerService, data, reply);
170 int fd = dup(data.readFileDescriptor());
171 int64_t offset = data.readInt64();
172 int64_t length = data.readInt64();
173 uint32_t sampleRate;
174 int numChannels;
Glenn Kasten1c5a89d2012-01-04 09:36:37 -0800175 audio_format_t format;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800176 sp<IMemory> player = decode(fd, offset, length, &sampleRate, &numChannels, &format);
177 reply->writeInt32(sampleRate);
178 reply->writeInt32(numChannels);
Glenn Kasten1c5a89d2012-01-04 09:36:37 -0800179 reply->writeInt32((int32_t) format);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800180 reply->writeStrongBinder(player->asBinder());
181 return NO_ERROR;
182 } break;
183 case CREATE_MEDIA_RECORDER: {
184 CHECK_INTERFACE(IMediaPlayerService, data, reply);
185 pid_t pid = data.readInt32();
186 sp<IMediaRecorder> recorder = createMediaRecorder(pid);
187 reply->writeStrongBinder(recorder->asBinder());
188 return NO_ERROR;
189 } break;
190 case CREATE_METADATA_RETRIEVER: {
191 CHECK_INTERFACE(IMediaPlayerService, data, reply);
192 pid_t pid = data.readInt32();
193 sp<IMediaMetadataRetriever> retriever = createMetadataRetriever(pid);
194 reply->writeStrongBinder(retriever->asBinder());
195 return NO_ERROR;
196 } break;
Andreas Huber784202e2009-10-15 13:46:54 -0700197 case GET_OMX: {
Andreas Hubere46b7be2009-07-14 16:56:47 -0700198 CHECK_INTERFACE(IMediaPlayerService, data, reply);
Andreas Huber784202e2009-10-15 13:46:54 -0700199 sp<IOMX> omx = getOMX();
Andreas Hubere46b7be2009-07-14 16:56:47 -0700200 reply->writeStrongBinder(omx->asBinder());
201 return NO_ERROR;
202 } break;
Andreas Huber9b8e4962012-03-26 11:13:27 -0700203 case MAKE_CRYPTO: {
204 CHECK_INTERFACE(IMediaPlayerService, data, reply);
205 sp<ICrypto> crypto = makeCrypto();
206 reply->writeStrongBinder(crypto->asBinder());
207 return NO_ERROR;
208 } break;
Gloria Wangd211f412011-02-19 18:37:57 -0800209 case ADD_BATTERY_DATA: {
210 CHECK_INTERFACE(IMediaPlayerService, data, reply);
211 uint32_t params = data.readInt32();
212 addBatteryData(params);
213 return NO_ERROR;
214 } break;
215 case PULL_BATTERY_DATA: {
216 CHECK_INTERFACE(IMediaPlayerService, data, reply);
217 pullBatteryData(reply);
218 return NO_ERROR;
219 } break;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800220 default:
221 return BBinder::onTransact(code, data, reply, flags);
222 }
223}
224
225// ----------------------------------------------------------------------------
226
227}; // namespace android