189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/* 289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** 389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Copyright 2008, The Android Open Source Project 489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** 589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** you may not use this file except in compliance with the License. 789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** You may obtain a copy of the License at 889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** 989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** 1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** See the License for the specific language governing permissions and 1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** limitations under the License. 1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project*/ 1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <stdint.h> 1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <sys/types.h> 2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/Parcel.h> 227562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/IMemory.h> 231381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar#include <media/IMediaCodecList.h> 241b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <media/IMediaHTTPService.h> 2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IMediaPlayerService.h> 2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IMediaRecorder.h> 2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/IOMX.h> 282013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown#include <media/IRemoteDisplay.h> 292013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown#include <media/IRemoteDisplayClient.h> 30e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/IStreamSource.h> 3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Errors.h> // for status_t 332013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown#include <utils/String8.h> 3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android { 3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum { 38d681bbb1767bed09415e050ba78975df214bcd68Dave Burke CREATE = IBinder::FIRST_CALL_TRANSACTION, 3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CREATE_MEDIA_RECORDER, 4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CREATE_METADATA_RETRIEVER, 417cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang ADD_BATTERY_DATA, 422013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown PULL_BATTERY_DATA, 432013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown LISTEN_FOR_REMOTE_DISPLAY, 441381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar GET_CODEC_LIST, 4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpMediaPlayerService: public BpInterface<IMediaPlayerService> 4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic: 50090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh explicit BpMediaPlayerService(const sp<IBinder>& impl) 5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project : BpInterface<IMediaPlayerService>(impl) 5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 55f37971f624164c3ed185d3f976404a6f60f49b9aGlenn Kasten virtual sp<IMediaMetadataRetriever> createMetadataRetriever() 5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 5789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 5889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor()); 5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(CREATE_METADATA_RETRIEVER, data, &reply); 6089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return interface_cast<IMediaMetadataRetriever>(reply.readStrongBinder()); 6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 632db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber virtual sp<IMediaPlayer> create( 64d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten const sp<IMediaPlayerClient>& client, audio_session_t audioSessionId) { 6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor()); 67f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen data.writeStrongBinder(IInterface::asBinder(client)); 68a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent data.writeInt32(audioSessionId); 692db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber 70d681bbb1767bed09415e050ba78975df214bcd68Dave Burke remote()->transact(CREATE, data, &reply); 7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return interface_cast<IMediaPlayer>(reply.readStrongBinder()); 7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 74be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov virtual sp<IMediaRecorder> createMediaRecorder(const String16 &opPackageName) 7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor()); 78be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov data.writeString16(opPackageName); 7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(CREATE_MEDIA_RECORDER, data, &reply); 8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return interface_cast<IMediaRecorder>(reply.readStrongBinder()); 8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 837cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang virtual void addBatteryData(uint32_t params) { 847cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang Parcel data, reply; 857cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor()); 867cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang data.writeInt32(params); 877cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang remote()->transact(ADD_BATTERY_DATA, data, &reply); 887cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 897cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 907cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang virtual status_t pullBatteryData(Parcel* reply) { 917cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang Parcel data; 927cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor()); 937cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang return remote()->transact(PULL_BATTERY_DATA, data, reply); 947cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 952013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown 96be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov virtual sp<IRemoteDisplay> listenForRemoteDisplay(const String16 &opPackageName, 97be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov const sp<IRemoteDisplayClient>& client, const String8& iface) 982013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown { 992013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown Parcel data, reply; 1002013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor()); 101be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov data.writeString16(opPackageName); 102f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen data.writeStrongBinder(IInterface::asBinder(client)); 1032013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown data.writeString8(iface); 1042013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown remote()->transact(LISTEN_FOR_REMOTE_DISPLAY, data, &reply); 1052013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown return interface_cast<IRemoteDisplay>(reply.readStrongBinder()); 1062013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown } 1071381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar 1081381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar virtual sp<IMediaCodecList> getCodecList() const { 1091381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar Parcel data, reply; 1101381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor()); 1111381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar remote()->transact(GET_CODEC_LIST, data, &reply); 1121381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar return interface_cast<IMediaCodecList>(reply.readStrongBinder()); 1131381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar } 11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 11656f0cc533a38bdb84bc03adcb43515614ab21baenikoIMPLEMENT_META_INTERFACE(MediaPlayerService, "android.media.IMediaPlayerService"); 11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------- 11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnMediaPlayerService::onTransact( 12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 123e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten switch (code) { 124d681bbb1767bed09415e050ba78975df214bcd68Dave Burke case CREATE: { 12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IMediaPlayerService, data, reply); 1262db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber sp<IMediaPlayerClient> client = 1272db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber interface_cast<IMediaPlayerClient>(data.readStrongBinder()); 128d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t audioSessionId = (audio_session_t) data.readInt32(); 129f37971f624164c3ed185d3f976404a6f60f49b9aGlenn Kasten sp<IMediaPlayer> player = create(client, audioSessionId); 130f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(player)); 13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 13389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case CREATE_MEDIA_RECORDER: { 13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IMediaPlayerService, data, reply); 135be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov const String16 opPackageName = data.readString16(); 136be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov sp<IMediaRecorder> recorder = createMediaRecorder(opPackageName); 137f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(recorder)); 13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case CREATE_METADATA_RETRIEVER: { 14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IMediaPlayerService, data, reply); 142f37971f624164c3ed185d3f976404a6f60f49b9aGlenn Kasten sp<IMediaMetadataRetriever> retriever = createMetadataRetriever(); 143f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(retriever)); 14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1467cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang case ADD_BATTERY_DATA: { 1477cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang CHECK_INTERFACE(IMediaPlayerService, data, reply); 1487cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang uint32_t params = data.readInt32(); 1497cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang addBatteryData(params); 1507cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang return NO_ERROR; 1517cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } break; 1527cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang case PULL_BATTERY_DATA: { 1537cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang CHECK_INTERFACE(IMediaPlayerService, data, reply); 1547cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang pullBatteryData(reply); 1557cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang return NO_ERROR; 1567cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } break; 1572013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown case LISTEN_FOR_REMOTE_DISPLAY: { 1582013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown CHECK_INTERFACE(IMediaPlayerService, data, reply); 159be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov const String16 opPackageName = data.readString16(); 1602013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown sp<IRemoteDisplayClient> client( 1612013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown interface_cast<IRemoteDisplayClient>(data.readStrongBinder())); 1622afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia if (client == NULL) { 1632afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia reply->writeStrongBinder(NULL); 1642afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia return NO_ERROR; 1652afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia } 1662013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown String8 iface(data.readString8()); 167be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov sp<IRemoteDisplay> display(listenForRemoteDisplay(opPackageName, client, iface)); 168f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(display)); 1692013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown return NO_ERROR; 1702013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown } break; 1711381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar case GET_CODEC_LIST: { 1721381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar CHECK_INTERFACE(IMediaPlayerService, data, reply); 1731381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar sp<IMediaCodecList> mcl = getCodecList(); 174f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(mcl)); 1751381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar return NO_ERROR; 1761381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar } break; 17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project default: 17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return BBinder::onTransact(code, data, reply, flags); 17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------------- 18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 18440bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android 185