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>
23ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include <media/ICrypto.h>
24efbb781c15abf8e085f5ab8d39710bd58ea0b6e4Andreas Huber#include <media/IHDCP.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>
28e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown#include <media/IRemoteDisplay.h>
29e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown#include <media/IRemoteDisplayClient.h>
30e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/IStreamSource.h>
3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Errors.h>  // for status_t
33e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff 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    DECODE_URL,
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    DECODE_FD,
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    CREATE_MEDIA_RECORDER,
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    CREATE_METADATA_RETRIEVER,
437cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    GET_OMX,
44ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    MAKE_CRYPTO,
45efbb781c15abf8e085f5ab8d39710bd58ea0b6e4Andreas Huber    MAKE_HDCP,
467cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    ADD_BATTERY_DATA,
47e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown    PULL_BATTERY_DATA,
48e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown    LISTEN_FOR_REMOTE_DISPLAY,
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpMediaPlayerService: public BpInterface<IMediaPlayerService>
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    BpMediaPlayerService(const sp<IBinder>& impl)
5589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IMediaPlayerService>(impl)
5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
5789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
5889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IMediaMetadataRetriever> createMetadataRetriever(pid_t pid)
6089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(pid);
6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(CREATE_METADATA_RETRIEVER, data, &reply);
6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IMediaMetadataRetriever>(reply.readStrongBinder());
6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
682db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber    virtual sp<IMediaPlayer> create(
69d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            pid_t pid, const sp<IMediaPlayerClient>& client, int audioSessionId) {
7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(pid);
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeStrongBinder(client->asBinder());
74a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent        data.writeInt32(audioSessionId);
752db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber
76d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        remote()->transact(CREATE, data, &reply);
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IMediaPlayer>(reply.readStrongBinder());
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IMediaRecorder> createMediaRecorder(pid_t pid)
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(pid);
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(CREATE_MEDIA_RECORDER, data, &reply);
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IMediaRecorder>(reply.readStrongBinder());
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
89e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kasten    virtual sp<IMemory> decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, audio_format_t* pFormat)
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeCString(url);
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(DECODE_URL, data, &reply);
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *pSampleRate = uint32_t(reply.readInt32());
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *pNumChannels = reply.readInt32();
97e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kasten        *pFormat = (audio_format_t) reply.readInt32();
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IMemory>(reply.readStrongBinder());
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
101e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kasten    virtual sp<IMemory> decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, audio_format_t* pFormat)
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFileDescriptor(fd);
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt64(offset);
10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt64(length);
10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(DECODE_FD, data, &reply);
10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *pSampleRate = uint32_t(reply.readInt32());
11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *pNumChannels = reply.readInt32();
111e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kasten        *pFormat = (audio_format_t) reply.readInt32();
11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IMemory>(reply.readStrongBinder());
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
115318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual sp<IOMX> getOMX() {
11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
118318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        remote()->transact(GET_OMX, data, &reply);
11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return interface_cast<IOMX>(reply.readStrongBinder());
12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
1217cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
122ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    virtual sp<ICrypto> makeCrypto() {
123ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        Parcel data, reply;
124ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
125ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        remote()->transact(MAKE_CRYPTO, data, &reply);
126ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        return interface_cast<ICrypto>(reply.readStrongBinder());
127ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    }
128ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
129efbb781c15abf8e085f5ab8d39710bd58ea0b6e4Andreas Huber    virtual sp<IHDCP> makeHDCP() {
130efbb781c15abf8e085f5ab8d39710bd58ea0b6e4Andreas Huber        Parcel data, reply;
131efbb781c15abf8e085f5ab8d39710bd58ea0b6e4Andreas Huber        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
132efbb781c15abf8e085f5ab8d39710bd58ea0b6e4Andreas Huber        remote()->transact(MAKE_HDCP, data, &reply);
133efbb781c15abf8e085f5ab8d39710bd58ea0b6e4Andreas Huber        return interface_cast<IHDCP>(reply.readStrongBinder());
134efbb781c15abf8e085f5ab8d39710bd58ea0b6e4Andreas Huber    }
135efbb781c15abf8e085f5ab8d39710bd58ea0b6e4Andreas Huber
1367cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    virtual void addBatteryData(uint32_t params) {
1377cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        Parcel data, reply;
1387cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
1397cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        data.writeInt32(params);
1407cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        remote()->transact(ADD_BATTERY_DATA, data, &reply);
1417cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
1427cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
1437cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    virtual status_t pullBatteryData(Parcel* reply) {
1447cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        Parcel data;
1457cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
1467cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        return remote()->transact(PULL_BATTERY_DATA, data, reply);
1477cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
148e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown
149e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown    virtual sp<IRemoteDisplay> listenForRemoteDisplay(const sp<IRemoteDisplayClient>& client,
150e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown            const String8& iface)
151e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown    {
152e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown        Parcel data, reply;
153e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
154e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown        data.writeStrongBinder(client->asBinder());
155e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown        data.writeString8(iface);
156e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown        remote()->transact(LISTEN_FOR_REMOTE_DISPLAY, data, &reply);
157e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown        return interface_cast<IRemoteDisplay>(reply.readStrongBinder());
158e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown    }
15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
16156f0cc533a38bdb84bc03adcb43515614ab21baenikoIMPLEMENT_META_INTERFACE(MediaPlayerService, "android.media.IMediaPlayerService");
16289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
16489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
16589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnMediaPlayerService::onTransact(
16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
168e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
169d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        case CREATE: {
17089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayerService, data, reply);
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            pid_t pid = data.readInt32();
1722db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber            sp<IMediaPlayerClient> client =
1732db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber                interface_cast<IMediaPlayerClient>(data.readStrongBinder());
174a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent            int audioSessionId = data.readInt32();
175d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            sp<IMediaPlayer> player = create(pid, client, audioSessionId);
17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(player->asBinder());
17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case DECODE_URL: {
18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayerService, data, reply);
18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            const char* url = data.readCString();
18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate;
18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int numChannels;
184e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kasten            audio_format_t format;
18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IMemory> player = decode(url, &sampleRate, &numChannels, &format);
18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(sampleRate);
18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(numChannels);
188e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kasten            reply->writeInt32((int32_t) format);
18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(player->asBinder());
19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case DECODE_FD: {
19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayerService, data, reply);
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int fd = dup(data.readFileDescriptor());
19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int64_t offset = data.readInt64();
19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int64_t length = data.readInt64();
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate;
19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int numChannels;
199e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kasten            audio_format_t format;
20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IMemory> player = decode(fd, offset, length, &sampleRate, &numChannels, &format);
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(sampleRate);
20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(numChannels);
203e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kasten            reply->writeInt32((int32_t) format);
20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(player->asBinder());
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CREATE_MEDIA_RECORDER: {
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayerService, data, reply);
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            pid_t pid = data.readInt32();
21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IMediaRecorder> recorder = createMediaRecorder(pid);
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(recorder->asBinder());
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CREATE_METADATA_RETRIEVER: {
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayerService, data, reply);
21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            pid_t pid = data.readInt32();
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IMediaMetadataRetriever> retriever = createMetadataRetriever(pid);
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(retriever->asBinder());
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
221318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        case GET_OMX: {
22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IMediaPlayerService, data, reply);
223318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            sp<IOMX> omx = getOMX();
22420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeStrongBinder(omx->asBinder());
22520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
22620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } break;
227ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        case MAKE_CRYPTO: {
228ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber            CHECK_INTERFACE(IMediaPlayerService, data, reply);
229ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber            sp<ICrypto> crypto = makeCrypto();
230ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber            reply->writeStrongBinder(crypto->asBinder());
231ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber            return NO_ERROR;
232ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        } break;
233efbb781c15abf8e085f5ab8d39710bd58ea0b6e4Andreas Huber        case MAKE_HDCP: {
234efbb781c15abf8e085f5ab8d39710bd58ea0b6e4Andreas Huber            CHECK_INTERFACE(IMediaPlayerService, data, reply);
235efbb781c15abf8e085f5ab8d39710bd58ea0b6e4Andreas Huber            sp<IHDCP> hdcp = makeHDCP();
236efbb781c15abf8e085f5ab8d39710bd58ea0b6e4Andreas Huber            reply->writeStrongBinder(hdcp->asBinder());
237efbb781c15abf8e085f5ab8d39710bd58ea0b6e4Andreas Huber            return NO_ERROR;
238efbb781c15abf8e085f5ab8d39710bd58ea0b6e4Andreas Huber        } break;
2397cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        case ADD_BATTERY_DATA: {
2407cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            CHECK_INTERFACE(IMediaPlayerService, data, reply);
2417cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            uint32_t params = data.readInt32();
2427cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            addBatteryData(params);
2437cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            return NO_ERROR;
2447cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        } break;
2457cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        case PULL_BATTERY_DATA: {
2467cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            CHECK_INTERFACE(IMediaPlayerService, data, reply);
2477cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            pullBatteryData(reply);
2487cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            return NO_ERROR;
2497cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        } break;
250e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown        case LISTEN_FOR_REMOTE_DISPLAY: {
251e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown            CHECK_INTERFACE(IMediaPlayerService, data, reply);
252e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown            sp<IRemoteDisplayClient> client(
253e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown                    interface_cast<IRemoteDisplayClient>(data.readStrongBinder()));
254e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown            String8 iface(data.readString8());
255e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown            sp<IRemoteDisplay> display(listenForRemoteDisplay(client, iface));
256e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown            reply->writeStrongBinder(display->asBinder());
257e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown            return NO_ERROR;
258e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown        } break;
25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
267