IAudioPolicyService.cpp revision 8af901cdea0af7e536579dee6d56e69987035a01
1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/*
2326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams**
3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams** Copyright 2009, The Android Open Source Project
4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams**
5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams** Licensed under the Apache License, Version 2.0 (the "License");
6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams** you may not use this file except in compliance with the License.
7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams** You may obtain a copy of the License at
8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams**
9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams**     http://www.apache.org/licenses/LICENSE-2.0
10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams**
11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams** Unless required by applicable law or agreed to in writing, software
12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams** distributed under the License is distributed on an "AS IS" BASIS,
13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams** See the License for the specific language governing permissions and
15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams** limitations under the License.
16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams*/
17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#define LOG_TAG "IAudioPolicyService"
19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include <utils/Log.h>
205ae678f2e68e25bd74cdc408df354c3b6fe481bfMathias Agopian
21afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams#include <stdint.h>
229b97c2906aed2b6dea9e0824f91f27c08d3690a7Mathias Agopian#include <sys/types.h>
23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
24158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams#include <binder/Parcel.h>
25158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams
267bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams#include <media/IAudioPolicyService.h>
27158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams
2876371fff76412fd020e24ddb8bf1ddb5c75f0ed1Joe Onorato#include <system/audio.h>
2976371fff76412fd020e24ddb8bf1ddb5c75f0ed1Joe Onorato
301aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Samsnamespace android {
311aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams
324815c0d121310cfcd6a8aba4eab77a9910af53acJason Samsenum {
334815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    SET_DEVICE_CONNECTION_STATE = IBinder::FIRST_CALL_TRANSACTION,
341aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams    GET_DEVICE_CONNECTION_STATE,
35158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams    SET_PHONE_STATE,
36158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams    SET_RINGER_MODE,    // reserved, no longer used
37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    SET_FORCE_USE,
38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    GET_FORCE_USE,
39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    GET_OUTPUT,
40e57691037aea219562ac686429b4b98202aab7bcJason Sams    START_OUTPUT,
41fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams    STOP_OUTPUT,
4233b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams    RELEASE_OUTPUT,
43fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams    GET_INPUT,
44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    START_INPUT,
4533b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams    STOP_INPUT,
4633b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams    RELEASE_INPUT,
4733b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams    INIT_STREAM_VOLUME,
4833b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams    SET_STREAM_VOLUME,
4933b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams    GET_STREAM_VOLUME,
5033b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams    GET_STRATEGY_FOR_STREAM,
5133b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams    GET_OUTPUT_FOR_EFFECT,
5233b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams    REGISTER_EFFECT,
5333b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams    UNREGISTER_EFFECT,
5433b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams    IS_STREAM_ACTIVE,
5533b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams    IS_SOURCE_ACTIVE,
5633b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams    GET_DEVICES_FOR_STREAM,
57c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    QUERY_DEFAULT_PRE_PROCESSING,
58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    SET_EFFECT_ENABLED
59afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams};
60afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams
61afcb25c65e8145d15aaf50a0ca38333954a97000Jason Samsclass BpAudioPolicyService : public BpInterface<IAudioPolicyService>
62c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{
63afcb25c65e8145d15aaf50a0ca38333954a97000Jason Samspublic:
64afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams    BpAudioPolicyService(const sp<IBinder>& impl)
65afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams        : BpInterface<IAudioPolicyService>(impl)
66afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams    {
67afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams    }
68afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams
69afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams    virtual status_t setDeviceConnectionState(
70c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams                                    audio_devices_t device,
71c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams                                    audio_policy_dev_state_t state,
72c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams                                    const char *device_address)
73c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    {
74c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        Parcel data, reply;
75c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
76afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams        data.writeInt32(static_cast <uint32_t>(device));
77afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams        data.writeInt32(static_cast <uint32_t>(state));
78afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams        data.writeCString(device_address);
79afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams        remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply);
80afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams        return static_cast <status_t> (reply.readInt32());
819397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    }
825fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams
835fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams    virtual audio_policy_dev_state_t getDeviceConnectionState(
845fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams                                    audio_devices_t device,
855fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams                                    const char *device_address)
865fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams    {
875fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams        Parcel data, reply;
88afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
89afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams        data.writeInt32(static_cast <uint32_t>(device));
90afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams        data.writeCString(device_address);
916d751ef1b4611c6b5fc2085fa5ef9ae2f4e60c5aJason Sams        remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply);
92afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams        return static_cast <audio_policy_dev_state_t>(reply.readInt32());
9333b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams    }
9433b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams
95afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams    virtual status_t setPhoneState(audio_mode_t state)
9633b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams    {
97afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams        Parcel data, reply;
98afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
99afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams        data.writeInt32(state);
1009397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        remote()->transact(SET_PHONE_STATE, data, &reply);
101afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams        return static_cast <status_t> (reply.readInt32());
102afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams    }
103afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams
10433b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams    virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config)
105c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    {
106c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        Parcel data, reply;
107c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
108c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        data.writeInt32(static_cast <uint32_t>(usage));
109c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        data.writeInt32(static_cast <uint32_t>(config));
11033b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams        remote()->transact(SET_FORCE_USE, data, &reply);
11133b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams        return static_cast <status_t> (reply.readInt32());
11233b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams    }
11333b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams
11433b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams    virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage)
115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    {
116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        Parcel data, reply;
11733b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
11833b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams        data.writeInt32(static_cast <uint32_t>(usage));
119613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams        remote()->transact(GET_FORCE_USE, data, &reply);
120613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams        return static_cast <audio_policy_forced_cfg_t> (reply.readInt32());
12133b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams    }
12233b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams
12333b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams    virtual audio_io_handle_t getOutput(
12433b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams                                        audio_stream_type_t stream,
12533b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams                                        uint32_t samplingRate,
12633b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams                                        audio_format_t format,
12733b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams                                        audio_channel_mask_t channelMask,
12833b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams                                        audio_output_flags_t flags)
12933b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams    {
13033b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams        Parcel data, reply;
131c61346b91434307c5003029017b54ce9c49112beJason Sams        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1321030893d9b99b72468034da13df025bda479bb97Jason Sams        data.writeInt32(static_cast <uint32_t>(stream));
1331030893d9b99b72468034da13df025bda479bb97Jason Sams        data.writeInt32(samplingRate);
1341030893d9b99b72468034da13df025bda479bb97Jason Sams        data.writeInt32(static_cast <uint32_t>(format));
135ccc010bb7c0f89e162bf60033968a20be90a903aJason Sams        data.writeInt32(channelMask);
136b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams        data.writeInt32(static_cast <uint32_t>(flags));
137d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        remote()->transact(GET_OUTPUT, data, &reply);
1381030893d9b99b72468034da13df025bda479bb97Jason Sams        return static_cast <audio_io_handle_t> (reply.readInt32());
139c61346b91434307c5003029017b54ce9c49112beJason Sams    }
1401030893d9b99b72468034da13df025bda479bb97Jason Sams
141a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    virtual status_t startOutput(audio_io_handle_t output,
142a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                                 audio_stream_type_t stream,
143a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                                 int session)
144b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams    {
145d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        Parcel data, reply;
146c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1471030893d9b99b72468034da13df025bda479bb97Jason Sams        data.writeInt32(output);
1481030893d9b99b72468034da13df025bda479bb97Jason Sams        data.writeInt32((int32_t) stream);
149d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        data.writeInt32(session);
150d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        remote()->transact(START_OUTPUT, data, &reply);
151d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        return static_cast <status_t> (reply.readInt32());
152d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    }
153d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
154d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    virtual status_t stopOutput(audio_io_handle_t output,
155d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                                audio_stream_type_t stream,
1561030893d9b99b72468034da13df025bda479bb97Jason Sams                                int session)
1572dca84dd6c07992f78ad050177975f16486dd77eJason Sams    {
158326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        Parcel data, reply;
159771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
160306fb23e57c4a389eaf3159b9701a64cb56e284eJason Sams        data.writeInt32(output);
1612dca84dd6c07992f78ad050177975f16486dd77eJason Sams        data.writeInt32((int32_t) stream);
1628c401effb0837155fc39ca0364f57a882d127d38Jason Sams        data.writeInt32(session);
163c61346b91434307c5003029017b54ce9c49112beJason Sams        remote()->transact(STOP_OUTPUT, data, &reply);
1648cfdd24fec22080b72266d33f61befc4a98b77c6Jason Sams        return static_cast <status_t> (reply.readInt32());
165d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    }
166a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams
167a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams    virtual void releaseOutput(audio_io_handle_t output)
168a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams    {
169a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams        Parcel data, reply;
170a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
17124371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        data.writeInt32(output);
17224371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        remote()->transact(RELEASE_OUTPUT, data, &reply);
173cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams    }
17424371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams
17524371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams    virtual audio_io_handle_t getInput(
17624371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams                                    audio_source_t inputSource,
17724371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams                                    uint32_t samplingRate,
17824371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams                                    audio_format_t format,
17924371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams                                    audio_channel_mask_t channelMask,
180cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams                                    int audioSession)
18124371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams    {
18224371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        Parcel data, reply;
18324371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
18424371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        data.writeInt32((int32_t) inputSource);
18524371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        data.writeInt32(samplingRate);
18624371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        data.writeInt32(static_cast <uint32_t>(format));
187cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams        data.writeInt32(channelMask);
18824371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        data.writeInt32(audioSession);
18924371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        remote()->transact(GET_INPUT, data, &reply);
19024371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        return static_cast <audio_io_handle_t> (reply.readInt32());
1911d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams    }
1921d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams
19324371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams    virtual status_t startInput(audio_io_handle_t input)
19424371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams    {
19524371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        Parcel data, reply;
19624371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1971d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams        data.writeInt32(input);
1981d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams        remote()->transact(START_INPUT, data, &reply);
1991d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams        return static_cast <status_t> (reply.readInt32());
2001d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams    }
2011d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams
2021d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams    virtual status_t stopInput(audio_io_handle_t input)
20324371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams    {
20424371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        Parcel data, reply;
20524371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
20624371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        data.writeInt32(input);
20724371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        remote()->transact(STOP_INPUT, data, &reply);
20824371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        return static_cast <status_t> (reply.readInt32());
20924371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams    }
21024371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams
21124371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams    virtual void releaseInput(audio_io_handle_t input)
21224371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams    {
21324371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        Parcel data, reply;
21424371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
21524371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        data.writeInt32(input);
21624371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        remote()->transact(RELEASE_INPUT, data, &reply);
2171d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams    }
2182dca84dd6c07992f78ad050177975f16486dd77eJason Sams
2192dca84dd6c07992f78ad050177975f16486dd77eJason Sams    virtual status_t initStreamVolume(audio_stream_type_t stream,
2202dca84dd6c07992f78ad050177975f16486dd77eJason Sams                                    int indexMin,
22124371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams                                    int indexMax)
2222dca84dd6c07992f78ad050177975f16486dd77eJason Sams    {
2232dca84dd6c07992f78ad050177975f16486dd77eJason Sams        Parcel data, reply;
2242dca84dd6c07992f78ad050177975f16486dd77eJason Sams        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
2252dca84dd6c07992f78ad050177975f16486dd77eJason Sams        data.writeInt32(static_cast <uint32_t>(stream));
2262dca84dd6c07992f78ad050177975f16486dd77eJason Sams        data.writeInt32(indexMin);
2272dca84dd6c07992f78ad050177975f16486dd77eJason Sams        data.writeInt32(indexMax);
2282dca84dd6c07992f78ad050177975f16486dd77eJason Sams        remote()->transact(INIT_STREAM_VOLUME, data, &reply);
2292dca84dd6c07992f78ad050177975f16486dd77eJason Sams        return static_cast <status_t> (reply.readInt32());
2302dca84dd6c07992f78ad050177975f16486dd77eJason Sams    }
231326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
232326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
233a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams                                          int index,
234326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                                          audio_devices_t device)
235c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    {
236a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams        Parcel data, reply;
237a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
238a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams        data.writeInt32(static_cast <uint32_t>(stream));
239a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams        data.writeInt32(index);
240c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        data.writeInt32(static_cast <uint32_t>(device));
241c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        remote()->transact(SET_STREAM_VOLUME, data, &reply);
242c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        return static_cast <status_t> (reply.readInt32());
243c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    }
244c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
245c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
246c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams                                          int *index,
247c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams                                          audio_devices_t device)
248c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    {
249c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        Parcel data, reply;
250c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
251c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        data.writeInt32(static_cast <uint32_t>(stream));
252a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams        data.writeInt32(static_cast <uint32_t>(device));
253326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
254326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        remote()->transact(GET_STREAM_VOLUME, data, &reply);
2551fddd90849deaae89b546ff492c345d485bbce42Jason Sams        int lIndex = reply.readInt32();
25676371fff76412fd020e24ddb8bf1ddb5c75f0ed1Joe Onorato        if (index) *index = lIndex;
25776371fff76412fd020e24ddb8bf1ddb5c75f0ed1Joe Onorato        return static_cast <status_t> (reply.readInt32());
2581fddd90849deaae89b546ff492c345d485bbce42Jason Sams    }
25976371fff76412fd020e24ddb8bf1ddb5c75f0ed1Joe Onorato
26076371fff76412fd020e24ddb8bf1ddb5c75f0ed1Joe Onorato    virtual uint32_t getStrategyForStream(audio_stream_type_t stream)
261326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    {
262326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        Parcel data, reply;
263326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
264326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        data.writeInt32(static_cast <uint32_t>(stream));
265158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams        remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply);
266158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams        return reply.readInt32();
267158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams    }
2682dca84dd6c07992f78ad050177975f16486dd77eJason Sams
269326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream)
2701fddd90849deaae89b546ff492c345d485bbce42Jason Sams    {
2711fddd90849deaae89b546ff492c345d485bbce42Jason Sams        Parcel data, reply;
272433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
273433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams        data.writeInt32(static_cast <uint32_t>(stream));
27476371fff76412fd020e24ddb8bf1ddb5c75f0ed1Joe Onorato        remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply);
275e57691037aea219562ac686429b4b98202aab7bcJason Sams        return (audio_devices_t) reply.readInt32();
276e57691037aea219562ac686429b4b98202aab7bcJason Sams    }
277e57691037aea219562ac686429b4b98202aab7bcJason Sams
278e57691037aea219562ac686429b4b98202aab7bcJason Sams    virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc)
279e57691037aea219562ac686429b4b98202aab7bcJason Sams    {
280e57691037aea219562ac686429b4b98202aab7bcJason Sams        Parcel data, reply;
281e57691037aea219562ac686429b4b98202aab7bcJason Sams        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
282e57691037aea219562ac686429b4b98202aab7bcJason Sams        data.write(desc, sizeof(effect_descriptor_t));
283e57691037aea219562ac686429b4b98202aab7bcJason Sams        remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply);
284e57691037aea219562ac686429b4b98202aab7bcJason Sams        return static_cast <audio_io_handle_t> (reply.readInt32());
285e57691037aea219562ac686429b4b98202aab7bcJason Sams    }
286e57691037aea219562ac686429b4b98202aab7bcJason Sams
2874820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams    virtual status_t registerEffect(const effect_descriptor_t *desc,
288771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams                                        audio_io_handle_t io,
2894820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams                                        uint32_t strategy,
290771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams                                        int session,
2914820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams                                        int id)
292771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams    {
2934820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams        Parcel data, reply;
294771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
2954820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams        data.write(desc, sizeof(effect_descriptor_t));
296d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        data.writeInt32(io);
297d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        data.writeInt32(strategy);
2984820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams        data.writeInt32(session);
2994820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams        data.writeInt32(id);
3008ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams        remote()->transact(REGISTER_EFFECT, data, &reply);
301326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return static_cast <status_t> (reply.readInt32());
302a44cb29164726cd9d812117819abdd7b60dfdd93Jason Sams    }
303326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
304fcd3192ebff8ab58d841836b7e94361d0998338cJason Sams    virtual status_t unregisterEffect(int id)
305732f1c0a29cc468ea271ca3bd654239a0a973fd5Jason Sams    {
306458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams        Parcel data, reply;
307326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
3082dca84dd6c07992f78ad050177975f16486dd77eJason Sams        data.writeInt32(id);
3094820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams        remote()->transact(UNREGISTER_EFFECT, data, &reply);
3102dca84dd6c07992f78ad050177975f16486dd77eJason Sams        return static_cast <status_t> (reply.readInt32());
3112dca84dd6c07992f78ad050177975f16486dd77eJason Sams    }
3122dca84dd6c07992f78ad050177975f16486dd77eJason Sams
313afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams    virtual status_t setEffectEnabled(int id, bool enabled)
3142dca84dd6c07992f78ad050177975f16486dd77eJason Sams    {
3152dca84dd6c07992f78ad050177975f16486dd77eJason Sams        Parcel data, reply;
3162dca84dd6c07992f78ad050177975f16486dd77eJason Sams        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
3172dca84dd6c07992f78ad050177975f16486dd77eJason Sams        data.writeInt32(id);
31824371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        data.writeInt32(enabled);
31924371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        remote()->transact(SET_EFFECT_ENABLED, data, &reply);
32024371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        return static_cast <status_t> (reply.readInt32());
321326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
3222dca84dd6c07992f78ad050177975f16486dd77eJason Sams
3232dca84dd6c07992f78ad050177975f16486dd77eJason Sams    virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
3242dca84dd6c07992f78ad050177975f16486dd77eJason Sams    {
3252dca84dd6c07992f78ad050177975f16486dd77eJason Sams        Parcel data, reply;
3262dca84dd6c07992f78ad050177975f16486dd77eJason Sams        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
3272dca84dd6c07992f78ad050177975f16486dd77eJason Sams        data.writeInt32((int32_t) stream);
328326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        data.writeInt32(inPastMs);
329326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        remote()->transact(IS_STREAM_ACTIVE, data, &reply);
3308c0ee6567b3c874dd472843eb7918ae68d1b9739Jason Sams        return reply.readInt32();
3314820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams    }
3324820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams
3334820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams    virtual bool isSourceActive(audio_source_t source) const
3344820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams    {
3354820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams        Parcel data, reply;
336d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
3374820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams        data.writeInt32((int32_t) source);
3384820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams        remote()->transact(IS_SOURCE_ACTIVE, data, &reply);
3394820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams        return reply.readInt32();
3404820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams    }
3414820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams
342d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    virtual status_t queryDefaultPreProcessing(int audioSession,
3434820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams                                               effect_descriptor_t *descriptors,
344e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams                                               uint32_t *count)
345e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    {
346e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams        if (descriptors == NULL || count == NULL) {
347e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams            return BAD_VALUE;
348e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams        }
3494820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams        Parcel data, reply;
3504820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
3514820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams        data.writeInt32(audioSession);
3524820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams        data.writeInt32(*count);
3534820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams        status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply);
35433b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams        if (status != NO_ERROR) {
3558c0ee6567b3c874dd472843eb7918ae68d1b9739Jason Sams            return status;
356326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
357326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        status = static_cast <status_t> (reply.readInt32());
358326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        uint32_t retCount = reply.readInt32();
3597bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams        if (retCount != 0) {
3607bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams            uint32_t numDesc = (retCount < *count) ? retCount : *count;
3617bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams            reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc);
3627bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams        }
3637bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams        *count = retCount;
3647bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams        return status;
3657bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    }
3667bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams};
3677bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams
3687bf29ddc35450d8064541c42c99a1f48be6cf0ddJason SamsIMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
3697bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams
3707bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams// ----------------------------------------------------------------------
3717bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams
3727bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams
3737bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Samsstatus_t BnAudioPolicyService::onTransact(
3747bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
3757bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams{
3767bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    switch (code) {
3777bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams        case SET_DEVICE_CONNECTION_STATE: {
3787bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
3797bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams            audio_devices_t device =
3807bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams                    static_cast <audio_devices_t>(data.readInt32());
3817bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams            audio_policy_dev_state_t state =
3827bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams                    static_cast <audio_policy_dev_state_t>(data.readInt32());
3837bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams            const char *device_address = data.readCString();
3847bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams            reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device,
3857bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams                                                                              state,
3867bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams                                                                              device_address)));
3877bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams            return NO_ERROR;
3887bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams        } break;
3897bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams
3907bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams        case GET_DEVICE_CONNECTION_STATE: {
3917bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
3927bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams            audio_devices_t device =
3937bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams                    static_cast<audio_devices_t> (data.readInt32());
3947bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams            const char *device_address = data.readCString();
3957bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams            reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device,
3967bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams                                                                              device_address)));
3977bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams            return NO_ERROR;
3987bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams        } break;
3997bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams
4007bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams        case SET_PHONE_STATE: {
4017bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
402158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams            reply->writeInt32(static_cast <uint32_t>(setPhoneState(
403158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams                    (audio_mode_t) data.readInt32())));
404158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams            return NO_ERROR;
405158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams        } break;
406158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams
407158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams        case SET_FORCE_USE: {
4082dca84dd6c07992f78ad050177975f16486dd77eJason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
409158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams            audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
410158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams                    data.readInt32());
411158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams            audio_policy_forced_cfg_t config =
412158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams                    static_cast <audio_policy_forced_cfg_t>(data.readInt32());
413158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams            reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config)));
414158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams            return NO_ERROR;
415158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams        } break;
416158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams
417158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams        case GET_FORCE_USE: {
4187bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
4197bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams            audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
4207bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams                    data.readInt32());
4217bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams            reply->writeInt32(static_cast <uint32_t>(getForceUse(usage)));
422158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams            return NO_ERROR;
423158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams        } break;
424158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams
4254820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams        case GET_OUTPUT: {
426326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
427fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams            audio_stream_type_t stream =
428fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams                    static_cast <audio_stream_type_t>(data.readInt32());
429326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            uint32_t samplingRate = data.readInt32();
430326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            audio_format_t format = (audio_format_t) data.readInt32();
431326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            audio_channel_mask_t channelMask = data.readInt32();
432326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            audio_output_flags_t flags =
433afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams                    static_cast <audio_output_flags_t>(data.readInt32());
43486f1b23aaaf9b8822a009d8c3e585e46768abb6aJason Sams
435e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            audio_io_handle_t output = getOutput(stream,
436a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams                                                 samplingRate,
437a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams                                                 format,
438a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams                                                 channelMask,
439613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams                                                 flags);
4404820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams            reply->writeInt32(static_cast <int>(output));
4414820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams            return NO_ERROR;
442326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        } break;
443a658e905f14fe500bfee3812b213a73cb37ef6f2Jason Sams
444a658e905f14fe500bfee3812b213a73cb37ef6f2Jason Sams        case START_OUTPUT: {
445a658e905f14fe500bfee3812b213a73cb37ef6f2Jason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
446fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
4479e4e13d87e834b1cb770407cef0778c262b02b72Jason Sams            uint32_t stream = data.readInt32();
4489e4e13d87e834b1cb770407cef0778c262b02b72Jason Sams            int session = data.readInt32();
4499e4e13d87e834b1cb770407cef0778c262b02b72Jason Sams            reply->writeInt32(static_cast <uint32_t>(startOutput(output,
450fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams                                                                 (audio_stream_type_t)stream,
4519e4e13d87e834b1cb770407cef0778c262b02b72Jason Sams                                                                 session)));
4529e4e13d87e834b1cb770407cef0778c262b02b72Jason Sams            return NO_ERROR;
453e57691037aea219562ac686429b4b98202aab7bcJason Sams        } break;
454fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams
455fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams        case STOP_OUTPUT: {
456fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
457fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
458e57691037aea219562ac686429b4b98202aab7bcJason Sams            uint32_t stream = data.readInt32();
459a658e905f14fe500bfee3812b213a73cb37ef6f2Jason Sams            int session = data.readInt32();
460a658e905f14fe500bfee3812b213a73cb37ef6f2Jason Sams            reply->writeInt32(static_cast <uint32_t>(stopOutput(output,
461a658e905f14fe500bfee3812b213a73cb37ef6f2Jason Sams                                                                (audio_stream_type_t)stream,
462a658e905f14fe500bfee3812b213a73cb37ef6f2Jason Sams                                                                session)));
463a658e905f14fe500bfee3812b213a73cb37ef6f2Jason Sams            return NO_ERROR;
464a658e905f14fe500bfee3812b213a73cb37ef6f2Jason Sams        } break;
465613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams
466992a0b70d8fd7a14f0c57bc3c7e16c1f269a6609Jason Sams        case RELEASE_OUTPUT: {
4675086938044e0a9b6b1138f915d0d252fe046e102Jason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
46824371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
469a891933b4c5ab1b63103add167269cfc404c2adfJason Sams            releaseOutput(output);
4705086938044e0a9b6b1138f915d0d252fe046e102Jason Sams            return NO_ERROR;
4717bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams        } break;
4727bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams
4737bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams        case GET_INPUT: {
4747bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
4757bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams            audio_source_t inputSource = (audio_source_t) data.readInt32();
4767bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams            uint32_t samplingRate = data.readInt32();
477a658e905f14fe500bfee3812b213a73cb37ef6f2Jason Sams            audio_format_t format = (audio_format_t) data.readInt32();
478326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            audio_channel_mask_t channelMask = data.readInt32();
479326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            int audioSession = data.readInt32();
4807bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams            audio_io_handle_t input = getInput(inputSource,
4817bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams                                               samplingRate,
4827bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams                                               format,
4837bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams                                               channelMask,
4847bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams                                               audioSession);
4857bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams            reply->writeInt32(static_cast <int>(input));
4867bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams            return NO_ERROR;
4877bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams        } break;
4887bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams
4897bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams        case START_INPUT: {
4907bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
491326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
492326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            reply->writeInt32(static_cast <uint32_t>(startInput(input)));
493326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            return NO_ERROR;
494ada7f272890d8791bc518c95989ad7d13050834dJason Sams        } break;
495326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
496326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        case STOP_INPUT: {
497a658e905f14fe500bfee3812b213a73cb37ef6f2Jason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
498326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
499326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            reply->writeInt32(static_cast <uint32_t>(stopInput(input)));
500326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            return NO_ERROR;
501326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        } break;
5028c0ee6567b3c874dd472843eb7918ae68d1b9739Jason Sams
503326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        case RELEASE_INPUT: {
50486f1b23aaaf9b8822a009d8c3e585e46768abb6aJason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
505326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
506326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            releaseInput(input);
5078c0ee6567b3c874dd472843eb7918ae68d1b9739Jason Sams            return NO_ERROR;
508326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        } break;
509bf3c14ebf456c745c084605dddeda08afdfc7987Jason Sams
5105086938044e0a9b6b1138f915d0d252fe046e102Jason Sams        case INIT_STREAM_VOLUME: {
511326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
512fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams            audio_stream_type_t stream =
513fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams                    static_cast <audio_stream_type_t>(data.readInt32());
514326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            int indexMin = data.readInt32();
515326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            int indexMax = data.readInt32();
516fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams            reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax)));
517fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams            return NO_ERROR;
518fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams        } break;
519fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams
520bf3c14ebf456c745c084605dddeda08afdfc7987Jason Sams        case SET_STREAM_VOLUME: {
521326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
522fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams            audio_stream_type_t stream =
5235086938044e0a9b6b1138f915d0d252fe046e102Jason Sams                    static_cast <audio_stream_type_t>(data.readInt32());
5245086938044e0a9b6b1138f915d0d252fe046e102Jason Sams            int index = data.readInt32();
525326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
526326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream,
5271c769c3d0e5f08e78ecdb4508c6bc69fcb69bfa8Dianne Hackborn                                                                          index,
528458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams                                                                          device)));
5294820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams            return NO_ERROR;
530613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams        } break;
531458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams
532458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams        case GET_STREAM_VOLUME: {
533458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
534458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams            audio_stream_type_t stream =
535458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams                    static_cast <audio_stream_type_t>(data.readInt32());
536458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams            audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
537458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams            int index;
538458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams            status_t status = getStreamVolumeIndex(stream, &index, device);
539458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams            reply->writeInt32(index);
540613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams            reply->writeInt32(static_cast <uint32_t>(status));
541613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams            return NO_ERROR;
542458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams        } break;
543458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams
544458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams        case GET_STRATEGY_FOR_STREAM: {
545458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
546771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams            audio_stream_type_t stream =
547771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams                    static_cast <audio_stream_type_t>(data.readInt32());
548613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams            reply->writeInt32(getStrategyForStream(stream));
549613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams            return NO_ERROR;
550613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams        } break;
551613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams
552f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams        case GET_DEVICES_FOR_STREAM: {
553613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
554613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams            audio_stream_type_t stream =
555613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams                    static_cast <audio_stream_type_t>(data.readInt32());
556458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams            reply->writeInt32(static_cast <int>(getDevicesForStream(stream)));
557458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams            return NO_ERROR;
558458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams        } break;
559458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams
560458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams        case GET_OUTPUT_FOR_EFFECT: {
561458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
562458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams            effect_descriptor_t desc;
563458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams            data.read(&desc, sizeof(effect_descriptor_t));
564613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams            audio_io_handle_t output = getOutputForEffect(&desc);
565771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams            reply->writeInt32(static_cast <int>(output));
566613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams            return NO_ERROR;
567613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams        } break;
568613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams
569613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams        case REGISTER_EFFECT: {
570613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
571613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams            effect_descriptor_t desc;
572613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams            data.read(&desc, sizeof(effect_descriptor_t));
573613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams            audio_io_handle_t io = data.readInt32();
574613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams            uint32_t strategy = data.readInt32();
575c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams            int session = data.readInt32();
576613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams            int id = data.readInt32();
577613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams            reply->writeInt32(static_cast <int32_t>(registerEffect(&desc,
578613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams                                                                   io,
579c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams                                                                   strategy,
580c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams                                                                   session,
581c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams                                                                   id)));
582c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams            return NO_ERROR;
583c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        } break;
584c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
585c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        case UNREGISTER_EFFECT: {
586c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
587c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams            int id = data.readInt32();
588c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams            reply->writeInt32(static_cast <int32_t>(unregisterEffect(id)));
589c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams            return NO_ERROR;
590613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams        } break;
591613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams
592c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        case SET_EFFECT_ENABLED: {
593613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
5944815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            int id = data.readInt32();
5954815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            bool enabled = static_cast <bool>(data.readInt32());
5964815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled)));
5974815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            return NO_ERROR;
5984815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        } break;
5994815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
6004815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        case IS_STREAM_ACTIVE: {
6014815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
6024815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
6034815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            uint32_t inPastMs = (uint32_t)data.readInt32();
604ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams            reply->writeInt32( isStreamActive((audio_stream_type_t) stream, inPastMs) );
605ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams            return NO_ERROR;
606613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams        } break;
607613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams
608458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams        case IS_SOURCE_ACTIVE: {
609458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
610458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams            audio_source_t source = (audio_source_t) data.readInt32();
61186f1b23aaaf9b8822a009d8c3e585e46768abb6aJason Sams            reply->writeInt32( isSourceActive(source));
61286f1b23aaaf9b8822a009d8c3e585e46768abb6aJason Sams            return NO_ERROR;
6134820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams        }
61486f1b23aaaf9b8822a009d8c3e585e46768abb6aJason Sams
61586f1b23aaaf9b8822a009d8c3e585e46768abb6aJason Sams        case QUERY_DEFAULT_PRE_PROCESSING: {
61686f1b23aaaf9b8822a009d8c3e585e46768abb6aJason Sams            CHECK_INTERFACE(IAudioPolicyService, data, reply);
61786f1b23aaaf9b8822a009d8c3e585e46768abb6aJason Sams            int audioSession = data.readInt32();
61886f1b23aaaf9b8822a009d8c3e585e46768abb6aJason Sams            uint32_t count = data.readInt32();
6194820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams            uint32_t retCount = count;
62086f1b23aaaf9b8822a009d8c3e585e46768abb6aJason Sams            effect_descriptor_t *descriptors =
62186f1b23aaaf9b8822a009d8c3e585e46768abb6aJason Sams                    (effect_descriptor_t *)new char[count * sizeof(effect_descriptor_t)];
62286f1b23aaaf9b8822a009d8c3e585e46768abb6aJason Sams            status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount);
623326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            reply->writeInt32(status);
624326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            if (status != NO_ERROR && status != NO_MEMORY) {
6254820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams                retCount = 0;
626326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            }
627326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            reply->writeInt32(retCount);
628326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            if (retCount) {
629ccc010bb7c0f89e162bf60033968a20be90a903aJason Sams                if (retCount < count) {
630326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                    count = retCount;
6314820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams                }
6328ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                reply->write(descriptors, sizeof(effect_descriptor_t) * count);
6338ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams            }
6348ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams            delete[] descriptors;
6358ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams            return status;
6368ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams        }
637326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
638326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        default:
639326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            return BBinder::onTransact(code, data, reply, flags);
640326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
6414820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams}
6428ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams
6438ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams// ----------------------------------------------------------------------------
6448ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams
6458ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams}; // namespace android
6468ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams