blob: 57de58fb236c30df29551da571a548f216f35c87 [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
26#include <media/IAudioPolicyService.h>
27
Dima Zavin64760242011-05-11 14:15:23 -070028#include <system/audio.h>
Dima Zavinfce7a472011-04-19 22:30:36 -070029
Eric Laurentc2f1f072009-07-17 12:17:14 -070030namespace android {
31
32enum {
33 SET_DEVICE_CONNECTION_STATE = IBinder::FIRST_CALL_TRANSACTION,
34 GET_DEVICE_CONNECTION_STATE,
35 SET_PHONE_STATE,
Glenn Kasten0b07b802012-01-18 14:56:06 -080036 SET_RINGER_MODE, // reserved, no longer used
Eric Laurentc2f1f072009-07-17 12:17:14 -070037 SET_FORCE_USE,
38 GET_FORCE_USE,
39 GET_OUTPUT,
40 START_OUTPUT,
41 STOP_OUTPUT,
42 RELEASE_OUTPUT,
43 GET_INPUT,
44 START_INPUT,
45 STOP_INPUT,
46 RELEASE_INPUT,
47 INIT_STREAM_VOLUME,
48 SET_STREAM_VOLUME,
Eric Laurentde070132010-07-13 04:45:46 -070049 GET_STREAM_VOLUME,
50 GET_STRATEGY_FOR_STREAM,
51 GET_OUTPUT_FOR_EFFECT,
52 REGISTER_EFFECT,
Eric Laurenteda6c362011-02-02 09:33:30 -080053 UNREGISTER_EFFECT,
Glenn Kasten6b2718c2011-02-04 13:54:26 -080054 IS_STREAM_ACTIVE,
Jean-Michel Trivid7086032012-10-10 12:11:16 -070055 IS_SOURCE_ACTIVE,
Glenn Kasten6b2718c2011-02-04 13:54:26 -080056 GET_DEVICES_FOR_STREAM,
Eric Laurentdb7c0792011-08-10 10:37:50 -070057 QUERY_DEFAULT_PRE_PROCESSING,
Jean-Michel Trivi272ab542013-02-04 16:26:02 -080058 SET_EFFECT_ENABLED,
Richard Fitzgeraldad3af332013-03-25 16:54:37 +000059 IS_STREAM_ACTIVE_REMOTELY,
60 IS_OFFLOAD_SUPPORTED
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,
Richard Fitzgeraldad3af332013-03-25 16:54:37 +0000130 audio_output_flags_t flags,
131 const audio_offload_info_t *offloadInfo)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700132 {
133 Parcel data, reply;
134 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
135 data.writeInt32(static_cast <uint32_t>(stream));
136 data.writeInt32(samplingRate);
137 data.writeInt32(static_cast <uint32_t>(format));
Glenn Kasten254af182012-07-03 14:59:05 -0700138 data.writeInt32(channelMask);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700139 data.writeInt32(static_cast <uint32_t>(flags));
140 remote()->transact(GET_OUTPUT, data, &reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700141 return static_cast <audio_io_handle_t> (reply.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700142 }
143
Eric Laurentde070132010-07-13 04:45:46 -0700144 virtual status_t startOutput(audio_io_handle_t output,
Dima Zavinfce7a472011-04-19 22:30:36 -0700145 audio_stream_type_t stream,
Eric Laurentde070132010-07-13 04:45:46 -0700146 int session)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700147 {
148 Parcel data, reply;
149 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700150 data.writeInt32(output);
Glenn Kastenfff6d712012-01-12 16:38:12 -0800151 data.writeInt32((int32_t) stream);
Eric Laurentde070132010-07-13 04:45:46 -0700152 data.writeInt32(session);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700153 remote()->transact(START_OUTPUT, data, &reply);
154 return static_cast <status_t> (reply.readInt32());
155 }
156
Eric Laurentde070132010-07-13 04:45:46 -0700157 virtual status_t stopOutput(audio_io_handle_t output,
Dima Zavinfce7a472011-04-19 22:30:36 -0700158 audio_stream_type_t stream,
Eric Laurentde070132010-07-13 04:45:46 -0700159 int session)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700160 {
161 Parcel data, reply;
162 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700163 data.writeInt32(output);
Glenn Kastenfff6d712012-01-12 16:38:12 -0800164 data.writeInt32((int32_t) stream);
Eric Laurentde070132010-07-13 04:45:46 -0700165 data.writeInt32(session);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700166 remote()->transact(STOP_OUTPUT, data, &reply);
167 return static_cast <status_t> (reply.readInt32());
168 }
169
170 virtual void releaseOutput(audio_io_handle_t output)
171 {
172 Parcel data, reply;
173 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700174 data.writeInt32(output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700175 remote()->transact(RELEASE_OUTPUT, data, &reply);
176 }
177
178 virtual audio_io_handle_t getInput(
Glenn Kasteneba51fb2012-01-23 13:58:49 -0800179 audio_source_t inputSource,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700180 uint32_t samplingRate,
Glenn Kasten58f30212012-01-12 12:27:51 -0800181 audio_format_t format,
Glenn Kasten254af182012-07-03 14:59:05 -0700182 audio_channel_mask_t channelMask,
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700183 int audioSession)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700184 {
185 Parcel data, reply;
186 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Glenn Kasteneba51fb2012-01-23 13:58:49 -0800187 data.writeInt32((int32_t) inputSource);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700188 data.writeInt32(samplingRate);
189 data.writeInt32(static_cast <uint32_t>(format));
Glenn Kasten254af182012-07-03 14:59:05 -0700190 data.writeInt32(channelMask);
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700191 data.writeInt32(audioSession);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700192 remote()->transact(GET_INPUT, data, &reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700193 return static_cast <audio_io_handle_t> (reply.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700194 }
195
196 virtual status_t startInput(audio_io_handle_t input)
197 {
198 Parcel data, reply;
199 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700200 data.writeInt32(input);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700201 remote()->transact(START_INPUT, data, &reply);
202 return static_cast <status_t> (reply.readInt32());
203 }
204
205 virtual status_t stopInput(audio_io_handle_t input)
206 {
207 Parcel data, reply;
208 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700209 data.writeInt32(input);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700210 remote()->transact(STOP_INPUT, data, &reply);
211 return static_cast <status_t> (reply.readInt32());
212 }
213
214 virtual void releaseInput(audio_io_handle_t input)
215 {
216 Parcel data, reply;
217 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700218 data.writeInt32(input);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700219 remote()->transact(RELEASE_INPUT, data, &reply);
220 }
221
Dima Zavinfce7a472011-04-19 22:30:36 -0700222 virtual status_t initStreamVolume(audio_stream_type_t stream,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700223 int indexMin,
224 int indexMax)
225 {
226 Parcel data, reply;
227 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
228 data.writeInt32(static_cast <uint32_t>(stream));
229 data.writeInt32(indexMin);
230 data.writeInt32(indexMax);
231 remote()->transact(INIT_STREAM_VOLUME, data, &reply);
232 return static_cast <status_t> (reply.readInt32());
233 }
234
Eric Laurent83844cc2011-11-18 16:43:31 -0800235 virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
236 int index,
237 audio_devices_t device)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700238 {
239 Parcel data, reply;
240 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
241 data.writeInt32(static_cast <uint32_t>(stream));
242 data.writeInt32(index);
Eric Laurent83844cc2011-11-18 16:43:31 -0800243 data.writeInt32(static_cast <uint32_t>(device));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700244 remote()->transact(SET_STREAM_VOLUME, data, &reply);
245 return static_cast <status_t> (reply.readInt32());
246 }
247
Eric Laurent83844cc2011-11-18 16:43:31 -0800248 virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
249 int *index,
250 audio_devices_t device)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700251 {
252 Parcel data, reply;
253 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
254 data.writeInt32(static_cast <uint32_t>(stream));
Eric Laurent83844cc2011-11-18 16:43:31 -0800255 data.writeInt32(static_cast <uint32_t>(device));
256
Eric Laurentc2f1f072009-07-17 12:17:14 -0700257 remote()->transact(GET_STREAM_VOLUME, data, &reply);
258 int lIndex = reply.readInt32();
259 if (index) *index = lIndex;
260 return static_cast <status_t> (reply.readInt32());
261 }
Eric Laurentde070132010-07-13 04:45:46 -0700262
Dima Zavinfce7a472011-04-19 22:30:36 -0700263 virtual uint32_t getStrategyForStream(audio_stream_type_t stream)
Eric Laurentde070132010-07-13 04:45:46 -0700264 {
265 Parcel data, reply;
266 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
267 data.writeInt32(static_cast <uint32_t>(stream));
268 remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply);
269 return reply.readInt32();
270 }
271
Eric Laurent63742522012-03-08 13:42:42 -0800272 virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream)
Glenn Kasten6b2718c2011-02-04 13:54:26 -0800273 {
274 Parcel data, reply;
275 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
276 data.writeInt32(static_cast <uint32_t>(stream));
277 remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply);
Eric Laurent63742522012-03-08 13:42:42 -0800278 return (audio_devices_t) reply.readInt32();
Glenn Kasten6b2718c2011-02-04 13:54:26 -0800279 }
280
Glenn Kasten58e5aa32012-06-20 14:08:14 -0700281 virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc)
Eric Laurentde070132010-07-13 04:45:46 -0700282 {
283 Parcel data, reply;
284 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
285 data.write(desc, sizeof(effect_descriptor_t));
286 remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply);
287 return static_cast <audio_io_handle_t> (reply.readInt32());
288 }
289
Glenn Kasten58e5aa32012-06-20 14:08:14 -0700290 virtual status_t registerEffect(const effect_descriptor_t *desc,
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700291 audio_io_handle_t io,
Eric Laurentde070132010-07-13 04:45:46 -0700292 uint32_t strategy,
293 int session,
294 int id)
295 {
296 Parcel data, reply;
297 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
298 data.write(desc, sizeof(effect_descriptor_t));
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700299 data.writeInt32(io);
Eric Laurentde070132010-07-13 04:45:46 -0700300 data.writeInt32(strategy);
301 data.writeInt32(session);
302 data.writeInt32(id);
303 remote()->transact(REGISTER_EFFECT, data, &reply);
304 return static_cast <status_t> (reply.readInt32());
305 }
306
307 virtual status_t unregisterEffect(int id)
308 {
309 Parcel data, reply;
310 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
311 data.writeInt32(id);
312 remote()->transact(UNREGISTER_EFFECT, data, &reply);
313 return static_cast <status_t> (reply.readInt32());
314 }
315
Eric Laurentdb7c0792011-08-10 10:37:50 -0700316 virtual status_t setEffectEnabled(int id, bool enabled)
317 {
318 Parcel data, reply;
319 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
320 data.writeInt32(id);
321 data.writeInt32(enabled);
322 remote()->transact(SET_EFFECT_ENABLED, data, &reply);
323 return static_cast <status_t> (reply.readInt32());
324 }
325
Glenn Kastenfff6d712012-01-12 16:38:12 -0800326 virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
Eric Laurenteda6c362011-02-02 09:33:30 -0800327 {
328 Parcel data, reply;
329 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800330 data.writeInt32((int32_t) stream);
Eric Laurenteda6c362011-02-02 09:33:30 -0800331 data.writeInt32(inPastMs);
332 remote()->transact(IS_STREAM_ACTIVE, data, &reply);
333 return reply.readInt32();
334 }
Eric Laurent57dae992011-07-24 13:36:09 -0700335
Jean-Michel Trivi272ab542013-02-04 16:26:02 -0800336 virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
337 {
338 Parcel data, reply;
339 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
340 data.writeInt32((int32_t) stream);
341 data.writeInt32(inPastMs);
342 remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply);
343 return reply.readInt32();
344 }
345
Jean-Michel Trivid7086032012-10-10 12:11:16 -0700346 virtual bool isSourceActive(audio_source_t source) const
347 {
348 Parcel data, reply;
349 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
350 data.writeInt32((int32_t) source);
351 remote()->transact(IS_SOURCE_ACTIVE, data, &reply);
352 return reply.readInt32();
353 }
354
Eric Laurent57dae992011-07-24 13:36:09 -0700355 virtual status_t queryDefaultPreProcessing(int audioSession,
356 effect_descriptor_t *descriptors,
357 uint32_t *count)
358 {
359 if (descriptors == NULL || count == NULL) {
360 return BAD_VALUE;
361 }
362 Parcel data, reply;
363 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
364 data.writeInt32(audioSession);
365 data.writeInt32(*count);
366 status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply);
367 if (status != NO_ERROR) {
368 return status;
369 }
370 status = static_cast <status_t> (reply.readInt32());
371 uint32_t retCount = reply.readInt32();
372 if (retCount != 0) {
373 uint32_t numDesc = (retCount < *count) ? retCount : *count;
374 reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc);
375 }
376 *count = retCount;
377 return status;
378 }
Richard Fitzgeraldad3af332013-03-25 16:54:37 +0000379
380 virtual bool isOffloadSupported(const audio_offload_info_t& info)
381 {
382 // stub function
383 return false;
384 }
Eric Laurentc2f1f072009-07-17 12:17:14 -0700385};
386
387IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
388
389// ----------------------------------------------------------------------
390
391
392status_t BnAudioPolicyService::onTransact(
393 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
394{
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700395 switch (code) {
Eric Laurentc2f1f072009-07-17 12:17:14 -0700396 case SET_DEVICE_CONNECTION_STATE: {
397 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700398 audio_devices_t device =
399 static_cast <audio_devices_t>(data.readInt32());
400 audio_policy_dev_state_t state =
401 static_cast <audio_policy_dev_state_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700402 const char *device_address = data.readCString();
Eric Laurentde070132010-07-13 04:45:46 -0700403 reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device,
404 state,
405 device_address)));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700406 return NO_ERROR;
407 } break;
408
409 case GET_DEVICE_CONNECTION_STATE: {
410 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700411 audio_devices_t device =
412 static_cast<audio_devices_t> (data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700413 const char *device_address = data.readCString();
Eric Laurentde070132010-07-13 04:45:46 -0700414 reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device,
415 device_address)));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700416 return NO_ERROR;
417 } break;
418
419 case SET_PHONE_STATE: {
420 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kasten85ab62c2012-11-01 11:11:38 -0700421 reply->writeInt32(static_cast <uint32_t>(setPhoneState(
422 (audio_mode_t) data.readInt32())));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700423 return NO_ERROR;
424 } break;
425
Eric Laurentc2f1f072009-07-17 12:17:14 -0700426 case SET_FORCE_USE: {
427 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kasten85ab62c2012-11-01 11:11:38 -0700428 audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
429 data.readInt32());
Dima Zavinfce7a472011-04-19 22:30:36 -0700430 audio_policy_forced_cfg_t config =
431 static_cast <audio_policy_forced_cfg_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700432 reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config)));
433 return NO_ERROR;
434 } break;
435
436 case GET_FORCE_USE: {
437 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kasten85ab62c2012-11-01 11:11:38 -0700438 audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
439 data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700440 reply->writeInt32(static_cast <uint32_t>(getForceUse(usage)));
441 return NO_ERROR;
442 } break;
443
444 case GET_OUTPUT: {
445 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700446 audio_stream_type_t stream =
447 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700448 uint32_t samplingRate = data.readInt32();
Glenn Kasten58f30212012-01-12 12:27:51 -0800449 audio_format_t format = (audio_format_t) data.readInt32();
Glenn Kasten254af182012-07-03 14:59:05 -0700450 audio_channel_mask_t channelMask = data.readInt32();
Eric Laurent0ca3cf92012-04-18 09:24:29 -0700451 audio_output_flags_t flags =
452 static_cast <audio_output_flags_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700453
454 audio_io_handle_t output = getOutput(stream,
455 samplingRate,
456 format,
Glenn Kasten254af182012-07-03 14:59:05 -0700457 channelMask,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700458 flags);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700459 reply->writeInt32(static_cast <int>(output));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700460 return NO_ERROR;
461 } break;
462
463 case START_OUTPUT: {
464 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700465 audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700466 uint32_t stream = data.readInt32();
Eric Laurentde070132010-07-13 04:45:46 -0700467 int session = data.readInt32();
468 reply->writeInt32(static_cast <uint32_t>(startOutput(output,
Dima Zavinfce7a472011-04-19 22:30:36 -0700469 (audio_stream_type_t)stream,
Eric Laurentde070132010-07-13 04:45:46 -0700470 session)));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700471 return NO_ERROR;
472 } break;
473
474 case STOP_OUTPUT: {
475 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700476 audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700477 uint32_t stream = data.readInt32();
Eric Laurentde070132010-07-13 04:45:46 -0700478 int session = data.readInt32();
479 reply->writeInt32(static_cast <uint32_t>(stopOutput(output,
Dima Zavinfce7a472011-04-19 22:30:36 -0700480 (audio_stream_type_t)stream,
Eric Laurentde070132010-07-13 04:45:46 -0700481 session)));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700482 return NO_ERROR;
483 } break;
484
485 case RELEASE_OUTPUT: {
486 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700487 audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700488 releaseOutput(output);
489 return NO_ERROR;
490 } break;
491
492 case GET_INPUT: {
493 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kasteneba51fb2012-01-23 13:58:49 -0800494 audio_source_t inputSource = (audio_source_t) data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700495 uint32_t samplingRate = data.readInt32();
Glenn Kasten58f30212012-01-12 12:27:51 -0800496 audio_format_t format = (audio_format_t) data.readInt32();
Glenn Kasten254af182012-07-03 14:59:05 -0700497 audio_channel_mask_t channelMask = data.readInt32();
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700498 int audioSession = data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700499 audio_io_handle_t input = getInput(inputSource,
500 samplingRate,
501 format,
Glenn Kasten254af182012-07-03 14:59:05 -0700502 channelMask,
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700503 audioSession);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700504 reply->writeInt32(static_cast <int>(input));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700505 return NO_ERROR;
506 } break;
507
508 case START_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>(startInput(input)));
512 return NO_ERROR;
513 } break;
514
515 case STOP_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 reply->writeInt32(static_cast <uint32_t>(stopInput(input)));
519 return NO_ERROR;
520 } break;
521
522 case RELEASE_INPUT: {
523 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700524 audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700525 releaseInput(input);
526 return NO_ERROR;
527 } break;
528
529 case INIT_STREAM_VOLUME: {
530 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700531 audio_stream_type_t stream =
532 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700533 int indexMin = data.readInt32();
534 int indexMax = data.readInt32();
535 reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax)));
536 return NO_ERROR;
537 } break;
538
539 case SET_STREAM_VOLUME: {
540 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700541 audio_stream_type_t stream =
542 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700543 int index = data.readInt32();
Eric Laurent83844cc2011-11-18 16:43:31 -0800544 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
545 reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream,
546 index,
547 device)));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700548 return NO_ERROR;
549 } break;
550
551 case GET_STREAM_VOLUME: {
552 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700553 audio_stream_type_t stream =
554 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurent83844cc2011-11-18 16:43:31 -0800555 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700556 int index;
Eric Laurent83844cc2011-11-18 16:43:31 -0800557 status_t status = getStreamVolumeIndex(stream, &index, device);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700558 reply->writeInt32(index);
559 reply->writeInt32(static_cast <uint32_t>(status));
560 return NO_ERROR;
561 } break;
562
Eric Laurentde070132010-07-13 04:45:46 -0700563 case GET_STRATEGY_FOR_STREAM: {
564 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700565 audio_stream_type_t stream =
566 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentde070132010-07-13 04:45:46 -0700567 reply->writeInt32(getStrategyForStream(stream));
568 return NO_ERROR;
569 } break;
570
Glenn Kasten6b2718c2011-02-04 13:54:26 -0800571 case GET_DEVICES_FOR_STREAM: {
572 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700573 audio_stream_type_t stream =
574 static_cast <audio_stream_type_t>(data.readInt32());
Glenn Kasten6b2718c2011-02-04 13:54:26 -0800575 reply->writeInt32(static_cast <int>(getDevicesForStream(stream)));
576 return NO_ERROR;
577 } break;
578
Eric Laurentde070132010-07-13 04:45:46 -0700579 case GET_OUTPUT_FOR_EFFECT: {
580 CHECK_INTERFACE(IAudioPolicyService, data, reply);
581 effect_descriptor_t desc;
582 data.read(&desc, sizeof(effect_descriptor_t));
583 audio_io_handle_t output = getOutputForEffect(&desc);
584 reply->writeInt32(static_cast <int>(output));
585 return NO_ERROR;
586 } break;
587
588 case REGISTER_EFFECT: {
589 CHECK_INTERFACE(IAudioPolicyService, data, reply);
590 effect_descriptor_t desc;
591 data.read(&desc, sizeof(effect_descriptor_t));
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700592 audio_io_handle_t io = data.readInt32();
Eric Laurentde070132010-07-13 04:45:46 -0700593 uint32_t strategy = data.readInt32();
594 int session = data.readInt32();
595 int id = data.readInt32();
596 reply->writeInt32(static_cast <int32_t>(registerEffect(&desc,
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700597 io,
Eric Laurentde070132010-07-13 04:45:46 -0700598 strategy,
599 session,
600 id)));
601 return NO_ERROR;
602 } break;
603
604 case UNREGISTER_EFFECT: {
605 CHECK_INTERFACE(IAudioPolicyService, data, reply);
606 int id = data.readInt32();
607 reply->writeInt32(static_cast <int32_t>(unregisterEffect(id)));
608 return NO_ERROR;
609 } break;
610
Eric Laurentdb7c0792011-08-10 10:37:50 -0700611 case SET_EFFECT_ENABLED: {
612 CHECK_INTERFACE(IAudioPolicyService, data, reply);
613 int id = data.readInt32();
614 bool enabled = static_cast <bool>(data.readInt32());
615 reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled)));
616 return NO_ERROR;
617 } break;
618
Eric Laurenteda6c362011-02-02 09:33:30 -0800619 case IS_STREAM_ACTIVE: {
620 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kastenfff6d712012-01-12 16:38:12 -0800621 audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
Eric Laurenteda6c362011-02-02 09:33:30 -0800622 uint32_t inPastMs = (uint32_t)data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -0800623 reply->writeInt32( isStreamActive((audio_stream_type_t) stream, inPastMs) );
Eric Laurenteda6c362011-02-02 09:33:30 -0800624 return NO_ERROR;
625 } break;
626
Jean-Michel Trivi272ab542013-02-04 16:26:02 -0800627 case IS_STREAM_ACTIVE_REMOTELY: {
628 CHECK_INTERFACE(IAudioPolicyService, data, reply);
629 audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
630 uint32_t inPastMs = (uint32_t)data.readInt32();
631 reply->writeInt32( isStreamActiveRemotely((audio_stream_type_t) stream, inPastMs) );
632 return NO_ERROR;
633 } break;
634
Jean-Michel Trivid7086032012-10-10 12:11:16 -0700635 case IS_SOURCE_ACTIVE: {
636 CHECK_INTERFACE(IAudioPolicyService, data, reply);
637 audio_source_t source = (audio_source_t) data.readInt32();
638 reply->writeInt32( isSourceActive(source));
639 return NO_ERROR;
640 }
641
Eric Laurent57dae992011-07-24 13:36:09 -0700642 case QUERY_DEFAULT_PRE_PROCESSING: {
643 CHECK_INTERFACE(IAudioPolicyService, data, reply);
644 int audioSession = data.readInt32();
645 uint32_t count = data.readInt32();
646 uint32_t retCount = count;
647 effect_descriptor_t *descriptors =
648 (effect_descriptor_t *)new char[count * sizeof(effect_descriptor_t)];
649 status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount);
650 reply->writeInt32(status);
651 if (status != NO_ERROR && status != NO_MEMORY) {
652 retCount = 0;
653 }
654 reply->writeInt32(retCount);
655 if (retCount) {
656 if (retCount < count) {
657 count = retCount;
658 }
659 reply->write(descriptors, sizeof(effect_descriptor_t) * count);
660 }
661 delete[] descriptors;
662 return status;
663 }
664
Eric Laurentc2f1f072009-07-17 12:17:14 -0700665 default:
666 return BBinder::onTransact(code, data, reply, flags);
667 }
668}
669
670// ----------------------------------------------------------------------------
671
672}; // namespace android