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