IMediaPlayer.cpp revision 9fc8b5cd4a64ef07e84c69112461324d5c13a0b0
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>
26d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia#include <media/BufferingSettings.h>
273a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar
2899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins#include <media/IDataSource.h>
291b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <media/IMediaHTTPService.h>
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IMediaPlayer.h>
31d681bbb1767bed09415e050ba78975df214bcd68Dave Burke#include <media/IStreamSource.h>
32d681bbb1767bed09415e050ba78975df214bcd68Dave Burke
338ba01021b573889802e67e029225a96f0dfa471aAndy McFadden#include <gui/IGraphicBufferProducer.h>
34d681bbb1767bed09415e050ba78975df214bcd68Dave Burke#include <utils/String8.h>
3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum {
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
40d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    SET_DATA_SOURCE_URL,
41d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    SET_DATA_SOURCE_FD,
42d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    SET_DATA_SOURCE_STREAM,
4399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    SET_DATA_SOURCE_CALLBACK,
44d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia    SET_BUFFERING_SETTINGS,
45d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia    GET_DEFAULT_BUFFERING_SETTINGS,
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    PREPARE_ASYNC,
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    START,
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    STOP,
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    IS_PLAYING,
503a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    SET_PLAYBACK_SETTINGS,
513a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    GET_PLAYBACK_SETTINGS,
523a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    SET_SYNC_SETTINGS,
533a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    GET_SYNC_SETTINGS,
5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    PAUSE,
5589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SEEK_TO,
5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_CURRENT_POSITION,
5789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_DURATION,
5889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    RESET,
5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_AUDIO_STREAM_TYPE,
6089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_LOOPING,
611d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    SET_VOLUME,
621d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    INVOKE,
63a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    SET_METADATA_FILTER,
648e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    GET_METADATA,
652beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    SET_AUX_EFFECT_SEND_LEVEL,
661173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    ATTACH_AUX_EFFECT,
671173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    SET_VIDEO_SURFACETEXTURE,
684f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    SET_PARAMETER,
694f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    GET_PARAMETER,
70c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    SET_RETRANSMIT_ENDPOINT,
7144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    GET_RETRANSMIT_ENDPOINT,
726b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen    SET_NEXT_PLAYER,
739fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung    APPLY_VOLUME_SHAPER,
749fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung    GET_VOLUME_SHAPER_STATE,
75071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    // ModDrm
76071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    PREPARE_DRM,
77071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    RELEASE_DRM,
78071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    GET_KEY_REQUEST,
79071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    PROVIDE_KEY_RESPONSE,
80071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    RESTORE_KEYS,
81071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    GET_DRM_PROPERTY_STRING,
82071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    SET_DRM_PROPERTY_STRING,
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
85071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania// ModDrm helpers
86071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojaniastatic void readVector(const Parcel& reply, Vector<uint8_t>& vector) {
87071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    uint32_t size = reply.readUint32();
88071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    vector.insertAt((size_t)0, size);
89071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    reply.read(vector.editArray(), size);
90071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania}
91071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
92071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojaniastatic void writeVector(Parcel& data, Vector<uint8_t> const& vector) {
93071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    data.writeUint32(vector.size());
94071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    data.write(vector.array(), vector.size());
95071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania}
96071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpMediaPlayer: public BpInterface<IMediaPlayer>
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
100090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh    explicit BpMediaPlayer(const sp<IBinder>& impl)
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IMediaPlayer>(impl)
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // disconnect from media player service
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void disconnect()
10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(DISCONNECT, data, &reply);
11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1131b86fe063badb5f28c467ade39be0f4008688947Andreas Huber    status_t setDataSource(
1141b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            const sp<IMediaHTTPService> &httpService,
1151b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            const char* url,
116d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            const KeyedVector<String8, String8>* headers)
117d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    {
118d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        Parcel data, reply;
119d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
1201b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        data.writeInt32(httpService != NULL);
1211b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        if (httpService != NULL) {
12206b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            data.writeStrongBinder(IInterface::asBinder(httpService));
1231b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        }
124d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeCString(url);
125d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        if (headers == NULL) {
126d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            data.writeInt32(0);
127d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        } else {
128d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            // serialize the headers
129d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            data.writeInt32(headers->size());
130d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            for (size_t i = 0; i < headers->size(); ++i) {
131d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                data.writeString8(headers->keyAt(i));
132d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                data.writeString8(headers->valueAt(i));
133d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            }
134d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        }
135d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        remote()->transact(SET_DATA_SOURCE_URL, data, &reply);
136d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        return reply.readInt32();
137d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    }
138d681bbb1767bed09415e050ba78975df214bcd68Dave Burke
139d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    status_t setDataSource(int fd, int64_t offset, int64_t length) {
140d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        Parcel data, reply;
141d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
142d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeFileDescriptor(fd);
143d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInt64(offset);
144d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInt64(length);
145d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        remote()->transact(SET_DATA_SOURCE_FD, data, &reply);
146d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        return reply.readInt32();
147d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    }
148d681bbb1767bed09415e050ba78975df214bcd68Dave Burke
149d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    status_t setDataSource(const sp<IStreamSource> &source) {
150d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        Parcel data, reply;
151d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
15206b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(source));
1538d65510a2e9ff7b64f2f35bfe3cd745a717c9533Glenn Kasten        remote()->transact(SET_DATA_SOURCE_STREAM, data, &reply);
154d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        return reply.readInt32();
155d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    }
156d681bbb1767bed09415e050ba78975df214bcd68Dave Burke
15799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    status_t setDataSource(const sp<IDataSource> &source) {
15899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        Parcel data, reply;
15999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
16099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        data.writeStrongBinder(IInterface::asBinder(source));
16199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        remote()->transact(SET_DATA_SOURCE_CALLBACK, data, &reply);
16299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        return reply.readInt32();
16399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    }
16499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
1658ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    // pass the buffered IGraphicBufferProducer to the media player service
1668ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    status_t setVideoSurfaceTexture(const sp<IGraphicBufferProducer>& bufferProducer)
1671173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    {
1681173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        Parcel data, reply;
1691173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
17006b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        sp<IBinder> b(IInterface::asBinder(bufferProducer));
1711173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        data.writeStrongBinder(b);
1721173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        remote()->transact(SET_VIDEO_SURFACETEXTURE, data, &reply);
1731173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        return reply.readInt32();
1741173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    }
1751173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
176d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia    status_t setBufferingSettings(const BufferingSettings& buffering)
177d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia    {
178d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        Parcel data, reply;
179d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
180d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        buffering.writeToParcel(&data);
181d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        remote()->transact(SET_BUFFERING_SETTINGS, data, &reply);
182d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        return reply.readInt32();
183d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia    }
184d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia
185d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia    status_t getDefaultBufferingSettings(BufferingSettings* buffering /* nonnull */)
186d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia    {
187d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        if (buffering == nullptr) {
188d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            return BAD_VALUE;
189d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        }
190d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        Parcel data, reply;
191d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
192d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        remote()->transact(GET_DEFAULT_BUFFERING_SETTINGS, data, &reply);
193d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        status_t err = reply.readInt32();
194d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        if (err == OK) {
195d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            err = buffering->readFromParcel(&reply);
196d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        }
197d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        return err;
198d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia    }
199d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia
20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t prepareAsync()
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(PREPARE_ASYNC, data, &reply);
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t start()
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(START, data, &reply);
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t stop()
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STOP, data, &reply);
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t isPlaying(bool* state)
22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(IS_PLAYING, data, &reply);
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *state = reply.readInt32();
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2333a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    status_t setPlaybackSettings(const AudioPlaybackRate& rate)
2343a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    {
2353a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        Parcel data, reply;
2363a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
2373a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeFloat(rate.mSpeed);
2383a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeFloat(rate.mPitch);
2393a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeInt32((int32_t)rate.mFallbackMode);
2403a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeInt32((int32_t)rate.mStretchMode);
2413a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        remote()->transact(SET_PLAYBACK_SETTINGS, data, &reply);
2423a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        return reply.readInt32();
2433a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    }
2443a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar
2453a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    status_t getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */)
2463a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    {
2473a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        Parcel data, reply;
2483a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
2493a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        remote()->transact(GET_PLAYBACK_SETTINGS, data, &reply);
2503a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        status_t err = reply.readInt32();
2513a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        if (err == OK) {
2523a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            *rate = AUDIO_PLAYBACK_RATE_DEFAULT;
2533a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate->mSpeed = reply.readFloat();
2543a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate->mPitch = reply.readFloat();
2553a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate->mFallbackMode = (AudioTimestretchFallbackMode)reply.readInt32();
2563a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate->mStretchMode = (AudioTimestretchStretchMode)reply.readInt32();
2573a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        }
2583a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        return err;
2593a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    }
2603a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar
2613a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    status_t setSyncSettings(const AVSyncSettings& sync, float videoFpsHint)
2629816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia    {
2639816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia        Parcel data, reply;
2649816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
2653a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeInt32((int32_t)sync.mSource);
2663a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeInt32((int32_t)sync.mAudioAdjustMode);
2673a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeFloat(sync.mTolerance);
2683a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeFloat(videoFpsHint);
2693a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        remote()->transact(SET_SYNC_SETTINGS, data, &reply);
2709816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia        return reply.readInt32();
2719816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia    }
2729816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia
2733a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    status_t getSyncSettings(AVSyncSettings* sync /* nonnull */, float* videoFps /* nonnull */)
2743a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    {
2753a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        Parcel data, reply;
2763a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
2773a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        remote()->transact(GET_SYNC_SETTINGS, data, &reply);
2783a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        status_t err = reply.readInt32();
2793a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        if (err == OK) {
2803a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            AVSyncSettings settings;
2813a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            settings.mSource = (AVSyncSource)reply.readInt32();
2823a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            settings.mAudioAdjustMode = (AVSyncAudioAdjustMode)reply.readInt32();
2833a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            settings.mTolerance = reply.readFloat();
2843a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            *sync = settings;
2853a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            *videoFps = reply.readFloat();
2863a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        }
2873a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        return err;
2883a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    }
2893a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar
29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t pause()
29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(PAUSE, data, &reply);
29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
298c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia    status_t seekTo(int msec, MediaPlayerSeekMode mode)
29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(msec);
303c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia        data.writeInt32(mode);
30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SEEK_TO, data, &reply);
30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t getCurrentPosition(int* msec)
30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(GET_CURRENT_POSITION, data, &reply);
31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *msec = reply.readInt32();
31489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t getDuration(int* msec)
31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(GET_DURATION, data, &reply);
32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *msec = reply.readInt32();
32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t reset()
32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(RESET, data, &reply);
33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
334fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    status_t setAudioStreamType(audio_stream_type_t stream)
33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
33689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
33789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
338fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
33989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_AUDIO_STREAM_TYPE, data, &reply);
34089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
34189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
34289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
34389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t setLooping(int loop)
34489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
34589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
34689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
34789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(loop);
34889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_LOOPING, data, &reply);
34989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
35089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
35189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
35289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t setVolume(float leftVolume, float rightVolume)
35389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
35489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
355172fb9ab347e146642234f0bd6f223d351e9fd0bDave Sparks        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(leftVolume);
35789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(rightVolume);
35889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_VOLUME, data, &reply);
35989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
36089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
3611d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania
3621d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    status_t invoke(const Parcel& request, Parcel *reply)
363040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong    {
364040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong        // Avoid doing any extra copy. The interface descriptor should
365040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong        // have been set by MediaPlayer.java.
3668e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        return remote()->transact(INVOKE, request, reply);
3671d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    }
368a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania
369a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    status_t setMetadataFilter(const Parcel& request)
370a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    {
371a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        Parcel reply;
372a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        // Avoid doing any extra copy of the request. The interface
373a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        // descriptor should have been set by MediaPlayer.java.
374a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        remote()->transact(SET_METADATA_FILTER, request, &reply);
375a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        return reply.readInt32();
376a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    }
3778e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania
3788e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    status_t getMetadata(bool update_only, bool apply_filter, Parcel *reply)
3798e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    {
3808e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        Parcel request;
3818e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        request.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
3828e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        // TODO: Burning 2 ints for 2 boolean. Should probably use flags in an int here.
3838e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        request.writeInt32(update_only);
3848e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        request.writeInt32(apply_filter);
3858e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        remote()->transact(GET_METADATA, request, reply);
3868e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        return reply->readInt32();
3878e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    }
3884e92c7efc68b5d7635a32dbd283ab8558ad9bdd6Andreas Huber
3892beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    status_t setAuxEffectSendLevel(float level)
3902beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    {
3912beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        Parcel data, reply;
3922beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
3932beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        data.writeFloat(level);
3942beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        remote()->transact(SET_AUX_EFFECT_SEND_LEVEL, data, &reply);
3952beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        return reply.readInt32();
3962beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    }
3972beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent
3982beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    status_t attachAuxEffect(int effectId)
3992beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    {
4002beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        Parcel data, reply;
4012beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
4022beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        data.writeInt32(effectId);
4032beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        remote()->transact(ATTACH_AUX_EFFECT, data, &reply);
4042beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        return reply.readInt32();
4052beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    }
4061173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
4074f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    status_t setParameter(int key, const Parcel& request)
4084f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    {
4094f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        Parcel data, reply;
4104f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
4114f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        data.writeInt32(key);
4124f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        if (request.dataSize() > 0) {
4134f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            data.appendFrom(const_cast<Parcel *>(&request), 0, request.dataSize());
4144f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        }
4154f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        remote()->transact(SET_PARAMETER, data, &reply);
4164f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        return reply.readInt32();
4174f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    }
4184f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
4194f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    status_t getParameter(int key, Parcel *reply)
4204f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    {
4214f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        Parcel data;
4224f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
4234f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        data.writeInt32(key);
4244f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        return remote()->transact(GET_PARAMETER, data, reply);
4254f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    }
4264f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
42744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    status_t setRetransmitEndpoint(const struct sockaddr_in* endpoint)
42844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    {
429c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        Parcel data, reply;
430c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        status_t err;
431c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
432c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
433c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        if (NULL != endpoint) {
434c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            data.writeInt32(sizeof(*endpoint));
435c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            data.write(endpoint, sizeof(*endpoint));
436c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        } else {
437c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            data.writeInt32(0);
438c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        }
439c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
440c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        err = remote()->transact(SET_RETRANSMIT_ENDPOINT, data, &reply);
441c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        if (OK != err) {
442c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            return err;
443c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        }
4446b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        return reply.readInt32();
4456b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen    }
446c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
4476b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen    status_t setNextPlayer(const sp<IMediaPlayer>& player) {
4486b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        Parcel data, reply;
4496b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
45006b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        sp<IBinder> b(IInterface::asBinder(player));
4516b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        data.writeStrongBinder(b);
4526b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        remote()->transact(SET_NEXT_PLAYER, data, &reply);
453c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        return reply.readInt32();
454c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    }
45544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
45644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    status_t getRetransmitEndpoint(struct sockaddr_in* endpoint)
45744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    {
45844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        Parcel data, reply;
45944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        status_t err;
46044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
46144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
46244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        err = remote()->transact(GET_RETRANSMIT_ENDPOINT, data, &reply);
46344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
46444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        if ((OK != err) || (OK != (err = reply.readInt32()))) {
46544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            return err;
46644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        }
46744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
46844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        data.read(endpoint, sizeof(*endpoint));
46944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
47044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return err;
47144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
472071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
4739fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung    virtual VolumeShaper::Status applyVolumeShaper(
4749fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            const sp<VolumeShaper::Configuration>& configuration,
4759fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            const sp<VolumeShaper::Operation>& operation) {
4769fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        Parcel data, reply;
4779fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
4789fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung
4799fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        status_t tmp;
4809fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        status_t status = configuration.get() == nullptr
4819fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                ? data.writeInt32(0)
4829fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                : (tmp = data.writeInt32(1)) != NO_ERROR
4839fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                    ? tmp : configuration->writeToParcel(&data);
4849fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        if (status != NO_ERROR) {
4859fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            return VolumeShaper::Status(status);
4869fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        }
4879fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung
4889fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        status = operation.get() == nullptr
4899fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                ? status = data.writeInt32(0)
4909fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                : (tmp = data.writeInt32(1)) != NO_ERROR
4919fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                    ? tmp : operation->writeToParcel(&data);
4929fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        if (status != NO_ERROR) {
4939fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            return VolumeShaper::Status(status);
4949fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        }
4959fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung
4969fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        int32_t remoteVolumeShaperStatus;
4979fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        status = remote()->transact(APPLY_VOLUME_SHAPER, data, &reply);
4989fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        if (status == NO_ERROR) {
4999fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            status = reply.readInt32(&remoteVolumeShaperStatus);
5009fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        }
5019fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        if (status != NO_ERROR) {
5029fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            return VolumeShaper::Status(status);
5039fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        }
5049fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        return VolumeShaper::Status(remoteVolumeShaperStatus);
5059fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung    }
5069fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung
5079fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung    virtual sp<VolumeShaper::State> getVolumeShaperState(int id) {
5089fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        Parcel data, reply;
5099fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
5109fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung
5119fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        data.writeInt32(id);
5129fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        status_t status = remote()->transact(GET_VOLUME_SHAPER_STATE, data, &reply);
5139fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        if (status != NO_ERROR) {
5149fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            return nullptr;
5159fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        }
5169fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        sp<VolumeShaper::State> state = new VolumeShaper::State();
5179fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        status = state->readFromParcel(reply);
5189fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        if (status != NO_ERROR) {
5199fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            return nullptr;
5209fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        }
5219fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        return state;
5229fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung    }
5239fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung
524071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    // ModDrm
525071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    status_t prepareDrm(const uint8_t uuid[16], const int mode)
526071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    {
527071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        Parcel data, reply;
528071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
529071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
530071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        data.write(uuid, 16);
531071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        data.writeInt32(mode);
532071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
533071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        status_t status = remote()->transact(PREPARE_DRM, data, &reply);
534071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        if (status != OK) {
535071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            ALOGE("prepareDrm: binder call failed: %d", status);
536071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            return status;
537071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        }
538071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
539071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        return reply.readInt32();
540071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    }
541071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
542071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    status_t releaseDrm()
543071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    {
544071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        Parcel data, reply;
545071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
546071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
547071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        status_t status = remote()->transact(RELEASE_DRM, data, &reply);
548071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        if (status != OK) {
549071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            ALOGE("releaseDrm: binder call failed: %d", status);
550071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            return status;
551071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        }
552071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
553071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        return reply.readInt32();
554071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    }
555071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
556071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    status_t getKeyRequest(Vector<uint8_t> const& scope, String8 const& mimeType,
557071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            DrmPlugin::KeyType keyType, KeyedVector<String8, String8>& optionalParameters,
558071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            Vector<uint8_t>& request, String8& defaultUrl,
559071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            DrmPlugin::KeyRequestType& keyRequestType)
560071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    {
561071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        Parcel data, reply;
562071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
563071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
564071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        writeVector(data, scope);
565071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        data.writeString8(mimeType);
566071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        data.writeInt32((int32_t)keyType);
567071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
568071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        data.writeUint32(optionalParameters.size());
569071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        for (size_t i = 0; i < optionalParameters.size(); ++i) {
570071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            data.writeString8(optionalParameters.keyAt(i));
571071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            data.writeString8(optionalParameters.valueAt(i));
572071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        }
573071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
574071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        status_t status = remote()->transact(GET_KEY_REQUEST, data, &reply);
575071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        if (status != OK) {
576071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            ALOGE("getKeyRequest: binder call failed: %d", status);
577071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            return status;
578071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        }
579071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
580071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        readVector(reply, request);
581071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        defaultUrl = reply.readString8();
582071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        keyRequestType = (DrmPlugin::KeyRequestType)reply.readInt32();
583071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
584071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        return reply.readInt32();
585071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    }
586071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
587071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    status_t provideKeyResponse(Vector<uint8_t>& releaseKeySetId, Vector<uint8_t>& response,
588071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            Vector<uint8_t> &keySetId)
589071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    {
590071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        Parcel data, reply;
591071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
592071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
593071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        writeVector(data, releaseKeySetId);
594071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        writeVector(data, response);
595071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
596071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        status_t status = remote()->transact(PROVIDE_KEY_RESPONSE, data, &reply);
597071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        if (status != OK) {
598071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            ALOGE("provideKeyResponse: binder call failed: %d", status);
599071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            return status;
600071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        }
601071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
602071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        readVector(reply, keySetId);
603071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
604071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        return reply.readInt32();
605071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    }
606071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
607071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    status_t restoreKeys(Vector<uint8_t> const& keySetId)
608071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    {
609071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        Parcel data, reply;
610071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
611071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
612071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        writeVector(data, keySetId);
613071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
614071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        status_t status = remote()->transact(RESTORE_KEYS, data, &reply);
615071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        if (status != OK) {
616071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            ALOGE("restoreKeys: binder call failed: %d", status);
617071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            return status;
618071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        }
619071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
620071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        return reply.readInt32();
621071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    }
622071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
623071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    status_t getDrmPropertyString(String8 const& name, String8& value)
624071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    {
625071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        Parcel data, reply;
626071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
627071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
628071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        data.writeString8(name);
629071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        status_t status = remote()->transact(GET_DRM_PROPERTY_STRING, data, &reply);
630071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        if (status != OK) {
631071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            ALOGE("getDrmPropertyString: binder call failed: %d", status);
632071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            return status;
633071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        }
634071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
635071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        value = reply.readString8();
636071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        return reply.readInt32();
637071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    }
638071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
639071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    status_t setDrmPropertyString(String8 const& name, String8 const& value)
640071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    {
641071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        Parcel data, reply;
642071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
643071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
644071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        data.writeString8(name);
645071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        data.writeString8(value);
646071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        status_t status = remote()->transact(SET_DRM_PROPERTY_STRING, data, &reply);
647071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        if (status != OK) {
648071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            ALOGE("setDrmPropertyString: binder call failed: %d", status);
649071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            return status;
650071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        }
651071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
652071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        return reply.readInt32();
653071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    }
65489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
65589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
65656f0cc533a38bdb84bc03adcb43515614ab21baenikoIMPLEMENT_META_INTERFACE(MediaPlayer, "android.media.IMediaPlayer");
65789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
65889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
65989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
66089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnMediaPlayer::onTransact(
66189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
66289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
663e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
66489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case DISCONNECT: {
66589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
66689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            disconnect();
66789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
66889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
669d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        case SET_DATA_SOURCE_URL: {
670d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            CHECK_INTERFACE(IMediaPlayer, data, reply);
6711b86fe063badb5f28c467ade39be0f4008688947Andreas Huber
6721b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            sp<IMediaHTTPService> httpService;
6731b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            if (data.readInt32()) {
6741b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                httpService =
6751b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                    interface_cast<IMediaHTTPService>(data.readStrongBinder());
6761b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            }
6771b86fe063badb5f28c467ade39be0f4008688947Andreas Huber
678d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            const char* url = data.readCString();
6790ca02a0c2c77bf88aa7d7b7c3ec04f9153ddce93Wei Jia            if (url == NULL) {
6802afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                reply->writeInt32(BAD_VALUE);
6812afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                return NO_ERROR;
6822afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            }
683d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            KeyedVector<String8, String8> headers;
684d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            int32_t numHeaders = data.readInt32();
685d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            for (int i = 0; i < numHeaders; ++i) {
686d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                String8 key = data.readString8();
687d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                String8 value = data.readString8();
688d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                headers.add(key, value);
689d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            }
6901b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            reply->writeInt32(setDataSource(
6911b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                        httpService, url, numHeaders > 0 ? &headers : NULL));
692d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            return NO_ERROR;
693d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        } break;
694d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        case SET_DATA_SOURCE_FD: {
695d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            CHECK_INTERFACE(IMediaPlayer, data, reply);
696d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            int fd = data.readFileDescriptor();
697d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            int64_t offset = data.readInt64();
698d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            int64_t length = data.readInt64();
699d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            reply->writeInt32(setDataSource(fd, offset, length));
700d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            return NO_ERROR;
701d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        }
702d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        case SET_DATA_SOURCE_STREAM: {
703d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            CHECK_INTERFACE(IMediaPlayer, data, reply);
704d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            sp<IStreamSource> source =
705d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                interface_cast<IStreamSource>(data.readStrongBinder());
7062afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            if (source == NULL) {
7072afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                reply->writeInt32(BAD_VALUE);
7082afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            } else {
7092afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                reply->writeInt32(setDataSource(source));
7102afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            }
711d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            return NO_ERROR;
712d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        }
71399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        case SET_DATA_SOURCE_CALLBACK: {
71499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            CHECK_INTERFACE(IMediaPlayer, data, reply);
71599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            sp<IDataSource> source =
71699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins                interface_cast<IDataSource>(data.readStrongBinder());
7172afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            if (source == NULL) {
7182afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                reply->writeInt32(BAD_VALUE);
7192afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            } else {
7202afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                reply->writeInt32(setDataSource(source));
7212afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            }
72299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            return NO_ERROR;
72399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        }
7241173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        case SET_VIDEO_SURFACETEXTURE: {
7251173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            CHECK_INTERFACE(IMediaPlayer, data, reply);
7268ba01021b573889802e67e029225a96f0dfa471aAndy McFadden            sp<IGraphicBufferProducer> bufferProducer =
7278ba01021b573889802e67e029225a96f0dfa471aAndy McFadden                    interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
7288ba01021b573889802e67e029225a96f0dfa471aAndy McFadden            reply->writeInt32(setVideoSurfaceTexture(bufferProducer));
7291173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            return NO_ERROR;
7301173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        } break;
731d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        case SET_BUFFERING_SETTINGS: {
732d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            CHECK_INTERFACE(IMediaPlayer, data, reply);
733d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            BufferingSettings buffering;
734d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            buffering.readFromParcel(&data);
735d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            reply->writeInt32(setBufferingSettings(buffering));
736d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            return NO_ERROR;
737d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        } break;
738d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        case GET_DEFAULT_BUFFERING_SETTINGS: {
739d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            CHECK_INTERFACE(IMediaPlayer, data, reply);
740d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            BufferingSettings buffering;
741d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            status_t err = getDefaultBufferingSettings(&buffering);
742d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            reply->writeInt32(err);
743d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            if (err == OK) {
744d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia                buffering.writeToParcel(reply);
745d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            }
746d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            return NO_ERROR;
747d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        } break;
74889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case PREPARE_ASYNC: {
74989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
75089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(prepareAsync());
75189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
75289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
75389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case START: {
75489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
75589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(start());
75689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
75789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
75889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STOP: {
75989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
76089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(stop());
76189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
76289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
76389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case IS_PLAYING: {
76489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
76589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            bool state;
76689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t ret = isPlaying(&state);
76789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(state);
76889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(ret);
76989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
77089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
7713a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        case SET_PLAYBACK_SETTINGS: {
7723a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            CHECK_INTERFACE(IMediaPlayer, data, reply);
7733a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            AudioPlaybackRate rate = AUDIO_PLAYBACK_RATE_DEFAULT;
7743a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate.mSpeed = data.readFloat();
7753a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate.mPitch = data.readFloat();
7763a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate.mFallbackMode = (AudioTimestretchFallbackMode)data.readInt32();
7773a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate.mStretchMode = (AudioTimestretchStretchMode)data.readInt32();
7783a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            reply->writeInt32(setPlaybackSettings(rate));
7793a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            return NO_ERROR;
7803a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        } break;
7813a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        case GET_PLAYBACK_SETTINGS: {
7829816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia            CHECK_INTERFACE(IMediaPlayer, data, reply);
7833a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            AudioPlaybackRate rate = AUDIO_PLAYBACK_RATE_DEFAULT;
7843a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            status_t err = getPlaybackSettings(&rate);
7853a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            reply->writeInt32(err);
7863a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            if (err == OK) {
7873a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                reply->writeFloat(rate.mSpeed);
7883a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                reply->writeFloat(rate.mPitch);
7893a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                reply->writeInt32((int32_t)rate.mFallbackMode);
7903a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                reply->writeInt32((int32_t)rate.mStretchMode);
7913a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            }
7923a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            return NO_ERROR;
7933a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        } break;
7943a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        case SET_SYNC_SETTINGS: {
7953a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            CHECK_INTERFACE(IMediaPlayer, data, reply);
7963a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            AVSyncSettings sync;
7973a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            sync.mSource = (AVSyncSource)data.readInt32();
7983a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            sync.mAudioAdjustMode = (AVSyncAudioAdjustMode)data.readInt32();
7993a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            sync.mTolerance = data.readFloat();
8003a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            float videoFpsHint = data.readFloat();
8013a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            reply->writeInt32(setSyncSettings(sync, videoFpsHint));
8023a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            return NO_ERROR;
8033a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        } break;
8043a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        case GET_SYNC_SETTINGS: {
8053a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            CHECK_INTERFACE(IMediaPlayer, data, reply);
8063a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            AVSyncSettings sync;
8073a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            float videoFps;
8083a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            status_t err = getSyncSettings(&sync, &videoFps);
8093a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            reply->writeInt32(err);
8103a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            if (err == OK) {
8113a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                reply->writeInt32((int32_t)sync.mSource);
8123a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                reply->writeInt32((int32_t)sync.mAudioAdjustMode);
8133a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                reply->writeFloat(sync.mTolerance);
8143a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                reply->writeFloat(videoFps);
8153a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            }
8169816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia            return NO_ERROR;
8179816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia        } break;
81889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case PAUSE: {
81989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
82089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(pause());
82189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
82289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
82389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SEEK_TO: {
82489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
82567b6dccfd7b59efa772a3c2c553e7382c8f9f24cWei Jia            int msec = data.readInt32();
826c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia            MediaPlayerSeekMode mode = (MediaPlayerSeekMode)data.readInt32();
827c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia            reply->writeInt32(seekTo(msec, mode));
82889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
82989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
83089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_CURRENT_POSITION: {
83189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
832892354335d49f0b9fcd10e20e0c13e3cd0f1f1cbRobert Shih            int msec = 0;
83389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t ret = getCurrentPosition(&msec);
83489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(msec);
83589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(ret);
83689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
83789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
83889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_DURATION: {
83989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
840892354335d49f0b9fcd10e20e0c13e3cd0f1f1cbRobert Shih            int msec = 0;
84189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t ret = getDuration(&msec);
84289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(msec);
84389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(ret);
84489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
84589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
84689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case RESET: {
84789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
84889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(reset());
84989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
85089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
85189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_AUDIO_STREAM_TYPE: {
85289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
853fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32(setAudioStreamType((audio_stream_type_t) data.readInt32()));
85489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
85589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
85689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_LOOPING: {
85789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
85889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(setLooping(data.readInt32()));
85989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
86089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
86189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_VOLUME: {
862172fb9ab347e146642234f0bd6f223d351e9fd0bDave Sparks            CHECK_INTERFACE(IMediaPlayer, data, reply);
863de162ff337723798381890151247b129c4fbe314Gloria Wang            float leftVolume = data.readFloat();
864de162ff337723798381890151247b129c4fbe314Gloria Wang            float rightVolume = data.readFloat();
865de162ff337723798381890151247b129c4fbe314Gloria Wang            reply->writeInt32(setVolume(leftVolume, rightVolume));
86689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
86789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
8681d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania        case INVOKE: {
8691d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania            CHECK_INTERFACE(IMediaPlayer, data, reply);
870040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong            status_t result = invoke(data, reply);
871040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong            return result;
8721d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania        } break;
873a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        case SET_METADATA_FILTER: {
874a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania            CHECK_INTERFACE(IMediaPlayer, data, reply);
875a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania            reply->writeInt32(setMetadataFilter(data));
876a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania            return NO_ERROR;
877a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        } break;
8788e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        case GET_METADATA: {
8798e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            CHECK_INTERFACE(IMediaPlayer, data, reply);
880de162ff337723798381890151247b129c4fbe314Gloria Wang            bool update_only = static_cast<bool>(data.readInt32());
881de162ff337723798381890151247b129c4fbe314Gloria Wang            bool apply_filter = static_cast<bool>(data.readInt32());
882de162ff337723798381890151247b129c4fbe314Gloria Wang            const status_t retcode = getMetadata(update_only, apply_filter, reply);
8838e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            reply->setDataPosition(0);
8848e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            reply->writeInt32(retcode);
8858e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            reply->setDataPosition(0);
8868e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            return NO_ERROR;
8878e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        } break;
8882beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        case SET_AUX_EFFECT_SEND_LEVEL: {
8892beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            CHECK_INTERFACE(IMediaPlayer, data, reply);
8902beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            reply->writeInt32(setAuxEffectSendLevel(data.readFloat()));
8912beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            return NO_ERROR;
8922beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        } break;
8932beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        case ATTACH_AUX_EFFECT: {
8942beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            CHECK_INTERFACE(IMediaPlayer, data, reply);
8952beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            reply->writeInt32(attachAuxEffect(data.readInt32()));
8962beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            return NO_ERROR;
8972beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        } break;
8984f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        case SET_PARAMETER: {
8994f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            CHECK_INTERFACE(IMediaPlayer, data, reply);
9004f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            int key = data.readInt32();
9014f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
9024f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            Parcel request;
9034f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            if (data.dataAvail() > 0) {
9044f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang                request.appendFrom(
9054f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang                        const_cast<Parcel *>(&data), data.dataPosition(), data.dataAvail());
9064f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            }
9074f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            request.setDataPosition(0);
9084f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            reply->writeInt32(setParameter(key, request));
9094f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            return NO_ERROR;
9104f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        } break;
9114f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        case GET_PARAMETER: {
9124f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            CHECK_INTERFACE(IMediaPlayer, data, reply);
9134f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            return getParameter(data.readInt32(), reply);
9144f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        } break;
915c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        case SET_RETRANSMIT_ENDPOINT: {
916c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            CHECK_INTERFACE(IMediaPlayer, data, reply);
917c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
918c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            struct sockaddr_in endpoint;
9190981df6e3db106bfb7a56a2b668c012fcc34dd2cNick Kralevich            memset(&endpoint, 0, sizeof(endpoint));
920c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            int amt = data.readInt32();
921c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            if (amt == sizeof(endpoint)) {
922c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman                data.read(&endpoint, sizeof(struct sockaddr_in));
923c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman                reply->writeInt32(setRetransmitEndpoint(&endpoint));
924c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            } else {
925c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman                reply->writeInt32(setRetransmitEndpoint(NULL));
926c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            }
92744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
92844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            return NO_ERROR;
92944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        } break;
93044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        case GET_RETRANSMIT_ENDPOINT: {
93144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            CHECK_INTERFACE(IMediaPlayer, data, reply);
93244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
93344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            struct sockaddr_in endpoint;
9340981df6e3db106bfb7a56a2b668c012fcc34dd2cNick Kralevich            memset(&endpoint, 0, sizeof(endpoint));
93544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            status_t res = getRetransmitEndpoint(&endpoint);
93644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
93744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            reply->writeInt32(res);
93844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            reply->write(&endpoint, sizeof(endpoint));
93944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
9406b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen            return NO_ERROR;
9416b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        } break;
9426b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        case SET_NEXT_PLAYER: {
9436b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen            CHECK_INTERFACE(IMediaPlayer, data, reply);
9446b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen            reply->writeInt32(setNextPlayer(interface_cast<IMediaPlayer>(data.readStrongBinder())));
94544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
946c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            return NO_ERROR;
947c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        } break;
948071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
9499fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        case APPLY_VOLUME_SHAPER: {
9509fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            CHECK_INTERFACE(IMediaPlayer, data, reply);
9519fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            sp<VolumeShaper::Configuration> configuration;
9529fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            sp<VolumeShaper::Operation> operation;
9539fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung
9549fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            int32_t present;
9559fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            status_t status = data.readInt32(&present);
9569fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            if (status == NO_ERROR && present != 0) {
9579fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                configuration = new VolumeShaper::Configuration();
9589fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                status = configuration->readFromParcel(data);
9599fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            }
9609fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            if (status == NO_ERROR) {
9619fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                status = data.readInt32(&present);
9629fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            }
9639fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            if (status == NO_ERROR && present != 0) {
9649fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                operation = new VolumeShaper::Operation();
9659fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                status = operation->readFromParcel(data);
9669fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            }
9679fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            if (status == NO_ERROR) {
9689fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                status = (status_t)applyVolumeShaper(configuration, operation);
9699fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            }
9709fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            reply->writeInt32(status);
9719fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            return NO_ERROR;
9729fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        } break;
9739fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        case GET_VOLUME_SHAPER_STATE: {
9749fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            CHECK_INTERFACE(IMediaPlayer, data, reply);
9759fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            int id;
9769fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            status_t status = data.readInt32(&id);
9779fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            if (status == NO_ERROR) {
9789fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                sp<VolumeShaper::State> state = getVolumeShaperState(id);
9799fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                if (state.get() != nullptr) {
9809fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                     status = state->writeToParcel(reply);
9819fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                }
9829fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            }
9839fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            return NO_ERROR;
9849fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        } break;
9859fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung
986071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        // ModDrm
987071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        case PREPARE_DRM: {
988071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            CHECK_INTERFACE(IMediaPlayer, data, reply);
989071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            uint8_t uuid[16];
990071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            data.read(uuid, sizeof(uuid));
991071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
992071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            int mode = data.readInt32();
993071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
994071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            uint32_t result = prepareDrm(uuid, mode);
995071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            reply->writeInt32(result);
996071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            return OK;
997071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        }
998071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        case RELEASE_DRM: {
999071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            CHECK_INTERFACE(IMediaPlayer, data, reply);
1000071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1001071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            uint32_t result = releaseDrm();
1002071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            reply->writeInt32(result);
1003071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            return OK;
1004071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        }
1005071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        case GET_KEY_REQUEST: {
1006071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            CHECK_INTERFACE(IMediaPlayer, data, reply);
1007071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1008071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            Vector<uint8_t> scope;
1009071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            readVector(data, scope);
1010071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            String8 mimeType = data.readString8();
1011071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            DrmPlugin::KeyType keyType = (DrmPlugin::KeyType)data.readInt32();
1012071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1013071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            KeyedVector<String8, String8> optionalParameters;
1014071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            uint32_t count = data.readUint32();
1015071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            for (size_t i = 0; i < count; ++i) {
1016071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania                String8 key, value;
1017071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania                key = data.readString8();
1018071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania                value = data.readString8();
1019071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania                optionalParameters.add(key, value);
1020071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            }
1021071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1022071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            Vector<uint8_t> request;
1023071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            String8 defaultUrl;
1024071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            DrmPlugin::KeyRequestType keyRequestType = DrmPlugin::kKeyRequestType_Unknown;
1025071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1026071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            status_t result = getKeyRequest(scope, mimeType, keyType, optionalParameters,
1027071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania                                      request, defaultUrl, keyRequestType);
1028071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1029071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            writeVector(*reply, request);
1030071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            reply->writeString8(defaultUrl);
1031071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            reply->writeInt32(keyRequestType);
1032071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            reply->writeInt32(result);
1033071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            return OK;
1034071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        }
1035071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        case PROVIDE_KEY_RESPONSE: {
1036071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            CHECK_INTERFACE(IMediaPlayer, data, reply);
1037071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            Vector<uint8_t> releaseKeySetId, response, keySetId;
1038071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            readVector(data, releaseKeySetId);
1039071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            readVector(data, response);
1040071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            uint32_t result = provideKeyResponse(releaseKeySetId, response, keySetId);
1041071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            writeVector(*reply, keySetId);
1042071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            reply->writeInt32(result);
1043071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            return OK;
1044071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        }
1045071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        case RESTORE_KEYS: {
1046071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            CHECK_INTERFACE(IMediaPlayer, data, reply);
1047071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1048071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            Vector<uint8_t> keySetId;
1049071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            readVector(data, keySetId);
1050071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            uint32_t result = restoreKeys(keySetId);
1051071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            reply->writeInt32(result);
1052071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            return OK;
1053071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        }
1054071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        case GET_DRM_PROPERTY_STRING: {
1055071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            CHECK_INTERFACE(IMediaPlayer, data, reply);
1056071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            String8 name, value;
1057071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            name = data.readString8();
1058071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            uint32_t result = getDrmPropertyString(name, value);
1059071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            reply->writeString8(value);
1060071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            reply->writeInt32(result);
1061071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            return OK;
1062071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        }
1063071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        case SET_DRM_PROPERTY_STRING: {
1064071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            CHECK_INTERFACE(IMediaPlayer, data, reply);
1065071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            String8 name, value;
1066071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            name = data.readString8();
1067071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            value = data.readString8();
1068071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            uint32_t result = setDrmPropertyString(name, value);
1069071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            reply->writeInt32(result);
1070071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            return OK;
1071071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        }
107289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
107389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
107489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
107589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
107689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
107789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
107889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
107940bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
1080