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>
24cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#include <media/IDrm.h>
2559451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber#include <media/IHDCP.h>
2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IMediaPlayerService.h>
2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IMediaRecorder.h>
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/IOMX.h>
292013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown#include <media/IRemoteDisplay.h>
302013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown#include <media/IRemoteDisplayClient.h>
31e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/IStreamSource.h>
3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Errors.h>  // for status_t
342013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown#include <utils/String8.h>
3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum {
39d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    CREATE = IBinder::FIRST_CALL_TRANSACTION,
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    DECODE_URL,
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    DECODE_FD,
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    CREATE_MEDIA_RECORDER,
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    CREATE_METADATA_RETRIEVER,
447cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    GET_OMX,
45ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    MAKE_CRYPTO,
46cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    MAKE_DRM,
4759451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber    MAKE_HDCP,
487cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    ADD_BATTERY_DATA,
492013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown    PULL_BATTERY_DATA,
502013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown    LISTEN_FOR_REMOTE_DISPLAY,
51b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber    UPDATE_PROXY_CONFIG,
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpMediaPlayerService: public BpInterface<IMediaPlayerService>
5589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
5789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    BpMediaPlayerService(const sp<IBinder>& impl)
5889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IMediaPlayerService>(impl)
5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
6089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
62f37971f624164c3ed185d3f976404a6f60f49b9aGlenn Kasten    virtual sp<IMediaMetadataRetriever> createMetadataRetriever()
6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(CREATE_METADATA_RETRIEVER, data, &reply);
6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IMediaMetadataRetriever>(reply.readStrongBinder());
6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
6989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
702db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber    virtual sp<IMediaPlayer> create(
71f37971f624164c3ed185d3f976404a6f60f49b9aGlenn Kasten            const sp<IMediaPlayerClient>& client, int audioSessionId) {
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeStrongBinder(client->asBinder());
75a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent        data.writeInt32(audioSessionId);
762db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber
77d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        remote()->transact(CREATE, data, &reply);
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IMediaPlayer>(reply.readStrongBinder());
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
81f37971f624164c3ed185d3f976404a6f60f49b9aGlenn Kasten    virtual sp<IMediaRecorder> createMediaRecorder()
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
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
129cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    virtual sp<IDrm> makeDrm() {
130cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        Parcel data, reply;
131cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
132cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        remote()->transact(MAKE_DRM, data, &reply);
133cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return interface_cast<IDrm>(reply.readStrongBinder());
134cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
135cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
136279dcd89ab1d2de91dfe95e461412a0f577a6891Andreas Huber    virtual sp<IHDCP> makeHDCP(bool createEncryptionModule) {
13759451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber        Parcel data, reply;
13859451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
139279dcd89ab1d2de91dfe95e461412a0f577a6891Andreas Huber        data.writeInt32(createEncryptionModule);
14059451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber        remote()->transact(MAKE_HDCP, data, &reply);
14159451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber        return interface_cast<IHDCP>(reply.readStrongBinder());
14259451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber    }
14359451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber
1447cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    virtual void addBatteryData(uint32_t params) {
1457cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        Parcel data, reply;
1467cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
1477cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        data.writeInt32(params);
1487cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        remote()->transact(ADD_BATTERY_DATA, data, &reply);
1497cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
1507cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
1517cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    virtual status_t pullBatteryData(Parcel* reply) {
1527cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        Parcel data;
1537cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
1547cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        return remote()->transact(PULL_BATTERY_DATA, data, reply);
1557cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
1562013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown
1572013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown    virtual sp<IRemoteDisplay> listenForRemoteDisplay(const sp<IRemoteDisplayClient>& client,
1582013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown            const String8& iface)
1592013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown    {
1602013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown        Parcel data, reply;
1612013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
1622013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown        data.writeStrongBinder(client->asBinder());
1632013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown        data.writeString8(iface);
1642013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown        remote()->transact(LISTEN_FOR_REMOTE_DISPLAY, data, &reply);
1652013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown        return interface_cast<IRemoteDisplay>(reply.readStrongBinder());
1662013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown    }
167b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber
168b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber    virtual status_t updateProxyConfig(
169b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber            const char *host, int32_t port, const char *exclusionList) {
170b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber        Parcel data, reply;
171b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber
172b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
173b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber        if (host == NULL) {
174b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber            data.writeInt32(0);
175b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber        } else {
176b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber            data.writeInt32(1);
177b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber            data.writeCString(host);
178b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber            data.writeInt32(port);
179b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber            data.writeCString(exclusionList);
180b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber        }
181b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber
182b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber        remote()->transact(UPDATE_PROXY_CONFIG, data, &reply);
183b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber
184b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber        return reply.readInt32();
185b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber    }
18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
18856f0cc533a38bdb84bc03adcb43515614ab21baenikoIMPLEMENT_META_INTERFACE(MediaPlayerService, "android.media.IMediaPlayerService");
18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnMediaPlayerService::onTransact(
19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
195e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
196d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        case CREATE: {
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayerService, data, reply);
1982db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber            sp<IMediaPlayerClient> client =
1992db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber                interface_cast<IMediaPlayerClient>(data.readStrongBinder());
200a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent            int audioSessionId = data.readInt32();
201f37971f624164c3ed185d3f976404a6f60f49b9aGlenn Kasten            sp<IMediaPlayer> player = create(client, audioSessionId);
20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(player->asBinder());
20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case DECODE_URL: {
20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayerService, data, reply);
20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            const char* url = data.readCString();
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate;
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int numChannels;
210e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kasten            audio_format_t format;
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IMemory> player = decode(url, &sampleRate, &numChannels, &format);
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(sampleRate);
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(numChannels);
214e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kasten            reply->writeInt32((int32_t) format);
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(player->asBinder());
21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case DECODE_FD: {
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayerService, data, reply);
22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int fd = dup(data.readFileDescriptor());
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int64_t offset = data.readInt64();
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int64_t length = data.readInt64();
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate;
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int numChannels;
225e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kasten            audio_format_t format;
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IMemory> player = decode(fd, offset, length, &sampleRate, &numChannels, &format);
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(sampleRate);
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(numChannels);
229e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kasten            reply->writeInt32((int32_t) format);
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(player->asBinder());
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CREATE_MEDIA_RECORDER: {
23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayerService, data, reply);
235f37971f624164c3ed185d3f976404a6f60f49b9aGlenn Kasten            sp<IMediaRecorder> recorder = createMediaRecorder();
23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(recorder->asBinder());
23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CREATE_METADATA_RETRIEVER: {
24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayerService, data, reply);
241f37971f624164c3ed185d3f976404a6f60f49b9aGlenn Kasten            sp<IMediaMetadataRetriever> retriever = createMetadataRetriever();
24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(retriever->asBinder());
24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
245318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        case GET_OMX: {
24620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IMediaPlayerService, data, reply);
247318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            sp<IOMX> omx = getOMX();
24820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeStrongBinder(omx->asBinder());
24920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
25020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } break;
251ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        case MAKE_CRYPTO: {
252ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber            CHECK_INTERFACE(IMediaPlayerService, data, reply);
253ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber            sp<ICrypto> crypto = makeCrypto();
254ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber            reply->writeStrongBinder(crypto->asBinder());
255ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber            return NO_ERROR;
256ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        } break;
257cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        case MAKE_DRM: {
258cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker            CHECK_INTERFACE(IMediaPlayerService, data, reply);
259cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker            sp<IDrm> drm = makeDrm();
260cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker            reply->writeStrongBinder(drm->asBinder());
261cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker            return NO_ERROR;
262cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        } break;
26359451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber        case MAKE_HDCP: {
26459451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber            CHECK_INTERFACE(IMediaPlayerService, data, reply);
265279dcd89ab1d2de91dfe95e461412a0f577a6891Andreas Huber            bool createEncryptionModule = data.readInt32();
266279dcd89ab1d2de91dfe95e461412a0f577a6891Andreas Huber            sp<IHDCP> hdcp = makeHDCP(createEncryptionModule);
26759451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber            reply->writeStrongBinder(hdcp->asBinder());
26859451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber            return NO_ERROR;
26959451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber        } break;
2707cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        case ADD_BATTERY_DATA: {
2717cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            CHECK_INTERFACE(IMediaPlayerService, data, reply);
2727cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            uint32_t params = data.readInt32();
2737cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            addBatteryData(params);
2747cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            return NO_ERROR;
2757cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        } break;
2767cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        case PULL_BATTERY_DATA: {
2777cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            CHECK_INTERFACE(IMediaPlayerService, data, reply);
2787cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            pullBatteryData(reply);
2797cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            return NO_ERROR;
2807cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        } break;
2812013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown        case LISTEN_FOR_REMOTE_DISPLAY: {
2822013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown            CHECK_INTERFACE(IMediaPlayerService, data, reply);
2832013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown            sp<IRemoteDisplayClient> client(
2842013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown                    interface_cast<IRemoteDisplayClient>(data.readStrongBinder()));
2852013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown            String8 iface(data.readString8());
2862013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown            sp<IRemoteDisplay> display(listenForRemoteDisplay(client, iface));
2872013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown            reply->writeStrongBinder(display->asBinder());
2882013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown            return NO_ERROR;
2892013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown        } break;
290b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber        case UPDATE_PROXY_CONFIG:
291b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber        {
292b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber            CHECK_INTERFACE(IMediaPlayerService, data, reply);
293b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber
294b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber            const char *host = NULL;
295b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber            int32_t port = 0;
296b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber            const char *exclusionList = NULL;
297b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber
298b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber            if (data.readInt32()) {
299b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber                host = data.readCString();
300b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber                port = data.readInt32();
301b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber                exclusionList = data.readCString();
302b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber            }
303b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber
304b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber            reply->writeInt32(updateProxyConfig(host, port, exclusionList));
305b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber
306b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber            return OK;
307b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber        }
30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
31489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
316