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
388cf3a0788df2ee184b498086b1b8da322eeadccaIvan Lozanousing media::VolumeShaper;
398cf3a0788df2ee184b498086b1b8da322eeadccaIvan Lozano
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum {
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
42d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    SET_DATA_SOURCE_URL,
43d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    SET_DATA_SOURCE_FD,
44d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    SET_DATA_SOURCE_STREAM,
4599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    SET_DATA_SOURCE_CALLBACK,
46d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia    SET_BUFFERING_SETTINGS,
479bb3803a80a680ea7a3bc11e07b8a89ccddee003Wei Jia    GET_BUFFERING_SETTINGS,
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    PREPARE_ASYNC,
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    START,
5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    STOP,
5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    IS_PLAYING,
523a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    SET_PLAYBACK_SETTINGS,
533a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    GET_PLAYBACK_SETTINGS,
543a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    SET_SYNC_SETTINGS,
553a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    GET_SYNC_SETTINGS,
5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    PAUSE,
5789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SEEK_TO,
5889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_CURRENT_POSITION,
5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_DURATION,
6089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    RESET,
6152c2851b30588df1aba00766c37ffde86a3345bcWei Jia    NOTIFY_AT,
6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_AUDIO_STREAM_TYPE,
6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_LOOPING,
641d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    SET_VOLUME,
651d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    INVOKE,
66a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    SET_METADATA_FILTER,
678e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    GET_METADATA,
682beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    SET_AUX_EFFECT_SEND_LEVEL,
691173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    ATTACH_AUX_EFFECT,
701173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    SET_VIDEO_SURFACETEXTURE,
714f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    SET_PARAMETER,
724f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    GET_PARAMETER,
73c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    SET_RETRANSMIT_ENDPOINT,
7444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    GET_RETRANSMIT_ENDPOINT,
756b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen    SET_NEXT_PLAYER,
769fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung    APPLY_VOLUME_SHAPER,
779fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung    GET_VOLUME_SHAPER_STATE,
78cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania    // Modular DRM
79071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    PREPARE_DRM,
80071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    RELEASE_DRM,
81156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin    // AudioRouting
82156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin    SET_OUTPUT_DEVICE,
83156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin    GET_ROUTED_DEVICE_ID,
84156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin    ENABLE_AUDIO_DEVICE_CALLBACK,
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
87071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania// ModDrm helpers
88071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojaniastatic void readVector(const Parcel& reply, Vector<uint8_t>& vector) {
89071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    uint32_t size = reply.readUint32();
90071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    vector.insertAt((size_t)0, size);
91071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    reply.read(vector.editArray(), size);
92071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania}
93071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
94071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojaniastatic void writeVector(Parcel& data, Vector<uint8_t> const& vector) {
95071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    data.writeUint32(vector.size());
96071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    data.write(vector.array(), vector.size());
97071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania}
98071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpMediaPlayer: public BpInterface<IMediaPlayer>
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
102090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh    explicit BpMediaPlayer(const sp<IBinder>& impl)
10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IMediaPlayer>(impl)
10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // disconnect from media player service
10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void disconnect()
10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(DISCONNECT, data, &reply);
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1151b86fe063badb5f28c467ade39be0f4008688947Andreas Huber    status_t setDataSource(
1161b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            const sp<IMediaHTTPService> &httpService,
1171b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            const char* url,
118d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            const KeyedVector<String8, String8>* headers)
119d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    {
120d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        Parcel data, reply;
121d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
1221b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        data.writeInt32(httpService != NULL);
1231b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        if (httpService != NULL) {
12406b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            data.writeStrongBinder(IInterface::asBinder(httpService));
1251b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        }
126d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeCString(url);
127d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        if (headers == NULL) {
128d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            data.writeInt32(0);
129d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        } else {
130d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            // serialize the headers
131d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            data.writeInt32(headers->size());
132d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            for (size_t i = 0; i < headers->size(); ++i) {
133d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                data.writeString8(headers->keyAt(i));
134d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                data.writeString8(headers->valueAt(i));
135d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            }
136d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        }
137d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        remote()->transact(SET_DATA_SOURCE_URL, data, &reply);
138d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        return reply.readInt32();
139d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    }
140d681bbb1767bed09415e050ba78975df214bcd68Dave Burke
141d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    status_t setDataSource(int fd, int64_t offset, int64_t length) {
142d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        Parcel data, reply;
143d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
144d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeFileDescriptor(fd);
145d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInt64(offset);
146d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInt64(length);
147d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        remote()->transact(SET_DATA_SOURCE_FD, data, &reply);
148d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        return reply.readInt32();
149d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    }
150d681bbb1767bed09415e050ba78975df214bcd68Dave Burke
151d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    status_t setDataSource(const sp<IStreamSource> &source) {
152d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        Parcel data, reply;
153d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
15406b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(source));
1558d65510a2e9ff7b64f2f35bfe3cd745a717c9533Glenn Kasten        remote()->transact(SET_DATA_SOURCE_STREAM, data, &reply);
156d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        return reply.readInt32();
157d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    }
158d681bbb1767bed09415e050ba78975df214bcd68Dave Burke
15999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    status_t setDataSource(const sp<IDataSource> &source) {
16099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        Parcel data, reply;
16199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
16299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        data.writeStrongBinder(IInterface::asBinder(source));
16399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        remote()->transact(SET_DATA_SOURCE_CALLBACK, data, &reply);
16499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        return reply.readInt32();
16599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    }
16699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
1678ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    // pass the buffered IGraphicBufferProducer to the media player service
1688ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    status_t setVideoSurfaceTexture(const sp<IGraphicBufferProducer>& bufferProducer)
1691173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    {
1701173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        Parcel data, reply;
1711173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
17206b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        sp<IBinder> b(IInterface::asBinder(bufferProducer));
1731173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        data.writeStrongBinder(b);
1741173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        remote()->transact(SET_VIDEO_SURFACETEXTURE, data, &reply);
1751173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        return reply.readInt32();
1761173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    }
1771173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
178d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia    status_t setBufferingSettings(const BufferingSettings& buffering)
179d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia    {
180d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        Parcel data, reply;
181d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
182d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        buffering.writeToParcel(&data);
183d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        remote()->transact(SET_BUFFERING_SETTINGS, data, &reply);
184d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        return reply.readInt32();
185d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia    }
186d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia
1879bb3803a80a680ea7a3bc11e07b8a89ccddee003Wei Jia    status_t getBufferingSettings(BufferingSettings* buffering /* nonnull */)
188d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia    {
189d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        if (buffering == nullptr) {
190d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            return BAD_VALUE;
191d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        }
192d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        Parcel data, reply;
193d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
1949bb3803a80a680ea7a3bc11e07b8a89ccddee003Wei Jia        remote()->transact(GET_BUFFERING_SETTINGS, data, &reply);
195d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        status_t err = reply.readInt32();
196d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        if (err == OK) {
197d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            err = buffering->readFromParcel(&reply);
198d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        }
199d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        return err;
200d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia    }
201d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia
20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t prepareAsync()
20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(PREPARE_ASYNC, data, &reply);
20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t start()
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(START, data, &reply);
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t stop()
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STOP, data, &reply);
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t isPlaying(bool* state)
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(IS_PLAYING, data, &reply);
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *state = reply.readInt32();
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2353a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    status_t setPlaybackSettings(const AudioPlaybackRate& rate)
2363a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    {
2373a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        Parcel data, reply;
2383a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
2393a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeFloat(rate.mSpeed);
2403a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeFloat(rate.mPitch);
2413a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeInt32((int32_t)rate.mFallbackMode);
2423a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeInt32((int32_t)rate.mStretchMode);
2433a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        remote()->transact(SET_PLAYBACK_SETTINGS, data, &reply);
2443a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        return reply.readInt32();
2453a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    }
2463a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar
2473a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    status_t getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */)
2483a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    {
2493a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        Parcel data, reply;
2503a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
2513a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        remote()->transact(GET_PLAYBACK_SETTINGS, data, &reply);
2523a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        status_t err = reply.readInt32();
2533a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        if (err == OK) {
2543a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            *rate = AUDIO_PLAYBACK_RATE_DEFAULT;
2553a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate->mSpeed = reply.readFloat();
2563a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate->mPitch = reply.readFloat();
2573a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate->mFallbackMode = (AudioTimestretchFallbackMode)reply.readInt32();
2583a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate->mStretchMode = (AudioTimestretchStretchMode)reply.readInt32();
2593a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        }
2603a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        return err;
2613a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    }
2623a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar
2633a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    status_t setSyncSettings(const AVSyncSettings& sync, float videoFpsHint)
2649816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia    {
2659816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia        Parcel data, reply;
2669816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
2673a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeInt32((int32_t)sync.mSource);
2683a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeInt32((int32_t)sync.mAudioAdjustMode);
2693a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeFloat(sync.mTolerance);
2703a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeFloat(videoFpsHint);
2713a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        remote()->transact(SET_SYNC_SETTINGS, data, &reply);
2729816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia        return reply.readInt32();
2739816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia    }
2749816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia
2753a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    status_t getSyncSettings(AVSyncSettings* sync /* nonnull */, float* videoFps /* nonnull */)
2763a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    {
2773a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        Parcel data, reply;
2783a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
2793a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        remote()->transact(GET_SYNC_SETTINGS, data, &reply);
2803a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        status_t err = reply.readInt32();
2813a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        if (err == OK) {
2823a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            AVSyncSettings settings;
2833a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            settings.mSource = (AVSyncSource)reply.readInt32();
2843a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            settings.mAudioAdjustMode = (AVSyncAudioAdjustMode)reply.readInt32();
2853a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            settings.mTolerance = reply.readFloat();
2863a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            *sync = settings;
2873a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            *videoFps = reply.readFloat();
2883a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        }
2893a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        return err;
2903a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    }
2913a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar
29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t pause()
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(PAUSE, data, &reply);
29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
300c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia    status_t seekTo(int msec, MediaPlayerSeekMode mode)
30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(msec);
305c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia        data.writeInt32(mode);
30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SEEK_TO, data, &reply);
30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t getCurrentPosition(int* msec)
31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
31489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(GET_CURRENT_POSITION, data, &reply);
31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *msec = reply.readInt32();
31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t getDuration(int* msec)
32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(GET_DURATION, data, &reply);
32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *msec = reply.readInt32();
32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t reset()
32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(RESET, data, &reply);
33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
33652c2851b30588df1aba00766c37ffde86a3345bcWei Jia    status_t notifyAt(int64_t mediaTimeUs)
33752c2851b30588df1aba00766c37ffde86a3345bcWei Jia    {
33852c2851b30588df1aba00766c37ffde86a3345bcWei Jia        Parcel data, reply;
33952c2851b30588df1aba00766c37ffde86a3345bcWei Jia        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
34052c2851b30588df1aba00766c37ffde86a3345bcWei Jia        data.writeInt64(mediaTimeUs);
34152c2851b30588df1aba00766c37ffde86a3345bcWei Jia        remote()->transact(NOTIFY_AT, data, &reply);
34252c2851b30588df1aba00766c37ffde86a3345bcWei Jia        return reply.readInt32();
34352c2851b30588df1aba00766c37ffde86a3345bcWei Jia    }
34452c2851b30588df1aba00766c37ffde86a3345bcWei Jia
345fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    status_t setAudioStreamType(audio_stream_type_t stream)
34689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
34789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
34889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
349fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
35089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_AUDIO_STREAM_TYPE, data, &reply);
35189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
35289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
35389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
35489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t setLooping(int loop)
35589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
35789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
35889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(loop);
35989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_LOOPING, data, &reply);
36089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
36189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
36289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
36389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t setVolume(float leftVolume, float rightVolume)
36489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
36589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
366172fb9ab347e146642234f0bd6f223d351e9fd0bDave Sparks        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
36789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(leftVolume);
36889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(rightVolume);
36989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_VOLUME, data, &reply);
37089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
37189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
3721d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania
3731d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    status_t invoke(const Parcel& request, Parcel *reply)
374040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong    {
375040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong        // Avoid doing any extra copy. The interface descriptor should
376040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong        // have been set by MediaPlayer.java.
3778e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        return remote()->transact(INVOKE, request, reply);
3781d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    }
379a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania
380a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    status_t setMetadataFilter(const Parcel& request)
381a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    {
382a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        Parcel reply;
383a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        // Avoid doing any extra copy of the request. The interface
384a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        // descriptor should have been set by MediaPlayer.java.
385a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        remote()->transact(SET_METADATA_FILTER, request, &reply);
386a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        return reply.readInt32();
387a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    }
3888e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania
3898e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    status_t getMetadata(bool update_only, bool apply_filter, Parcel *reply)
3908e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    {
3918e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        Parcel request;
3928e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        request.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
3938e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        // TODO: Burning 2 ints for 2 boolean. Should probably use flags in an int here.
3948e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        request.writeInt32(update_only);
3958e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        request.writeInt32(apply_filter);
3968e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        remote()->transact(GET_METADATA, request, reply);
3978e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        return reply->readInt32();
3988e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    }
3994e92c7efc68b5d7635a32dbd283ab8558ad9bdd6Andreas Huber
4002beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    status_t setAuxEffectSendLevel(float level)
4012beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    {
4022beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        Parcel data, reply;
4032beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
4042beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        data.writeFloat(level);
4052beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        remote()->transact(SET_AUX_EFFECT_SEND_LEVEL, data, &reply);
4062beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        return reply.readInt32();
4072beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    }
4082beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent
4092beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    status_t attachAuxEffect(int effectId)
4102beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    {
4112beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        Parcel data, reply;
4122beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
4132beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        data.writeInt32(effectId);
4142beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        remote()->transact(ATTACH_AUX_EFFECT, data, &reply);
4152beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        return reply.readInt32();
4162beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    }
4171173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
4184f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    status_t setParameter(int key, const Parcel& request)
4194f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    {
4204f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        Parcel data, reply;
4214f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
4224f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        data.writeInt32(key);
4234f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        if (request.dataSize() > 0) {
4244f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            data.appendFrom(const_cast<Parcel *>(&request), 0, request.dataSize());
4254f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        }
4264f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        remote()->transact(SET_PARAMETER, data, &reply);
4274f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        return reply.readInt32();
4284f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    }
4294f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
4304f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    status_t getParameter(int key, Parcel *reply)
4314f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    {
4324f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        Parcel data;
4334f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
4344f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        data.writeInt32(key);
4354f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        return remote()->transact(GET_PARAMETER, data, reply);
4364f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    }
4374f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
43844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    status_t setRetransmitEndpoint(const struct sockaddr_in* endpoint)
43944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    {
440c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        Parcel data, reply;
441c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        status_t err;
442c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
443c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
444c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        if (NULL != endpoint) {
445c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            data.writeInt32(sizeof(*endpoint));
446c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            data.write(endpoint, sizeof(*endpoint));
447c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        } else {
448c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            data.writeInt32(0);
449c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        }
450c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
451c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        err = remote()->transact(SET_RETRANSMIT_ENDPOINT, data, &reply);
452c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        if (OK != err) {
453c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            return err;
454c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        }
4556b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        return reply.readInt32();
4566b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen    }
457c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
4586b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen    status_t setNextPlayer(const sp<IMediaPlayer>& player) {
4596b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        Parcel data, reply;
4606b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
46106b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        sp<IBinder> b(IInterface::asBinder(player));
4626b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        data.writeStrongBinder(b);
4636b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        remote()->transact(SET_NEXT_PLAYER, data, &reply);
464c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        return reply.readInt32();
465c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    }
46644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
46744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    status_t getRetransmitEndpoint(struct sockaddr_in* endpoint)
46844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    {
46944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        Parcel data, reply;
47044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        status_t err;
47144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
47244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
47344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        err = remote()->transact(GET_RETRANSMIT_ENDPOINT, data, &reply);
47444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
47544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        if ((OK != err) || (OK != (err = reply.readInt32()))) {
47644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            return err;
47744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        }
47844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
47944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        data.read(endpoint, sizeof(*endpoint));
48044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
48144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return err;
48244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
483071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
4849fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung    virtual VolumeShaper::Status applyVolumeShaper(
4859fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            const sp<VolumeShaper::Configuration>& configuration,
4869fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            const sp<VolumeShaper::Operation>& operation) {
4879fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        Parcel data, reply;
4889fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
4899fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung
4909fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        status_t tmp;
4919fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        status_t status = configuration.get() == nullptr
4929fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                ? data.writeInt32(0)
4939fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                : (tmp = data.writeInt32(1)) != NO_ERROR
4949fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                    ? tmp : configuration->writeToParcel(&data);
4959fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        if (status != NO_ERROR) {
4969fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            return VolumeShaper::Status(status);
4979fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        }
4989fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung
4999fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        status = operation.get() == nullptr
5009fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                ? status = data.writeInt32(0)
5019fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                : (tmp = data.writeInt32(1)) != NO_ERROR
5029fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                    ? tmp : operation->writeToParcel(&data);
5039fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        if (status != NO_ERROR) {
5049fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            return VolumeShaper::Status(status);
5059fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        }
5069fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung
5079fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        int32_t remoteVolumeShaperStatus;
5089fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        status = remote()->transact(APPLY_VOLUME_SHAPER, data, &reply);
5099fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        if (status == NO_ERROR) {
5109fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            status = reply.readInt32(&remoteVolumeShaperStatus);
5119fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        }
5129fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        if (status != NO_ERROR) {
5139fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            return VolumeShaper::Status(status);
5149fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        }
5159fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        return VolumeShaper::Status(remoteVolumeShaperStatus);
5169fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung    }
5179fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung
5189fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung    virtual sp<VolumeShaper::State> getVolumeShaperState(int id) {
5199fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        Parcel data, reply;
5209fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
5219fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung
5229fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        data.writeInt32(id);
5239fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        status_t status = remote()->transact(GET_VOLUME_SHAPER_STATE, data, &reply);
5249fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        if (status != NO_ERROR) {
5259fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            return nullptr;
5269fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        }
5279fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        sp<VolumeShaper::State> state = new VolumeShaper::State();
5288cf3a0788df2ee184b498086b1b8da322eeadccaIvan Lozano        status = state->readFromParcel(&reply);
5299fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        if (status != NO_ERROR) {
5309fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            return nullptr;
5319fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        }
5329fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        return state;
5339fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung    }
5349fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung
535cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania    // Modular DRM
536cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania    status_t prepareDrm(const uint8_t uuid[16], const Vector<uint8_t>& drmSessionId)
537071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    {
538071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        Parcel data, reply;
539071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
540071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
541071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        data.write(uuid, 16);
542cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania        writeVector(data, drmSessionId);
543071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
544071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        status_t status = remote()->transact(PREPARE_DRM, data, &reply);
545071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        if (status != OK) {
546071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            ALOGE("prepareDrm: binder call failed: %d", status);
547071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            return status;
548071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        }
549071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
550071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        return reply.readInt32();
551071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    }
552071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
553071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    status_t releaseDrm()
554071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    {
555071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        Parcel data, reply;
556071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
557071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
558071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        status_t status = remote()->transact(RELEASE_DRM, data, &reply);
559071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        if (status != OK) {
560071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            ALOGE("releaseDrm: binder call failed: %d", status);
561071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            return status;
562071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        }
563071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
564071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        return reply.readInt32();
565071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    }
566156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin
567156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin    status_t setOutputDevice(audio_port_handle_t deviceId)
568156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin    {
569156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        Parcel data, reply;
570156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
571156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin
572156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        data.writeInt32(deviceId);
573156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin
574156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        status_t status = remote()->transact(SET_OUTPUT_DEVICE, data, &reply);
575156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        if (status != OK) {
576156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            ALOGE("setOutputDevice: binder call failed: %d", status);
577156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            return status;
578156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        }
579156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin
580156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        return reply.readInt32();
581156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin    }
582156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin
583156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin    status_t getRoutedDeviceId(audio_port_handle_t* deviceId)
584156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin    {
585156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        Parcel data, reply;
586156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
587156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin
588156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        status_t status = remote()->transact(GET_ROUTED_DEVICE_ID, data, &reply);
589156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        if (status != OK) {
590156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            ALOGE("getRoutedDeviceid: binder call failed: %d", status);
591156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            *deviceId = AUDIO_PORT_HANDLE_NONE;
592156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            return status;
593156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        }
594156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin
595156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        status = reply.readInt32();
596156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        if (status != NO_ERROR) {
597156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            *deviceId = AUDIO_PORT_HANDLE_NONE;
598156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        } else {
599156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            *deviceId = reply.readInt32();
600156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        }
601156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        return status;
602156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin    }
603156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin
604156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin    status_t enableAudioDeviceCallback(bool enabled)
605156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin    {
606156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        Parcel data, reply;
607156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
608156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin
609156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        data.writeBool(enabled);
610156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin
611156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        status_t status = remote()->transact(ENABLE_AUDIO_DEVICE_CALLBACK, data, &reply);
612156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        if (status != OK) {
613156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            ALOGE("enableAudioDeviceCallback: binder call failed: %d, %d", enabled, status);
614156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            return status;
615156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        }
616156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin
617156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        return reply.readInt32();
618156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin    }
61989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
62089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
62156f0cc533a38bdb84bc03adcb43515614ab21baenikoIMPLEMENT_META_INTERFACE(MediaPlayer, "android.media.IMediaPlayer");
62289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
62389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
62489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
62589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnMediaPlayer::onTransact(
62689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
62789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
628e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
62989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case DISCONNECT: {
63089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
63189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            disconnect();
63289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
63389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
634d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        case SET_DATA_SOURCE_URL: {
635d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            CHECK_INTERFACE(IMediaPlayer, data, reply);
6361b86fe063badb5f28c467ade39be0f4008688947Andreas Huber
6371b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            sp<IMediaHTTPService> httpService;
6381b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            if (data.readInt32()) {
6391b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                httpService =
6401b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                    interface_cast<IMediaHTTPService>(data.readStrongBinder());
6411b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            }
6421b86fe063badb5f28c467ade39be0f4008688947Andreas Huber
643d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            const char* url = data.readCString();
6440ca02a0c2c77bf88aa7d7b7c3ec04f9153ddce93Wei Jia            if (url == NULL) {
6452afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                reply->writeInt32(BAD_VALUE);
6462afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                return NO_ERROR;
6472afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            }
648d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            KeyedVector<String8, String8> headers;
649d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            int32_t numHeaders = data.readInt32();
650d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            for (int i = 0; i < numHeaders; ++i) {
651d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                String8 key = data.readString8();
652d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                String8 value = data.readString8();
653d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                headers.add(key, value);
654d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            }
6551b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            reply->writeInt32(setDataSource(
6561b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                        httpService, url, numHeaders > 0 ? &headers : NULL));
657d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            return NO_ERROR;
658d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        } break;
659d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        case SET_DATA_SOURCE_FD: {
660d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            CHECK_INTERFACE(IMediaPlayer, data, reply);
661d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            int fd = data.readFileDescriptor();
662d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            int64_t offset = data.readInt64();
663d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            int64_t length = data.readInt64();
664d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            reply->writeInt32(setDataSource(fd, offset, length));
665d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            return NO_ERROR;
666d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        }
667d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        case SET_DATA_SOURCE_STREAM: {
668d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            CHECK_INTERFACE(IMediaPlayer, data, reply);
669d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            sp<IStreamSource> source =
670d681bbb1767bed09415e050ba78975df214bcd68Dave Burke                interface_cast<IStreamSource>(data.readStrongBinder());
6712afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            if (source == NULL) {
6722afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                reply->writeInt32(BAD_VALUE);
6732afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            } else {
6742afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                reply->writeInt32(setDataSource(source));
6752afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            }
676d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            return NO_ERROR;
677d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        }
67899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        case SET_DATA_SOURCE_CALLBACK: {
67999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            CHECK_INTERFACE(IMediaPlayer, data, reply);
68099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            sp<IDataSource> source =
68199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins                interface_cast<IDataSource>(data.readStrongBinder());
6822afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            if (source == NULL) {
6832afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                reply->writeInt32(BAD_VALUE);
6842afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            } else {
6852afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                reply->writeInt32(setDataSource(source));
6862afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            }
68799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            return NO_ERROR;
68899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        }
6891173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        case SET_VIDEO_SURFACETEXTURE: {
6901173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            CHECK_INTERFACE(IMediaPlayer, data, reply);
6918ba01021b573889802e67e029225a96f0dfa471aAndy McFadden            sp<IGraphicBufferProducer> bufferProducer =
6928ba01021b573889802e67e029225a96f0dfa471aAndy McFadden                    interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
6938ba01021b573889802e67e029225a96f0dfa471aAndy McFadden            reply->writeInt32(setVideoSurfaceTexture(bufferProducer));
6941173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            return NO_ERROR;
6951173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        } break;
696d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        case SET_BUFFERING_SETTINGS: {
697d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            CHECK_INTERFACE(IMediaPlayer, data, reply);
698d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            BufferingSettings buffering;
699d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            buffering.readFromParcel(&data);
700d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            reply->writeInt32(setBufferingSettings(buffering));
701d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            return NO_ERROR;
702d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        } break;
7039bb3803a80a680ea7a3bc11e07b8a89ccddee003Wei Jia        case GET_BUFFERING_SETTINGS: {
704d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            CHECK_INTERFACE(IMediaPlayer, data, reply);
705d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            BufferingSettings buffering;
7069bb3803a80a680ea7a3bc11e07b8a89ccddee003Wei Jia            status_t err = getBufferingSettings(&buffering);
707d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            reply->writeInt32(err);
708d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            if (err == OK) {
709d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia                buffering.writeToParcel(reply);
710d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            }
711d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia            return NO_ERROR;
712d399e7e6065aa310e025ab633f633d5b4831a358Wei Jia        } break;
71389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case PREPARE_ASYNC: {
71489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
71589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(prepareAsync());
71689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
71789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
71889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case START: {
71989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
72089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(start());
72189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
72289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
72389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STOP: {
72489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
72589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(stop());
72689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
72789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
72889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case IS_PLAYING: {
72989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
73089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            bool state;
73189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t ret = isPlaying(&state);
73289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(state);
73389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(ret);
73489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
73589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
7363a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        case SET_PLAYBACK_SETTINGS: {
7373a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            CHECK_INTERFACE(IMediaPlayer, data, reply);
7383a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            AudioPlaybackRate rate = AUDIO_PLAYBACK_RATE_DEFAULT;
7393a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate.mSpeed = data.readFloat();
7403a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate.mPitch = data.readFloat();
7413a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate.mFallbackMode = (AudioTimestretchFallbackMode)data.readInt32();
7423a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate.mStretchMode = (AudioTimestretchStretchMode)data.readInt32();
7433a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            reply->writeInt32(setPlaybackSettings(rate));
7443a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            return NO_ERROR;
7453a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        } break;
7463a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        case GET_PLAYBACK_SETTINGS: {
7479816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia            CHECK_INTERFACE(IMediaPlayer, data, reply);
7483a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            AudioPlaybackRate rate = AUDIO_PLAYBACK_RATE_DEFAULT;
7493a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            status_t err = getPlaybackSettings(&rate);
7503a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            reply->writeInt32(err);
7513a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            if (err == OK) {
7523a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                reply->writeFloat(rate.mSpeed);
7533a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                reply->writeFloat(rate.mPitch);
7543a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                reply->writeInt32((int32_t)rate.mFallbackMode);
7553a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                reply->writeInt32((int32_t)rate.mStretchMode);
7563a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            }
7573a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            return NO_ERROR;
7583a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        } break;
7593a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        case SET_SYNC_SETTINGS: {
7603a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            CHECK_INTERFACE(IMediaPlayer, data, reply);
7613a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            AVSyncSettings sync;
7623a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            sync.mSource = (AVSyncSource)data.readInt32();
7633a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            sync.mAudioAdjustMode = (AVSyncAudioAdjustMode)data.readInt32();
7643a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            sync.mTolerance = data.readFloat();
7653a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            float videoFpsHint = data.readFloat();
7663a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            reply->writeInt32(setSyncSettings(sync, videoFpsHint));
7673a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            return NO_ERROR;
7683a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        } break;
7693a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        case GET_SYNC_SETTINGS: {
7703a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            CHECK_INTERFACE(IMediaPlayer, data, reply);
7713a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            AVSyncSettings sync;
7723a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            float videoFps;
7733a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            status_t err = getSyncSettings(&sync, &videoFps);
7743a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            reply->writeInt32(err);
7753a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            if (err == OK) {
7763a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                reply->writeInt32((int32_t)sync.mSource);
7773a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                reply->writeInt32((int32_t)sync.mAudioAdjustMode);
7783a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                reply->writeFloat(sync.mTolerance);
7793a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                reply->writeFloat(videoFps);
7803a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            }
7819816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia            return NO_ERROR;
7829816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia        } break;
78389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case PAUSE: {
78489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
78589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(pause());
78689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
78789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
78889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SEEK_TO: {
78989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
79067b6dccfd7b59efa772a3c2c553e7382c8f9f24cWei Jia            int msec = data.readInt32();
791c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia            MediaPlayerSeekMode mode = (MediaPlayerSeekMode)data.readInt32();
792c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia            reply->writeInt32(seekTo(msec, mode));
79389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
79489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
79589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_CURRENT_POSITION: {
79689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
797892354335d49f0b9fcd10e20e0c13e3cd0f1f1cbRobert Shih            int msec = 0;
79889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t ret = getCurrentPosition(&msec);
79989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(msec);
80089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(ret);
80189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
80289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
80389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_DURATION: {
80489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
805892354335d49f0b9fcd10e20e0c13e3cd0f1f1cbRobert Shih            int msec = 0;
80689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t ret = getDuration(&msec);
80789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(msec);
80889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(ret);
80989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
81089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
81189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case RESET: {
81289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
81389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(reset());
81489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
81589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
81652c2851b30588df1aba00766c37ffde86a3345bcWei Jia        case NOTIFY_AT: {
81752c2851b30588df1aba00766c37ffde86a3345bcWei Jia            CHECK_INTERFACE(IMediaPlayer, data, reply);
81852c2851b30588df1aba00766c37ffde86a3345bcWei Jia            reply->writeInt32(notifyAt(data.readInt64()));
81952c2851b30588df1aba00766c37ffde86a3345bcWei Jia            return NO_ERROR;
82052c2851b30588df1aba00766c37ffde86a3345bcWei Jia        } break;
82189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_AUDIO_STREAM_TYPE: {
82289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
823fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32(setAudioStreamType((audio_stream_type_t) data.readInt32()));
82489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
82589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
82689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_LOOPING: {
82789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayer, data, reply);
82889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(setLooping(data.readInt32()));
82989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
83089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
83189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_VOLUME: {
832172fb9ab347e146642234f0bd6f223d351e9fd0bDave Sparks            CHECK_INTERFACE(IMediaPlayer, data, reply);
833de162ff337723798381890151247b129c4fbe314Gloria Wang            float leftVolume = data.readFloat();
834de162ff337723798381890151247b129c4fbe314Gloria Wang            float rightVolume = data.readFloat();
835de162ff337723798381890151247b129c4fbe314Gloria Wang            reply->writeInt32(setVolume(leftVolume, rightVolume));
83689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
83789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
8381d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania        case INVOKE: {
8391d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania            CHECK_INTERFACE(IMediaPlayer, data, reply);
840040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong            status_t result = invoke(data, reply);
841040e4a14ef9cafd5d08d9a180e6237fb79687995James Dong            return result;
8421d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania        } break;
843a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        case SET_METADATA_FILTER: {
844a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania            CHECK_INTERFACE(IMediaPlayer, data, reply);
845a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania            reply->writeInt32(setMetadataFilter(data));
846a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania            return NO_ERROR;
847a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        } break;
8488e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        case GET_METADATA: {
8498e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            CHECK_INTERFACE(IMediaPlayer, data, reply);
850de162ff337723798381890151247b129c4fbe314Gloria Wang            bool update_only = static_cast<bool>(data.readInt32());
851de162ff337723798381890151247b129c4fbe314Gloria Wang            bool apply_filter = static_cast<bool>(data.readInt32());
852de162ff337723798381890151247b129c4fbe314Gloria Wang            const status_t retcode = getMetadata(update_only, apply_filter, reply);
8538e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            reply->setDataPosition(0);
8548e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            reply->writeInt32(retcode);
8558e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            reply->setDataPosition(0);
8568e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania            return NO_ERROR;
8578e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        } break;
8582beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        case SET_AUX_EFFECT_SEND_LEVEL: {
8592beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            CHECK_INTERFACE(IMediaPlayer, data, reply);
8602beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            reply->writeInt32(setAuxEffectSendLevel(data.readFloat()));
8612beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            return NO_ERROR;
8622beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        } break;
8632beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        case ATTACH_AUX_EFFECT: {
8642beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            CHECK_INTERFACE(IMediaPlayer, data, reply);
8652beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            reply->writeInt32(attachAuxEffect(data.readInt32()));
8662beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            return NO_ERROR;
8672beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        } break;
8684f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        case SET_PARAMETER: {
8694f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            CHECK_INTERFACE(IMediaPlayer, data, reply);
8704f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            int key = data.readInt32();
8714f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
8724f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            Parcel request;
8734f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            if (data.dataAvail() > 0) {
8744f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang                request.appendFrom(
8754f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang                        const_cast<Parcel *>(&data), data.dataPosition(), data.dataAvail());
8764f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            }
8774f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            request.setDataPosition(0);
8784f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            reply->writeInt32(setParameter(key, request));
8794f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            return NO_ERROR;
8804f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        } break;
8814f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        case GET_PARAMETER: {
8824f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            CHECK_INTERFACE(IMediaPlayer, data, reply);
8834f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang            return getParameter(data.readInt32(), reply);
8844f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang        } break;
885c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        case SET_RETRANSMIT_ENDPOINT: {
886c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            CHECK_INTERFACE(IMediaPlayer, data, reply);
887c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
888c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            struct sockaddr_in endpoint;
8890981df6e3db106bfb7a56a2b668c012fcc34dd2cNick Kralevich            memset(&endpoint, 0, sizeof(endpoint));
890c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            int amt = data.readInt32();
891c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            if (amt == sizeof(endpoint)) {
892c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman                data.read(&endpoint, sizeof(struct sockaddr_in));
893c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman                reply->writeInt32(setRetransmitEndpoint(&endpoint));
894c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            } else {
895c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman                reply->writeInt32(setRetransmitEndpoint(NULL));
896c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            }
89744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
89844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            return NO_ERROR;
89944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        } break;
90044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        case GET_RETRANSMIT_ENDPOINT: {
90144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            CHECK_INTERFACE(IMediaPlayer, data, reply);
90244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
90344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            struct sockaddr_in endpoint;
9040981df6e3db106bfb7a56a2b668c012fcc34dd2cNick Kralevich            memset(&endpoint, 0, sizeof(endpoint));
90544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            status_t res = getRetransmitEndpoint(&endpoint);
90644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
90744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            reply->writeInt32(res);
90844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            reply->write(&endpoint, sizeof(endpoint));
90944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
9106b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen            return NO_ERROR;
9116b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        } break;
9126b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        case SET_NEXT_PLAYER: {
9136b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen            CHECK_INTERFACE(IMediaPlayer, data, reply);
9146b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen            reply->writeInt32(setNextPlayer(interface_cast<IMediaPlayer>(data.readStrongBinder())));
91544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
916c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            return NO_ERROR;
917c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        } break;
918071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
9199fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        case APPLY_VOLUME_SHAPER: {
9209fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            CHECK_INTERFACE(IMediaPlayer, data, reply);
9219fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            sp<VolumeShaper::Configuration> configuration;
9229fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            sp<VolumeShaper::Operation> operation;
9239fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung
9249fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            int32_t present;
9259fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            status_t status = data.readInt32(&present);
9269fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            if (status == NO_ERROR && present != 0) {
9279fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                configuration = new VolumeShaper::Configuration();
9288cf3a0788df2ee184b498086b1b8da322eeadccaIvan Lozano                status = configuration->readFromParcel(&data);
9299fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            }
9309fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            if (status == NO_ERROR) {
9319fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                status = data.readInt32(&present);
9329fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            }
9339fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            if (status == NO_ERROR && present != 0) {
9349fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                operation = new VolumeShaper::Operation();
9358cf3a0788df2ee184b498086b1b8da322eeadccaIvan Lozano                status = operation->readFromParcel(&data);
9369fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            }
9379fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            if (status == NO_ERROR) {
9389fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                status = (status_t)applyVolumeShaper(configuration, operation);
9399fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            }
9409fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            reply->writeInt32(status);
9419fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            return NO_ERROR;
9429fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        } break;
9439fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        case GET_VOLUME_SHAPER_STATE: {
9449fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            CHECK_INTERFACE(IMediaPlayer, data, reply);
9459fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            int id;
9469fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            status_t status = data.readInt32(&id);
9479fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            if (status == NO_ERROR) {
9489fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                sp<VolumeShaper::State> state = getVolumeShaperState(id);
9499fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                if (state.get() != nullptr) {
9509fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                     status = state->writeToParcel(reply);
9519fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                }
9529fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            }
9539fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung            return NO_ERROR;
9549fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung        } break;
9559fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung
956cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania        // Modular DRM
957071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        case PREPARE_DRM: {
958071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            CHECK_INTERFACE(IMediaPlayer, data, reply);
959cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania
960071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            uint8_t uuid[16];
961071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            data.read(uuid, sizeof(uuid));
962cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania            Vector<uint8_t> drmSessionId;
963cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania            readVector(data, drmSessionId);
964071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
965cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania            uint32_t result = prepareDrm(uuid, drmSessionId);
966071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            reply->writeInt32(result);
967071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            return OK;
968071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        }
969071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        case RELEASE_DRM: {
970071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            CHECK_INTERFACE(IMediaPlayer, data, reply);
971071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
972071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            uint32_t result = releaseDrm();
973071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            reply->writeInt32(result);
974071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania            return OK;
975071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        }
976156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin
977156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        // AudioRouting
978156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        case SET_OUTPUT_DEVICE: {
979156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            CHECK_INTERFACE(IMediaPlayer, data, reply);
980156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            int deviceId;
981156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            status_t status = data.readInt32(&deviceId);
982156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            if (status == NO_ERROR) {
983156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin                reply->writeInt32(setOutputDevice(deviceId));
984156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            } else {
985156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin                reply->writeInt32(BAD_VALUE);
986156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            }
987156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            return NO_ERROR;
988156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        }
989156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        case GET_ROUTED_DEVICE_ID: {
990156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            CHECK_INTERFACE(IMediaPlayer, data, reply);
991156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            audio_port_handle_t deviceId;
992156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            status_t ret = getRoutedDeviceId(&deviceId);
993156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            reply->writeInt32(ret);
994156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            if (ret == NO_ERROR) {
995156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin                reply->writeInt32(deviceId);
996156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            }
997156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            return NO_ERROR;
998156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        } break;
999156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        case ENABLE_AUDIO_DEVICE_CALLBACK: {
1000156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            CHECK_INTERFACE(IMediaPlayer, data, reply);
1001156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            bool enabled;
1002156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            status_t status = data.readBool(&enabled);
1003156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            if (status == NO_ERROR) {
1004156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin                reply->writeInt32(enableAudioDeviceCallback(enabled));
1005156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            } else {
1006156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin                reply->writeInt32(BAD_VALUE);
1007156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            }
1008156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin            return NO_ERROR;
1009156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin        } break;
1010156c6873a5e69af71f3c28b236c5831b9cb2ac95jiabin
101189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
101289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
101389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
101489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
101589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
101689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
101789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
101840bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
1019