IMediaPlayerService.cpp revision b7056fc8525e0515c6f46676e3307088f8b64cdc
194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood/*
294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood**
394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood** Copyright 2008, The Android Open Source Project
494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood**
594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood** Licensed under the Apache License, Version 2.0 (the "License");
694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood** you may not use this file except in compliance with the License.
794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood** You may obtain a copy of the License at
894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood**
994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood**     http://www.apache.org/licenses/LICENSE-2.0
1094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood**
1194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood** Unless required by applicable law or agreed to in writing, software
1294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood** distributed under the License is distributed on an "AS IS" BASIS,
1394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood** See the License for the specific language governing permissions and
1594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood** limitations under the License.
1694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood*/
17d747129e1e8876f5a50f47156ec50b6969a638e4Nick Kralevich
1894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <stdint.h>
1994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <sys/types.h>
2094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <binder/Parcel.h>
2194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
2294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <binder/IMemory.h>
2394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <media/IMediaPlayerService.h>
2494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <media/IMediaRecorder.h>
2594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
2694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwoodnamespace android {
2794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
2894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwoodenum {
2994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    CREATE_URL = IBinder::FIRST_CALL_TRANSACTION,
3094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    CREATE_FD,
314d3fd4e9988c0eb284dd5104c4dea757f723c716Robert Craig    DECODE_URL,
3294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    DECODE_FD,
3394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    CREATE_MEDIA_RECORDER,
3494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    CREATE_METADATA_RETRIEVER,
3594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood};
3694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
3794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwoodclass BpMediaPlayerService: public BpInterface<IMediaPlayerService>
3894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood{
3994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwoodpublic:
4094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    BpMediaPlayerService(const sp<IBinder>& impl)
4194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        : BpInterface<IMediaPlayerService>(impl)
4294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    {
4394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    }
4494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
4594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    virtual sp<IMediaMetadataRetriever> createMetadataRetriever(pid_t pid)
4694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    {
4794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        Parcel data, reply;
4894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
4994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        data.writeInt32(pid);
5094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        remote()->transact(CREATE_METADATA_RETRIEVER, data, &reply);
5194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        return interface_cast<IMediaMetadataRetriever>(reply.readStrongBinder());
5294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    }
5394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
5494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    virtual sp<IMediaPlayer> create(pid_t pid, const sp<IMediaPlayerClient>& client, const char* url)
5594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    {
5694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        Parcel data, reply;
5794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
58a2d838a542c34d2887a0ec1fafa5f47566d595e9Nick Kralevich        data.writeInt32(pid);
5994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        data.writeStrongBinder(client->asBinder());
6094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        data.writeCString(url);
6194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        remote()->transact(CREATE_URL, data, &reply);
62a2d838a542c34d2887a0ec1fafa5f47566d595e9Nick Kralevich        return interface_cast<IMediaPlayer>(reply.readStrongBinder());
6394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    }
6494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
6594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    virtual sp<IMediaRecorder> createMediaRecorder(pid_t pid)
6694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    {
6794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        Parcel data, reply;
6894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
6994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        data.writeInt32(pid);
7094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        remote()->transact(CREATE_MEDIA_RECORDER, data, &reply);
7194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        return interface_cast<IMediaRecorder>(reply.readStrongBinder());
7294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    }
7394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
7494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    virtual sp<IMediaPlayer> create(pid_t pid, const sp<IMediaPlayerClient>& client, int fd, int64_t offset, int64_t length)
7594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    {
7694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        Parcel data, reply;
7794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
7894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        data.writeInt32(pid);
7994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        data.writeStrongBinder(client->asBinder());
8094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        data.writeFileDescriptor(fd);
8194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        data.writeInt64(offset);
8294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        data.writeInt64(length);
8394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        remote()->transact(CREATE_FD, data, &reply);
8494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        return interface_cast<IMediaPlayer>(reply.readStrongBinder());
8594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    }
8694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
8794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    virtual sp<IMemory> decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, int* pFormat)
8894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    {
8994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        Parcel data, reply;
9094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
9194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        data.writeCString(url);
9294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        remote()->transact(DECODE_URL, data, &reply);
9394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        *pSampleRate = uint32_t(reply.readInt32());
944d3fd4e9988c0eb284dd5104c4dea757f723c716Robert Craig        *pNumChannels = reply.readInt32();
9594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        *pFormat = reply.readInt32();
9694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        return interface_cast<IMemory>(reply.readStrongBinder());
9794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    }
9894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
9994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    virtual sp<IMemory> decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, int* pFormat)
10094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    {
10194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        Parcel data, reply;
10294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
10394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        data.writeFileDescriptor(fd);
10494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        data.writeInt64(offset);
10594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        data.writeInt64(length);
10694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        remote()->transact(DECODE_FD, data, &reply);
10794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        *pSampleRate = uint32_t(reply.readInt32());
10894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        *pNumChannels = reply.readInt32();
10994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        *pFormat = reply.readInt32();
11094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        return interface_cast<IMemory>(reply.readStrongBinder());
111abe4fe5b46157ecd2a52d28abf938c816c3ce878Jeff Sharkey    }
11294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood};
11394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
11494afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodIMPLEMENT_META_INTERFACE(MediaPlayerService, "android.hardware.IMediaPlayerService");
115abe4fe5b46157ecd2a52d28abf938c816c3ce878Jeff Sharkey
11694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood// ----------------------------------------------------------------------
11794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
11894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwoodstatus_t BnMediaPlayerService::onTransact(
11994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
12094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood{
12194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    switch(code) {
12294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        case CREATE_URL: {
12394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            CHECK_INTERFACE(IMediaPlayerService, data, reply);
12494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            pid_t pid = data.readInt32();
12594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            sp<IMediaPlayerClient> client = interface_cast<IMediaPlayerClient>(data.readStrongBinder());
12694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            const char* url = data.readCString();
12794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            sp<IMediaPlayer> player = create(pid, client, url);
12894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            reply->writeStrongBinder(player->asBinder());
12994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            return NO_ERROR;
13094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        } break;
13194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        case CREATE_FD: {
13294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            CHECK_INTERFACE(IMediaPlayerService, data, reply);
13394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            pid_t pid = data.readInt32();
13494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            sp<IMediaPlayerClient> client = interface_cast<IMediaPlayerClient>(data.readStrongBinder());
13594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            int fd = dup(data.readFileDescriptor());
13694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            int64_t offset = data.readInt64();
13794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            int64_t length = data.readInt64();
13894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            sp<IMediaPlayer> player = create(pid, client, fd, offset, length);
13994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            reply->writeStrongBinder(player->asBinder());
14094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            return NO_ERROR;
14194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        } break;
14294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        case DECODE_URL: {
14394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            CHECK_INTERFACE(IMediaPlayerService, data, reply);
14494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            const char* url = data.readCString();
14594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            uint32_t sampleRate;
14694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            int numChannels;
14794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            int format;
14894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            sp<IMemory> player = decode(url, &sampleRate, &numChannels, &format);
14994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            reply->writeInt32(sampleRate);
15094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            reply->writeInt32(numChannels);
15194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            reply->writeInt32(format);
15294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            reply->writeStrongBinder(player->asBinder());
15394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            return NO_ERROR;
15494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        } break;
15594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        case DECODE_FD: {
15694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            CHECK_INTERFACE(IMediaPlayerService, data, reply);
15794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            int fd = dup(data.readFileDescriptor());
15894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            int64_t offset = data.readInt64();
15994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            int64_t length = data.readInt64();
16094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            uint32_t sampleRate;
16194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            int numChannels;
16294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            int format;
16394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            sp<IMemory> player = decode(fd, offset, length, &sampleRate, &numChannels, &format);
16494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            reply->writeInt32(sampleRate);
16594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            reply->writeInt32(numChannels);
16694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            reply->writeInt32(format);
16794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            reply->writeStrongBinder(player->asBinder());
16894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            return NO_ERROR;
16994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        } break;
17094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        case CREATE_MEDIA_RECORDER: {
17194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            CHECK_INTERFACE(IMediaPlayerService, data, reply);
17294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            pid_t pid = data.readInt32();
17394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            sp<IMediaRecorder> recorder = createMediaRecorder(pid);
17494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            reply->writeStrongBinder(recorder->asBinder());
17594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            return NO_ERROR;
176abe4fe5b46157ecd2a52d28abf938c816c3ce878Jeff Sharkey        } break;
17794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        case CREATE_METADATA_RETRIEVER: {
17894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            CHECK_INTERFACE(IMediaPlayerService, data, reply);
17994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            pid_t pid = data.readInt32();
180abe4fe5b46157ecd2a52d28abf938c816c3ce878Jeff Sharkey            sp<IMediaMetadataRetriever> retriever = createMetadataRetriever(pid);
18194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            reply->writeStrongBinder(retriever->asBinder());
18294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            return NO_ERROR;
18394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        } break;
18494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        default:
18594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            return BBinder::onTransact(code, data, reply, flags);
18694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    }
187e4e91c4ead821afb5aced2e33ee39d8878eb4d1eNick Kralevich}
18894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
18994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood// ----------------------------------------------------------------------------
19094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
19194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}; // namespace android
19294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
19394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood