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