1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker **
3*ec779b8eSAndroid Build Coastguard Worker ** Copyright 2008, The Android Open Source Project
4*ec779b8eSAndroid Build Coastguard Worker **
5*ec779b8eSAndroid Build Coastguard Worker ** Licensed under the Apache License, Version 2.0 (the "License");
6*ec779b8eSAndroid Build Coastguard Worker ** you may not use this file except in compliance with the License.
7*ec779b8eSAndroid Build Coastguard Worker ** You may obtain a copy of the License at
8*ec779b8eSAndroid Build Coastguard Worker **
9*ec779b8eSAndroid Build Coastguard Worker ** http://www.apache.org/licenses/LICENSE-2.0
10*ec779b8eSAndroid Build Coastguard Worker **
11*ec779b8eSAndroid Build Coastguard Worker ** Unless required by applicable law or agreed to in writing, software
12*ec779b8eSAndroid Build Coastguard Worker ** distributed under the License is distributed on an "AS IS" BASIS,
13*ec779b8eSAndroid Build Coastguard Worker ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*ec779b8eSAndroid Build Coastguard Worker ** See the License for the specific language governing permissions and
15*ec779b8eSAndroid Build Coastguard Worker ** limitations under the License.
16*ec779b8eSAndroid Build Coastguard Worker */
17*ec779b8eSAndroid Build Coastguard Worker
18*ec779b8eSAndroid Build Coastguard Worker #include <stdint.h>
19*ec779b8eSAndroid Build Coastguard Worker #include <sys/types.h>
20*ec779b8eSAndroid Build Coastguard Worker
21*ec779b8eSAndroid Build Coastguard Worker #include <binder/Parcel.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <binder/IMemory.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <media/IMediaCodecList.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <media/IMediaHTTPService.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <media/IMediaPlayerService.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <media/IMediaPlayer.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <media/IMediaRecorder.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <media/IOMX.h>
29*ec779b8eSAndroid Build Coastguard Worker #include <media/IRemoteDisplay.h>
30*ec779b8eSAndroid Build Coastguard Worker #include <media/IRemoteDisplayClient.h>
31*ec779b8eSAndroid Build Coastguard Worker #include <media/IStreamSource.h>
32*ec779b8eSAndroid Build Coastguard Worker
33*ec779b8eSAndroid Build Coastguard Worker #include <utils/Errors.h> // for status_t
34*ec779b8eSAndroid Build Coastguard Worker #include <utils/String8.h>
35*ec779b8eSAndroid Build Coastguard Worker
36*ec779b8eSAndroid Build Coastguard Worker namespace android {
37*ec779b8eSAndroid Build Coastguard Worker
38*ec779b8eSAndroid Build Coastguard Worker using android::content::AttributionSourceState;
39*ec779b8eSAndroid Build Coastguard Worker
40*ec779b8eSAndroid Build Coastguard Worker enum {
41*ec779b8eSAndroid Build Coastguard Worker CREATE = IBinder::FIRST_CALL_TRANSACTION,
42*ec779b8eSAndroid Build Coastguard Worker CREATE_MEDIA_RECORDER,
43*ec779b8eSAndroid Build Coastguard Worker CREATE_METADATA_RETRIEVER,
44*ec779b8eSAndroid Build Coastguard Worker ADD_BATTERY_DATA,
45*ec779b8eSAndroid Build Coastguard Worker PULL_BATTERY_DATA,
46*ec779b8eSAndroid Build Coastguard Worker LISTEN_FOR_REMOTE_DISPLAY,
47*ec779b8eSAndroid Build Coastguard Worker GET_CODEC_LIST,
48*ec779b8eSAndroid Build Coastguard Worker };
49*ec779b8eSAndroid Build Coastguard Worker
50*ec779b8eSAndroid Build Coastguard Worker class BpMediaPlayerService: public BpInterface<IMediaPlayerService>
51*ec779b8eSAndroid Build Coastguard Worker {
52*ec779b8eSAndroid Build Coastguard Worker public:
BpMediaPlayerService(const sp<IBinder> & impl)53*ec779b8eSAndroid Build Coastguard Worker explicit BpMediaPlayerService(const sp<IBinder>& impl)
54*ec779b8eSAndroid Build Coastguard Worker : BpInterface<IMediaPlayerService>(impl)
55*ec779b8eSAndroid Build Coastguard Worker {
56*ec779b8eSAndroid Build Coastguard Worker }
57*ec779b8eSAndroid Build Coastguard Worker
createMetadataRetriever()58*ec779b8eSAndroid Build Coastguard Worker virtual sp<IMediaMetadataRetriever> createMetadataRetriever()
59*ec779b8eSAndroid Build Coastguard Worker {
60*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
61*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
62*ec779b8eSAndroid Build Coastguard Worker remote()->transact(CREATE_METADATA_RETRIEVER, data, &reply);
63*ec779b8eSAndroid Build Coastguard Worker return interface_cast<IMediaMetadataRetriever>(reply.readStrongBinder());
64*ec779b8eSAndroid Build Coastguard Worker }
65*ec779b8eSAndroid Build Coastguard Worker
create(const sp<IMediaPlayerClient> & client,audio_session_t audioSessionId,const AttributionSourceState & attributionSource)66*ec779b8eSAndroid Build Coastguard Worker virtual sp<IMediaPlayer> create(
67*ec779b8eSAndroid Build Coastguard Worker const sp<IMediaPlayerClient>& client, audio_session_t audioSessionId,
68*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& attributionSource) {
69*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
70*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
71*ec779b8eSAndroid Build Coastguard Worker data.writeStrongBinder(IInterface::asBinder(client));
72*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(audioSessionId);
73*ec779b8eSAndroid Build Coastguard Worker data.writeParcelable(attributionSource);
74*ec779b8eSAndroid Build Coastguard Worker
75*ec779b8eSAndroid Build Coastguard Worker remote()->transact(CREATE, data, &reply);
76*ec779b8eSAndroid Build Coastguard Worker return interface_cast<IMediaPlayer>(reply.readStrongBinder());
77*ec779b8eSAndroid Build Coastguard Worker }
78*ec779b8eSAndroid Build Coastguard Worker
createMediaRecorder(const AttributionSourceState & attributionSource)79*ec779b8eSAndroid Build Coastguard Worker virtual sp<IMediaRecorder> createMediaRecorder(const AttributionSourceState& attributionSource)
80*ec779b8eSAndroid Build Coastguard Worker {
81*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
82*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
83*ec779b8eSAndroid Build Coastguard Worker data.writeParcelable(attributionSource);
84*ec779b8eSAndroid Build Coastguard Worker remote()->transact(CREATE_MEDIA_RECORDER, data, &reply);
85*ec779b8eSAndroid Build Coastguard Worker return interface_cast<IMediaRecorder>(reply.readStrongBinder());
86*ec779b8eSAndroid Build Coastguard Worker }
87*ec779b8eSAndroid Build Coastguard Worker
addBatteryData(uint32_t params)88*ec779b8eSAndroid Build Coastguard Worker virtual void addBatteryData(uint32_t params) {
89*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
90*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
91*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(params);
92*ec779b8eSAndroid Build Coastguard Worker remote()->transact(ADD_BATTERY_DATA, data, &reply);
93*ec779b8eSAndroid Build Coastguard Worker }
94*ec779b8eSAndroid Build Coastguard Worker
pullBatteryData(Parcel * reply)95*ec779b8eSAndroid Build Coastguard Worker virtual status_t pullBatteryData(Parcel* reply) {
96*ec779b8eSAndroid Build Coastguard Worker Parcel data;
97*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
98*ec779b8eSAndroid Build Coastguard Worker return remote()->transact(PULL_BATTERY_DATA, data, reply);
99*ec779b8eSAndroid Build Coastguard Worker }
100*ec779b8eSAndroid Build Coastguard Worker
listenForRemoteDisplay(const String16 & opPackageName,const sp<IRemoteDisplayClient> & client,const String8 & iface)101*ec779b8eSAndroid Build Coastguard Worker virtual sp<IRemoteDisplay> listenForRemoteDisplay(const String16 &opPackageName,
102*ec779b8eSAndroid Build Coastguard Worker const sp<IRemoteDisplayClient>& client, const String8& iface)
103*ec779b8eSAndroid Build Coastguard Worker {
104*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
105*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
106*ec779b8eSAndroid Build Coastguard Worker data.writeString16(opPackageName);
107*ec779b8eSAndroid Build Coastguard Worker data.writeStrongBinder(IInterface::asBinder(client));
108*ec779b8eSAndroid Build Coastguard Worker data.writeString8(iface);
109*ec779b8eSAndroid Build Coastguard Worker remote()->transact(LISTEN_FOR_REMOTE_DISPLAY, data, &reply);
110*ec779b8eSAndroid Build Coastguard Worker return interface_cast<IRemoteDisplay>(reply.readStrongBinder());
111*ec779b8eSAndroid Build Coastguard Worker }
112*ec779b8eSAndroid Build Coastguard Worker
getCodecList() const113*ec779b8eSAndroid Build Coastguard Worker virtual sp<IMediaCodecList> getCodecList() const {
114*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
115*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
116*ec779b8eSAndroid Build Coastguard Worker remote()->transact(GET_CODEC_LIST, data, &reply);
117*ec779b8eSAndroid Build Coastguard Worker return interface_cast<IMediaCodecList>(reply.readStrongBinder());
118*ec779b8eSAndroid Build Coastguard Worker }
119*ec779b8eSAndroid Build Coastguard Worker };
120*ec779b8eSAndroid Build Coastguard Worker
121*ec779b8eSAndroid Build Coastguard Worker IMPLEMENT_META_INTERFACE(MediaPlayerService, "android.media.IMediaPlayerService");
122*ec779b8eSAndroid Build Coastguard Worker
123*ec779b8eSAndroid Build Coastguard Worker // ----------------------------------------------------------------------
124*ec779b8eSAndroid Build Coastguard Worker
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)125*ec779b8eSAndroid Build Coastguard Worker status_t BnMediaPlayerService::onTransact(
126*ec779b8eSAndroid Build Coastguard Worker uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
127*ec779b8eSAndroid Build Coastguard Worker {
128*ec779b8eSAndroid Build Coastguard Worker switch (code) {
129*ec779b8eSAndroid Build Coastguard Worker case CREATE: {
130*ec779b8eSAndroid Build Coastguard Worker CHECK_INTERFACE(IMediaPlayerService, data, reply);
131*ec779b8eSAndroid Build Coastguard Worker sp<IMediaPlayerClient> client =
132*ec779b8eSAndroid Build Coastguard Worker interface_cast<IMediaPlayerClient>(data.readStrongBinder());
133*ec779b8eSAndroid Build Coastguard Worker audio_session_t audioSessionId = (audio_session_t) data.readInt32();
134*ec779b8eSAndroid Build Coastguard Worker AttributionSourceState attributionSource;
135*ec779b8eSAndroid Build Coastguard Worker status_t status = data.readParcelable(&attributionSource);
136*ec779b8eSAndroid Build Coastguard Worker if (status != NO_ERROR) {
137*ec779b8eSAndroid Build Coastguard Worker return status;
138*ec779b8eSAndroid Build Coastguard Worker }
139*ec779b8eSAndroid Build Coastguard Worker sp<IMediaPlayer> player = create(client, audioSessionId, attributionSource);
140*ec779b8eSAndroid Build Coastguard Worker reply->writeStrongBinder(IInterface::asBinder(player));
141*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
142*ec779b8eSAndroid Build Coastguard Worker } break;
143*ec779b8eSAndroid Build Coastguard Worker case CREATE_MEDIA_RECORDER: {
144*ec779b8eSAndroid Build Coastguard Worker CHECK_INTERFACE(IMediaPlayerService, data, reply);
145*ec779b8eSAndroid Build Coastguard Worker AttributionSourceState attributionSource;
146*ec779b8eSAndroid Build Coastguard Worker status_t status = data.readParcelable(&attributionSource);
147*ec779b8eSAndroid Build Coastguard Worker if (status != NO_ERROR) {
148*ec779b8eSAndroid Build Coastguard Worker return status;
149*ec779b8eSAndroid Build Coastguard Worker }
150*ec779b8eSAndroid Build Coastguard Worker sp<IMediaRecorder> recorder = createMediaRecorder(attributionSource);
151*ec779b8eSAndroid Build Coastguard Worker reply->writeStrongBinder(IInterface::asBinder(recorder));
152*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
153*ec779b8eSAndroid Build Coastguard Worker } break;
154*ec779b8eSAndroid Build Coastguard Worker case CREATE_METADATA_RETRIEVER: {
155*ec779b8eSAndroid Build Coastguard Worker CHECK_INTERFACE(IMediaPlayerService, data, reply);
156*ec779b8eSAndroid Build Coastguard Worker sp<IMediaMetadataRetriever> retriever = createMetadataRetriever();
157*ec779b8eSAndroid Build Coastguard Worker reply->writeStrongBinder(IInterface::asBinder(retriever));
158*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
159*ec779b8eSAndroid Build Coastguard Worker } break;
160*ec779b8eSAndroid Build Coastguard Worker case ADD_BATTERY_DATA: {
161*ec779b8eSAndroid Build Coastguard Worker CHECK_INTERFACE(IMediaPlayerService, data, reply);
162*ec779b8eSAndroid Build Coastguard Worker uint32_t params = data.readInt32();
163*ec779b8eSAndroid Build Coastguard Worker addBatteryData(params);
164*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
165*ec779b8eSAndroid Build Coastguard Worker } break;
166*ec779b8eSAndroid Build Coastguard Worker case PULL_BATTERY_DATA: {
167*ec779b8eSAndroid Build Coastguard Worker CHECK_INTERFACE(IMediaPlayerService, data, reply);
168*ec779b8eSAndroid Build Coastguard Worker pullBatteryData(reply);
169*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
170*ec779b8eSAndroid Build Coastguard Worker } break;
171*ec779b8eSAndroid Build Coastguard Worker case LISTEN_FOR_REMOTE_DISPLAY: {
172*ec779b8eSAndroid Build Coastguard Worker CHECK_INTERFACE(IMediaPlayerService, data, reply);
173*ec779b8eSAndroid Build Coastguard Worker const String16 opPackageName = data.readString16();
174*ec779b8eSAndroid Build Coastguard Worker sp<IRemoteDisplayClient> client(
175*ec779b8eSAndroid Build Coastguard Worker interface_cast<IRemoteDisplayClient>(data.readStrongBinder()));
176*ec779b8eSAndroid Build Coastguard Worker if (client == NULL) {
177*ec779b8eSAndroid Build Coastguard Worker reply->writeStrongBinder(NULL);
178*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
179*ec779b8eSAndroid Build Coastguard Worker }
180*ec779b8eSAndroid Build Coastguard Worker String8 iface(data.readString8());
181*ec779b8eSAndroid Build Coastguard Worker sp<IRemoteDisplay> display(listenForRemoteDisplay(opPackageName, client, iface));
182*ec779b8eSAndroid Build Coastguard Worker reply->writeStrongBinder(IInterface::asBinder(display));
183*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
184*ec779b8eSAndroid Build Coastguard Worker } break;
185*ec779b8eSAndroid Build Coastguard Worker case GET_CODEC_LIST: {
186*ec779b8eSAndroid Build Coastguard Worker CHECK_INTERFACE(IMediaPlayerService, data, reply);
187*ec779b8eSAndroid Build Coastguard Worker sp<IMediaCodecList> mcl = getCodecList();
188*ec779b8eSAndroid Build Coastguard Worker reply->writeStrongBinder(IInterface::asBinder(mcl));
189*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
190*ec779b8eSAndroid Build Coastguard Worker } break;
191*ec779b8eSAndroid Build Coastguard Worker default:
192*ec779b8eSAndroid Build Coastguard Worker return BBinder::onTransact(code, data, reply, flags);
193*ec779b8eSAndroid Build Coastguard Worker }
194*ec779b8eSAndroid Build Coastguard Worker }
195*ec779b8eSAndroid Build Coastguard Worker
196*ec779b8eSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
197*ec779b8eSAndroid Build Coastguard Worker
198*ec779b8eSAndroid Build Coastguard Worker } // namespace android
199