IMediaPlayerService.cpp revision e2b1028852120bcfded33b8f06f66b780437fe92
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>
2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IMediaPlayerService.h>
2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IMediaRecorder.h>
2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/IOMX.h>
26e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/IStreamSource.h>
2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Errors.h>  // for status_t
2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum {
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    CREATE_URL = IBinder::FIRST_CALL_TRANSACTION,
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    CREATE_FD,
35e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    CREATE_STREAM,
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    DECODE_URL,
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    DECODE_FD,
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    CREATE_MEDIA_RECORDER,
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    CREATE_METADATA_RETRIEVER,
40da7581b7b61b84f15e8d671c86fd117c322b009eEric Laurent    GET_OMX
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpMediaPlayerService: public BpInterface<IMediaPlayerService>
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    BpMediaPlayerService(const sp<IBinder>& impl)
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IMediaPlayerService>(impl)
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IMediaMetadataRetriever> createMetadataRetriever(pid_t pid)
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
5589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(pid);
5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(CREATE_METADATA_RETRIEVER, data, &reply);
5789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IMediaMetadataRetriever>(reply.readStrongBinder());
5889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
602db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber    virtual sp<IMediaPlayer> create(
612db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber            pid_t pid, const sp<IMediaPlayerClient>& client,
62a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent            const char* url, const KeyedVector<String8, String8> *headers, int audioSessionId) {
6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(pid);
6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeStrongBinder(client->asBinder());
6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeCString(url);
682db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber
692db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber        if (headers == NULL) {
702db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber            data.writeInt32(0);
712db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber        } else {
722db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber            // serialize the headers
732db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber            data.writeInt32(headers->size());
742db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber            for (size_t i = 0; i < headers->size(); ++i) {
752db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber                data.writeString8(headers->keyAt(i));
762db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber                data.writeString8(headers->valueAt(i));
772db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber            }
782db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber        }
79a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent        data.writeInt32(audioSessionId);
802db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(CREATE_URL, data, &reply);
82a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IMediaPlayer>(reply.readStrongBinder());
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IMediaRecorder> createMediaRecorder(pid_t pid)
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(pid);
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(CREATE_MEDIA_RECORDER, data, &reply);
9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IMediaRecorder>(reply.readStrongBinder());
9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
95a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    virtual sp<IMediaPlayer> create(pid_t pid, const sp<IMediaPlayerClient>& client, int fd,
96a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent            int64_t offset, int64_t length, int audioSessionId)
9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(pid);
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeStrongBinder(client->asBinder());
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFileDescriptor(fd);
10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt64(offset);
10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt64(length);
105a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent        data.writeInt32(audioSessionId);
106a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent
10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(CREATE_FD, data, &reply);
108a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent
109a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent        return interface_cast<IMediaPlayer>(reply.readStrongBinder());;
11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
112e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    virtual sp<IMediaPlayer> create(
113e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            pid_t pid, const sp<IMediaPlayerClient> &client,
114e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            const sp<IStreamSource> &source, int audioSessionId) {
115e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        Parcel data, reply;
116e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
117e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInt32(static_cast<int32_t>(pid));
118e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeStrongBinder(client->asBinder());
119e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeStrongBinder(source->asBinder());
120e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInt32(static_cast<int32_t>(audioSessionId));
121e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
122e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        remote()->transact(CREATE_STREAM, data, &reply);
123e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
124e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        return interface_cast<IMediaPlayer>(reply.readStrongBinder());;
125e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
126e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IMemory> decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, int* pFormat)
12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeCString(url);
13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(DECODE_URL, data, &reply);
13389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *pSampleRate = uint32_t(reply.readInt32());
13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *pNumChannels = reply.readInt32();
13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *pFormat = reply.readInt32();
13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IMemory>(reply.readStrongBinder());
13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IMemory> decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, int* pFormat)
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFileDescriptor(fd);
14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt64(offset);
14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt64(length);
14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(DECODE_FD, data, &reply);
14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *pSampleRate = uint32_t(reply.readInt32());
14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *pNumChannels = reply.readInt32();
14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *pFormat = reply.readInt32();
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IMemory>(reply.readStrongBinder());
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
15220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
153318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual sp<IOMX> getOMX() {
15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
156318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        remote()->transact(GET_OMX, data, &reply);
15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return interface_cast<IOMX>(reply.readStrongBinder());
15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
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{
16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    switch(code) {
16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CREATE_URL: {
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());
17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            const char* url = data.readCString();
1752db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber
1762db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber            KeyedVector<String8, String8> headers;
1772db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber            int32_t numHeaders = data.readInt32();
1782db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber            for (int i = 0; i < numHeaders; ++i) {
1792db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber                String8 key = data.readString8();
1802db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber                String8 value = data.readString8();
1812db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber                headers.add(key, value);
1822db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber            }
183a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent            int audioSessionId = data.readInt32();
1842db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber
1852db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber            sp<IMediaPlayer> player = create(
186a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent                    pid, client, url, numHeaders > 0 ? &headers : NULL, audioSessionId);
1872db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber
18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(player->asBinder());
18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CREATE_FD: {
19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayerService, data, reply);
19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            pid_t pid = data.readInt32();
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IMediaPlayerClient> client = interface_cast<IMediaPlayerClient>(data.readStrongBinder());
19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int fd = dup(data.readFileDescriptor());
19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int64_t offset = data.readInt64();
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int64_t length = data.readInt64();
198a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent            int audioSessionId = data.readInt32();
199a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent
200a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent            sp<IMediaPlayer> player = create(pid, client, fd, offset, length, audioSessionId);
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(player->asBinder());
20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
204e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        case CREATE_STREAM:
205e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        {
206e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            CHECK_INTERFACE(IMediaPlayerService, data, reply);
207e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
208e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            pid_t pid = static_cast<pid_t>(data.readInt32());
209e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
210e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            sp<IMediaPlayerClient> client =
211e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                interface_cast<IMediaPlayerClient>(data.readStrongBinder());
212e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
213e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            sp<IStreamSource> source =
214e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                interface_cast<IStreamSource>(data.readStrongBinder());
215e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
216e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            int audioSessionId = static_cast<int>(data.readInt32());
217e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
218e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            sp<IMediaPlayer> player =
219e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                create(pid, client, source, audioSessionId);
220e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
221e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            reply->writeStrongBinder(player->asBinder());
222e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            return OK;
223e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
224e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case DECODE_URL: {
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayerService, data, reply);
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            const char* url = data.readCString();
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate;
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int numChannels;
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int format;
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IMemory> player = decode(url, &sampleRate, &numChannels, &format);
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(sampleRate);
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(numChannels);
23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(format);
23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(player->asBinder());
23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case DECODE_FD: {
23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayerService, data, reply);
24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int fd = dup(data.readFileDescriptor());
24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int64_t offset = data.readInt64();
24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int64_t length = data.readInt64();
24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate;
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int numChannels;
24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int format;
24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IMemory> player = decode(fd, offset, length, &sampleRate, &numChannels, &format);
24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(sampleRate);
24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(numChannels);
24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(format);
25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(player->asBinder());
25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CREATE_MEDIA_RECORDER: {
25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayerService, data, reply);
25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            pid_t pid = data.readInt32();
25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IMediaRecorder> recorder = createMediaRecorder(pid);
25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(recorder->asBinder());
25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CREATE_METADATA_RETRIEVER: {
26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayerService, data, reply);
26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            pid_t pid = data.readInt32();
26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IMediaMetadataRetriever> retriever = createMetadataRetriever(pid);
26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(retriever->asBinder());
26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
267318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        case GET_OMX: {
26820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IMediaPlayerService, data, reply);
269318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            sp<IOMX> omx = getOMX();
27020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeStrongBinder(omx->asBinder());
27120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
27220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } break;
27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
281