IMediaPlayerService.cpp revision 441a78d5e224e0d67f9b52fa9adc795c6944159b
1/*
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
21#include <binder/Parcel.h>
22#include <binder/IMemory.h>
23#include <media/ICrypto.h>
24#include <media/IDrm.h>
25#include <media/IHDCP.h>
26#include <media/IMediaPlayerService.h>
27#include <media/IMediaRecorder.h>
28#include <media/IOMX.h>
29#include <media/IRemoteDisplay.h>
30#include <media/IRemoteDisplayClient.h>
31#include <media/IStreamSource.h>
32
33#include <utils/Errors.h>  // for status_t
34#include <utils/String8.h>
35
36namespace android {
37
38enum {
39    CREATE = IBinder::FIRST_CALL_TRANSACTION,
40    DECODE_URL,
41    DECODE_FD,
42    CREATE_MEDIA_RECORDER,
43    CREATE_METADATA_RETRIEVER,
44    GET_OMX,
45    MAKE_CRYPTO,
46    MAKE_DRM,
47    MAKE_HDCP,
48    ADD_BATTERY_DATA,
49    PULL_BATTERY_DATA,
50    LISTEN_FOR_REMOTE_DISPLAY,
51};
52
53class BpMediaPlayerService: public BpInterface<IMediaPlayerService>
54{
55public:
56    BpMediaPlayerService(const sp<IBinder>& impl)
57        : BpInterface<IMediaPlayerService>(impl)
58    {
59    }
60
61    virtual sp<IMediaMetadataRetriever> createMetadataRetriever()
62    {
63        Parcel data, reply;
64        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
65        remote()->transact(CREATE_METADATA_RETRIEVER, data, &reply);
66        return interface_cast<IMediaMetadataRetriever>(reply.readStrongBinder());
67    }
68
69    virtual sp<IMediaPlayer> create(
70            const sp<IMediaPlayerClient>& client, int audioSessionId) {
71        Parcel data, reply;
72        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
73        data.writeStrongBinder(client->asBinder());
74        data.writeInt32(audioSessionId);
75
76        remote()->transact(CREATE, data, &reply);
77        return interface_cast<IMediaPlayer>(reply.readStrongBinder());
78    }
79
80    virtual sp<IMediaRecorder> createMediaRecorder()
81    {
82        Parcel data, reply;
83        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
84        remote()->transact(CREATE_MEDIA_RECORDER, data, &reply);
85        return interface_cast<IMediaRecorder>(reply.readStrongBinder());
86    }
87
88    virtual sp<IMemory> decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, audio_format_t* pFormat)
89    {
90        Parcel data, reply;
91        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
92        data.writeCString(url);
93        remote()->transact(DECODE_URL, data, &reply);
94        *pSampleRate = uint32_t(reply.readInt32());
95        *pNumChannels = reply.readInt32();
96        *pFormat = (audio_format_t) reply.readInt32();
97        return interface_cast<IMemory>(reply.readStrongBinder());
98    }
99
100    virtual sp<IMemory> decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, audio_format_t* pFormat)
101    {
102        Parcel data, reply;
103        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
104        data.writeFileDescriptor(fd);
105        data.writeInt64(offset);
106        data.writeInt64(length);
107        remote()->transact(DECODE_FD, data, &reply);
108        *pSampleRate = uint32_t(reply.readInt32());
109        *pNumChannels = reply.readInt32();
110        *pFormat = (audio_format_t) reply.readInt32();
111        return interface_cast<IMemory>(reply.readStrongBinder());
112    }
113
114    virtual sp<IOMX> getOMX() {
115        Parcel data, reply;
116        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
117        remote()->transact(GET_OMX, data, &reply);
118        return interface_cast<IOMX>(reply.readStrongBinder());
119    }
120
121    virtual sp<ICrypto> makeCrypto() {
122        Parcel data, reply;
123        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
124        remote()->transact(MAKE_CRYPTO, data, &reply);
125        return interface_cast<ICrypto>(reply.readStrongBinder());
126    }
127
128    virtual sp<IDrm> makeDrm() {
129        Parcel data, reply;
130        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
131        remote()->transact(MAKE_DRM, data, &reply);
132        return interface_cast<IDrm>(reply.readStrongBinder());
133    }
134
135    virtual sp<IHDCP> makeHDCP(bool createEncryptionModule) {
136        Parcel data, reply;
137        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
138        data.writeInt32(createEncryptionModule);
139        remote()->transact(MAKE_HDCP, data, &reply);
140        return interface_cast<IHDCP>(reply.readStrongBinder());
141    }
142
143    virtual void addBatteryData(uint32_t params) {
144        Parcel data, reply;
145        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
146        data.writeInt32(params);
147        remote()->transact(ADD_BATTERY_DATA, data, &reply);
148    }
149
150    virtual status_t pullBatteryData(Parcel* reply) {
151        Parcel data;
152        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
153        return remote()->transact(PULL_BATTERY_DATA, data, reply);
154    }
155
156    virtual sp<IRemoteDisplay> listenForRemoteDisplay(const sp<IRemoteDisplayClient>& client,
157            const String8& iface)
158    {
159        Parcel data, reply;
160        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
161        data.writeStrongBinder(client->asBinder());
162        data.writeString8(iface);
163        remote()->transact(LISTEN_FOR_REMOTE_DISPLAY, data, &reply);
164        return interface_cast<IRemoteDisplay>(reply.readStrongBinder());
165    }
166};
167
168IMPLEMENT_META_INTERFACE(MediaPlayerService, "android.media.IMediaPlayerService");
169
170// ----------------------------------------------------------------------
171
172status_t BnMediaPlayerService::onTransact(
173    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
174{
175    switch (code) {
176        case CREATE: {
177            CHECK_INTERFACE(IMediaPlayerService, data, reply);
178            sp<IMediaPlayerClient> client =
179                interface_cast<IMediaPlayerClient>(data.readStrongBinder());
180            int audioSessionId = data.readInt32();
181            sp<IMediaPlayer> player = create(client, audioSessionId);
182            reply->writeStrongBinder(player->asBinder());
183            return NO_ERROR;
184        } break;
185        case DECODE_URL: {
186            CHECK_INTERFACE(IMediaPlayerService, data, reply);
187            const char* url = data.readCString();
188            uint32_t sampleRate;
189            int numChannels;
190            audio_format_t format;
191            sp<IMemory> player = decode(url, &sampleRate, &numChannels, &format);
192            reply->writeInt32(sampleRate);
193            reply->writeInt32(numChannels);
194            reply->writeInt32((int32_t) format);
195            reply->writeStrongBinder(player->asBinder());
196            return NO_ERROR;
197        } break;
198        case DECODE_FD: {
199            CHECK_INTERFACE(IMediaPlayerService, data, reply);
200            int fd = dup(data.readFileDescriptor());
201            int64_t offset = data.readInt64();
202            int64_t length = data.readInt64();
203            uint32_t sampleRate;
204            int numChannels;
205            audio_format_t format;
206            sp<IMemory> player = decode(fd, offset, length, &sampleRate, &numChannels, &format);
207            reply->writeInt32(sampleRate);
208            reply->writeInt32(numChannels);
209            reply->writeInt32((int32_t) format);
210            reply->writeStrongBinder(player->asBinder());
211            return NO_ERROR;
212        } break;
213        case CREATE_MEDIA_RECORDER: {
214            CHECK_INTERFACE(IMediaPlayerService, data, reply);
215            sp<IMediaRecorder> recorder = createMediaRecorder();
216            reply->writeStrongBinder(recorder->asBinder());
217            return NO_ERROR;
218        } break;
219        case CREATE_METADATA_RETRIEVER: {
220            CHECK_INTERFACE(IMediaPlayerService, data, reply);
221            sp<IMediaMetadataRetriever> retriever = createMetadataRetriever();
222            reply->writeStrongBinder(retriever->asBinder());
223            return NO_ERROR;
224        } break;
225        case GET_OMX: {
226            CHECK_INTERFACE(IMediaPlayerService, data, reply);
227            sp<IOMX> omx = getOMX();
228            reply->writeStrongBinder(omx->asBinder());
229            return NO_ERROR;
230        } break;
231        case MAKE_CRYPTO: {
232            CHECK_INTERFACE(IMediaPlayerService, data, reply);
233            sp<ICrypto> crypto = makeCrypto();
234            reply->writeStrongBinder(crypto->asBinder());
235            return NO_ERROR;
236        } break;
237        case MAKE_DRM: {
238            CHECK_INTERFACE(IMediaPlayerService, data, reply);
239            sp<IDrm> drm = makeDrm();
240            reply->writeStrongBinder(drm->asBinder());
241            return NO_ERROR;
242        } break;
243        case MAKE_HDCP: {
244            CHECK_INTERFACE(IMediaPlayerService, data, reply);
245            bool createEncryptionModule = data.readInt32();
246            sp<IHDCP> hdcp = makeHDCP(createEncryptionModule);
247            reply->writeStrongBinder(hdcp->asBinder());
248            return NO_ERROR;
249        } break;
250        case ADD_BATTERY_DATA: {
251            CHECK_INTERFACE(IMediaPlayerService, data, reply);
252            uint32_t params = data.readInt32();
253            addBatteryData(params);
254            return NO_ERROR;
255        } break;
256        case PULL_BATTERY_DATA: {
257            CHECK_INTERFACE(IMediaPlayerService, data, reply);
258            pullBatteryData(reply);
259            return NO_ERROR;
260        } break;
261        case LISTEN_FOR_REMOTE_DISPLAY: {
262            CHECK_INTERFACE(IMediaPlayerService, data, reply);
263            sp<IRemoteDisplayClient> client(
264                    interface_cast<IRemoteDisplayClient>(data.readStrongBinder()));
265            String8 iface(data.readString8());
266            sp<IRemoteDisplay> display(listenForRemoteDisplay(client, iface));
267            reply->writeStrongBinder(display->asBinder());
268            return NO_ERROR;
269        } break;
270        default:
271            return BBinder::onTransact(code, data, reply, flags);
272    }
273}
274
275// ----------------------------------------------------------------------------
276
277}; // namespace android
278