IMediaPlayer.cpp revision 44a7e42f0310831e6a846d1b6bb40bf3a399bf6d
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
18c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman#include <arpa/inet.h>
1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <stdint.h>
2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <sys/types.h>
2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
227562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/Parcel.h>
2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IMediaPlayer.h>
25d681bbb1767bed09415e050ba78975df214bcd68Dave Burke#include <media/IStreamSource.h>
26d681bbb1767bed09415e050ba78975df214bcd68Dave Burke
271173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/ISurfaceTexture.h>
28d681bbb1767bed09415e050ba78975df214bcd68Dave Burke#include <utils/String8.h>
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    DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
34d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    SET_DATA_SOURCE_URL,
35d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    SET_DATA_SOURCE_FD,
36d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    SET_DATA_SOURCE_STREAM,
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    PREPARE_ASYNC,
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    START,
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    STOP,
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    IS_PLAYING,
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    PAUSE,
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SEEK_TO,
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_CURRENT_POSITION,
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_DURATION,
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    RESET,
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_AUDIO_STREAM_TYPE,
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_LOOPING,
481d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    SET_VOLUME,
491d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    INVOKE,
50a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    SET_METADATA_FILTER,
518e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    GET_METADATA,
522beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    SET_AUX_EFFECT_SEND_LEVEL,
531173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    ATTACH_AUX_EFFECT,
541173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    SET_VIDEO_SURFACETEXTURE,
554f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    SET_PARAMETER,
564f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    GET_PARAMETER,
57c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    SET_RETRANSMIT_ENDPOINT,
5844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    GET_RETRANSMIT_ENDPOINT,
596b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen    SET_NEXT_PLAYER,
6089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpMediaPlayer: public BpInterface<IMediaPlayer>
6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    BpMediaPlayer(const sp<IBinder>& impl)
6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IMediaPlayer>(impl)
6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
6989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // disconnect from media player service
7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void disconnect()
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(DISCONNECT, data, &reply);
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
78d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    status_t setDataSource(const char* url,
79d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            const KeyedVector<String8, String8>* headers)
80d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    {
81d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        Parcel data, reply;
82d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
83d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeCString(url);
84d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        if (headers == NULL) {
85d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            data.writeInt32(0);
86d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        } else {
87d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            // serialize the headers
88d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            data.writeInt32(headers->size());
89d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            for (size_t i = 0; i < headers->size(); ++i) {
90d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                data.writeString8(headers->keyAt(i));
91d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                data.writeString8(headers->valueAt(i));
92d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            }
93d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        }
94d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        remote()->transact(SET_DATA_SOURCE_URL, data, &reply);
95d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        return reply.readInt32();
96d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    }
97d681bbb1767bed09415e050ba78975df214bcd68Dave Burke
98d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    status_t setDataSource(int fd, int64_t offset, int64_t length) {
99d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        Parcel data, reply;
100d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
101d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeFileDescriptor(fd);
102d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInt64(offset);
103d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInt64(length);
104d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        remote()->transact(SET_DATA_SOURCE_FD, data, &reply);
105d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        return reply.readInt32();
106d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    }
107d681bbb1767bed09415e050ba78975df214bcd68Dave Burke
108d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    status_t setDataSource(const sp<IStreamSource> &source) {
109d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        Parcel data, reply;
110d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
111d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeStrongBinder(source->asBinder());
1128d65510a2e9ff7b64f2f35bfe3cd745a717c9533Glenn Kasten        remote()->transact(SET_DATA_SOURCE_STREAM, data, &reply);
113d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        return reply.readInt32();
114d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    }
115d681bbb1767bed09415e050ba78975df214bcd68Dave Burke
1161173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    // pass the buffered ISurfaceTexture to the media player service
1171173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    status_t setVideoSurfaceTexture(const sp<ISurfaceTexture>& surfaceTexture)
1181173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    {
1191173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        Parcel data, reply;
1201173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
1211173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        sp<IBinder> b(surfaceTexture->asBinder());
1221173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        data.writeStrongBinder(b);
1231173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        remote()->transact(SET_VIDEO_SURFACETEXTURE, data, &reply);
1241173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        return reply.readInt32();
1251173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    }
1261173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t prepareAsync()
12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(PREPARE_ASYNC, data, &reply);
13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
13389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t start()
13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(START, data, &reply);
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t stop()
14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STOP, data, &reply);
14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t isPlaying(bool* state)
15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
15589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(IS_PLAYING, data, &reply);
15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *state = reply.readInt32();
15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
15889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t pause()
16189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
16289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
16489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(PAUSE, data, &reply);
16589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t seekTo(int msec)
16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
17089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(msec);
17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SEEK_TO, data, &reply);
17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t getCurrentPosition(int* msec)
17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(GET_CURRENT_POSITION, data, &reply);
18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *msec = reply.readInt32();
18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t getDuration(int* msec)
18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(GET_DURATION, data, &reply);
19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *msec = reply.readInt32();
19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t reset()
19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(RESET, data, &reply);
20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
203fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    status_t setAudioStreamType(audio_stream_type_t stream)
20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
207fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_AUDIO_STREAM_TYPE, data, &reply);
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t setLooping(int loop)
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(loop);
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_LOOPING, data, &reply);
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t setVolume(float leftVolume, float rightVolume)
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
224172fb9ab347e146642234f0bd6f223d351e9fd0bDave Sparks        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(leftVolume);
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(rightVolume);
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_VOLUME, data, &reply);
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
2301d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania
2311d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    status_t invoke(const Parcel& request, Parcel *reply)
232040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong    {
233040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong        // Avoid doing any extra copy. The interface descriptor should
234040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong        // have been set by MediaPlayer.java.
2358e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        return remote()->transact(INVOKE, request, reply);
2361d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    }
237a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania
238a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    status_t setMetadataFilter(const Parcel& request)
239a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    {
240a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        Parcel reply;
241a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        // Avoid doing any extra copy of the request. The interface
242a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        // descriptor should have been set by MediaPlayer.java.
243a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        remote()->transact(SET_METADATA_FILTER, request, &reply);
244a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        return reply.readInt32();
245a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    }
2468e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania
2478e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    status_t getMetadata(bool update_only, bool apply_filter, Parcel *reply)
2488e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    {
2498e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        Parcel request;
2508e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        request.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
2518e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        // TODO: Burning 2 ints for 2 boolean. Should probably use flags in an int here.
2528e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        request.writeInt32(update_only);
2538e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        request.writeInt32(apply_filter);
2548e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        remote()->transact(GET_METADATA, request, reply);
2558e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        return reply->readInt32();
2568e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    }
2574e92c7efc68b5d7635a32dbd283ab8558ad9bdd6Andreas Huber
2582beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    status_t setAuxEffectSendLevel(float level)
2592beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    {
2602beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        Parcel data, reply;
2612beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
2622beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        data.writeFloat(level);
2632beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        remote()->transact(SET_AUX_EFFECT_SEND_LEVEL, data, &reply);
2642beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        return reply.readInt32();
2652beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    }
2662beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent
2672beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    status_t attachAuxEffect(int effectId)
2682beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    {
2692beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        Parcel data, reply;
2702beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
2712beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        data.writeInt32(effectId);
2722beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        remote()->transact(ATTACH_AUX_EFFECT, data, &reply);
2732beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        return reply.readInt32();
2742beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    }
2751173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
2764f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    status_t setParameter(int key, const Parcel& request)
2774f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    {
2784f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        Parcel data, reply;
2794f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
2804f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        data.writeInt32(key);
2814f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        if (request.dataSize() > 0) {
2824f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            data.appendFrom(const_cast<Parcel *>(&request), 0, request.dataSize());
2834f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        }
2844f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        remote()->transact(SET_PARAMETER, data, &reply);
2854f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        return reply.readInt32();
2864f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    }
2874f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
2884f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    status_t getParameter(int key, Parcel *reply)
2894f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    {
2904f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        Parcel data;
2914f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
2924f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        data.writeInt32(key);
2934f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        return remote()->transact(GET_PARAMETER, data, reply);
2944f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    }
2954f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
29644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    status_t setRetransmitEndpoint(const struct sockaddr_in* endpoint)
29744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    {
298c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        Parcel data, reply;
299c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        status_t err;
300c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
301c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
302c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        if (NULL != endpoint) {
303c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            data.writeInt32(sizeof(*endpoint));
304c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            data.write(endpoint, sizeof(*endpoint));
305c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        } else {
306c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            data.writeInt32(0);
307c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        }
308c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
309c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        err = remote()->transact(SET_RETRANSMIT_ENDPOINT, data, &reply);
310c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        if (OK != err) {
311c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            return err;
312c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        }
3136b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        return reply.readInt32();
3146b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen    }
315c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
3166b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen    status_t setNextPlayer(const sp<IMediaPlayer>& player) {
3176b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        Parcel data, reply;
3186b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
3196b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        sp<IBinder> b(player->asBinder());
3206b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        data.writeStrongBinder(b);
3216b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        remote()->transact(SET_NEXT_PLAYER, data, &reply);
322c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        return reply.readInt32();
323c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    }
32444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
32544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    status_t getRetransmitEndpoint(struct sockaddr_in* endpoint)
32644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    {
32744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        Parcel data, reply;
32844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        status_t err;
32944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
33044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
33144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        err = remote()->transact(GET_RETRANSMIT_ENDPOINT, data, &reply);
33244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
33344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        if ((OK != err) || (OK != (err = reply.readInt32()))) {
33444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            return err;
33544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        }
33644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
33744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        data.read(endpoint, sizeof(*endpoint));
33844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
33944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return err;
34044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
34189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
34289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
34356f0cc533a38bdb84bc03adcb43515614ab21baenikoIMPLEMENT_META_INTERFACE(MediaPlayer, "android.media.IMediaPlayer");
34489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
34589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
34689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
34789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnMediaPlayer::onTransact(
34889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
34989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
350e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
35189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case DISCONNECT: {
35289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
35389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            disconnect();
35489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
35589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
356d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        case SET_DATA_SOURCE_URL: {
357d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            CHECK_INTERFACE(IMediaPlayer, data, reply);
358d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            const char* url = data.readCString();
359d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            KeyedVector<String8, String8> headers;
360d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            int32_t numHeaders = data.readInt32();
361d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            for (int i = 0; i < numHeaders; ++i) {
362d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                String8 key = data.readString8();
363d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                String8 value = data.readString8();
364d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                headers.add(key, value);
365d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            }
366d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            reply->writeInt32(setDataSource(url, numHeaders > 0 ? &headers : NULL));
367d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            return NO_ERROR;
368d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        } break;
369d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        case SET_DATA_SOURCE_FD: {
370d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            CHECK_INTERFACE(IMediaPlayer, data, reply);
371d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            int fd = data.readFileDescriptor();
372d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            int64_t offset = data.readInt64();
373d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            int64_t length = data.readInt64();
374d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            reply->writeInt32(setDataSource(fd, offset, length));
375d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            return NO_ERROR;
376d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        }
377d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        case SET_DATA_SOURCE_STREAM: {
378d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            CHECK_INTERFACE(IMediaPlayer, data, reply);
379d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            sp<IStreamSource> source =
380d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                interface_cast<IStreamSource>(data.readStrongBinder());
381d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            reply->writeInt32(setDataSource(source));
382d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            return NO_ERROR;
383d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        }
3841173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        case SET_VIDEO_SURFACETEXTURE: {
3851173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            CHECK_INTERFACE(IMediaPlayer, data, reply);
3861173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            sp<ISurfaceTexture> surfaceTexture =
3871173118eace0e9e347cb007f0da817cee87579edGlenn Kasten                    interface_cast<ISurfaceTexture>(data.readStrongBinder());
3881173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            reply->writeInt32(setVideoSurfaceTexture(surfaceTexture));
3891173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            return NO_ERROR;
3901173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        } break;
39189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case PREPARE_ASYNC: {
39289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
39389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(prepareAsync());
39489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
39589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
39689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case START: {
39789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
39889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(start());
39989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
40089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
40189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STOP: {
40289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
40389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(stop());
40489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
40589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
40689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case IS_PLAYING: {
40789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
40889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            bool state;
40989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t ret = isPlaying(&state);
41089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(state);
41189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(ret);
41289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
41389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
41489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case PAUSE: {
41589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
41689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(pause());
41789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
41889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
41989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SEEK_TO: {
42089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
42189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(seekTo(data.readInt32()));
42289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
42389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
42489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_CURRENT_POSITION: {
42589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
42689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int msec;
42789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t ret = getCurrentPosition(&msec);
42889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(msec);
42989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(ret);
43089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
43189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
43289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_DURATION: {
43389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
43489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int msec;
43589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t ret = getDuration(&msec);
43689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(msec);
43789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(ret);
43889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
43989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
44089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case RESET: {
44189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
44289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(reset());
44389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
44489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
44589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_AUDIO_STREAM_TYPE: {
44689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
447fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32(setAudioStreamType((audio_stream_type_t) data.readInt32()));
44889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
44989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
45089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_LOOPING: {
45189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
45289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(setLooping(data.readInt32()));
45389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
45489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
45589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_VOLUME: {
456172fb9ab347e146642234f0bd6f223d351e9fd0bDave Sparks            CHECK_INTERFACE(IMediaPlayer, data, reply);
457de162ff337723798381890151247b129c4fbe314Gloria Wang            float leftVolume = data.readFloat();
458de162ff337723798381890151247b129c4fbe314Gloria Wang            float rightVolume = data.readFloat();
459de162ff337723798381890151247b129c4fbe314Gloria Wang            reply->writeInt32(setVolume(leftVolume, rightVolume));
46089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
46189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
4621d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania        case INVOKE: {
4631d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania            CHECK_INTERFACE(IMediaPlayer, data, reply);
464040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong            status_t result = invoke(data, reply);
465040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong            return result;
4661d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania        } break;
467a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        case SET_METADATA_FILTER: {
468a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania            CHECK_INTERFACE(IMediaPlayer, data, reply);
469a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania            reply->writeInt32(setMetadataFilter(data));
470a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania            return NO_ERROR;
471a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        } break;
4728e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        case GET_METADATA: {
4738e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            CHECK_INTERFACE(IMediaPlayer, data, reply);
474de162ff337723798381890151247b129c4fbe314Gloria Wang            bool update_only = static_cast<bool>(data.readInt32());
475de162ff337723798381890151247b129c4fbe314Gloria Wang            bool apply_filter = static_cast<bool>(data.readInt32());
476de162ff337723798381890151247b129c4fbe314Gloria Wang            const status_t retcode = getMetadata(update_only, apply_filter, reply);
4778e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            reply->setDataPosition(0);
4788e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            reply->writeInt32(retcode);
4798e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            reply->setDataPosition(0);
4808e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            return NO_ERROR;
4818e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        } break;
4822beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        case SET_AUX_EFFECT_SEND_LEVEL: {
4832beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            CHECK_INTERFACE(IMediaPlayer, data, reply);
4842beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            reply->writeInt32(setAuxEffectSendLevel(data.readFloat()));
4852beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            return NO_ERROR;
4862beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        } break;
4872beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        case ATTACH_AUX_EFFECT: {
4882beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            CHECK_INTERFACE(IMediaPlayer, data, reply);
4892beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            reply->writeInt32(attachAuxEffect(data.readInt32()));
4902beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            return NO_ERROR;
4912beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        } break;
4924f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        case SET_PARAMETER: {
4934f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            CHECK_INTERFACE(IMediaPlayer, data, reply);
4944f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            int key = data.readInt32();
4954f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
4964f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            Parcel request;
4974f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            if (data.dataAvail() > 0) {
4984f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang                request.appendFrom(
4994f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang                        const_cast<Parcel *>(&data), data.dataPosition(), data.dataAvail());
5004f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            }
5014f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            request.setDataPosition(0);
5024f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            reply->writeInt32(setParameter(key, request));
5034f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            return NO_ERROR;
5044f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        } break;
5054f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        case GET_PARAMETER: {
5064f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            CHECK_INTERFACE(IMediaPlayer, data, reply);
5074f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            return getParameter(data.readInt32(), reply);
5084f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        } break;
509c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        case SET_RETRANSMIT_ENDPOINT: {
510c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            CHECK_INTERFACE(IMediaPlayer, data, reply);
511c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
512c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            struct sockaddr_in endpoint;
513c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            int amt = data.readInt32();
514c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            if (amt == sizeof(endpoint)) {
515c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman                data.read(&endpoint, sizeof(struct sockaddr_in));
516c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman                reply->writeInt32(setRetransmitEndpoint(&endpoint));
517c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            } else {
518c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman                reply->writeInt32(setRetransmitEndpoint(NULL));
519c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            }
52044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
52144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            return NO_ERROR;
52244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        } break;
52344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        case GET_RETRANSMIT_ENDPOINT: {
52444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            CHECK_INTERFACE(IMediaPlayer, data, reply);
52544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
52644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            struct sockaddr_in endpoint;
52744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            status_t res = getRetransmitEndpoint(&endpoint);
52844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
52944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            reply->writeInt32(res);
53044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            reply->write(&endpoint, sizeof(endpoint));
53144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
5326b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen            return NO_ERROR;
5336b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        } break;
5346b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        case SET_NEXT_PLAYER: {
5356b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen            CHECK_INTERFACE(IMediaPlayer, data, reply);
5366b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen            reply->writeInt32(setNextPlayer(interface_cast<IMediaPlayer>(data.readStrongBinder())));
53744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
538c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            return NO_ERROR;
539c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        } break;
54089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
54189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
54289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
54389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
54489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
54589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
54689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
54789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
548