blob: 77d131bb1a03427021d5262e580281aba58fd37b [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,
Eric Laurent203b1a12014-04-01 10:34:16 -070060 IS_OFFLOAD_SUPPORTED,
61 LIST_AUDIO_PORTS,
62 GET_AUDIO_PORT,
63 CREATE_AUDIO_PATCH,
64 RELEASE_AUDIO_PATCH,
65 LIST_AUDIO_PATCHES,
Eric Laurentb52c1522014-05-20 11:27:36 -070066 SET_AUDIO_PORT_CONFIG,
67 REGISTER_CLIENT
Eric Laurentc2f1f072009-07-17 12:17:14 -070068};
69
70class BpAudioPolicyService : public BpInterface<IAudioPolicyService>
71{
72public:
73 BpAudioPolicyService(const sp<IBinder>& impl)
74 : BpInterface<IAudioPolicyService>(impl)
75 {
76 }
77
78 virtual status_t setDeviceConnectionState(
Dima Zavinfce7a472011-04-19 22:30:36 -070079 audio_devices_t device,
80 audio_policy_dev_state_t state,
Eric Laurentc2f1f072009-07-17 12:17:14 -070081 const char *device_address)
82 {
83 Parcel data, reply;
84 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
85 data.writeInt32(static_cast <uint32_t>(device));
86 data.writeInt32(static_cast <uint32_t>(state));
87 data.writeCString(device_address);
88 remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply);
89 return static_cast <status_t> (reply.readInt32());
90 }
91
Dima Zavinfce7a472011-04-19 22:30:36 -070092 virtual audio_policy_dev_state_t getDeviceConnectionState(
93 audio_devices_t device,
Eric Laurentc2f1f072009-07-17 12:17:14 -070094 const char *device_address)
95 {
96 Parcel data, reply;
97 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
98 data.writeInt32(static_cast <uint32_t>(device));
99 data.writeCString(device_address);
100 remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700101 return static_cast <audio_policy_dev_state_t>(reply.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700102 }
103
Glenn Kastenf78aee72012-01-04 11:00:47 -0800104 virtual status_t setPhoneState(audio_mode_t state)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700105 {
106 Parcel data, reply;
107 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
108 data.writeInt32(state);
109 remote()->transact(SET_PHONE_STATE, data, &reply);
110 return static_cast <status_t> (reply.readInt32());
111 }
112
Dima Zavinfce7a472011-04-19 22:30:36 -0700113 virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700114 {
115 Parcel data, reply;
116 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
117 data.writeInt32(static_cast <uint32_t>(usage));
118 data.writeInt32(static_cast <uint32_t>(config));
119 remote()->transact(SET_FORCE_USE, data, &reply);
120 return static_cast <status_t> (reply.readInt32());
121 }
122
Dima Zavinfce7a472011-04-19 22:30:36 -0700123 virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700124 {
125 Parcel data, reply;
126 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
127 data.writeInt32(static_cast <uint32_t>(usage));
128 remote()->transact(GET_FORCE_USE, data, &reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700129 return static_cast <audio_policy_forced_cfg_t> (reply.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700130 }
131
132 virtual audio_io_handle_t getOutput(
Dima Zavinfce7a472011-04-19 22:30:36 -0700133 audio_stream_type_t stream,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700134 uint32_t samplingRate,
Glenn Kasten58f30212012-01-12 12:27:51 -0800135 audio_format_t format,
Glenn Kasten254af182012-07-03 14:59:05 -0700136 audio_channel_mask_t channelMask,
Richard Fitzgeraldad3af332013-03-25 16:54:37 +0000137 audio_output_flags_t flags,
138 const audio_offload_info_t *offloadInfo)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700139 {
140 Parcel data, reply;
141 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
142 data.writeInt32(static_cast <uint32_t>(stream));
143 data.writeInt32(samplingRate);
144 data.writeInt32(static_cast <uint32_t>(format));
Glenn Kasten254af182012-07-03 14:59:05 -0700145 data.writeInt32(channelMask);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700146 data.writeInt32(static_cast <uint32_t>(flags));
Glenn Kasten2301acc2014-01-17 10:21:00 -0800147 // hasOffloadInfo
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +0100148 if (offloadInfo == NULL) {
149 data.writeInt32(0);
150 } else {
151 data.writeInt32(1);
152 data.write(offloadInfo, sizeof(audio_offload_info_t));
153 }
Eric Laurentc2f1f072009-07-17 12:17:14 -0700154 remote()->transact(GET_OUTPUT, data, &reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700155 return static_cast <audio_io_handle_t> (reply.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700156 }
157
Eric Laurentde070132010-07-13 04:45:46 -0700158 virtual status_t startOutput(audio_io_handle_t output,
Dima Zavinfce7a472011-04-19 22:30:36 -0700159 audio_stream_type_t stream,
Eric Laurentde070132010-07-13 04:45:46 -0700160 int session)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700161 {
162 Parcel data, reply;
163 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700164 data.writeInt32(output);
Glenn Kastenfff6d712012-01-12 16:38:12 -0800165 data.writeInt32((int32_t) stream);
Eric Laurentde070132010-07-13 04:45:46 -0700166 data.writeInt32(session);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700167 remote()->transact(START_OUTPUT, data, &reply);
168 return static_cast <status_t> (reply.readInt32());
169 }
170
Eric Laurentde070132010-07-13 04:45:46 -0700171 virtual status_t stopOutput(audio_io_handle_t output,
Dima Zavinfce7a472011-04-19 22:30:36 -0700172 audio_stream_type_t stream,
Eric Laurentde070132010-07-13 04:45:46 -0700173 int session)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700174 {
175 Parcel data, reply;
176 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700177 data.writeInt32(output);
Glenn Kastenfff6d712012-01-12 16:38:12 -0800178 data.writeInt32((int32_t) stream);
Eric Laurentde070132010-07-13 04:45:46 -0700179 data.writeInt32(session);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700180 remote()->transact(STOP_OUTPUT, data, &reply);
181 return static_cast <status_t> (reply.readInt32());
182 }
183
184 virtual void releaseOutput(audio_io_handle_t output)
185 {
186 Parcel data, reply;
187 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700188 data.writeInt32(output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700189 remote()->transact(RELEASE_OUTPUT, data, &reply);
190 }
191
192 virtual audio_io_handle_t getInput(
Glenn Kasteneba51fb2012-01-23 13:58:49 -0800193 audio_source_t inputSource,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700194 uint32_t samplingRate,
Glenn Kasten58f30212012-01-12 12:27:51 -0800195 audio_format_t format,
Glenn Kasten254af182012-07-03 14:59:05 -0700196 audio_channel_mask_t channelMask,
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700197 int audioSession)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700198 {
199 Parcel data, reply;
200 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Glenn Kasteneba51fb2012-01-23 13:58:49 -0800201 data.writeInt32((int32_t) inputSource);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700202 data.writeInt32(samplingRate);
203 data.writeInt32(static_cast <uint32_t>(format));
Glenn Kasten254af182012-07-03 14:59:05 -0700204 data.writeInt32(channelMask);
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700205 data.writeInt32(audioSession);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700206 remote()->transact(GET_INPUT, data, &reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700207 return static_cast <audio_io_handle_t> (reply.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700208 }
209
210 virtual status_t startInput(audio_io_handle_t input)
211 {
212 Parcel data, reply;
213 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700214 data.writeInt32(input);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700215 remote()->transact(START_INPUT, data, &reply);
216 return static_cast <status_t> (reply.readInt32());
217 }
218
219 virtual status_t stopInput(audio_io_handle_t input)
220 {
221 Parcel data, reply;
222 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700223 data.writeInt32(input);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700224 remote()->transact(STOP_INPUT, data, &reply);
225 return static_cast <status_t> (reply.readInt32());
226 }
227
228 virtual void releaseInput(audio_io_handle_t input)
229 {
230 Parcel data, reply;
231 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700232 data.writeInt32(input);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700233 remote()->transact(RELEASE_INPUT, data, &reply);
234 }
235
Dima Zavinfce7a472011-04-19 22:30:36 -0700236 virtual status_t initStreamVolume(audio_stream_type_t stream,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700237 int indexMin,
238 int indexMax)
239 {
240 Parcel data, reply;
241 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
242 data.writeInt32(static_cast <uint32_t>(stream));
243 data.writeInt32(indexMin);
244 data.writeInt32(indexMax);
245 remote()->transact(INIT_STREAM_VOLUME, data, &reply);
246 return static_cast <status_t> (reply.readInt32());
247 }
248
Eric Laurent83844cc2011-11-18 16:43:31 -0800249 virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
250 int index,
251 audio_devices_t device)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700252 {
253 Parcel data, reply;
254 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
255 data.writeInt32(static_cast <uint32_t>(stream));
256 data.writeInt32(index);
Eric Laurent83844cc2011-11-18 16:43:31 -0800257 data.writeInt32(static_cast <uint32_t>(device));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700258 remote()->transact(SET_STREAM_VOLUME, data, &reply);
259 return static_cast <status_t> (reply.readInt32());
260 }
261
Eric Laurent83844cc2011-11-18 16:43:31 -0800262 virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
263 int *index,
264 audio_devices_t device)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700265 {
266 Parcel data, reply;
267 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
268 data.writeInt32(static_cast <uint32_t>(stream));
Eric Laurent83844cc2011-11-18 16:43:31 -0800269 data.writeInt32(static_cast <uint32_t>(device));
270
Eric Laurentc2f1f072009-07-17 12:17:14 -0700271 remote()->transact(GET_STREAM_VOLUME, data, &reply);
272 int lIndex = reply.readInt32();
273 if (index) *index = lIndex;
274 return static_cast <status_t> (reply.readInt32());
275 }
Eric Laurentde070132010-07-13 04:45:46 -0700276
Dima Zavinfce7a472011-04-19 22:30:36 -0700277 virtual uint32_t getStrategyForStream(audio_stream_type_t stream)
Eric Laurentde070132010-07-13 04:45:46 -0700278 {
279 Parcel data, reply;
280 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
281 data.writeInt32(static_cast <uint32_t>(stream));
282 remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply);
283 return reply.readInt32();
284 }
285
Eric Laurent63742522012-03-08 13:42:42 -0800286 virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream)
Glenn Kasten6b2718c2011-02-04 13:54:26 -0800287 {
288 Parcel data, reply;
289 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
290 data.writeInt32(static_cast <uint32_t>(stream));
291 remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply);
Eric Laurent63742522012-03-08 13:42:42 -0800292 return (audio_devices_t) reply.readInt32();
Glenn Kasten6b2718c2011-02-04 13:54:26 -0800293 }
294
Glenn Kasten58e5aa32012-06-20 14:08:14 -0700295 virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc)
Eric Laurentde070132010-07-13 04:45:46 -0700296 {
297 Parcel data, reply;
298 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
299 data.write(desc, sizeof(effect_descriptor_t));
300 remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply);
301 return static_cast <audio_io_handle_t> (reply.readInt32());
302 }
303
Glenn Kasten58e5aa32012-06-20 14:08:14 -0700304 virtual status_t registerEffect(const effect_descriptor_t *desc,
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700305 audio_io_handle_t io,
Eric Laurentde070132010-07-13 04:45:46 -0700306 uint32_t strategy,
307 int session,
308 int id)
309 {
310 Parcel data, reply;
311 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
312 data.write(desc, sizeof(effect_descriptor_t));
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700313 data.writeInt32(io);
Eric Laurentde070132010-07-13 04:45:46 -0700314 data.writeInt32(strategy);
315 data.writeInt32(session);
316 data.writeInt32(id);
317 remote()->transact(REGISTER_EFFECT, data, &reply);
318 return static_cast <status_t> (reply.readInt32());
319 }
320
321 virtual status_t unregisterEffect(int id)
322 {
323 Parcel data, reply;
324 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
325 data.writeInt32(id);
326 remote()->transact(UNREGISTER_EFFECT, data, &reply);
327 return static_cast <status_t> (reply.readInt32());
328 }
329
Eric Laurentdb7c0792011-08-10 10:37:50 -0700330 virtual status_t setEffectEnabled(int id, bool enabled)
331 {
332 Parcel data, reply;
333 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
334 data.writeInt32(id);
335 data.writeInt32(enabled);
336 remote()->transact(SET_EFFECT_ENABLED, data, &reply);
337 return static_cast <status_t> (reply.readInt32());
338 }
339
Glenn Kastenfff6d712012-01-12 16:38:12 -0800340 virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
Eric Laurenteda6c362011-02-02 09:33:30 -0800341 {
342 Parcel data, reply;
343 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800344 data.writeInt32((int32_t) stream);
Eric Laurenteda6c362011-02-02 09:33:30 -0800345 data.writeInt32(inPastMs);
346 remote()->transact(IS_STREAM_ACTIVE, data, &reply);
347 return reply.readInt32();
348 }
Eric Laurent57dae992011-07-24 13:36:09 -0700349
Jean-Michel Trivi272ab542013-02-04 16:26:02 -0800350 virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
351 {
352 Parcel data, reply;
353 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
354 data.writeInt32((int32_t) stream);
355 data.writeInt32(inPastMs);
356 remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply);
357 return reply.readInt32();
358 }
359
Jean-Michel Trivid7086032012-10-10 12:11:16 -0700360 virtual bool isSourceActive(audio_source_t source) const
361 {
362 Parcel data, reply;
363 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
364 data.writeInt32((int32_t) source);
365 remote()->transact(IS_SOURCE_ACTIVE, data, &reply);
366 return reply.readInt32();
367 }
368
Eric Laurent57dae992011-07-24 13:36:09 -0700369 virtual status_t queryDefaultPreProcessing(int audioSession,
370 effect_descriptor_t *descriptors,
371 uint32_t *count)
372 {
373 if (descriptors == NULL || count == NULL) {
374 return BAD_VALUE;
375 }
376 Parcel data, reply;
377 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
378 data.writeInt32(audioSession);
379 data.writeInt32(*count);
380 status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply);
381 if (status != NO_ERROR) {
382 return status;
383 }
384 status = static_cast <status_t> (reply.readInt32());
385 uint32_t retCount = reply.readInt32();
386 if (retCount != 0) {
387 uint32_t numDesc = (retCount < *count) ? retCount : *count;
388 reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc);
389 }
390 *count = retCount;
391 return status;
392 }
Richard Fitzgeraldad3af332013-03-25 16:54:37 +0000393
394 virtual bool isOffloadSupported(const audio_offload_info_t& info)
395 {
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +0100396 Parcel data, reply;
397 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
398 data.write(&info, sizeof(audio_offload_info_t));
399 remote()->transact(IS_OFFLOAD_SUPPORTED, data, &reply);
Eric Laurent203b1a12014-04-01 10:34:16 -0700400 return reply.readInt32();
401 }
402
403 virtual status_t listAudioPorts(audio_port_role_t role,
404 audio_port_type_t type,
405 unsigned int *num_ports,
406 struct audio_port *ports,
407 unsigned int *generation)
408 {
409 if (num_ports == NULL || (*num_ports != 0 && ports == NULL) ||
410 generation == NULL) {
411 return BAD_VALUE;
412 }
413 Parcel data, reply;
414 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
415 unsigned int numPortsReq = (ports == NULL) ? 0 : *num_ports;
416 data.writeInt32(role);
417 data.writeInt32(type);
418 data.writeInt32(numPortsReq);
419 status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply);
420 if (status == NO_ERROR) {
421 status = (status_t)reply.readInt32();
422 *num_ports = (unsigned int)reply.readInt32();
423 }
Eric Laurent203b1a12014-04-01 10:34:16 -0700424 if (status == NO_ERROR) {
425 if (numPortsReq > *num_ports) {
426 numPortsReq = *num_ports;
427 }
428 if (numPortsReq > 0) {
429 reply.read(ports, numPortsReq * sizeof(struct audio_port));
430 }
431 *generation = reply.readInt32();
432 }
433 return status;
434 }
435
436 virtual status_t getAudioPort(struct audio_port *port)
437 {
438 if (port == NULL) {
439 return BAD_VALUE;
440 }
441 Parcel data, reply;
442 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
443 data.write(port, sizeof(struct audio_port));
444 status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply);
445 if (status != NO_ERROR ||
446 (status = (status_t)reply.readInt32()) != NO_ERROR) {
447 return status;
448 }
449 reply.read(port, sizeof(struct audio_port));
450 return status;
451 }
452
453 virtual status_t createAudioPatch(const struct audio_patch *patch,
454 audio_patch_handle_t *handle)
455 {
456 if (patch == NULL || handle == NULL) {
457 return BAD_VALUE;
458 }
459 Parcel data, reply;
460 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
461 data.write(patch, sizeof(struct audio_patch));
462 data.write(handle, sizeof(audio_patch_handle_t));
463 status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply);
464 if (status != NO_ERROR ||
465 (status = (status_t)reply.readInt32()) != NO_ERROR) {
466 return status;
467 }
468 reply.read(handle, sizeof(audio_patch_handle_t));
469 return status;
470 }
471
472 virtual status_t releaseAudioPatch(audio_patch_handle_t handle)
473 {
474 Parcel data, reply;
475 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
476 data.write(&handle, sizeof(audio_patch_handle_t));
477 status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply);
478 if (status != NO_ERROR) {
479 status = (status_t)reply.readInt32();
480 }
481 return status;
482 }
483
484 virtual status_t listAudioPatches(unsigned int *num_patches,
485 struct audio_patch *patches,
486 unsigned int *generation)
487 {
488 if (num_patches == NULL || (*num_patches != 0 && patches == NULL) ||
489 generation == NULL) {
490 return BAD_VALUE;
491 }
492 Parcel data, reply;
493 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
494 unsigned int numPatchesReq = (patches == NULL) ? 0 : *num_patches;
495 data.writeInt32(numPatchesReq);
496 status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply);
497 if (status == NO_ERROR) {
498 status = (status_t)reply.readInt32();
499 *num_patches = (unsigned int)reply.readInt32();
500 }
501 if (status == NO_ERROR) {
502 if (numPatchesReq > *num_patches) {
503 numPatchesReq = *num_patches;
504 }
505 if (numPatchesReq > 0) {
506 reply.read(patches, numPatchesReq * sizeof(struct audio_patch));
507 }
508 *generation = reply.readInt32();
509 }
510 return status;
511 }
512
513 virtual status_t setAudioPortConfig(const struct audio_port_config *config)
514 {
515 if (config == NULL) {
516 return BAD_VALUE;
517 }
518 Parcel data, reply;
519 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
520 data.write(config, sizeof(struct audio_port_config));
521 status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply);
522 if (status != NO_ERROR) {
523 status = (status_t)reply.readInt32();
524 }
525 return status;
526 }
Eric Laurentb52c1522014-05-20 11:27:36 -0700527 virtual void registerClient(const sp<IAudioPolicyServiceClient>& client)
528 {
529 Parcel data, reply;
530 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
531 data.writeStrongBinder(client->asBinder());
532 remote()->transact(REGISTER_CLIENT, data, &reply);
533 }
Eric Laurentc2f1f072009-07-17 12:17:14 -0700534};
535
536IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
537
538// ----------------------------------------------------------------------
539
540
541status_t BnAudioPolicyService::onTransact(
542 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
543{
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700544 switch (code) {
Eric Laurentc2f1f072009-07-17 12:17:14 -0700545 case SET_DEVICE_CONNECTION_STATE: {
546 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700547 audio_devices_t device =
548 static_cast <audio_devices_t>(data.readInt32());
549 audio_policy_dev_state_t state =
550 static_cast <audio_policy_dev_state_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700551 const char *device_address = data.readCString();
Eric Laurentde070132010-07-13 04:45:46 -0700552 reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device,
553 state,
554 device_address)));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700555 return NO_ERROR;
556 } break;
557
558 case GET_DEVICE_CONNECTION_STATE: {
559 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700560 audio_devices_t device =
561 static_cast<audio_devices_t> (data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700562 const char *device_address = data.readCString();
Eric Laurentde070132010-07-13 04:45:46 -0700563 reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device,
564 device_address)));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700565 return NO_ERROR;
566 } break;
567
568 case SET_PHONE_STATE: {
569 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kasten85ab62c2012-11-01 11:11:38 -0700570 reply->writeInt32(static_cast <uint32_t>(setPhoneState(
571 (audio_mode_t) data.readInt32())));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700572 return NO_ERROR;
573 } break;
574
Eric Laurentc2f1f072009-07-17 12:17:14 -0700575 case SET_FORCE_USE: {
576 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kasten85ab62c2012-11-01 11:11:38 -0700577 audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
578 data.readInt32());
Dima Zavinfce7a472011-04-19 22:30:36 -0700579 audio_policy_forced_cfg_t config =
580 static_cast <audio_policy_forced_cfg_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700581 reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config)));
582 return NO_ERROR;
583 } break;
584
585 case GET_FORCE_USE: {
586 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kasten85ab62c2012-11-01 11:11:38 -0700587 audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
588 data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700589 reply->writeInt32(static_cast <uint32_t>(getForceUse(usage)));
590 return NO_ERROR;
591 } break;
592
593 case GET_OUTPUT: {
594 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700595 audio_stream_type_t stream =
596 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700597 uint32_t samplingRate = data.readInt32();
Glenn Kasten58f30212012-01-12 12:27:51 -0800598 audio_format_t format = (audio_format_t) data.readInt32();
Glenn Kasten254af182012-07-03 14:59:05 -0700599 audio_channel_mask_t channelMask = data.readInt32();
Eric Laurent0ca3cf92012-04-18 09:24:29 -0700600 audio_output_flags_t flags =
601 static_cast <audio_output_flags_t>(data.readInt32());
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +0100602 bool hasOffloadInfo = data.readInt32() != 0;
603 audio_offload_info_t offloadInfo;
604 if (hasOffloadInfo) {
605 data.read(&offloadInfo, sizeof(audio_offload_info_t));
606 }
Eric Laurentc2f1f072009-07-17 12:17:14 -0700607 audio_io_handle_t output = getOutput(stream,
608 samplingRate,
609 format,
Glenn Kasten254af182012-07-03 14:59:05 -0700610 channelMask,
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +0100611 flags,
612 hasOffloadInfo ? &offloadInfo : NULL);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700613 reply->writeInt32(static_cast <int>(output));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700614 return NO_ERROR;
615 } break;
616
617 case START_OUTPUT: {
618 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700619 audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
Eric Laurentebcb2542014-03-05 18:30:08 -0800620 audio_stream_type_t stream =
621 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentde070132010-07-13 04:45:46 -0700622 int session = data.readInt32();
623 reply->writeInt32(static_cast <uint32_t>(startOutput(output,
Eric Laurentebcb2542014-03-05 18:30:08 -0800624 stream,
Eric Laurentde070132010-07-13 04:45:46 -0700625 session)));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700626 return NO_ERROR;
627 } break;
628
629 case STOP_OUTPUT: {
630 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700631 audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
Eric Laurentebcb2542014-03-05 18:30:08 -0800632 audio_stream_type_t stream =
633 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentde070132010-07-13 04:45:46 -0700634 int session = data.readInt32();
635 reply->writeInt32(static_cast <uint32_t>(stopOutput(output,
Eric Laurentebcb2542014-03-05 18:30:08 -0800636 stream,
Eric Laurentde070132010-07-13 04:45:46 -0700637 session)));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700638 return NO_ERROR;
639 } break;
640
641 case RELEASE_OUTPUT: {
642 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700643 audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700644 releaseOutput(output);
645 return NO_ERROR;
646 } break;
647
648 case GET_INPUT: {
649 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kasteneba51fb2012-01-23 13:58:49 -0800650 audio_source_t inputSource = (audio_source_t) data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700651 uint32_t samplingRate = data.readInt32();
Glenn Kasten58f30212012-01-12 12:27:51 -0800652 audio_format_t format = (audio_format_t) data.readInt32();
Glenn Kasten254af182012-07-03 14:59:05 -0700653 audio_channel_mask_t channelMask = data.readInt32();
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700654 int audioSession = data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700655 audio_io_handle_t input = getInput(inputSource,
656 samplingRate,
657 format,
Glenn Kasten254af182012-07-03 14:59:05 -0700658 channelMask,
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700659 audioSession);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700660 reply->writeInt32(static_cast <int>(input));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700661 return NO_ERROR;
662 } break;
663
664 case START_INPUT: {
665 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700666 audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700667 reply->writeInt32(static_cast <uint32_t>(startInput(input)));
668 return NO_ERROR;
669 } break;
670
671 case STOP_INPUT: {
672 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700673 audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700674 reply->writeInt32(static_cast <uint32_t>(stopInput(input)));
675 return NO_ERROR;
676 } break;
677
678 case RELEASE_INPUT: {
679 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700680 audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700681 releaseInput(input);
682 return NO_ERROR;
683 } break;
684
685 case INIT_STREAM_VOLUME: {
686 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700687 audio_stream_type_t stream =
688 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700689 int indexMin = data.readInt32();
690 int indexMax = data.readInt32();
691 reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax)));
692 return NO_ERROR;
693 } break;
694
695 case SET_STREAM_VOLUME: {
696 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700697 audio_stream_type_t stream =
698 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700699 int index = data.readInt32();
Eric Laurent83844cc2011-11-18 16:43:31 -0800700 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
701 reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream,
702 index,
703 device)));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700704 return NO_ERROR;
705 } break;
706
707 case GET_STREAM_VOLUME: {
708 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700709 audio_stream_type_t stream =
710 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurent83844cc2011-11-18 16:43:31 -0800711 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700712 int index;
Eric Laurent83844cc2011-11-18 16:43:31 -0800713 status_t status = getStreamVolumeIndex(stream, &index, device);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700714 reply->writeInt32(index);
715 reply->writeInt32(static_cast <uint32_t>(status));
716 return NO_ERROR;
717 } break;
718
Eric Laurentde070132010-07-13 04:45:46 -0700719 case GET_STRATEGY_FOR_STREAM: {
720 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700721 audio_stream_type_t stream =
722 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentde070132010-07-13 04:45:46 -0700723 reply->writeInt32(getStrategyForStream(stream));
724 return NO_ERROR;
725 } break;
726
Glenn Kasten6b2718c2011-02-04 13:54:26 -0800727 case GET_DEVICES_FOR_STREAM: {
728 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700729 audio_stream_type_t stream =
730 static_cast <audio_stream_type_t>(data.readInt32());
Glenn Kasten6b2718c2011-02-04 13:54:26 -0800731 reply->writeInt32(static_cast <int>(getDevicesForStream(stream)));
732 return NO_ERROR;
733 } break;
734
Eric Laurentde070132010-07-13 04:45:46 -0700735 case GET_OUTPUT_FOR_EFFECT: {
736 CHECK_INTERFACE(IAudioPolicyService, data, reply);
737 effect_descriptor_t desc;
738 data.read(&desc, sizeof(effect_descriptor_t));
739 audio_io_handle_t output = getOutputForEffect(&desc);
740 reply->writeInt32(static_cast <int>(output));
741 return NO_ERROR;
742 } break;
743
744 case REGISTER_EFFECT: {
745 CHECK_INTERFACE(IAudioPolicyService, data, reply);
746 effect_descriptor_t desc;
747 data.read(&desc, sizeof(effect_descriptor_t));
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700748 audio_io_handle_t io = data.readInt32();
Eric Laurentde070132010-07-13 04:45:46 -0700749 uint32_t strategy = data.readInt32();
750 int session = data.readInt32();
751 int id = data.readInt32();
752 reply->writeInt32(static_cast <int32_t>(registerEffect(&desc,
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700753 io,
Eric Laurentde070132010-07-13 04:45:46 -0700754 strategy,
755 session,
756 id)));
757 return NO_ERROR;
758 } break;
759
760 case UNREGISTER_EFFECT: {
761 CHECK_INTERFACE(IAudioPolicyService, data, reply);
762 int id = data.readInt32();
763 reply->writeInt32(static_cast <int32_t>(unregisterEffect(id)));
764 return NO_ERROR;
765 } break;
766
Eric Laurentdb7c0792011-08-10 10:37:50 -0700767 case SET_EFFECT_ENABLED: {
768 CHECK_INTERFACE(IAudioPolicyService, data, reply);
769 int id = data.readInt32();
770 bool enabled = static_cast <bool>(data.readInt32());
771 reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled)));
772 return NO_ERROR;
773 } break;
774
Eric Laurenteda6c362011-02-02 09:33:30 -0800775 case IS_STREAM_ACTIVE: {
776 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kastenfff6d712012-01-12 16:38:12 -0800777 audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
Eric Laurenteda6c362011-02-02 09:33:30 -0800778 uint32_t inPastMs = (uint32_t)data.readInt32();
Eric Laurentebcb2542014-03-05 18:30:08 -0800779 reply->writeInt32( isStreamActive(stream, inPastMs) );
Eric Laurenteda6c362011-02-02 09:33:30 -0800780 return NO_ERROR;
781 } break;
782
Jean-Michel Trivi272ab542013-02-04 16:26:02 -0800783 case IS_STREAM_ACTIVE_REMOTELY: {
784 CHECK_INTERFACE(IAudioPolicyService, data, reply);
785 audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
786 uint32_t inPastMs = (uint32_t)data.readInt32();
Eric Laurentebcb2542014-03-05 18:30:08 -0800787 reply->writeInt32( isStreamActiveRemotely(stream, inPastMs) );
Jean-Michel Trivi272ab542013-02-04 16:26:02 -0800788 return NO_ERROR;
789 } break;
790
Jean-Michel Trivid7086032012-10-10 12:11:16 -0700791 case IS_SOURCE_ACTIVE: {
792 CHECK_INTERFACE(IAudioPolicyService, data, reply);
793 audio_source_t source = (audio_source_t) data.readInt32();
794 reply->writeInt32( isSourceActive(source));
795 return NO_ERROR;
796 }
797
Eric Laurent57dae992011-07-24 13:36:09 -0700798 case QUERY_DEFAULT_PRE_PROCESSING: {
799 CHECK_INTERFACE(IAudioPolicyService, data, reply);
800 int audioSession = data.readInt32();
801 uint32_t count = data.readInt32();
802 uint32_t retCount = count;
803 effect_descriptor_t *descriptors =
804 (effect_descriptor_t *)new char[count * sizeof(effect_descriptor_t)];
805 status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount);
806 reply->writeInt32(status);
807 if (status != NO_ERROR && status != NO_MEMORY) {
808 retCount = 0;
809 }
810 reply->writeInt32(retCount);
811 if (retCount) {
812 if (retCount < count) {
813 count = retCount;
814 }
815 reply->write(descriptors, sizeof(effect_descriptor_t) * count);
816 }
817 delete[] descriptors;
818 return status;
819 }
820
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +0100821 case IS_OFFLOAD_SUPPORTED: {
822 CHECK_INTERFACE(IAudioPolicyService, data, reply);
823 audio_offload_info_t info;
824 data.read(&info, sizeof(audio_offload_info_t));
825 bool isSupported = isOffloadSupported(info);
826 reply->writeInt32(isSupported);
827 return NO_ERROR;
828 }
829
Eric Laurent203b1a12014-04-01 10:34:16 -0700830 case LIST_AUDIO_PORTS: {
831 CHECK_INTERFACE(IAudioPolicyService, data, reply);
832 audio_port_role_t role = (audio_port_role_t)data.readInt32();
833 audio_port_type_t type = (audio_port_type_t)data.readInt32();
834 unsigned int numPortsReq = data.readInt32();
835 unsigned int numPorts = numPortsReq;
836 unsigned int generation;
837 struct audio_port *ports =
838 (struct audio_port *)calloc(numPortsReq, sizeof(struct audio_port));
839 status_t status = listAudioPorts(role, type, &numPorts, ports, &generation);
840 reply->writeInt32(status);
841 reply->writeInt32(numPorts);
Eric Laurent203b1a12014-04-01 10:34:16 -0700842
843 if (status == NO_ERROR) {
844 if (numPortsReq > numPorts) {
845 numPortsReq = numPorts;
846 }
847 reply->write(ports, numPortsReq * sizeof(struct audio_port));
848 reply->writeInt32(generation);
849 }
850 free(ports);
851 return NO_ERROR;
852 }
853
854 case GET_AUDIO_PORT: {
855 CHECK_INTERFACE(IAudioPolicyService, data, reply);
856 struct audio_port port;
857 data.read(&port, sizeof(struct audio_port));
858 status_t status = getAudioPort(&port);
859 reply->writeInt32(status);
860 if (status == NO_ERROR) {
861 reply->write(&port, sizeof(struct audio_port));
862 }
863 return NO_ERROR;
864 }
865
866 case CREATE_AUDIO_PATCH: {
867 CHECK_INTERFACE(IAudioPolicyService, data, reply);
868 struct audio_patch patch;
869 data.read(&patch, sizeof(struct audio_patch));
870 audio_patch_handle_t handle;
871 data.read(&handle, sizeof(audio_patch_handle_t));
872 status_t status = createAudioPatch(&patch, &handle);
873 reply->writeInt32(status);
874 if (status == NO_ERROR) {
875 reply->write(&handle, sizeof(audio_patch_handle_t));
876 }
877 return NO_ERROR;
878 }
879
880 case RELEASE_AUDIO_PATCH: {
881 CHECK_INTERFACE(IAudioPolicyService, data, reply);
882 audio_patch_handle_t handle;
883 data.read(&handle, sizeof(audio_patch_handle_t));
884 status_t status = releaseAudioPatch(handle);
885 reply->writeInt32(status);
886 return NO_ERROR;
887 }
888
889 case LIST_AUDIO_PATCHES: {
890 CHECK_INTERFACE(IAudioPolicyService, data, reply);
891 unsigned int numPatchesReq = data.readInt32();
892 unsigned int numPatches = numPatchesReq;
893 unsigned int generation;
894 struct audio_patch *patches =
895 (struct audio_patch *)calloc(numPatchesReq,
896 sizeof(struct audio_patch));
897 status_t status = listAudioPatches(&numPatches, patches, &generation);
898 reply->writeInt32(status);
899 reply->writeInt32(numPatches);
900 if (status == NO_ERROR) {
901 if (numPatchesReq > numPatches) {
902 numPatchesReq = numPatches;
903 }
904 reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
905 reply->writeInt32(generation);
906 }
907 free(patches);
908 return NO_ERROR;
909 }
910
911 case SET_AUDIO_PORT_CONFIG: {
912 CHECK_INTERFACE(IAudioPolicyService, data, reply);
913 struct audio_port_config config;
914 data.read(&config, sizeof(struct audio_port_config));
915 status_t status = setAudioPortConfig(&config);
916 reply->writeInt32(status);
917 return NO_ERROR;
918 }
Eric Laurentb52c1522014-05-20 11:27:36 -0700919 case REGISTER_CLIENT: {
920 CHECK_INTERFACE(IAudioPolicyService, data, reply);
921 sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
922 data.readStrongBinder());
923 registerClient(client);
924 return NO_ERROR;
925 } break;
Eric Laurent203b1a12014-04-01 10:34:16 -0700926
Eric Laurentc2f1f072009-07-17 12:17:14 -0700927 default:
928 return BBinder::onTransact(code, data, reply, flags);
929 }
930}
931
932// ----------------------------------------------------------------------------
933
934}; // namespace android