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
243a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar#include <media/AudioResamplerPublic.h>
253a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar#include <media/AVSyncSettings.h>
263a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar
2799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins#include <media/IDataSource.h>
281b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <media/IMediaHTTPService.h>
2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IMediaPlayer.h>
30d681bbb1767bed09415e050ba78975df214bcd68Dave Burke#include <media/IStreamSource.h>
31d681bbb1767bed09415e050ba78975df214bcd68Dave Burke
328ba01021b573889802e67e029225a96f0dfa471aAndy McFadden#include <gui/IGraphicBufferProducer.h>
33d681bbb1767bed09415e050ba78975df214bcd68Dave Burke#include <utils/String8.h>
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum {
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
39d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    SET_DATA_SOURCE_URL,
40d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    SET_DATA_SOURCE_FD,
41d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    SET_DATA_SOURCE_STREAM,
4299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    SET_DATA_SOURCE_CALLBACK,
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    PREPARE_ASYNC,
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    START,
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    STOP,
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    IS_PLAYING,
473a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    SET_PLAYBACK_SETTINGS,
483a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    GET_PLAYBACK_SETTINGS,
493a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    SET_SYNC_SETTINGS,
503a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    GET_SYNC_SETTINGS,
5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    PAUSE,
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SEEK_TO,
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_CURRENT_POSITION,
5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_DURATION,
5589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    RESET,
5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_AUDIO_STREAM_TYPE,
5789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_LOOPING,
581d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    SET_VOLUME,
591d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    INVOKE,
60a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    SET_METADATA_FILTER,
618e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    GET_METADATA,
622beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    SET_AUX_EFFECT_SEND_LEVEL,
631173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    ATTACH_AUX_EFFECT,
641173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    SET_VIDEO_SURFACETEXTURE,
654f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    SET_PARAMETER,
664f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    GET_PARAMETER,
67c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    SET_RETRANSMIT_ENDPOINT,
6844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    GET_RETRANSMIT_ENDPOINT,
696b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen    SET_NEXT_PLAYER,
7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpMediaPlayer: public BpInterface<IMediaPlayer>
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    BpMediaPlayer(const sp<IBinder>& impl)
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IMediaPlayer>(impl)
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // disconnect from media player service
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void disconnect()
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(DISCONNECT, data, &reply);
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
881b86fe063badb5f28c467ade39be0f4008688947Andreas Huber    status_t setDataSource(
891b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            const sp<IMediaHTTPService> &httpService,
901b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            const char* url,
91d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            const KeyedVector<String8, String8>* headers)
92d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    {
93d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        Parcel data, reply;
94d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
951b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        data.writeInt32(httpService != NULL);
961b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        if (httpService != NULL) {
9706b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            data.writeStrongBinder(IInterface::asBinder(httpService));
981b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        }
99d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeCString(url);
100d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        if (headers == NULL) {
101d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            data.writeInt32(0);
102d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        } else {
103d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            // serialize the headers
104d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            data.writeInt32(headers->size());
105d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            for (size_t i = 0; i < headers->size(); ++i) {
106d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                data.writeString8(headers->keyAt(i));
107d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                data.writeString8(headers->valueAt(i));
108d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            }
109d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        }
110d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        remote()->transact(SET_DATA_SOURCE_URL, data, &reply);
111d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        return reply.readInt32();
112d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    }
113d681bbb1767bed09415e050ba78975df214bcd68Dave Burke
114d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    status_t setDataSource(int fd, int64_t offset, int64_t length) {
115d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        Parcel data, reply;
116d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
117d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeFileDescriptor(fd);
118d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInt64(offset);
119d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInt64(length);
120d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        remote()->transact(SET_DATA_SOURCE_FD, data, &reply);
121d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        return reply.readInt32();
122d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    }
123d681bbb1767bed09415e050ba78975df214bcd68Dave Burke
124d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    status_t setDataSource(const sp<IStreamSource> &source) {
125d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        Parcel data, reply;
126d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
12706b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(source));
1288d65510a2e9ff7b64f2f35bfe3cd745a717c9533Glenn Kasten        remote()->transact(SET_DATA_SOURCE_STREAM, data, &reply);
129d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        return reply.readInt32();
130d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    }
131d681bbb1767bed09415e050ba78975df214bcd68Dave Burke
13299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    status_t setDataSource(const sp<IDataSource> &source) {
13399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        Parcel data, reply;
13499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
13599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        data.writeStrongBinder(IInterface::asBinder(source));
13699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        remote()->transact(SET_DATA_SOURCE_CALLBACK, data, &reply);
13799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        return reply.readInt32();
13899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    }
13999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
1408ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    // pass the buffered IGraphicBufferProducer to the media player service
1418ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    status_t setVideoSurfaceTexture(const sp<IGraphicBufferProducer>& bufferProducer)
1421173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    {
1431173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        Parcel data, reply;
1441173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
14506b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        sp<IBinder> b(IInterface::asBinder(bufferProducer));
1461173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        data.writeStrongBinder(b);
1471173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        remote()->transact(SET_VIDEO_SURFACETEXTURE, data, &reply);
1481173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        return reply.readInt32();
1491173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    }
1501173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t prepareAsync()
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(PREPARE_ASYNC, data, &reply);
15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
15889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t start()
16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
16189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
16289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(START, data, &reply);
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 stop()
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(STOP, 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 isPlaying(bool* state)
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        remote()->transact(IS_PLAYING, data, &reply);
18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *state = reply.readInt32();
18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1843a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    status_t setPlaybackSettings(const AudioPlaybackRate& rate)
1853a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    {
1863a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        Parcel data, reply;
1873a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
1883a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeFloat(rate.mSpeed);
1893a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeFloat(rate.mPitch);
1903a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeInt32((int32_t)rate.mFallbackMode);
1913a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeInt32((int32_t)rate.mStretchMode);
1923a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        remote()->transact(SET_PLAYBACK_SETTINGS, data, &reply);
1933a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        return reply.readInt32();
1943a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    }
1953a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar
1963a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    status_t getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */)
1973a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    {
1983a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        Parcel data, reply;
1993a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
2003a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        remote()->transact(GET_PLAYBACK_SETTINGS, data, &reply);
2013a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        status_t err = reply.readInt32();
2023a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        if (err == OK) {
2033a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            *rate = AUDIO_PLAYBACK_RATE_DEFAULT;
2043a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate->mSpeed = reply.readFloat();
2053a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate->mPitch = reply.readFloat();
2063a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate->mFallbackMode = (AudioTimestretchFallbackMode)reply.readInt32();
2073a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate->mStretchMode = (AudioTimestretchStretchMode)reply.readInt32();
2083a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        }
2093a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        return err;
2103a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    }
2113a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar
2123a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    status_t setSyncSettings(const AVSyncSettings& sync, float videoFpsHint)
2139816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia    {
2149816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia        Parcel data, reply;
2159816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
2163a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeInt32((int32_t)sync.mSource);
2173a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeInt32((int32_t)sync.mAudioAdjustMode);
2183a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeFloat(sync.mTolerance);
2193a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeFloat(videoFpsHint);
2203a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        remote()->transact(SET_SYNC_SETTINGS, data, &reply);
2219816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia        return reply.readInt32();
2229816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia    }
2239816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia
2243a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    status_t getSyncSettings(AVSyncSettings* sync /* nonnull */, float* videoFps /* nonnull */)
2253a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    {
2263a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        Parcel data, reply;
2273a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
2283a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        remote()->transact(GET_SYNC_SETTINGS, data, &reply);
2293a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        status_t err = reply.readInt32();
2303a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        if (err == OK) {
2313a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            AVSyncSettings settings;
2323a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            settings.mSource = (AVSyncSource)reply.readInt32();
2333a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            settings.mAudioAdjustMode = (AVSyncAudioAdjustMode)reply.readInt32();
2343a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            settings.mTolerance = reply.readFloat();
2353a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            *sync = settings;
2363a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            *videoFps = reply.readFloat();
2373a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        }
2383a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        return err;
2393a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    }
2403a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar
24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t pause()
24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(PAUSE, data, &reply);
24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t seekTo(int msec)
25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(msec);
25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SEEK_TO, data, &reply);
25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t getCurrentPosition(int* msec)
25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(GET_CURRENT_POSITION, data, &reply);
26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *msec = reply.readInt32();
26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t getDuration(int* msec)
26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(GET_DURATION, data, &reply);
27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *msec = reply.readInt32();
27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t reset()
27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(RESET, data, &reply);
28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
284fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    status_t setAudioStreamType(audio_stream_type_t stream)
28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
288fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_AUDIO_STREAM_TYPE, data, &reply);
29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t setLooping(int loop)
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(loop);
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_LOOPING, data, &reply);
29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t setVolume(float leftVolume, float rightVolume)
30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
305172fb9ab347e146642234f0bd6f223d351e9fd0bDave Sparks        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(leftVolume);
30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(rightVolume);
30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_VOLUME, data, &reply);
30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
3111d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania
3121d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    status_t invoke(const Parcel& request, Parcel *reply)
313040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong    {
314040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong        // Avoid doing any extra copy. The interface descriptor should
315040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong        // have been set by MediaPlayer.java.
3168e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        return remote()->transact(INVOKE, request, reply);
3171d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    }
318a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania
319a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    status_t setMetadataFilter(const Parcel& request)
320a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    {
321a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        Parcel reply;
322a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        // Avoid doing any extra copy of the request. The interface
323a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        // descriptor should have been set by MediaPlayer.java.
324a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        remote()->transact(SET_METADATA_FILTER, request, &reply);
325a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        return reply.readInt32();
326a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    }
3278e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania
3288e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    status_t getMetadata(bool update_only, bool apply_filter, Parcel *reply)
3298e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    {
3308e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        Parcel request;
3318e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        request.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
3328e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        // TODO: Burning 2 ints for 2 boolean. Should probably use flags in an int here.
3338e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        request.writeInt32(update_only);
3348e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        request.writeInt32(apply_filter);
3358e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        remote()->transact(GET_METADATA, request, reply);
3368e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        return reply->readInt32();
3378e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    }
3384e92c7efc68b5d7635a32dbd283ab8558ad9bdd6Andreas Huber
3392beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    status_t setAuxEffectSendLevel(float level)
3402beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    {
3412beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        Parcel data, reply;
3422beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
3432beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        data.writeFloat(level);
3442beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        remote()->transact(SET_AUX_EFFECT_SEND_LEVEL, data, &reply);
3452beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        return reply.readInt32();
3462beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    }
3472beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent
3482beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    status_t attachAuxEffect(int effectId)
3492beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    {
3502beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        Parcel data, reply;
3512beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
3522beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        data.writeInt32(effectId);
3532beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        remote()->transact(ATTACH_AUX_EFFECT, data, &reply);
3542beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        return reply.readInt32();
3552beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    }
3561173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
3574f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    status_t setParameter(int key, const Parcel& request)
3584f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    {
3594f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        Parcel data, reply;
3604f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
3614f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        data.writeInt32(key);
3624f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        if (request.dataSize() > 0) {
3634f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            data.appendFrom(const_cast<Parcel *>(&request), 0, request.dataSize());
3644f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        }
3654f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        remote()->transact(SET_PARAMETER, data, &reply);
3664f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        return reply.readInt32();
3674f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    }
3684f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
3694f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    status_t getParameter(int key, Parcel *reply)
3704f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    {
3714f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        Parcel data;
3724f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
3734f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        data.writeInt32(key);
3744f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        return remote()->transact(GET_PARAMETER, data, reply);
3754f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    }
3764f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
37744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    status_t setRetransmitEndpoint(const struct sockaddr_in* endpoint)
37844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    {
379c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        Parcel data, reply;
380c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        status_t err;
381c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
382c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
383c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        if (NULL != endpoint) {
384c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            data.writeInt32(sizeof(*endpoint));
385c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            data.write(endpoint, sizeof(*endpoint));
386c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        } else {
387c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            data.writeInt32(0);
388c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        }
389c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
390c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        err = remote()->transact(SET_RETRANSMIT_ENDPOINT, data, &reply);
391c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        if (OK != err) {
392c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            return err;
393c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        }
3946b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        return reply.readInt32();
3956b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen    }
396c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
3976b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen    status_t setNextPlayer(const sp<IMediaPlayer>& player) {
3986b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        Parcel data, reply;
3996b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
40006b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        sp<IBinder> b(IInterface::asBinder(player));
4016b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        data.writeStrongBinder(b);
4026b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        remote()->transact(SET_NEXT_PLAYER, data, &reply);
403c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        return reply.readInt32();
404c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    }
40544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
40644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    status_t getRetransmitEndpoint(struct sockaddr_in* endpoint)
40744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    {
40844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        Parcel data, reply;
40944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        status_t err;
41044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
41144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
41244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        err = remote()->transact(GET_RETRANSMIT_ENDPOINT, data, &reply);
41344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
41444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        if ((OK != err) || (OK != (err = reply.readInt32()))) {
41544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            return err;
41644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        }
41744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
41844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        data.read(endpoint, sizeof(*endpoint));
41944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
42044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return err;
42144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
42289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
42389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
42456f0cc533a38bdb84bc03adcb43515614ab21baenikoIMPLEMENT_META_INTERFACE(MediaPlayer, "android.media.IMediaPlayer");
42589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
42689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
42789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
42889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnMediaPlayer::onTransact(
42989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
43089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
431e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
43289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case DISCONNECT: {
43389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
43489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            disconnect();
43589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
43689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
437d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        case SET_DATA_SOURCE_URL: {
438d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            CHECK_INTERFACE(IMediaPlayer, data, reply);
4391b86fe063badb5f28c467ade39be0f4008688947Andreas Huber
4401b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            sp<IMediaHTTPService> httpService;
4411b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            if (data.readInt32()) {
4421b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                httpService =
4431b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                    interface_cast<IMediaHTTPService>(data.readStrongBinder());
4441b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            }
4451b86fe063badb5f28c467ade39be0f4008688947Andreas Huber
446d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            const char* url = data.readCString();
4470ca02a0c2c77bf88aa7d7b7c3ec04f9153ddce93Wei Jia            if (url == NULL) {
4482afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                reply->writeInt32(BAD_VALUE);
4492afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                return NO_ERROR;
4502afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            }
451d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            KeyedVector<String8, String8> headers;
452d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            int32_t numHeaders = data.readInt32();
453d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            for (int i = 0; i < numHeaders; ++i) {
454d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                String8 key = data.readString8();
455d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                String8 value = data.readString8();
456d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                headers.add(key, value);
457d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            }
4581b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            reply->writeInt32(setDataSource(
4591b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                        httpService, url, numHeaders > 0 ? &headers : NULL));
460d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            return NO_ERROR;
461d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        } break;
462d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        case SET_DATA_SOURCE_FD: {
463d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            CHECK_INTERFACE(IMediaPlayer, data, reply);
464d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            int fd = data.readFileDescriptor();
465d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            int64_t offset = data.readInt64();
466d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            int64_t length = data.readInt64();
467d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            reply->writeInt32(setDataSource(fd, offset, length));
468d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            return NO_ERROR;
469d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        }
470d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        case SET_DATA_SOURCE_STREAM: {
471d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            CHECK_INTERFACE(IMediaPlayer, data, reply);
472d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            sp<IStreamSource> source =
473d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                interface_cast<IStreamSource>(data.readStrongBinder());
4742afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            if (source == NULL) {
4752afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                reply->writeInt32(BAD_VALUE);
4762afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            } else {
4772afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                reply->writeInt32(setDataSource(source));
4782afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            }
479d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            return NO_ERROR;
480d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        }
48199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        case SET_DATA_SOURCE_CALLBACK: {
48299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            CHECK_INTERFACE(IMediaPlayer, data, reply);
48399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            sp<IDataSource> source =
48499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins                interface_cast<IDataSource>(data.readStrongBinder());
4852afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            if (source == NULL) {
4862afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                reply->writeInt32(BAD_VALUE);
4872afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            } else {
4882afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                reply->writeInt32(setDataSource(source));
4892afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            }
49099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            return NO_ERROR;
49199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        }
4921173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        case SET_VIDEO_SURFACETEXTURE: {
4931173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            CHECK_INTERFACE(IMediaPlayer, data, reply);
4948ba01021b573889802e67e029225a96f0dfa471aAndy McFadden            sp<IGraphicBufferProducer> bufferProducer =
4958ba01021b573889802e67e029225a96f0dfa471aAndy McFadden                    interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
4968ba01021b573889802e67e029225a96f0dfa471aAndy McFadden            reply->writeInt32(setVideoSurfaceTexture(bufferProducer));
4971173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            return NO_ERROR;
4981173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        } break;
49989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case PREPARE_ASYNC: {
50089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
50189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(prepareAsync());
50289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
50389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
50489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case START: {
50589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
50689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(start());
50789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
50889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
50989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STOP: {
51089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
51189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(stop());
51289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
51389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
51489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case IS_PLAYING: {
51589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
51689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            bool state;
51789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t ret = isPlaying(&state);
51889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(state);
51989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(ret);
52089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
52189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
5223a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        case SET_PLAYBACK_SETTINGS: {
5233a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            CHECK_INTERFACE(IMediaPlayer, data, reply);
5243a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            AudioPlaybackRate rate = AUDIO_PLAYBACK_RATE_DEFAULT;
5253a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate.mSpeed = data.readFloat();
5263a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate.mPitch = data.readFloat();
5273a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate.mFallbackMode = (AudioTimestretchFallbackMode)data.readInt32();
5283a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate.mStretchMode = (AudioTimestretchStretchMode)data.readInt32();
5293a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            reply->writeInt32(setPlaybackSettings(rate));
5303a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            return NO_ERROR;
5313a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        } break;
5323a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        case GET_PLAYBACK_SETTINGS: {
5339816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia            CHECK_INTERFACE(IMediaPlayer, data, reply);
5343a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            AudioPlaybackRate rate = AUDIO_PLAYBACK_RATE_DEFAULT;
5353a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            status_t err = getPlaybackSettings(&rate);
5363a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            reply->writeInt32(err);
5373a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            if (err == OK) {
5383a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                reply->writeFloat(rate.mSpeed);
5393a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                reply->writeFloat(rate.mPitch);
5403a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                reply->writeInt32((int32_t)rate.mFallbackMode);
5413a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                reply->writeInt32((int32_t)rate.mStretchMode);
5423a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            }
5433a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            return NO_ERROR;
5443a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        } break;
5453a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        case SET_SYNC_SETTINGS: {
5463a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            CHECK_INTERFACE(IMediaPlayer, data, reply);
5473a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            AVSyncSettings sync;
5483a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            sync.mSource = (AVSyncSource)data.readInt32();
5493a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            sync.mAudioAdjustMode = (AVSyncAudioAdjustMode)data.readInt32();
5503a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            sync.mTolerance = data.readFloat();
5513a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            float videoFpsHint = data.readFloat();
5523a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            reply->writeInt32(setSyncSettings(sync, videoFpsHint));
5533a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            return NO_ERROR;
5543a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        } break;
5553a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        case GET_SYNC_SETTINGS: {
5563a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            CHECK_INTERFACE(IMediaPlayer, data, reply);
5573a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            AVSyncSettings sync;
5583a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            float videoFps;
5593a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            status_t err = getSyncSettings(&sync, &videoFps);
5603a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            reply->writeInt32(err);
5613a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            if (err == OK) {
5623a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                reply->writeInt32((int32_t)sync.mSource);
5633a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                reply->writeInt32((int32_t)sync.mAudioAdjustMode);
5643a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                reply->writeFloat(sync.mTolerance);
5653a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                reply->writeFloat(videoFps);
5663a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            }
5679816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia            return NO_ERROR;
5689816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia        } break;
56989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case PAUSE: {
57089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
57189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(pause());
57289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
57389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
57489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SEEK_TO: {
57589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
57689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(seekTo(data.readInt32()));
57789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
57889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
57989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_CURRENT_POSITION: {
58089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
581892354335d49f0b9fcd10e20e0c13e3cd0f1f1cbRobert Shih            int msec = 0;
58289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t ret = getCurrentPosition(&msec);
58389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(msec);
58489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(ret);
58589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
58689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
58789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_DURATION: {
58889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
589892354335d49f0b9fcd10e20e0c13e3cd0f1f1cbRobert Shih            int msec = 0;
59089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t ret = getDuration(&msec);
59189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(msec);
59289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(ret);
59389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
59489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
59589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case RESET: {
59689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
59789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(reset());
59889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
59989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
60089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_AUDIO_STREAM_TYPE: {
60189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
602fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32(setAudioStreamType((audio_stream_type_t) data.readInt32()));
60389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
60489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
60589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_LOOPING: {
60689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
60789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(setLooping(data.readInt32()));
60889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
60989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
61089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_VOLUME: {
611172fb9ab347e146642234f0bd6f223d351e9fd0bDave Sparks            CHECK_INTERFACE(IMediaPlayer, data, reply);
612de162ff337723798381890151247b129c4fbe314Gloria Wang            float leftVolume = data.readFloat();
613de162ff337723798381890151247b129c4fbe314Gloria Wang            float rightVolume = data.readFloat();
614de162ff337723798381890151247b129c4fbe314Gloria Wang            reply->writeInt32(setVolume(leftVolume, rightVolume));
61589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
61689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
6171d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania        case INVOKE: {
6181d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania            CHECK_INTERFACE(IMediaPlayer, data, reply);
619040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong            status_t result = invoke(data, reply);
620040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong            return result;
6211d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania        } break;
622a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        case SET_METADATA_FILTER: {
623a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania            CHECK_INTERFACE(IMediaPlayer, data, reply);
624a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania            reply->writeInt32(setMetadataFilter(data));
625a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania            return NO_ERROR;
626a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        } break;
6278e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        case GET_METADATA: {
6288e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            CHECK_INTERFACE(IMediaPlayer, data, reply);
629de162ff337723798381890151247b129c4fbe314Gloria Wang            bool update_only = static_cast<bool>(data.readInt32());
630de162ff337723798381890151247b129c4fbe314Gloria Wang            bool apply_filter = static_cast<bool>(data.readInt32());
631de162ff337723798381890151247b129c4fbe314Gloria Wang            const status_t retcode = getMetadata(update_only, apply_filter, reply);
6328e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            reply->setDataPosition(0);
6338e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            reply->writeInt32(retcode);
6348e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            reply->setDataPosition(0);
6358e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            return NO_ERROR;
6368e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        } break;
6372beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        case SET_AUX_EFFECT_SEND_LEVEL: {
6382beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            CHECK_INTERFACE(IMediaPlayer, data, reply);
6392beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            reply->writeInt32(setAuxEffectSendLevel(data.readFloat()));
6402beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            return NO_ERROR;
6412beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        } break;
6422beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        case ATTACH_AUX_EFFECT: {
6432beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            CHECK_INTERFACE(IMediaPlayer, data, reply);
6442beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            reply->writeInt32(attachAuxEffect(data.readInt32()));
6452beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            return NO_ERROR;
6462beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        } break;
6474f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        case SET_PARAMETER: {
6484f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            CHECK_INTERFACE(IMediaPlayer, data, reply);
6494f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            int key = data.readInt32();
6504f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
6514f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            Parcel request;
6524f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            if (data.dataAvail() > 0) {
6534f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang                request.appendFrom(
6544f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang                        const_cast<Parcel *>(&data), data.dataPosition(), data.dataAvail());
6554f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            }
6564f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            request.setDataPosition(0);
6574f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            reply->writeInt32(setParameter(key, request));
6584f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            return NO_ERROR;
6594f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        } break;
6604f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        case GET_PARAMETER: {
6614f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            CHECK_INTERFACE(IMediaPlayer, data, reply);
6624f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            return getParameter(data.readInt32(), reply);
6634f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        } break;
664c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        case SET_RETRANSMIT_ENDPOINT: {
665c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            CHECK_INTERFACE(IMediaPlayer, data, reply);
666c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
667c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            struct sockaddr_in endpoint;
6680981df6e3db106bfb7a56a2b668c012fcc34dd2cNick Kralevich            memset(&endpoint, 0, sizeof(endpoint));
669c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            int amt = data.readInt32();
670c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            if (amt == sizeof(endpoint)) {
671c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman                data.read(&endpoint, sizeof(struct sockaddr_in));
672c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman                reply->writeInt32(setRetransmitEndpoint(&endpoint));
673c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            } else {
674c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman                reply->writeInt32(setRetransmitEndpoint(NULL));
675c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            }
67644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
67744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            return NO_ERROR;
67844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        } break;
67944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        case GET_RETRANSMIT_ENDPOINT: {
68044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            CHECK_INTERFACE(IMediaPlayer, data, reply);
68144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
68244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            struct sockaddr_in endpoint;
6830981df6e3db106bfb7a56a2b668c012fcc34dd2cNick Kralevich            memset(&endpoint, 0, sizeof(endpoint));
68444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            status_t res = getRetransmitEndpoint(&endpoint);
68544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
68644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            reply->writeInt32(res);
68744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            reply->write(&endpoint, sizeof(endpoint));
68844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
6896b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen            return NO_ERROR;
6906b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        } break;
6916b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        case SET_NEXT_PLAYER: {
6926b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen            CHECK_INTERFACE(IMediaPlayer, data, reply);
6936b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen            reply->writeInt32(setNextPlayer(interface_cast<IMediaPlayer>(data.readStrongBinder())));
69444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
695c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            return NO_ERROR;
696c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        } break;
69789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
69889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
69989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
70089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
70189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
70289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
70389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
70440bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
705