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
241b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <media/IMediaHTTPService.h>
2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IMediaPlayer.h>
26d681bbb1767bed09415e050ba78975df214bcd68Dave Burke#include <media/IStreamSource.h>
27d681bbb1767bed09415e050ba78975df214bcd68Dave Burke
288ba01021b573889802e67e029225a96f0dfa471aAndy McFadden#include <gui/IGraphicBufferProducer.h>
29d681bbb1767bed09415e050ba78975df214bcd68Dave Burke#include <utils/String8.h>
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum {
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
35d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    SET_DATA_SOURCE_URL,
36d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    SET_DATA_SOURCE_FD,
37d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    SET_DATA_SOURCE_STREAM,
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    PREPARE_ASYNC,
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    START,
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    STOP,
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    IS_PLAYING,
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    PAUSE,
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SEEK_TO,
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_CURRENT_POSITION,
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_DURATION,
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    RESET,
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_AUDIO_STREAM_TYPE,
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_LOOPING,
491d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    SET_VOLUME,
501d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    INVOKE,
51a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    SET_METADATA_FILTER,
528e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    GET_METADATA,
532beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    SET_AUX_EFFECT_SEND_LEVEL,
541173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    ATTACH_AUX_EFFECT,
551173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    SET_VIDEO_SURFACETEXTURE,
564f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    SET_PARAMETER,
574f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    GET_PARAMETER,
58c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    SET_RETRANSMIT_ENDPOINT,
5944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    GET_RETRANSMIT_ENDPOINT,
606b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen    SET_NEXT_PLAYER,
6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpMediaPlayer: public BpInterface<IMediaPlayer>
6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    BpMediaPlayer(const sp<IBinder>& impl)
6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IMediaPlayer>(impl)
6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
6989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // disconnect from media player service
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void disconnect()
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(DISCONNECT, data, &reply);
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
791b86fe063badb5f28c467ade39be0f4008688947Andreas Huber    status_t setDataSource(
801b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            const sp<IMediaHTTPService> &httpService,
811b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            const char* url,
82d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            const KeyedVector<String8, String8>* headers)
83d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    {
84d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        Parcel data, reply;
85d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
861b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        data.writeInt32(httpService != NULL);
871b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        if (httpService != NULL) {
881b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            data.writeStrongBinder(httpService->asBinder());
891b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        }
90d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeCString(url);
91d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        if (headers == NULL) {
92d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            data.writeInt32(0);
93d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        } else {
94d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            // serialize the headers
95d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            data.writeInt32(headers->size());
96d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            for (size_t i = 0; i < headers->size(); ++i) {
97d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                data.writeString8(headers->keyAt(i));
98d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                data.writeString8(headers->valueAt(i));
99d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            }
100d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        }
101d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        remote()->transact(SET_DATA_SOURCE_URL, data, &reply);
102d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        return reply.readInt32();
103d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    }
104d681bbb1767bed09415e050ba78975df214bcd68Dave Burke
105d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    status_t setDataSource(int fd, int64_t offset, int64_t length) {
106d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        Parcel data, reply;
107d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
108d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeFileDescriptor(fd);
109d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInt64(offset);
110d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInt64(length);
111d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        remote()->transact(SET_DATA_SOURCE_FD, data, &reply);
112d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        return reply.readInt32();
113d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    }
114d681bbb1767bed09415e050ba78975df214bcd68Dave Burke
115d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    status_t setDataSource(const sp<IStreamSource> &source) {
116d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        Parcel data, reply;
117d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
118d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeStrongBinder(source->asBinder());
1198d65510a2e9ff7b64f2f35bfe3cd745a717c9533Glenn Kasten        remote()->transact(SET_DATA_SOURCE_STREAM, data, &reply);
120d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        return reply.readInt32();
121d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    }
122d681bbb1767bed09415e050ba78975df214bcd68Dave Burke
1238ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    // pass the buffered IGraphicBufferProducer to the media player service
1248ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    status_t setVideoSurfaceTexture(const sp<IGraphicBufferProducer>& bufferProducer)
1251173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    {
1261173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        Parcel data, reply;
1271173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
1288ba01021b573889802e67e029225a96f0dfa471aAndy McFadden        sp<IBinder> b(bufferProducer->asBinder());
1291173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        data.writeStrongBinder(b);
1301173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        remote()->transact(SET_VIDEO_SURFACETEXTURE, data, &reply);
1311173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        return reply.readInt32();
1321173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    }
1331173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t prepareAsync()
13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(PREPARE_ASYNC, data, &reply);
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t start()
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(START, data, &reply);
14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t stop()
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STOP, data, &reply);
15589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
15889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t isPlaying(bool* state)
15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
16189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
16289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(IS_PLAYING, data, &reply);
16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *state = reply.readInt32();
16489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
16589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t pause()
16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
17089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(PAUSE, data, &reply);
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t seekTo(int msec)
17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(msec);
18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SEEK_TO, data, &reply);
18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t getCurrentPosition(int* msec)
18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(GET_CURRENT_POSITION, data, &reply);
18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *msec = reply.readInt32();
19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t getDuration(int* msec)
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(GET_DURATION, data, &reply);
19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *msec = reply.readInt32();
19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t reset()
20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(RESET, data, &reply);
20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
210fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    status_t setAudioStreamType(audio_stream_type_t stream)
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
214fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_AUDIO_STREAM_TYPE, data, &reply);
21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t setLooping(int loop)
22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(loop);
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_LOOPING, data, &reply);
22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t setVolume(float leftVolume, float rightVolume)
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
231172fb9ab347e146642234f0bd6f223d351e9fd0bDave Sparks        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(leftVolume);
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(rightVolume);
23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_VOLUME, data, &reply);
23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
2371d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania
2381d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    status_t invoke(const Parcel& request, Parcel *reply)
239040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong    {
240040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong        // Avoid doing any extra copy. The interface descriptor should
241040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong        // have been set by MediaPlayer.java.
2428e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        return remote()->transact(INVOKE, request, reply);
2431d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    }
244a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania
245a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    status_t setMetadataFilter(const Parcel& request)
246a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    {
247a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        Parcel reply;
248a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        // Avoid doing any extra copy of the request. The interface
249a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        // descriptor should have been set by MediaPlayer.java.
250a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        remote()->transact(SET_METADATA_FILTER, request, &reply);
251a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        return reply.readInt32();
252a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    }
2538e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania
2548e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    status_t getMetadata(bool update_only, bool apply_filter, Parcel *reply)
2558e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    {
2568e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        Parcel request;
2578e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        request.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
2588e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        // TODO: Burning 2 ints for 2 boolean. Should probably use flags in an int here.
2598e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        request.writeInt32(update_only);
2608e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        request.writeInt32(apply_filter);
2618e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        remote()->transact(GET_METADATA, request, reply);
2628e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        return reply->readInt32();
2638e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    }
2644e92c7efc68b5d7635a32dbd283ab8558ad9bdd6Andreas Huber
2652beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    status_t setAuxEffectSendLevel(float level)
2662beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    {
2672beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        Parcel data, reply;
2682beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
2692beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        data.writeFloat(level);
2702beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        remote()->transact(SET_AUX_EFFECT_SEND_LEVEL, data, &reply);
2712beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        return reply.readInt32();
2722beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    }
2732beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent
2742beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    status_t attachAuxEffect(int effectId)
2752beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    {
2762beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        Parcel data, reply;
2772beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
2782beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        data.writeInt32(effectId);
2792beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        remote()->transact(ATTACH_AUX_EFFECT, data, &reply);
2802beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        return reply.readInt32();
2812beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    }
2821173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
2834f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    status_t setParameter(int key, const Parcel& request)
2844f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    {
2854f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        Parcel data, reply;
2864f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
2874f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        data.writeInt32(key);
2884f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        if (request.dataSize() > 0) {
2894f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            data.appendFrom(const_cast<Parcel *>(&request), 0, request.dataSize());
2904f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        }
2914f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        remote()->transact(SET_PARAMETER, data, &reply);
2924f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        return reply.readInt32();
2934f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    }
2944f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
2954f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    status_t getParameter(int key, Parcel *reply)
2964f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    {
2974f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        Parcel data;
2984f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
2994f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        data.writeInt32(key);
3004f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        return remote()->transact(GET_PARAMETER, data, reply);
3014f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    }
3024f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
30344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    status_t setRetransmitEndpoint(const struct sockaddr_in* endpoint)
30444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    {
305c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        Parcel data, reply;
306c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        status_t err;
307c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
308c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
309c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        if (NULL != endpoint) {
310c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            data.writeInt32(sizeof(*endpoint));
311c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            data.write(endpoint, sizeof(*endpoint));
312c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        } else {
313c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            data.writeInt32(0);
314c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        }
315c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
316c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        err = remote()->transact(SET_RETRANSMIT_ENDPOINT, data, &reply);
317c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        if (OK != err) {
318c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            return err;
319c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        }
3206b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        return reply.readInt32();
3216b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen    }
322c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
3236b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen    status_t setNextPlayer(const sp<IMediaPlayer>& player) {
3246b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        Parcel data, reply;
3256b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
3266b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        sp<IBinder> b(player->asBinder());
3276b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        data.writeStrongBinder(b);
3286b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        remote()->transact(SET_NEXT_PLAYER, data, &reply);
329c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        return reply.readInt32();
330c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    }
33144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
33244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    status_t getRetransmitEndpoint(struct sockaddr_in* endpoint)
33344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    {
33444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        Parcel data, reply;
33544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        status_t err;
33644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
33744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
33844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        err = remote()->transact(GET_RETRANSMIT_ENDPOINT, data, &reply);
33944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
34044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        if ((OK != err) || (OK != (err = reply.readInt32()))) {
34144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            return err;
34244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        }
34344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
34444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        data.read(endpoint, sizeof(*endpoint));
34544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
34644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return err;
34744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
34889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
34989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
35056f0cc533a38bdb84bc03adcb43515614ab21baenikoIMPLEMENT_META_INTERFACE(MediaPlayer, "android.media.IMediaPlayer");
35189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
35289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
35389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
35489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnMediaPlayer::onTransact(
35589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
357e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
35889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case DISCONNECT: {
35989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
36089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            disconnect();
36189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
36289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
363d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        case SET_DATA_SOURCE_URL: {
364d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            CHECK_INTERFACE(IMediaPlayer, data, reply);
3651b86fe063badb5f28c467ade39be0f4008688947Andreas Huber
3661b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            sp<IMediaHTTPService> httpService;
3671b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            if (data.readInt32()) {
3681b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                httpService =
3691b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                    interface_cast<IMediaHTTPService>(data.readStrongBinder());
3701b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            }
3711b86fe063badb5f28c467ade39be0f4008688947Andreas Huber
372d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            const char* url = data.readCString();
373d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            KeyedVector<String8, String8> headers;
374d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            int32_t numHeaders = data.readInt32();
375d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            for (int i = 0; i < numHeaders; ++i) {
376d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                String8 key = data.readString8();
377d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                String8 value = data.readString8();
378d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                headers.add(key, value);
379d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            }
3801b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            reply->writeInt32(setDataSource(
3811b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                        httpService, url, numHeaders > 0 ? &headers : NULL));
382d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            return NO_ERROR;
383d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        } break;
384d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        case SET_DATA_SOURCE_FD: {
385d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            CHECK_INTERFACE(IMediaPlayer, data, reply);
386d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            int fd = data.readFileDescriptor();
387d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            int64_t offset = data.readInt64();
388d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            int64_t length = data.readInt64();
389d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            reply->writeInt32(setDataSource(fd, offset, length));
390d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            return NO_ERROR;
391d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        }
392d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        case SET_DATA_SOURCE_STREAM: {
393d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            CHECK_INTERFACE(IMediaPlayer, data, reply);
394d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            sp<IStreamSource> source =
395d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                interface_cast<IStreamSource>(data.readStrongBinder());
396d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            reply->writeInt32(setDataSource(source));
397d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            return NO_ERROR;
398d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        }
3991173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        case SET_VIDEO_SURFACETEXTURE: {
4001173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            CHECK_INTERFACE(IMediaPlayer, data, reply);
4018ba01021b573889802e67e029225a96f0dfa471aAndy McFadden            sp<IGraphicBufferProducer> bufferProducer =
4028ba01021b573889802e67e029225a96f0dfa471aAndy McFadden                    interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
4038ba01021b573889802e67e029225a96f0dfa471aAndy McFadden            reply->writeInt32(setVideoSurfaceTexture(bufferProducer));
4041173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            return NO_ERROR;
4051173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        } break;
40689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case PREPARE_ASYNC: {
40789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
40889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(prepareAsync());
40989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
41089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
41189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case START: {
41289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
41389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(start());
41489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
41589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
41689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STOP: {
41789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
41889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(stop());
41989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
42089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
42189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case IS_PLAYING: {
42289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
42389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            bool state;
42489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t ret = isPlaying(&state);
42589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(state);
42689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(ret);
42789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
42889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
42989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case PAUSE: {
43089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
43189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(pause());
43289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
43389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
43489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SEEK_TO: {
43589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
43689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(seekTo(data.readInt32()));
43789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
43889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
43989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_CURRENT_POSITION: {
44089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
44189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int msec;
44289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t ret = getCurrentPosition(&msec);
44389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(msec);
44489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(ret);
44589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
44689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
44789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_DURATION: {
44889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
44989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int msec;
45089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t ret = getDuration(&msec);
45189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(msec);
45289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(ret);
45389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
45489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
45589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case RESET: {
45689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
45789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(reset());
45889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
45989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
46089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_AUDIO_STREAM_TYPE: {
46189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
462fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32(setAudioStreamType((audio_stream_type_t) data.readInt32()));
46389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
46489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
46589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_LOOPING: {
46689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
46789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(setLooping(data.readInt32()));
46889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
46989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
47089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_VOLUME: {
471172fb9ab347e146642234f0bd6f223d351e9fd0bDave Sparks            CHECK_INTERFACE(IMediaPlayer, data, reply);
472de162ff337723798381890151247b129c4fbe314Gloria Wang            float leftVolume = data.readFloat();
473de162ff337723798381890151247b129c4fbe314Gloria Wang            float rightVolume = data.readFloat();
474de162ff337723798381890151247b129c4fbe314Gloria Wang            reply->writeInt32(setVolume(leftVolume, rightVolume));
47589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
47689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
4771d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania        case INVOKE: {
4781d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania            CHECK_INTERFACE(IMediaPlayer, data, reply);
479040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong            status_t result = invoke(data, reply);
480040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong            return result;
4811d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania        } break;
482a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        case SET_METADATA_FILTER: {
483a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania            CHECK_INTERFACE(IMediaPlayer, data, reply);
484a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania            reply->writeInt32(setMetadataFilter(data));
485a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania            return NO_ERROR;
486a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        } break;
4878e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        case GET_METADATA: {
4888e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            CHECK_INTERFACE(IMediaPlayer, data, reply);
489de162ff337723798381890151247b129c4fbe314Gloria Wang            bool update_only = static_cast<bool>(data.readInt32());
490de162ff337723798381890151247b129c4fbe314Gloria Wang            bool apply_filter = static_cast<bool>(data.readInt32());
491de162ff337723798381890151247b129c4fbe314Gloria Wang            const status_t retcode = getMetadata(update_only, apply_filter, reply);
4928e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            reply->setDataPosition(0);
4938e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            reply->writeInt32(retcode);
4948e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            reply->setDataPosition(0);
4958e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            return NO_ERROR;
4968e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        } break;
4972beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        case SET_AUX_EFFECT_SEND_LEVEL: {
4982beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            CHECK_INTERFACE(IMediaPlayer, data, reply);
4992beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            reply->writeInt32(setAuxEffectSendLevel(data.readFloat()));
5002beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            return NO_ERROR;
5012beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        } break;
5022beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        case ATTACH_AUX_EFFECT: {
5032beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            CHECK_INTERFACE(IMediaPlayer, data, reply);
5042beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            reply->writeInt32(attachAuxEffect(data.readInt32()));
5052beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            return NO_ERROR;
5062beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        } break;
5074f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        case SET_PARAMETER: {
5084f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            CHECK_INTERFACE(IMediaPlayer, data, reply);
5094f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            int key = data.readInt32();
5104f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
5114f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            Parcel request;
5124f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            if (data.dataAvail() > 0) {
5134f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang                request.appendFrom(
5144f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang                        const_cast<Parcel *>(&data), data.dataPosition(), data.dataAvail());
5154f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            }
5164f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            request.setDataPosition(0);
5174f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            reply->writeInt32(setParameter(key, request));
5184f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            return NO_ERROR;
5194f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        } break;
5204f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        case GET_PARAMETER: {
5214f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            CHECK_INTERFACE(IMediaPlayer, data, reply);
5224f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            return getParameter(data.readInt32(), reply);
5234f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        } break;
524c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        case SET_RETRANSMIT_ENDPOINT: {
525c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            CHECK_INTERFACE(IMediaPlayer, data, reply);
526c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
527c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            struct sockaddr_in endpoint;
528c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            int amt = data.readInt32();
529c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            if (amt == sizeof(endpoint)) {
530c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman                data.read(&endpoint, sizeof(struct sockaddr_in));
531c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman                reply->writeInt32(setRetransmitEndpoint(&endpoint));
532c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            } else {
533c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman                reply->writeInt32(setRetransmitEndpoint(NULL));
534c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            }
53544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
53644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            return NO_ERROR;
53744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        } break;
53844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        case GET_RETRANSMIT_ENDPOINT: {
53944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            CHECK_INTERFACE(IMediaPlayer, data, reply);
54044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
54144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            struct sockaddr_in endpoint;
54244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            status_t res = getRetransmitEndpoint(&endpoint);
54344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
54444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            reply->writeInt32(res);
54544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            reply->write(&endpoint, sizeof(endpoint));
54644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
5476b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen            return NO_ERROR;
5486b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        } break;
5496b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        case SET_NEXT_PLAYER: {
5506b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen            CHECK_INTERFACE(IMediaPlayer, data, reply);
5516b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen            reply->writeInt32(setNextPlayer(interface_cast<IMediaPlayer>(data.readStrongBinder())));
55244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
553c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            return NO_ERROR;
554c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        } break;
55589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
55689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
55789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
55889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
55989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
56089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
56189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
56289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
563