• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/IMediaCodecList.h>
24 #include <media/IMediaHTTPService.h>
25 #include <media/IMediaPlayerService.h>
26 #include <media/IMediaPlayer.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 
36 namespace android {
37 
38 enum {
39     CREATE = IBinder::FIRST_CALL_TRANSACTION,
40     CREATE_MEDIA_RECORDER,
41     CREATE_METADATA_RETRIEVER,
42     ADD_BATTERY_DATA,
43     PULL_BATTERY_DATA,
44     LISTEN_FOR_REMOTE_DISPLAY,
45     GET_CODEC_LIST,
46 };
47 
48 class BpMediaPlayerService: public BpInterface<IMediaPlayerService>
49 {
50 public:
BpMediaPlayerService(const sp<IBinder> & impl)51     explicit BpMediaPlayerService(const sp<IBinder>& impl)
52         : BpInterface<IMediaPlayerService>(impl)
53     {
54     }
55 
createMetadataRetriever()56     virtual sp<IMediaMetadataRetriever> createMetadataRetriever()
57     {
58         Parcel data, reply;
59         data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
60         remote()->transact(CREATE_METADATA_RETRIEVER, data, &reply);
61         return interface_cast<IMediaMetadataRetriever>(reply.readStrongBinder());
62     }
63 
create(const sp<IMediaPlayerClient> & client,audio_session_t audioSessionId,const std::string opPackageName)64     virtual sp<IMediaPlayer> create(
65             const sp<IMediaPlayerClient>& client, audio_session_t audioSessionId,
66             const std::string opPackageName) {
67         Parcel data, reply;
68         data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
69         data.writeStrongBinder(IInterface::asBinder(client));
70         data.writeInt32(audioSessionId);
71         data.writeCString(opPackageName.c_str());
72 
73         remote()->transact(CREATE, data, &reply);
74         return interface_cast<IMediaPlayer>(reply.readStrongBinder());
75     }
76 
createMediaRecorder(const String16 & opPackageName)77     virtual sp<IMediaRecorder> createMediaRecorder(const String16 &opPackageName)
78     {
79         Parcel data, reply;
80         data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
81         data.writeString16(opPackageName);
82         remote()->transact(CREATE_MEDIA_RECORDER, data, &reply);
83         return interface_cast<IMediaRecorder>(reply.readStrongBinder());
84     }
85 
addBatteryData(uint32_t params)86     virtual void addBatteryData(uint32_t params) {
87         Parcel data, reply;
88         data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
89         data.writeInt32(params);
90         remote()->transact(ADD_BATTERY_DATA, data, &reply);
91     }
92 
pullBatteryData(Parcel * reply)93     virtual status_t pullBatteryData(Parcel* reply) {
94         Parcel data;
95         data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
96         return remote()->transact(PULL_BATTERY_DATA, data, reply);
97     }
98 
listenForRemoteDisplay(const String16 & opPackageName,const sp<IRemoteDisplayClient> & client,const String8 & iface)99     virtual sp<IRemoteDisplay> listenForRemoteDisplay(const String16 &opPackageName,
100             const sp<IRemoteDisplayClient>& client, const String8& iface)
101     {
102         Parcel data, reply;
103         data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
104         data.writeString16(opPackageName);
105         data.writeStrongBinder(IInterface::asBinder(client));
106         data.writeString8(iface);
107         remote()->transact(LISTEN_FOR_REMOTE_DISPLAY, data, &reply);
108         return interface_cast<IRemoteDisplay>(reply.readStrongBinder());
109     }
110 
getCodecList() const111     virtual sp<IMediaCodecList> getCodecList() const {
112         Parcel data, reply;
113         data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
114         remote()->transact(GET_CODEC_LIST, data, &reply);
115         return interface_cast<IMediaCodecList>(reply.readStrongBinder());
116     }
117 };
118 
119 IMPLEMENT_META_INTERFACE(MediaPlayerService, "android.media.IMediaPlayerService");
120 
121 // ----------------------------------------------------------------------
122 
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)123 status_t BnMediaPlayerService::onTransact(
124     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
125 {
126     switch (code) {
127         case CREATE: {
128             CHECK_INTERFACE(IMediaPlayerService, data, reply);
129             sp<IMediaPlayerClient> client =
130                 interface_cast<IMediaPlayerClient>(data.readStrongBinder());
131             audio_session_t audioSessionId = (audio_session_t) data.readInt32();
132             const char* opPackageName = data.readCString();
133             if (opPackageName == nullptr) {
134                 return FAILED_TRANSACTION;
135             }
136             std::string opPackageNameStr(opPackageName);
137             sp<IMediaPlayer> player = create(client, audioSessionId, opPackageNameStr);
138             reply->writeStrongBinder(IInterface::asBinder(player));
139             return NO_ERROR;
140         } break;
141         case CREATE_MEDIA_RECORDER: {
142             CHECK_INTERFACE(IMediaPlayerService, data, reply);
143             const String16 opPackageName = data.readString16();
144             sp<IMediaRecorder> recorder = createMediaRecorder(opPackageName);
145             reply->writeStrongBinder(IInterface::asBinder(recorder));
146             return NO_ERROR;
147         } break;
148         case CREATE_METADATA_RETRIEVER: {
149             CHECK_INTERFACE(IMediaPlayerService, data, reply);
150             sp<IMediaMetadataRetriever> retriever = createMetadataRetriever();
151             reply->writeStrongBinder(IInterface::asBinder(retriever));
152             return NO_ERROR;
153         } break;
154         case ADD_BATTERY_DATA: {
155             CHECK_INTERFACE(IMediaPlayerService, data, reply);
156             uint32_t params = data.readInt32();
157             addBatteryData(params);
158             return NO_ERROR;
159         } break;
160         case PULL_BATTERY_DATA: {
161             CHECK_INTERFACE(IMediaPlayerService, data, reply);
162             pullBatteryData(reply);
163             return NO_ERROR;
164         } break;
165         case LISTEN_FOR_REMOTE_DISPLAY: {
166             CHECK_INTERFACE(IMediaPlayerService, data, reply);
167             const String16 opPackageName = data.readString16();
168             sp<IRemoteDisplayClient> client(
169                     interface_cast<IRemoteDisplayClient>(data.readStrongBinder()));
170             if (client == NULL) {
171                 reply->writeStrongBinder(NULL);
172                 return NO_ERROR;
173             }
174             String8 iface(data.readString8());
175             sp<IRemoteDisplay> display(listenForRemoteDisplay(opPackageName, client, iface));
176             reply->writeStrongBinder(IInterface::asBinder(display));
177             return NO_ERROR;
178         } break;
179         case GET_CODEC_LIST: {
180             CHECK_INTERFACE(IMediaPlayerService, data, reply);
181             sp<IMediaCodecList> mcl = getCodecList();
182             reply->writeStrongBinder(IInterface::asBinder(mcl));
183             return NO_ERROR;
184         } break;
185         default:
186             return BBinder::onTransact(code, data, reply, flags);
187     }
188 }
189 
190 // ----------------------------------------------------------------------------
191 
192 } // namespace android
193