blob: 109044d097837817c6dbefd80bb89c9d4becb56c [file] [log] [blame]
Eric Laurentc2f1f072009-07-17 12:17:14 -07001/*
2**
3** Copyright 2009, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9** http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
18#define LOG_TAG "IAudioPolicyService"
19#include <utils/Log.h>
20
21#include <stdint.h>
22#include <sys/types.h>
23
24#include <binder/Parcel.h>
25
Eric Laurente360f0f2014-11-05 12:15:36 -080026#include <media/AudioEffect.h>
Eric Laurentc2f1f072009-07-17 12:17:14 -070027#include <media/IAudioPolicyService.h>
28
Dima Zavin64760242011-05-11 14:15:23 -070029#include <system/audio.h>
Dima Zavinfce7a472011-04-19 22:30:36 -070030
Eric Laurentc2f1f072009-07-17 12:17:14 -070031namespace android {
32
33enum {
34 SET_DEVICE_CONNECTION_STATE = IBinder::FIRST_CALL_TRANSACTION,
35 GET_DEVICE_CONNECTION_STATE,
36 SET_PHONE_STATE,
Glenn Kasten0b07b802012-01-18 14:56:06 -080037 SET_RINGER_MODE, // reserved, no longer used
Eric Laurentc2f1f072009-07-17 12:17:14 -070038 SET_FORCE_USE,
39 GET_FORCE_USE,
40 GET_OUTPUT,
41 START_OUTPUT,
42 STOP_OUTPUT,
43 RELEASE_OUTPUT,
44 GET_INPUT,
45 START_INPUT,
46 STOP_INPUT,
47 RELEASE_INPUT,
48 INIT_STREAM_VOLUME,
49 SET_STREAM_VOLUME,
Eric Laurentde070132010-07-13 04:45:46 -070050 GET_STREAM_VOLUME,
51 GET_STRATEGY_FOR_STREAM,
52 GET_OUTPUT_FOR_EFFECT,
53 REGISTER_EFFECT,
Eric Laurenteda6c362011-02-02 09:33:30 -080054 UNREGISTER_EFFECT,
Glenn Kasten6b2718c2011-02-04 13:54:26 -080055 IS_STREAM_ACTIVE,
Jean-Michel Trivie3f641f2012-10-10 12:11:16 -070056 IS_SOURCE_ACTIVE,
Glenn Kasten6b2718c2011-02-04 13:54:26 -080057 GET_DEVICES_FOR_STREAM,
Eric Laurentdb7c0792011-08-10 10:37:50 -070058 QUERY_DEFAULT_PRE_PROCESSING,
Jean-Michel Trivie336f912013-02-04 16:26:02 -080059 SET_EFFECT_ENABLED,
60 IS_STREAM_ACTIVE_REMOTELY
Eric Laurentc2f1f072009-07-17 12:17:14 -070061};
62
63class BpAudioPolicyService : public BpInterface<IAudioPolicyService>
64{
65public:
66 BpAudioPolicyService(const sp<IBinder>& impl)
67 : BpInterface<IAudioPolicyService>(impl)
68 {
69 }
70
71 virtual status_t setDeviceConnectionState(
Dima Zavinfce7a472011-04-19 22:30:36 -070072 audio_devices_t device,
73 audio_policy_dev_state_t state,
Eric Laurentc2f1f072009-07-17 12:17:14 -070074 const char *device_address)
75 {
76 Parcel data, reply;
77 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
78 data.writeInt32(static_cast <uint32_t>(device));
79 data.writeInt32(static_cast <uint32_t>(state));
80 data.writeCString(device_address);
81 remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply);
82 return static_cast <status_t> (reply.readInt32());
83 }
84
Dima Zavinfce7a472011-04-19 22:30:36 -070085 virtual audio_policy_dev_state_t getDeviceConnectionState(
86 audio_devices_t device,
Eric Laurentc2f1f072009-07-17 12:17:14 -070087 const char *device_address)
88 {
89 Parcel data, reply;
90 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
91 data.writeInt32(static_cast <uint32_t>(device));
92 data.writeCString(device_address);
93 remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply);
Dima Zavinfce7a472011-04-19 22:30:36 -070094 return static_cast <audio_policy_dev_state_t>(reply.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -070095 }
96
Glenn Kastenf78aee72012-01-04 11:00:47 -080097 virtual status_t setPhoneState(audio_mode_t state)
Eric Laurentc2f1f072009-07-17 12:17:14 -070098 {
99 Parcel data, reply;
100 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
101 data.writeInt32(state);
102 remote()->transact(SET_PHONE_STATE, data, &reply);
103 return static_cast <status_t> (reply.readInt32());
104 }
105
Dima Zavinfce7a472011-04-19 22:30:36 -0700106 virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700107 {
108 Parcel data, reply;
109 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
110 data.writeInt32(static_cast <uint32_t>(usage));
111 data.writeInt32(static_cast <uint32_t>(config));
112 remote()->transact(SET_FORCE_USE, data, &reply);
113 return static_cast <status_t> (reply.readInt32());
114 }
115
Dima Zavinfce7a472011-04-19 22:30:36 -0700116 virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700117 {
118 Parcel data, reply;
119 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
120 data.writeInt32(static_cast <uint32_t>(usage));
121 remote()->transact(GET_FORCE_USE, data, &reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700122 return static_cast <audio_policy_forced_cfg_t> (reply.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700123 }
124
125 virtual audio_io_handle_t getOutput(
Dima Zavinfce7a472011-04-19 22:30:36 -0700126 audio_stream_type_t stream,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700127 uint32_t samplingRate,
Glenn Kasten58f30212012-01-12 12:27:51 -0800128 audio_format_t format,
Glenn Kasten254af182012-07-03 14:59:05 -0700129 audio_channel_mask_t channelMask,
Eric Laurent0ca3cf92012-04-18 09:24:29 -0700130 audio_output_flags_t flags)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700131 {
132 Parcel data, reply;
133 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
134 data.writeInt32(static_cast <uint32_t>(stream));
135 data.writeInt32(samplingRate);
136 data.writeInt32(static_cast <uint32_t>(format));
Glenn Kasten254af182012-07-03 14:59:05 -0700137 data.writeInt32(channelMask);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700138 data.writeInt32(static_cast <uint32_t>(flags));
139 remote()->transact(GET_OUTPUT, data, &reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700140 return static_cast <audio_io_handle_t> (reply.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700141 }
142
Eric Laurentde070132010-07-13 04:45:46 -0700143 virtual status_t startOutput(audio_io_handle_t output,
Dima Zavinfce7a472011-04-19 22:30:36 -0700144 audio_stream_type_t stream,
Eric Laurentde070132010-07-13 04:45:46 -0700145 int session)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700146 {
147 Parcel data, reply;
148 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700149 data.writeInt32(output);
Glenn Kastenfff6d712012-01-12 16:38:12 -0800150 data.writeInt32((int32_t) stream);
Eric Laurentde070132010-07-13 04:45:46 -0700151 data.writeInt32(session);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700152 remote()->transact(START_OUTPUT, data, &reply);
153 return static_cast <status_t> (reply.readInt32());
154 }
155
Eric Laurentde070132010-07-13 04:45:46 -0700156 virtual status_t stopOutput(audio_io_handle_t output,
Dima Zavinfce7a472011-04-19 22:30:36 -0700157 audio_stream_type_t stream,
Eric Laurentde070132010-07-13 04:45:46 -0700158 int session)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700159 {
160 Parcel data, reply;
161 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700162 data.writeInt32(output);
Glenn Kastenfff6d712012-01-12 16:38:12 -0800163 data.writeInt32((int32_t) stream);
Eric Laurentde070132010-07-13 04:45:46 -0700164 data.writeInt32(session);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700165 remote()->transact(STOP_OUTPUT, data, &reply);
166 return static_cast <status_t> (reply.readInt32());
167 }
168
169 virtual void releaseOutput(audio_io_handle_t output)
170 {
171 Parcel data, reply;
172 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700173 data.writeInt32(output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700174 remote()->transact(RELEASE_OUTPUT, data, &reply);
175 }
176
177 virtual audio_io_handle_t getInput(
Glenn Kasteneba51fb2012-01-23 13:58:49 -0800178 audio_source_t inputSource,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700179 uint32_t samplingRate,
Glenn Kasten58f30212012-01-12 12:27:51 -0800180 audio_format_t format,
Glenn Kasten254af182012-07-03 14:59:05 -0700181 audio_channel_mask_t channelMask,
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700182 int audioSession)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700183 {
184 Parcel data, reply;
185 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Glenn Kasteneba51fb2012-01-23 13:58:49 -0800186 data.writeInt32((int32_t) inputSource);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700187 data.writeInt32(samplingRate);
188 data.writeInt32(static_cast <uint32_t>(format));
Glenn Kasten254af182012-07-03 14:59:05 -0700189 data.writeInt32(channelMask);
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700190 data.writeInt32(audioSession);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700191 remote()->transact(GET_INPUT, data, &reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700192 return static_cast <audio_io_handle_t> (reply.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700193 }
194
195 virtual status_t startInput(audio_io_handle_t input)
196 {
197 Parcel data, reply;
198 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700199 data.writeInt32(input);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700200 remote()->transact(START_INPUT, data, &reply);
201 return static_cast <status_t> (reply.readInt32());
202 }
203
204 virtual status_t stopInput(audio_io_handle_t input)
205 {
206 Parcel data, reply;
207 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700208 data.writeInt32(input);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700209 remote()->transact(STOP_INPUT, data, &reply);
210 return static_cast <status_t> (reply.readInt32());
211 }
212
213 virtual void releaseInput(audio_io_handle_t input)
214 {
215 Parcel data, reply;
216 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700217 data.writeInt32(input);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700218 remote()->transact(RELEASE_INPUT, data, &reply);
219 }
220
Dima Zavinfce7a472011-04-19 22:30:36 -0700221 virtual status_t initStreamVolume(audio_stream_type_t stream,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700222 int indexMin,
223 int indexMax)
224 {
225 Parcel data, reply;
226 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
227 data.writeInt32(static_cast <uint32_t>(stream));
228 data.writeInt32(indexMin);
229 data.writeInt32(indexMax);
230 remote()->transact(INIT_STREAM_VOLUME, data, &reply);
231 return static_cast <status_t> (reply.readInt32());
232 }
233
Eric Laurent83844cc2011-11-18 16:43:31 -0800234 virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
235 int index,
236 audio_devices_t device)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700237 {
238 Parcel data, reply;
239 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
240 data.writeInt32(static_cast <uint32_t>(stream));
241 data.writeInt32(index);
Eric Laurent83844cc2011-11-18 16:43:31 -0800242 data.writeInt32(static_cast <uint32_t>(device));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700243 remote()->transact(SET_STREAM_VOLUME, data, &reply);
244 return static_cast <status_t> (reply.readInt32());
245 }
246
Eric Laurent83844cc2011-11-18 16:43:31 -0800247 virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
248 int *index,
249 audio_devices_t device)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700250 {
251 Parcel data, reply;
252 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
253 data.writeInt32(static_cast <uint32_t>(stream));
Eric Laurent83844cc2011-11-18 16:43:31 -0800254 data.writeInt32(static_cast <uint32_t>(device));
255
Eric Laurentc2f1f072009-07-17 12:17:14 -0700256 remote()->transact(GET_STREAM_VOLUME, data, &reply);
257 int lIndex = reply.readInt32();
258 if (index) *index = lIndex;
259 return static_cast <status_t> (reply.readInt32());
260 }
Eric Laurentde070132010-07-13 04:45:46 -0700261
Dima Zavinfce7a472011-04-19 22:30:36 -0700262 virtual uint32_t getStrategyForStream(audio_stream_type_t stream)
Eric Laurentde070132010-07-13 04:45:46 -0700263 {
264 Parcel data, reply;
265 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
266 data.writeInt32(static_cast <uint32_t>(stream));
267 remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply);
268 return reply.readInt32();
269 }
270
Eric Laurent63742522012-03-08 13:42:42 -0800271 virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream)
Glenn Kasten6b2718c2011-02-04 13:54:26 -0800272 {
273 Parcel data, reply;
274 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
275 data.writeInt32(static_cast <uint32_t>(stream));
276 remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply);
Eric Laurent63742522012-03-08 13:42:42 -0800277 return (audio_devices_t) reply.readInt32();
Glenn Kasten6b2718c2011-02-04 13:54:26 -0800278 }
279
Glenn Kasten58e5aa32012-06-20 14:08:14 -0700280 virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc)
Eric Laurentde070132010-07-13 04:45:46 -0700281 {
282 Parcel data, reply;
283 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
284 data.write(desc, sizeof(effect_descriptor_t));
285 remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply);
286 return static_cast <audio_io_handle_t> (reply.readInt32());
287 }
288
Glenn Kasten58e5aa32012-06-20 14:08:14 -0700289 virtual status_t registerEffect(const effect_descriptor_t *desc,
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700290 audio_io_handle_t io,
Eric Laurentde070132010-07-13 04:45:46 -0700291 uint32_t strategy,
292 int session,
293 int id)
294 {
295 Parcel data, reply;
296 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
297 data.write(desc, sizeof(effect_descriptor_t));
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700298 data.writeInt32(io);
Eric Laurentde070132010-07-13 04:45:46 -0700299 data.writeInt32(strategy);
300 data.writeInt32(session);
301 data.writeInt32(id);
302 remote()->transact(REGISTER_EFFECT, data, &reply);
303 return static_cast <status_t> (reply.readInt32());
304 }
305
306 virtual status_t unregisterEffect(int id)
307 {
308 Parcel data, reply;
309 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
310 data.writeInt32(id);
311 remote()->transact(UNREGISTER_EFFECT, data, &reply);
312 return static_cast <status_t> (reply.readInt32());
313 }
314
Eric Laurentdb7c0792011-08-10 10:37:50 -0700315 virtual status_t setEffectEnabled(int id, bool enabled)
316 {
317 Parcel data, reply;
318 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
319 data.writeInt32(id);
320 data.writeInt32(enabled);
321 remote()->transact(SET_EFFECT_ENABLED, data, &reply);
322 return static_cast <status_t> (reply.readInt32());
323 }
324
Glenn Kastenfff6d712012-01-12 16:38:12 -0800325 virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
Eric Laurenteda6c362011-02-02 09:33:30 -0800326 {
327 Parcel data, reply;
328 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800329 data.writeInt32((int32_t) stream);
Eric Laurenteda6c362011-02-02 09:33:30 -0800330 data.writeInt32(inPastMs);
331 remote()->transact(IS_STREAM_ACTIVE, data, &reply);
332 return reply.readInt32();
333 }
Eric Laurent57dae992011-07-24 13:36:09 -0700334
Jean-Michel Trivie336f912013-02-04 16:26:02 -0800335 virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
336 {
337 Parcel data, reply;
338 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
339 data.writeInt32((int32_t) stream);
340 data.writeInt32(inPastMs);
341 remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply);
342 return reply.readInt32();
343 }
344
Jean-Michel Trivie3f641f2012-10-10 12:11:16 -0700345 virtual bool isSourceActive(audio_source_t source) const
346 {
347 Parcel data, reply;
348 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
349 data.writeInt32((int32_t) source);
350 remote()->transact(IS_SOURCE_ACTIVE, data, &reply);
351 return reply.readInt32();
352 }
353
Eric Laurent57dae992011-07-24 13:36:09 -0700354 virtual status_t queryDefaultPreProcessing(int audioSession,
355 effect_descriptor_t *descriptors,
356 uint32_t *count)
357 {
358 if (descriptors == NULL || count == NULL) {
359 return BAD_VALUE;
360 }
361 Parcel data, reply;
362 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
363 data.writeInt32(audioSession);
364 data.writeInt32(*count);
365 status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply);
366 if (status != NO_ERROR) {
367 return status;
368 }
369 status = static_cast <status_t> (reply.readInt32());
370 uint32_t retCount = reply.readInt32();
371 if (retCount != 0) {
372 uint32_t numDesc = (retCount < *count) ? retCount : *count;
373 reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc);
374 }
375 *count = retCount;
376 return status;
377 }
Eric Laurentc2f1f072009-07-17 12:17:14 -0700378};
379
380IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
381
382// ----------------------------------------------------------------------
383
384
385status_t BnAudioPolicyService::onTransact(
386 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
387{
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700388 switch (code) {
Eric Laurentc2f1f072009-07-17 12:17:14 -0700389 case SET_DEVICE_CONNECTION_STATE: {
390 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700391 audio_devices_t device =
392 static_cast <audio_devices_t>(data.readInt32());
393 audio_policy_dev_state_t state =
394 static_cast <audio_policy_dev_state_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700395 const char *device_address = data.readCString();
Eric Laurentde070132010-07-13 04:45:46 -0700396 reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device,
397 state,
398 device_address)));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700399 return NO_ERROR;
400 } break;
401
402 case GET_DEVICE_CONNECTION_STATE: {
403 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700404 audio_devices_t device =
405 static_cast<audio_devices_t> (data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700406 const char *device_address = data.readCString();
Eric Laurentde070132010-07-13 04:45:46 -0700407 reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device,
408 device_address)));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700409 return NO_ERROR;
410 } break;
411
412 case SET_PHONE_STATE: {
413 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kasten8af901c2012-11-01 11:11:38 -0700414 reply->writeInt32(static_cast <uint32_t>(setPhoneState(
415 (audio_mode_t) data.readInt32())));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700416 return NO_ERROR;
417 } break;
418
Eric Laurentc2f1f072009-07-17 12:17:14 -0700419 case SET_FORCE_USE: {
420 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kasten8af901c2012-11-01 11:11:38 -0700421 audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
422 data.readInt32());
Dima Zavinfce7a472011-04-19 22:30:36 -0700423 audio_policy_forced_cfg_t config =
424 static_cast <audio_policy_forced_cfg_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700425 reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config)));
426 return NO_ERROR;
427 } break;
428
429 case GET_FORCE_USE: {
430 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kasten8af901c2012-11-01 11:11:38 -0700431 audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
432 data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700433 reply->writeInt32(static_cast <uint32_t>(getForceUse(usage)));
434 return NO_ERROR;
435 } break;
436
437 case GET_OUTPUT: {
438 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700439 audio_stream_type_t stream =
440 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700441 uint32_t samplingRate = data.readInt32();
Glenn Kasten58f30212012-01-12 12:27:51 -0800442 audio_format_t format = (audio_format_t) data.readInt32();
Glenn Kasten254af182012-07-03 14:59:05 -0700443 audio_channel_mask_t channelMask = data.readInt32();
Eric Laurent0ca3cf92012-04-18 09:24:29 -0700444 audio_output_flags_t flags =
445 static_cast <audio_output_flags_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700446
447 audio_io_handle_t output = getOutput(stream,
448 samplingRate,
449 format,
Glenn Kasten254af182012-07-03 14:59:05 -0700450 channelMask,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700451 flags);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700452 reply->writeInt32(static_cast <int>(output));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700453 return NO_ERROR;
454 } break;
455
456 case START_OUTPUT: {
457 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700458 audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700459 uint32_t stream = data.readInt32();
Eric Laurentde070132010-07-13 04:45:46 -0700460 int session = data.readInt32();
461 reply->writeInt32(static_cast <uint32_t>(startOutput(output,
Dima Zavinfce7a472011-04-19 22:30:36 -0700462 (audio_stream_type_t)stream,
Eric Laurentde070132010-07-13 04:45:46 -0700463 session)));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700464 return NO_ERROR;
465 } break;
466
467 case STOP_OUTPUT: {
468 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700469 audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700470 uint32_t stream = data.readInt32();
Eric Laurentde070132010-07-13 04:45:46 -0700471 int session = data.readInt32();
472 reply->writeInt32(static_cast <uint32_t>(stopOutput(output,
Dima Zavinfce7a472011-04-19 22:30:36 -0700473 (audio_stream_type_t)stream,
Eric Laurentde070132010-07-13 04:45:46 -0700474 session)));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700475 return NO_ERROR;
476 } break;
477
478 case RELEASE_OUTPUT: {
479 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700480 audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700481 releaseOutput(output);
482 return NO_ERROR;
483 } break;
484
485 case GET_INPUT: {
486 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kasteneba51fb2012-01-23 13:58:49 -0800487 audio_source_t inputSource = (audio_source_t) data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700488 uint32_t samplingRate = data.readInt32();
Glenn Kasten58f30212012-01-12 12:27:51 -0800489 audio_format_t format = (audio_format_t) data.readInt32();
Glenn Kasten254af182012-07-03 14:59:05 -0700490 audio_channel_mask_t channelMask = data.readInt32();
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700491 int audioSession = data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700492 audio_io_handle_t input = getInput(inputSource,
493 samplingRate,
494 format,
Glenn Kasten254af182012-07-03 14:59:05 -0700495 channelMask,
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700496 audioSession);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700497 reply->writeInt32(static_cast <int>(input));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700498 return NO_ERROR;
499 } break;
500
501 case START_INPUT: {
502 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700503 audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700504 reply->writeInt32(static_cast <uint32_t>(startInput(input)));
505 return NO_ERROR;
506 } break;
507
508 case STOP_INPUT: {
509 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700510 audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700511 reply->writeInt32(static_cast <uint32_t>(stopInput(input)));
512 return NO_ERROR;
513 } break;
514
515 case RELEASE_INPUT: {
516 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700517 audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700518 releaseInput(input);
519 return NO_ERROR;
520 } break;
521
522 case INIT_STREAM_VOLUME: {
523 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700524 audio_stream_type_t stream =
525 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700526 int indexMin = data.readInt32();
527 int indexMax = data.readInt32();
528 reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax)));
529 return NO_ERROR;
530 } break;
531
532 case SET_STREAM_VOLUME: {
533 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700534 audio_stream_type_t stream =
535 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700536 int index = data.readInt32();
Eric Laurent83844cc2011-11-18 16:43:31 -0800537 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
538 reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream,
539 index,
540 device)));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700541 return NO_ERROR;
542 } break;
543
544 case GET_STREAM_VOLUME: {
545 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700546 audio_stream_type_t stream =
547 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurent83844cc2011-11-18 16:43:31 -0800548 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700549 int index;
Eric Laurent83844cc2011-11-18 16:43:31 -0800550 status_t status = getStreamVolumeIndex(stream, &index, device);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700551 reply->writeInt32(index);
552 reply->writeInt32(static_cast <uint32_t>(status));
553 return NO_ERROR;
554 } break;
555
Eric Laurentde070132010-07-13 04:45:46 -0700556 case GET_STRATEGY_FOR_STREAM: {
557 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700558 audio_stream_type_t stream =
559 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentde070132010-07-13 04:45:46 -0700560 reply->writeInt32(getStrategyForStream(stream));
561 return NO_ERROR;
562 } break;
563
Glenn Kasten6b2718c2011-02-04 13:54:26 -0800564 case GET_DEVICES_FOR_STREAM: {
565 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700566 audio_stream_type_t stream =
567 static_cast <audio_stream_type_t>(data.readInt32());
Glenn Kasten6b2718c2011-02-04 13:54:26 -0800568 reply->writeInt32(static_cast <int>(getDevicesForStream(stream)));
569 return NO_ERROR;
570 } break;
571
Eric Laurentde070132010-07-13 04:45:46 -0700572 case GET_OUTPUT_FOR_EFFECT: {
573 CHECK_INTERFACE(IAudioPolicyService, data, reply);
574 effect_descriptor_t desc;
575 data.read(&desc, sizeof(effect_descriptor_t));
576 audio_io_handle_t output = getOutputForEffect(&desc);
577 reply->writeInt32(static_cast <int>(output));
578 return NO_ERROR;
579 } break;
580
581 case REGISTER_EFFECT: {
582 CHECK_INTERFACE(IAudioPolicyService, data, reply);
583 effect_descriptor_t desc;
584 data.read(&desc, sizeof(effect_descriptor_t));
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700585 audio_io_handle_t io = data.readInt32();
Eric Laurentde070132010-07-13 04:45:46 -0700586 uint32_t strategy = data.readInt32();
587 int session = data.readInt32();
588 int id = data.readInt32();
589 reply->writeInt32(static_cast <int32_t>(registerEffect(&desc,
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700590 io,
Eric Laurentde070132010-07-13 04:45:46 -0700591 strategy,
592 session,
593 id)));
594 return NO_ERROR;
595 } break;
596
597 case UNREGISTER_EFFECT: {
598 CHECK_INTERFACE(IAudioPolicyService, data, reply);
599 int id = data.readInt32();
600 reply->writeInt32(static_cast <int32_t>(unregisterEffect(id)));
601 return NO_ERROR;
602 } break;
603
Eric Laurentdb7c0792011-08-10 10:37:50 -0700604 case SET_EFFECT_ENABLED: {
605 CHECK_INTERFACE(IAudioPolicyService, data, reply);
606 int id = data.readInt32();
607 bool enabled = static_cast <bool>(data.readInt32());
608 reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled)));
609 return NO_ERROR;
610 } break;
611
Eric Laurenteda6c362011-02-02 09:33:30 -0800612 case IS_STREAM_ACTIVE: {
613 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kastenfff6d712012-01-12 16:38:12 -0800614 audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
Eric Laurenteda6c362011-02-02 09:33:30 -0800615 uint32_t inPastMs = (uint32_t)data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -0800616 reply->writeInt32( isStreamActive((audio_stream_type_t) stream, inPastMs) );
Eric Laurenteda6c362011-02-02 09:33:30 -0800617 return NO_ERROR;
618 } break;
619
Jean-Michel Trivie336f912013-02-04 16:26:02 -0800620 case IS_STREAM_ACTIVE_REMOTELY: {
621 CHECK_INTERFACE(IAudioPolicyService, data, reply);
622 audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
623 uint32_t inPastMs = (uint32_t)data.readInt32();
624 reply->writeInt32( isStreamActiveRemotely((audio_stream_type_t) stream, inPastMs) );
625 return NO_ERROR;
626 } break;
627
Jean-Michel Trivie3f641f2012-10-10 12:11:16 -0700628 case IS_SOURCE_ACTIVE: {
629 CHECK_INTERFACE(IAudioPolicyService, data, reply);
630 audio_source_t source = (audio_source_t) data.readInt32();
631 reply->writeInt32( isSourceActive(source));
632 return NO_ERROR;
633 }
634
Eric Laurent57dae992011-07-24 13:36:09 -0700635 case QUERY_DEFAULT_PRE_PROCESSING: {
636 CHECK_INTERFACE(IAudioPolicyService, data, reply);
637 int audioSession = data.readInt32();
638 uint32_t count = data.readInt32();
Eric Laurente360f0f2014-11-05 12:15:36 -0800639 if (count > AudioEffect::kMaxPreProcessing) {
640 count = AudioEffect::kMaxPreProcessing;
641 }
Eric Laurent57dae992011-07-24 13:36:09 -0700642 uint32_t retCount = count;
Eric Laurente360f0f2014-11-05 12:15:36 -0800643 effect_descriptor_t *descriptors = new effect_descriptor_t[count];
Eric Laurent57dae992011-07-24 13:36:09 -0700644 status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount);
645 reply->writeInt32(status);
646 if (status != NO_ERROR && status != NO_MEMORY) {
647 retCount = 0;
648 }
649 reply->writeInt32(retCount);
Eric Laurente360f0f2014-11-05 12:15:36 -0800650 if (retCount != 0) {
Eric Laurent57dae992011-07-24 13:36:09 -0700651 if (retCount < count) {
652 count = retCount;
653 }
654 reply->write(descriptors, sizeof(effect_descriptor_t) * count);
655 }
656 delete[] descriptors;
657 return status;
658 }
659
Eric Laurentc2f1f072009-07-17 12:17:14 -0700660 default:
661 return BBinder::onTransact(code, data, reply, flags);
662 }
663}
664
665// ----------------------------------------------------------------------------
666
667}; // namespace android