blob: a8137b75c9857337d1f8a6e62c4fc0d4a842745e [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>
Eric Laurentac9cef52017-06-09 15:46:26 -070022#include <math.h>
Eric Laurentc2f1f072009-07-17 12:17:14 -070023#include <sys/types.h>
24
Eric Laurentb1cc36b2017-12-11 12:14:16 -080025#include <binder/IPCThreadState.h>
Eric Laurentc2f1f072009-07-17 12:17:14 -070026#include <binder/Parcel.h>
Eric Laurent74adca92014-11-05 12:15:36 -080027#include <media/AudioEffect.h>
Eric Laurentc2f1f072009-07-17 12:17:14 -070028#include <media/IAudioPolicyService.h>
Andy Hung4ef19fa2018-05-15 19:35:29 -070029#include <mediautils/ServiceUtilities.h>
Marco Nelissencf90b492019-09-26 11:20:54 -070030#include <mediautils/TimeCheck.h>
Dima Zavin64760242011-05-11 14:15:23 -070031#include <system/audio.h>
Dima Zavinfce7a472011-04-19 22:30:36 -070032
Eric Laurentc2f1f072009-07-17 12:17:14 -070033namespace android {
34
35enum {
36 SET_DEVICE_CONNECTION_STATE = IBinder::FIRST_CALL_TRANSACTION,
37 GET_DEVICE_CONNECTION_STATE,
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -080038 HANDLE_DEVICE_CONFIG_CHANGE,
Eric Laurentc2f1f072009-07-17 12:17:14 -070039 SET_PHONE_STATE,
Glenn Kasten0b07b802012-01-18 14:56:06 -080040 SET_RINGER_MODE, // reserved, no longer used
Eric Laurentc2f1f072009-07-17 12:17:14 -070041 SET_FORCE_USE,
42 GET_FORCE_USE,
43 GET_OUTPUT,
44 START_OUTPUT,
45 STOP_OUTPUT,
46 RELEASE_OUTPUT,
Eric Laurentcaf7f482014-11-25 17:50:47 -080047 GET_INPUT_FOR_ATTR,
Eric Laurentc2f1f072009-07-17 12:17:14 -070048 START_INPUT,
49 STOP_INPUT,
50 RELEASE_INPUT,
51 INIT_STREAM_VOLUME,
52 SET_STREAM_VOLUME,
Eric Laurentde070132010-07-13 04:45:46 -070053 GET_STREAM_VOLUME,
François Gaffiecfe17322018-11-07 13:41:29 +010054 SET_VOLUME_ATTRIBUTES,
55 GET_VOLUME_ATTRIBUTES,
56 GET_MIN_VOLUME_FOR_ATTRIBUTES,
57 GET_MAX_VOLUME_FOR_ATTRIBUTES,
Eric Laurentde070132010-07-13 04:45:46 -070058 GET_STRATEGY_FOR_STREAM,
59 GET_OUTPUT_FOR_EFFECT,
60 REGISTER_EFFECT,
Eric Laurenteda6c362011-02-02 09:33:30 -080061 UNREGISTER_EFFECT,
Glenn Kasten6b2718c2011-02-04 13:54:26 -080062 IS_STREAM_ACTIVE,
Jean-Michel Trivid7086032012-10-10 12:11:16 -070063 IS_SOURCE_ACTIVE,
Glenn Kasten6b2718c2011-02-04 13:54:26 -080064 GET_DEVICES_FOR_STREAM,
Eric Laurentdb7c0792011-08-10 10:37:50 -070065 QUERY_DEFAULT_PRE_PROCESSING,
Jean-Michel Trivi272ab542013-02-04 16:26:02 -080066 SET_EFFECT_ENABLED,
Richard Fitzgeraldad3af332013-03-25 16:54:37 +000067 IS_STREAM_ACTIVE_REMOTELY,
Eric Laurent203b1a12014-04-01 10:34:16 -070068 IS_OFFLOAD_SUPPORTED,
Michael Chana94fbb22018-04-24 14:31:19 +100069 IS_DIRECT_OUTPUT_SUPPORTED,
Eric Laurent203b1a12014-04-01 10:34:16 -070070 LIST_AUDIO_PORTS,
71 GET_AUDIO_PORT,
72 CREATE_AUDIO_PATCH,
73 RELEASE_AUDIO_PATCH,
74 LIST_AUDIO_PATCHES,
Eric Laurentb52c1522014-05-20 11:27:36 -070075 SET_AUDIO_PORT_CONFIG,
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -070076 REGISTER_CLIENT,
Eric Laurentdf3dc7e2014-07-27 18:39:40 -070077 GET_OUTPUT_FOR_ATTR,
78 ACQUIRE_SOUNDTRIGGER_SESSION,
Eric Laurentbb6c9a02014-09-25 14:11:47 -070079 RELEASE_SOUNDTRIGGER_SESSION,
Eric Laurentbaac1832014-12-01 17:52:59 -080080 GET_PHONE_STATE,
81 REGISTER_POLICY_MIXES,
Eric Laurent554a2772015-04-10 11:29:24 -070082 START_AUDIO_SOURCE,
Eric Laurente8726fe2015-06-26 09:39:24 -070083 STOP_AUDIO_SOURCE,
84 SET_AUDIO_PORT_CALLBACK_ENABLED,
François Gaffiecfe17322018-11-07 13:41:29 +010085 SET_AUDIO_VOLUME_GROUP_CALLBACK_ENABLED,
Andy Hung2ddee192015-12-18 17:34:44 -080086 SET_MASTER_MONO,
87 GET_MASTER_MONO,
jiabin81772902018-04-02 17:52:27 -070088 GET_STREAM_VOLUME_DB,
89 GET_SURROUND_FORMATS,
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -070090 SET_SURROUND_FORMAT_ENABLED,
91 ADD_STREAM_DEFAULT_EFFECT,
Ari Hausman-Cohen24628312018-08-13 15:01:09 -070092 REMOVE_STREAM_DEFAULT_EFFECT,
93 ADD_SOURCE_DEFAULT_EFFECT,
Eric Laurentb78763e2018-10-17 10:08:02 -070094 REMOVE_SOURCE_DEFAULT_EFFECT,
95 SET_ASSISTANT_UID,
96 SET_A11Y_SERVICES_UIDS,
jiabin6012f912018-11-02 17:06:30 -070097 IS_HAPTIC_PLAYBACK_SUPPORTED,
Jean-Michel Trivibda70da2018-12-19 07:30:15 -080098 SET_UID_DEVICE_AFFINITY,
99 REMOVE_UID_DEVICE_AFFINITY,
François Gaffied0ba9ed2018-11-05 11:50:42 +0100100 GET_OFFLOAD_FORMATS_A2DP,
101 LIST_AUDIO_PRODUCT_STRATEGIES,
102 GET_STRATEGY_FOR_ATTRIBUTES,
François Gaffie4b2018b2018-11-07 11:18:59 +0100103 LIST_AUDIO_VOLUME_GROUPS,
Kevin Rocardb99cc752019-03-21 20:52:24 -0700104 GET_VOLUME_GROUP_FOR_ATTRIBUTES,
105 SET_ALLOWED_CAPTURE_POLICY,
Eric Laurent6c796322019-04-09 14:13:17 -0700106 MOVE_EFFECTS_TO_IO,
Eric Laurent8340e672019-11-06 11:01:08 -0800107 SET_RTT_ENABLED,
Jean-Michel Trivi30857152019-11-01 11:04:15 -0700108 IS_CALL_SCREEN_MODE_SUPPORTED,
109 SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY,
110 REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY,
111 GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY,
Jean-Michel Trivif41599b2020-01-07 14:22:08 -0800112 GET_DEVICES_FOR_ATTRIBUTES,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700113};
114
Eric Laurent1d670b12015-02-06 10:44:24 -0800115#define MAX_ITEMS_PER_LIST 1024
116
Eric Laurentc2f1f072009-07-17 12:17:14 -0700117class BpAudioPolicyService : public BpInterface<IAudioPolicyService>
118{
119public:
Chih-Hung Hsieh090ef602016-04-27 10:39:54 -0700120 explicit BpAudioPolicyService(const sp<IBinder>& impl)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700121 : BpInterface<IAudioPolicyService>(impl)
122 {
123 }
124
125 virtual status_t setDeviceConnectionState(
Dima Zavinfce7a472011-04-19 22:30:36 -0700126 audio_devices_t device,
127 audio_policy_dev_state_t state,
Paul McLeane743a472015-01-28 11:07:31 -0800128 const char *device_address,
Aniket Kumar Lata4e464702019-01-10 23:38:46 -0800129 const char *device_name,
130 audio_format_t encodedFormat)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700131 {
132 Parcel data, reply;
133 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
134 data.writeInt32(static_cast <uint32_t>(device));
135 data.writeInt32(static_cast <uint32_t>(state));
136 data.writeCString(device_address);
Paul McLeane743a472015-01-28 11:07:31 -0800137 data.writeCString(device_name);
Aniket Kumar Lata4e464702019-01-10 23:38:46 -0800138 data.writeInt32(static_cast <uint32_t>(encodedFormat));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700139 remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply);
140 return static_cast <status_t> (reply.readInt32());
141 }
142
Dima Zavinfce7a472011-04-19 22:30:36 -0700143 virtual audio_policy_dev_state_t getDeviceConnectionState(
144 audio_devices_t device,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700145 const char *device_address)
146 {
147 Parcel data, reply;
148 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
149 data.writeInt32(static_cast <uint32_t>(device));
150 data.writeCString(device_address);
151 remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700152 return static_cast <audio_policy_dev_state_t>(reply.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700153 }
154
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800155 virtual status_t handleDeviceConfigChange(audio_devices_t device,
156 const char *device_address,
Aniket Kumar Lata4e464702019-01-10 23:38:46 -0800157 const char *device_name,
158 audio_format_t encodedFormat)
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800159 {
160 Parcel data, reply;
161 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
162 data.writeInt32(static_cast <uint32_t>(device));
163 data.writeCString(device_address);
164 data.writeCString(device_name);
Aniket Kumar Lata4e464702019-01-10 23:38:46 -0800165 data.writeInt32(static_cast <uint32_t>(encodedFormat));
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800166 remote()->transact(HANDLE_DEVICE_CONFIG_CHANGE, data, &reply);
167 return static_cast <status_t> (reply.readInt32());
168 }
169
Glenn Kastenf78aee72012-01-04 11:00:47 -0800170 virtual status_t setPhoneState(audio_mode_t state)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700171 {
172 Parcel data, reply;
173 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
174 data.writeInt32(state);
175 remote()->transact(SET_PHONE_STATE, data, &reply);
176 return static_cast <status_t> (reply.readInt32());
177 }
178
Dima Zavinfce7a472011-04-19 22:30:36 -0700179 virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700180 {
181 Parcel data, reply;
182 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
183 data.writeInt32(static_cast <uint32_t>(usage));
184 data.writeInt32(static_cast <uint32_t>(config));
185 remote()->transact(SET_FORCE_USE, data, &reply);
186 return static_cast <status_t> (reply.readInt32());
187 }
188
Dima Zavinfce7a472011-04-19 22:30:36 -0700189 virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700190 {
191 Parcel data, reply;
192 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
193 data.writeInt32(static_cast <uint32_t>(usage));
194 remote()->transact(GET_FORCE_USE, data, &reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700195 return static_cast <audio_policy_forced_cfg_t> (reply.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700196 }
197
Eric Laurentf4e63452017-11-06 19:31:46 +0000198 virtual audio_io_handle_t getOutput(audio_stream_type_t stream)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700199 {
200 Parcel data, reply;
201 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
202 data.writeInt32(static_cast <uint32_t>(stream));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700203 remote()->transact(GET_OUTPUT, data, &reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700204 return static_cast <audio_io_handle_t> (reply.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700205 }
206
Eric Laurent42984412019-05-09 17:57:03 -0700207 status_t getOutputForAttr(audio_attributes_t *attr,
Kevin Rocard153f92d2018-12-18 18:33:28 -0800208 audio_io_handle_t *output,
209 audio_session_t session,
210 audio_stream_type_t *stream,
211 pid_t pid,
212 uid_t uid,
213 const audio_config_t *config,
214 audio_output_flags_t flags,
215 audio_port_handle_t *selectedDeviceId,
216 audio_port_handle_t *portId,
217 std::vector<audio_io_handle_t> *secondaryOutputs) override
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700218 {
219 Parcel data, reply;
220 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurent42984412019-05-09 17:57:03 -0700221 if (attr == nullptr) {
222 ALOGE("%s NULL audio attributes", __func__);
Eric Laurente83b55d2014-11-14 10:06:21 -0800223 return BAD_VALUE;
224 }
Eric Laurent42984412019-05-09 17:57:03 -0700225 if (output == nullptr) {
226 ALOGE("%s NULL output - shouldn't happen", __func__);
Eric Laurent9ae8c592017-06-22 17:17:09 -0700227 return BAD_VALUE;
228 }
Eric Laurent42984412019-05-09 17:57:03 -0700229 if (selectedDeviceId == nullptr) {
230 ALOGE("%s NULL selectedDeviceId - shouldn't happen", __func__);
Eric Laurent20b9ef02016-12-05 11:03:16 -0800231 return BAD_VALUE;
232 }
Eric Laurent42984412019-05-09 17:57:03 -0700233 if (portId == nullptr) {
234 ALOGE("%s NULL portId - shouldn't happen", __func__);
Kevin Rocard153f92d2018-12-18 18:33:28 -0800235 return BAD_VALUE;
236 }
Eric Laurent42984412019-05-09 17:57:03 -0700237 if (secondaryOutputs == nullptr) {
238 ALOGE("%s NULL secondaryOutputs - shouldn't happen", __func__);
239 return BAD_VALUE;
Eric Laurente83b55d2014-11-14 10:06:21 -0800240 }
Eric Laurent42984412019-05-09 17:57:03 -0700241 data.write(attr, sizeof(audio_attributes_t));
Eric Laurente83b55d2014-11-14 10:06:21 -0800242 data.writeInt32(session);
243 if (stream == NULL) {
244 data.writeInt32(0);
245 } else {
246 data.writeInt32(1);
247 data.writeInt32(*stream);
248 }
Nadav Bar766fb022018-01-07 12:18:03 +0200249 data.writeInt32(pid);
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700250 data.writeInt32(uid);
Eric Laurent20b9ef02016-12-05 11:03:16 -0800251 data.write(config, sizeof(audio_config_t));
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700252 data.writeInt32(static_cast <uint32_t>(flags));
Eric Laurent9ae8c592017-06-22 17:17:09 -0700253 data.writeInt32(*selectedDeviceId);
Eric Laurent20b9ef02016-12-05 11:03:16 -0800254 data.writeInt32(*portId);
Eric Laurente83b55d2014-11-14 10:06:21 -0800255 status_t status = remote()->transact(GET_OUTPUT_FOR_ATTR, data, &reply);
256 if (status != NO_ERROR) {
257 return status;
258 }
259 status = (status_t)reply.readInt32();
260 if (status != NO_ERROR) {
261 return status;
262 }
Eric Laurent42984412019-05-09 17:57:03 -0700263 status = (status_t)reply.read(&attr, sizeof(audio_attributes_t));
264 if (status != NO_ERROR) {
265 return status;
266 }
Eric Laurente83b55d2014-11-14 10:06:21 -0800267 *output = (audio_io_handle_t)reply.readInt32();
Eric Laurent20b9ef02016-12-05 11:03:16 -0800268 audio_stream_type_t lStream = (audio_stream_type_t)reply.readInt32();
Eric Laurente83b55d2014-11-14 10:06:21 -0800269 if (stream != NULL) {
Eric Laurent20b9ef02016-12-05 11:03:16 -0800270 *stream = lStream;
Eric Laurente83b55d2014-11-14 10:06:21 -0800271 }
Eric Laurent9ae8c592017-06-22 17:17:09 -0700272 *selectedDeviceId = (audio_port_handle_t)reply.readInt32();
Eric Laurent20b9ef02016-12-05 11:03:16 -0800273 *portId = (audio_port_handle_t)reply.readInt32();
Kevin Rocard153f92d2018-12-18 18:33:28 -0800274 secondaryOutputs->resize(reply.readInt32());
275 return reply.read(secondaryOutputs->data(),
276 secondaryOutputs->size() * sizeof(audio_io_handle_t));
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700277 }
278
Eric Laurentd7fe0862018-07-14 16:48:01 -0700279 virtual status_t startOutput(audio_port_handle_t portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700280 {
281 Parcel data, reply;
282 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentd7fe0862018-07-14 16:48:01 -0700283 data.writeInt32((int32_t)portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700284 remote()->transact(START_OUTPUT, data, &reply);
285 return static_cast <status_t> (reply.readInt32());
286 }
287
Eric Laurentd7fe0862018-07-14 16:48:01 -0700288 virtual status_t stopOutput(audio_port_handle_t portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700289 {
290 Parcel data, reply;
291 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentd7fe0862018-07-14 16:48:01 -0700292 data.writeInt32((int32_t)portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700293 remote()->transact(STOP_OUTPUT, data, &reply);
294 return static_cast <status_t> (reply.readInt32());
295 }
296
Eric Laurentd7fe0862018-07-14 16:48:01 -0700297 virtual void releaseOutput(audio_port_handle_t portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700298 {
299 Parcel data, reply;
300 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentd7fe0862018-07-14 16:48:01 -0700301 data.writeInt32((int32_t)portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700302 remote()->transact(RELEASE_OUTPUT, data, &reply);
303 }
304
Eric Laurentcaf7f482014-11-25 17:50:47 -0800305 virtual status_t getInputForAttr(const audio_attributes_t *attr,
306 audio_io_handle_t *input,
Mikhail Naganov2996f672019-04-18 12:29:59 -0700307 audio_unique_id_t riid,
Eric Laurentcaf7f482014-11-25 17:50:47 -0800308 audio_session_t session,
Eric Laurentb2379ba2016-05-23 17:42:12 -0700309 pid_t pid,
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700310 uid_t uid,
Eric Laurentfee19762018-01-29 18:44:13 -0800311 const String16& opPackageName,
Eric Laurent20b9ef02016-12-05 11:03:16 -0800312 const audio_config_base_t *config,
Paul McLean466dc8e2015-04-17 13:15:36 -0600313 audio_input_flags_t flags,
Eric Laurent9ae8c592017-06-22 17:17:09 -0700314 audio_port_handle_t *selectedDeviceId,
Eric Laurent20b9ef02016-12-05 11:03:16 -0800315 audio_port_handle_t *portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700316 {
317 Parcel data, reply;
318 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentcaf7f482014-11-25 17:50:47 -0800319 if (attr == NULL) {
320 ALOGE("getInputForAttr NULL attr - shouldn't happen");
321 return BAD_VALUE;
322 }
323 if (input == NULL) {
324 ALOGE("getInputForAttr NULL input - shouldn't happen");
325 return BAD_VALUE;
326 }
Eric Laurent9ae8c592017-06-22 17:17:09 -0700327 if (selectedDeviceId == NULL) {
328 ALOGE("getInputForAttr NULL selectedDeviceId - shouldn't happen");
329 return BAD_VALUE;
330 }
Eric Laurent20b9ef02016-12-05 11:03:16 -0800331 if (portId == NULL) {
332 ALOGE("getInputForAttr NULL portId - shouldn't happen");
333 return BAD_VALUE;
334 }
Eric Laurentcaf7f482014-11-25 17:50:47 -0800335 data.write(attr, sizeof(audio_attributes_t));
Eric Laurenta54f1282017-07-01 19:39:32 -0700336 data.writeInt32(*input);
Mikhail Naganov2996f672019-04-18 12:29:59 -0700337 data.writeInt32(riid);
Eric Laurentcaf7f482014-11-25 17:50:47 -0800338 data.writeInt32(session);
Eric Laurentb2379ba2016-05-23 17:42:12 -0700339 data.writeInt32(pid);
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700340 data.writeInt32(uid);
Eric Laurentfee19762018-01-29 18:44:13 -0800341 data.writeString16(opPackageName);
Eric Laurent20b9ef02016-12-05 11:03:16 -0800342 data.write(config, sizeof(audio_config_base_t));
Glenn Kastenb3b16602014-07-16 08:36:31 -0700343 data.writeInt32(flags);
Eric Laurent9ae8c592017-06-22 17:17:09 -0700344 data.writeInt32(*selectedDeviceId);
Eric Laurent20b9ef02016-12-05 11:03:16 -0800345 data.writeInt32(*portId);
Eric Laurentcaf7f482014-11-25 17:50:47 -0800346 status_t status = remote()->transact(GET_INPUT_FOR_ATTR, data, &reply);
347 if (status != NO_ERROR) {
348 return status;
349 }
350 status = reply.readInt32();
351 if (status != NO_ERROR) {
352 return status;
353 }
354 *input = (audio_io_handle_t)reply.readInt32();
Eric Laurent9ae8c592017-06-22 17:17:09 -0700355 *selectedDeviceId = (audio_port_handle_t)reply.readInt32();
Eric Laurent20b9ef02016-12-05 11:03:16 -0800356 *portId = (audio_port_handle_t)reply.readInt32();
Eric Laurentcaf7f482014-11-25 17:50:47 -0800357 return NO_ERROR;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700358 }
359
Eric Laurent4eb58f12018-12-07 16:41:02 -0800360 virtual status_t startInput(audio_port_handle_t portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700361 {
362 Parcel data, reply;
363 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfee19762018-01-29 18:44:13 -0800364 data.writeInt32(portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700365 remote()->transact(START_INPUT, data, &reply);
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800366 status_t status = static_cast <status_t> (reply.readInt32());
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800367 return status;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700368 }
369
Eric Laurentfee19762018-01-29 18:44:13 -0800370 virtual status_t stopInput(audio_port_handle_t portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700371 {
372 Parcel data, reply;
373 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfee19762018-01-29 18:44:13 -0800374 data.writeInt32(portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700375 remote()->transact(STOP_INPUT, data, &reply);
376 return static_cast <status_t> (reply.readInt32());
377 }
378
Eric Laurentfee19762018-01-29 18:44:13 -0800379 virtual void releaseInput(audio_port_handle_t portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700380 {
381 Parcel data, reply;
382 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfee19762018-01-29 18:44:13 -0800383 data.writeInt32(portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700384 remote()->transact(RELEASE_INPUT, data, &reply);
385 }
386
Dima Zavinfce7a472011-04-19 22:30:36 -0700387 virtual status_t initStreamVolume(audio_stream_type_t stream,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700388 int indexMin,
389 int indexMax)
390 {
391 Parcel data, reply;
392 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
393 data.writeInt32(static_cast <uint32_t>(stream));
394 data.writeInt32(indexMin);
395 data.writeInt32(indexMax);
396 remote()->transact(INIT_STREAM_VOLUME, data, &reply);
397 return static_cast <status_t> (reply.readInt32());
398 }
399
Eric Laurent83844cc2011-11-18 16:43:31 -0800400 virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
401 int index,
402 audio_devices_t device)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700403 {
404 Parcel data, reply;
405 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
406 data.writeInt32(static_cast <uint32_t>(stream));
407 data.writeInt32(index);
Eric Laurent83844cc2011-11-18 16:43:31 -0800408 data.writeInt32(static_cast <uint32_t>(device));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700409 remote()->transact(SET_STREAM_VOLUME, data, &reply);
410 return static_cast <status_t> (reply.readInt32());
411 }
412
Eric Laurent83844cc2011-11-18 16:43:31 -0800413 virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
414 int *index,
415 audio_devices_t device)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700416 {
417 Parcel data, reply;
418 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
419 data.writeInt32(static_cast <uint32_t>(stream));
Eric Laurent83844cc2011-11-18 16:43:31 -0800420 data.writeInt32(static_cast <uint32_t>(device));
421
Eric Laurentc2f1f072009-07-17 12:17:14 -0700422 remote()->transact(GET_STREAM_VOLUME, data, &reply);
423 int lIndex = reply.readInt32();
424 if (index) *index = lIndex;
425 return static_cast <status_t> (reply.readInt32());
426 }
Eric Laurentde070132010-07-13 04:45:46 -0700427
François Gaffiecfe17322018-11-07 13:41:29 +0100428 virtual status_t setVolumeIndexForAttributes(const audio_attributes_t &attr, int index,
429 audio_devices_t device)
430 {
431 Parcel data, reply;
432 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
433 data.write(&attr, sizeof(audio_attributes_t));
434 data.writeInt32(index);
435 data.writeInt32(static_cast <uint32_t>(device));
436 status_t status = remote()->transact(SET_VOLUME_ATTRIBUTES, data, &reply);
437 if (status != NO_ERROR) {
438 return status;
439 }
440 return static_cast <status_t> (reply.readInt32());
441 }
442 virtual status_t getVolumeIndexForAttributes(const audio_attributes_t &attr, int &index,
443 audio_devices_t device)
444 {
445 Parcel data, reply;
446 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
447 data.write(&attr, sizeof(audio_attributes_t));
448 data.writeInt32(static_cast <uint32_t>(device));
449 status_t status = remote()->transact(GET_VOLUME_ATTRIBUTES, data, &reply);
450 if (status != NO_ERROR) {
451 return status;
452 }
453 status = static_cast <status_t> (reply.readInt32());
454 if (status != NO_ERROR) {
455 return status;
456 }
457 index = reply.readInt32();
458 return NO_ERROR;
459 }
460 virtual status_t getMinVolumeIndexForAttributes(const audio_attributes_t &attr, int &index)
461 {
462 Parcel data, reply;
463 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
464 data.write(&attr, sizeof(audio_attributes_t));
465 status_t status = remote()->transact(GET_MIN_VOLUME_FOR_ATTRIBUTES, data, &reply);
466 if (status != NO_ERROR) {
467 return status;
468 }
469 status = static_cast <status_t> (reply.readInt32());
470 if (status != NO_ERROR) {
471 return status;
472 }
473 index = reply.readInt32();
474 return NO_ERROR;
475 }
476 virtual status_t getMaxVolumeIndexForAttributes(const audio_attributes_t &attr, int &index)
477 {
478 Parcel data, reply;
479 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
480 data.write(&attr, sizeof(audio_attributes_t));
481 status_t status = remote()->transact(GET_MAX_VOLUME_FOR_ATTRIBUTES, data, &reply);
482 if (status != NO_ERROR) {
483 return status;
484 }
485 status = static_cast <status_t> (reply.readInt32());
486 if (status != NO_ERROR) {
487 return status;
488 }
489 index = reply.readInt32();
490 return NO_ERROR;
491 }
Dima Zavinfce7a472011-04-19 22:30:36 -0700492 virtual uint32_t getStrategyForStream(audio_stream_type_t stream)
Eric Laurentde070132010-07-13 04:45:46 -0700493 {
494 Parcel data, reply;
495 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
496 data.writeInt32(static_cast <uint32_t>(stream));
497 remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply);
François Gaffiec005e562018-11-06 15:04:49 +0100498 return reply.readUint32();
Eric Laurentde070132010-07-13 04:45:46 -0700499 }
500
Eric Laurent63742522012-03-08 13:42:42 -0800501 virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream)
Glenn Kasten6b2718c2011-02-04 13:54:26 -0800502 {
503 Parcel data, reply;
504 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
505 data.writeInt32(static_cast <uint32_t>(stream));
506 remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply);
Eric Laurent63742522012-03-08 13:42:42 -0800507 return (audio_devices_t) reply.readInt32();
Glenn Kasten6b2718c2011-02-04 13:54:26 -0800508 }
509
Glenn Kasten58e5aa32012-06-20 14:08:14 -0700510 virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc)
Eric Laurentde070132010-07-13 04:45:46 -0700511 {
512 Parcel data, reply;
513 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
514 data.write(desc, sizeof(effect_descriptor_t));
515 remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply);
516 return static_cast <audio_io_handle_t> (reply.readInt32());
517 }
518
Glenn Kasten58e5aa32012-06-20 14:08:14 -0700519 virtual status_t registerEffect(const effect_descriptor_t *desc,
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700520 audio_io_handle_t io,
Eric Laurentde070132010-07-13 04:45:46 -0700521 uint32_t strategy,
Glenn Kastend848eb42016-03-08 13:42:11 -0800522 audio_session_t session,
Eric Laurentde070132010-07-13 04:45:46 -0700523 int id)
524 {
525 Parcel data, reply;
526 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
527 data.write(desc, sizeof(effect_descriptor_t));
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700528 data.writeInt32(io);
Eric Laurentde070132010-07-13 04:45:46 -0700529 data.writeInt32(strategy);
530 data.writeInt32(session);
531 data.writeInt32(id);
532 remote()->transact(REGISTER_EFFECT, data, &reply);
533 return static_cast <status_t> (reply.readInt32());
534 }
535
536 virtual status_t unregisterEffect(int id)
537 {
538 Parcel data, reply;
539 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
540 data.writeInt32(id);
541 remote()->transact(UNREGISTER_EFFECT, data, &reply);
542 return static_cast <status_t> (reply.readInt32());
543 }
544
Eric Laurentdb7c0792011-08-10 10:37:50 -0700545 virtual status_t setEffectEnabled(int id, bool enabled)
546 {
547 Parcel data, reply;
548 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
549 data.writeInt32(id);
550 data.writeInt32(enabled);
551 remote()->transact(SET_EFFECT_ENABLED, data, &reply);
552 return static_cast <status_t> (reply.readInt32());
553 }
554
Eric Laurent6c796322019-04-09 14:13:17 -0700555 status_t moveEffectsToIo(const std::vector<int>& ids, audio_io_handle_t io) override
556 {
557 Parcel data, reply;
558 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
559 data.writeInt32(ids.size());
560 for (auto id : ids) {
561 data.writeInt32(id);
562 }
563 data.writeInt32(io);
564 status_t status = remote()->transact(MOVE_EFFECTS_TO_IO, data, &reply);
565 if (status != NO_ERROR) {
566 return status;
567 }
568 return static_cast <status_t> (reply.readInt32());
569 }
570
Glenn Kastenfff6d712012-01-12 16:38:12 -0800571 virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
Eric Laurenteda6c362011-02-02 09:33:30 -0800572 {
573 Parcel data, reply;
574 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800575 data.writeInt32((int32_t) stream);
Eric Laurenteda6c362011-02-02 09:33:30 -0800576 data.writeInt32(inPastMs);
577 remote()->transact(IS_STREAM_ACTIVE, data, &reply);
578 return reply.readInt32();
579 }
Eric Laurent57dae992011-07-24 13:36:09 -0700580
Jean-Michel Trivi272ab542013-02-04 16:26:02 -0800581 virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
582 {
583 Parcel data, reply;
584 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
585 data.writeInt32((int32_t) stream);
586 data.writeInt32(inPastMs);
587 remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply);
588 return reply.readInt32();
589 }
590
Jean-Michel Trivid7086032012-10-10 12:11:16 -0700591 virtual bool isSourceActive(audio_source_t source) const
592 {
593 Parcel data, reply;
594 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
595 data.writeInt32((int32_t) source);
596 remote()->transact(IS_SOURCE_ACTIVE, data, &reply);
597 return reply.readInt32();
598 }
599
Glenn Kastend848eb42016-03-08 13:42:11 -0800600 virtual status_t queryDefaultPreProcessing(audio_session_t audioSession,
Eric Laurent57dae992011-07-24 13:36:09 -0700601 effect_descriptor_t *descriptors,
602 uint32_t *count)
603 {
604 if (descriptors == NULL || count == NULL) {
605 return BAD_VALUE;
606 }
607 Parcel data, reply;
608 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
609 data.writeInt32(audioSession);
610 data.writeInt32(*count);
611 status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply);
612 if (status != NO_ERROR) {
613 return status;
614 }
615 status = static_cast <status_t> (reply.readInt32());
616 uint32_t retCount = reply.readInt32();
617 if (retCount != 0) {
618 uint32_t numDesc = (retCount < *count) ? retCount : *count;
619 reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc);
620 }
621 *count = retCount;
622 return status;
623 }
Richard Fitzgeraldad3af332013-03-25 16:54:37 +0000624
Kevin Rocardb99cc752019-03-21 20:52:24 -0700625 status_t setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t flags) override {
626 Parcel data, reply;
627 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
628 data.writeInt32(uid);
629 data.writeInt32(flags);
630 remote()->transact(SET_ALLOWED_CAPTURE_POLICY, data, &reply);
631 return reply.readInt32();
632 }
633
Richard Fitzgeraldad3af332013-03-25 16:54:37 +0000634 virtual bool isOffloadSupported(const audio_offload_info_t& info)
635 {
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +0100636 Parcel data, reply;
637 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
638 data.write(&info, sizeof(audio_offload_info_t));
639 remote()->transact(IS_OFFLOAD_SUPPORTED, data, &reply);
Eric Laurent203b1a12014-04-01 10:34:16 -0700640 return reply.readInt32();
641 }
642
Michael Chana94fbb22018-04-24 14:31:19 +1000643 virtual bool isDirectOutputSupported(const audio_config_base_t& config,
644 const audio_attributes_t& attributes) {
645 Parcel data, reply;
646 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
647 data.write(&config, sizeof(audio_config_base_t));
648 data.write(&attributes, sizeof(audio_attributes_t));
649 status_t status = remote()->transact(IS_DIRECT_OUTPUT_SUPPORTED, data, &reply);
650 return status == NO_ERROR ? static_cast<bool>(reply.readInt32()) : false;
651 }
652
Eric Laurent203b1a12014-04-01 10:34:16 -0700653 virtual status_t listAudioPorts(audio_port_role_t role,
654 audio_port_type_t type,
655 unsigned int *num_ports,
656 struct audio_port *ports,
657 unsigned int *generation)
658 {
659 if (num_ports == NULL || (*num_ports != 0 && ports == NULL) ||
660 generation == NULL) {
661 return BAD_VALUE;
662 }
663 Parcel data, reply;
664 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
665 unsigned int numPortsReq = (ports == NULL) ? 0 : *num_ports;
666 data.writeInt32(role);
667 data.writeInt32(type);
668 data.writeInt32(numPortsReq);
669 status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply);
670 if (status == NO_ERROR) {
671 status = (status_t)reply.readInt32();
672 *num_ports = (unsigned int)reply.readInt32();
673 }
Eric Laurent203b1a12014-04-01 10:34:16 -0700674 if (status == NO_ERROR) {
675 if (numPortsReq > *num_ports) {
676 numPortsReq = *num_ports;
677 }
678 if (numPortsReq > 0) {
679 reply.read(ports, numPortsReq * sizeof(struct audio_port));
680 }
681 *generation = reply.readInt32();
682 }
683 return status;
684 }
685
686 virtual status_t getAudioPort(struct audio_port *port)
687 {
688 if (port == NULL) {
689 return BAD_VALUE;
690 }
691 Parcel data, reply;
692 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
693 data.write(port, sizeof(struct audio_port));
694 status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply);
695 if (status != NO_ERROR ||
696 (status = (status_t)reply.readInt32()) != NO_ERROR) {
697 return status;
698 }
699 reply.read(port, sizeof(struct audio_port));
700 return status;
701 }
702
703 virtual status_t createAudioPatch(const struct audio_patch *patch,
704 audio_patch_handle_t *handle)
705 {
706 if (patch == NULL || handle == NULL) {
707 return BAD_VALUE;
708 }
709 Parcel data, reply;
710 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
711 data.write(patch, sizeof(struct audio_patch));
712 data.write(handle, sizeof(audio_patch_handle_t));
713 status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply);
714 if (status != NO_ERROR ||
715 (status = (status_t)reply.readInt32()) != NO_ERROR) {
716 return status;
717 }
718 reply.read(handle, sizeof(audio_patch_handle_t));
719 return status;
720 }
721
722 virtual status_t releaseAudioPatch(audio_patch_handle_t handle)
723 {
724 Parcel data, reply;
725 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
726 data.write(&handle, sizeof(audio_patch_handle_t));
727 status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply);
728 if (status != NO_ERROR) {
729 status = (status_t)reply.readInt32();
730 }
731 return status;
732 }
733
734 virtual status_t listAudioPatches(unsigned int *num_patches,
735 struct audio_patch *patches,
736 unsigned int *generation)
737 {
738 if (num_patches == NULL || (*num_patches != 0 && patches == NULL) ||
739 generation == NULL) {
740 return BAD_VALUE;
741 }
742 Parcel data, reply;
743 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
744 unsigned int numPatchesReq = (patches == NULL) ? 0 : *num_patches;
745 data.writeInt32(numPatchesReq);
746 status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply);
747 if (status == NO_ERROR) {
748 status = (status_t)reply.readInt32();
749 *num_patches = (unsigned int)reply.readInt32();
750 }
751 if (status == NO_ERROR) {
752 if (numPatchesReq > *num_patches) {
753 numPatchesReq = *num_patches;
754 }
755 if (numPatchesReq > 0) {
756 reply.read(patches, numPatchesReq * sizeof(struct audio_patch));
757 }
758 *generation = reply.readInt32();
759 }
760 return status;
761 }
762
763 virtual status_t setAudioPortConfig(const struct audio_port_config *config)
764 {
765 if (config == NULL) {
766 return BAD_VALUE;
767 }
768 Parcel data, reply;
769 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
770 data.write(config, sizeof(struct audio_port_config));
771 status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply);
772 if (status != NO_ERROR) {
773 status = (status_t)reply.readInt32();
774 }
775 return status;
776 }
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700777
Eric Laurentb52c1522014-05-20 11:27:36 -0700778 virtual void registerClient(const sp<IAudioPolicyServiceClient>& client)
779 {
780 Parcel data, reply;
781 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Marco Nelissenf8880202014-11-14 07:58:25 -0800782 data.writeStrongBinder(IInterface::asBinder(client));
Eric Laurentb52c1522014-05-20 11:27:36 -0700783 remote()->transact(REGISTER_CLIENT, data, &reply);
784 }
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700785
Eric Laurente8726fe2015-06-26 09:39:24 -0700786 virtual void setAudioPortCallbacksEnabled(bool enabled)
787 {
788 Parcel data, reply;
789 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
790 data.writeInt32(enabled ? 1 : 0);
791 remote()->transact(SET_AUDIO_PORT_CALLBACK_ENABLED, data, &reply);
792 }
793
François Gaffiecfe17322018-11-07 13:41:29 +0100794 virtual void setAudioVolumeGroupCallbacksEnabled(bool enabled)
795 {
796 Parcel data, reply;
797 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
798 data.writeInt32(enabled ? 1 : 0);
799 remote()->transact(SET_AUDIO_VOLUME_GROUP_CALLBACK_ENABLED, data, &reply);
800 }
801
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700802 virtual status_t acquireSoundTriggerSession(audio_session_t *session,
803 audio_io_handle_t *ioHandle,
804 audio_devices_t *device)
805 {
806 if (session == NULL || ioHandle == NULL || device == NULL) {
807 return BAD_VALUE;
808 }
809 Parcel data, reply;
810 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
811 status_t status = remote()->transact(ACQUIRE_SOUNDTRIGGER_SESSION, data, &reply);
812 if (status != NO_ERROR) {
813 return status;
814 }
815 status = (status_t)reply.readInt32();
816 if (status == NO_ERROR) {
817 *session = (audio_session_t)reply.readInt32();
818 *ioHandle = (audio_io_handle_t)reply.readInt32();
819 *device = (audio_devices_t)reply.readInt32();
820 }
821 return status;
822 }
823
824 virtual status_t releaseSoundTriggerSession(audio_session_t session)
825 {
826 Parcel data, reply;
827 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
828 data.writeInt32(session);
829 status_t status = remote()->transact(RELEASE_SOUNDTRIGGER_SESSION, data, &reply);
830 if (status != NO_ERROR) {
831 return status;
832 }
833 return (status_t)reply.readInt32();
834 }
Eric Laurentbb6c9a02014-09-25 14:11:47 -0700835
836 virtual audio_mode_t getPhoneState()
837 {
838 Parcel data, reply;
839 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
840 status_t status = remote()->transact(GET_PHONE_STATE, data, &reply);
841 if (status != NO_ERROR) {
842 return AUDIO_MODE_INVALID;
843 }
844 return (audio_mode_t)reply.readInt32();
845 }
Eric Laurentbaac1832014-12-01 17:52:59 -0800846
Chih-Hung Hsiehe964d4e2016-08-09 14:31:32 -0700847 virtual status_t registerPolicyMixes(const Vector<AudioMix>& mixes, bool registration)
Eric Laurentbaac1832014-12-01 17:52:59 -0800848 {
849 Parcel data, reply;
850 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
851 data.writeInt32(registration ? 1 : 0);
852 size_t size = mixes.size();
853 if (size > MAX_MIXES_PER_POLICY) {
854 size = MAX_MIXES_PER_POLICY;
855 }
856 size_t sizePosition = data.dataPosition();
857 data.writeInt32(size);
858 size_t finalSize = size;
859 for (size_t i = 0; i < size; i++) {
860 size_t position = data.dataPosition();
861 if (mixes[i].writeToParcel(&data) != NO_ERROR) {
862 data.setDataPosition(position);
863 finalSize--;
864 }
865 }
866 if (size != finalSize) {
867 size_t position = data.dataPosition();
868 data.setDataPosition(sizePosition);
869 data.writeInt32(finalSize);
870 data.setDataPosition(position);
871 }
872 status_t status = remote()->transact(REGISTER_POLICY_MIXES, data, &reply);
873 if (status == NO_ERROR) {
874 status = (status_t)reply.readInt32();
875 }
876 return status;
877 }
Eric Laurent554a2772015-04-10 11:29:24 -0700878
879 virtual status_t startAudioSource(const struct audio_port_config *source,
880 const audio_attributes_t *attributes,
Eric Laurent3e6c7e12018-07-27 17:09:23 -0700881 audio_port_handle_t *portId)
Eric Laurent554a2772015-04-10 11:29:24 -0700882 {
883 Parcel data, reply;
884 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurent3e6c7e12018-07-27 17:09:23 -0700885 if (source == NULL || attributes == NULL || portId == NULL) {
Eric Laurent554a2772015-04-10 11:29:24 -0700886 return BAD_VALUE;
887 }
888 data.write(source, sizeof(struct audio_port_config));
889 data.write(attributes, sizeof(audio_attributes_t));
890 status_t status = remote()->transact(START_AUDIO_SOURCE, data, &reply);
891 if (status != NO_ERROR) {
892 return status;
893 }
894 status = (status_t)reply.readInt32();
895 if (status != NO_ERROR) {
896 return status;
897 }
Eric Laurent3e6c7e12018-07-27 17:09:23 -0700898 *portId = (audio_port_handle_t)reply.readInt32();
Eric Laurent554a2772015-04-10 11:29:24 -0700899 return status;
900 }
901
Eric Laurent3e6c7e12018-07-27 17:09:23 -0700902 virtual status_t stopAudioSource(audio_port_handle_t portId)
Eric Laurent554a2772015-04-10 11:29:24 -0700903 {
904 Parcel data, reply;
905 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurent3e6c7e12018-07-27 17:09:23 -0700906 data.writeInt32(portId);
Eric Laurent554a2772015-04-10 11:29:24 -0700907 status_t status = remote()->transact(STOP_AUDIO_SOURCE, data, &reply);
908 if (status != NO_ERROR) {
909 return status;
910 }
911 status = (status_t)reply.readInt32();
912 return status;
913 }
Andy Hung2ddee192015-12-18 17:34:44 -0800914
915 virtual status_t setMasterMono(bool mono)
916 {
917 Parcel data, reply;
918 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
919 data.writeInt32(static_cast<int32_t>(mono));
920 status_t status = remote()->transact(SET_MASTER_MONO, data, &reply);
921 if (status != NO_ERROR) {
922 return status;
923 }
924 return static_cast<status_t>(reply.readInt32());
925 }
926
927 virtual status_t getMasterMono(bool *mono)
928 {
929 if (mono == nullptr) {
930 return BAD_VALUE;
931 }
932 Parcel data, reply;
933 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
934
935 status_t status = remote()->transact(GET_MASTER_MONO, data, &reply);
936 if (status != NO_ERROR) {
937 return status;
938 }
939 status = static_cast<status_t>(reply.readInt32());
940 if (status == NO_ERROR) {
941 *mono = static_cast<bool>(reply.readInt32());
942 }
943 return status;
944 }
Eric Laurentac9cef52017-06-09 15:46:26 -0700945
946 virtual float getStreamVolumeDB(audio_stream_type_t stream, int index, audio_devices_t device)
947 {
948 Parcel data, reply;
949 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
950 data.writeInt32(static_cast <int32_t>(stream));
951 data.writeInt32(static_cast <int32_t>(index));
952 data.writeUint32(static_cast <uint32_t>(device));
953 status_t status = remote()->transact(GET_STREAM_VOLUME_DB, data, &reply);
954 if (status != NO_ERROR) {
955 return NAN;
956 }
957 return reply.readFloat();
958 }
jiabin81772902018-04-02 17:52:27 -0700959
960 virtual status_t getSurroundFormats(unsigned int *numSurroundFormats,
961 audio_format_t *surroundFormats,
962 bool *surroundFormatsEnabled,
963 bool reported)
964 {
965 if (numSurroundFormats == NULL || (*numSurroundFormats != 0 &&
966 (surroundFormats == NULL || surroundFormatsEnabled == NULL))) {
967 return BAD_VALUE;
968 }
969 Parcel data, reply;
970 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
971 unsigned int numSurroundFormatsReq = *numSurroundFormats;
972 data.writeUint32(numSurroundFormatsReq);
973 data.writeBool(reported);
974 status_t status = remote()->transact(GET_SURROUND_FORMATS, data, &reply);
975 if (status == NO_ERROR && (status = (status_t)reply.readInt32()) == NO_ERROR) {
976 *numSurroundFormats = reply.readUint32();
977 }
978 if (status == NO_ERROR) {
979 if (numSurroundFormatsReq > *numSurroundFormats) {
980 numSurroundFormatsReq = *numSurroundFormats;
981 }
982 if (numSurroundFormatsReq > 0) {
983 status = reply.read(surroundFormats,
984 numSurroundFormatsReq * sizeof(audio_format_t));
985 if (status != NO_ERROR) {
986 return status;
987 }
988 status = reply.read(surroundFormatsEnabled,
989 numSurroundFormatsReq * sizeof(bool));
990 }
991 }
992 return status;
993 }
994
995 virtual status_t setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled)
996 {
997 Parcel data, reply;
998 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
999 data.writeInt32(audioFormat);
1000 data.writeBool(enabled);
1001 status_t status = remote()->transact(SET_SURROUND_FORMAT_ENABLED, data, &reply);
1002 if (status != NO_ERROR) {
1003 return status;
1004 }
1005 return reply.readInt32();
1006 }
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001007
Arun Mirpuri11029ad2018-12-19 20:45:19 -08001008 virtual status_t getHwOffloadEncodingFormatsSupportedForA2DP(
1009 std::vector<audio_format_t> *formats)
1010 {
1011 if (formats == NULL) {
1012 return BAD_VALUE;
1013 }
1014
1015 Parcel data, reply;
1016 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1017 status_t status = remote()->transact(GET_OFFLOAD_FORMATS_A2DP, data, &reply);
1018 if (status != NO_ERROR || (status = (status_t)reply.readInt32()) != NO_ERROR) {
1019 return status;
1020 }
1021
1022 size_t list_size = reply.readUint32();
1023
1024 for (size_t i = 0; i < list_size; i++) {
1025 formats->push_back(static_cast<audio_format_t>(reply.readInt32()));
1026 }
1027 return NO_ERROR;
1028 }
1029
1030
1031 virtual status_t addStreamDefaultEffect(const effect_uuid_t *type,
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001032 const String16& opPackageName,
1033 const effect_uuid_t *uuid,
1034 int32_t priority,
1035 audio_usage_t usage,
1036 audio_unique_id_t* id)
1037 {
1038 Parcel data, reply;
1039 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1040 data.write(type, sizeof(effect_uuid_t));
1041 data.writeString16(opPackageName);
1042 data.write(uuid, sizeof(effect_uuid_t));
1043 data.writeInt32(priority);
1044 data.writeInt32((int32_t) usage);
1045 status_t status = remote()->transact(ADD_STREAM_DEFAULT_EFFECT, data, &reply);
1046 if (status != NO_ERROR) {
1047 return status;
1048 }
1049 status = static_cast <status_t> (reply.readInt32());
1050 *id = reply.readInt32();
1051 return status;
1052 }
1053
1054 virtual status_t removeStreamDefaultEffect(audio_unique_id_t id)
1055 {
1056 Parcel data, reply;
1057 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1058 data.writeInt32(id);
1059 status_t status = remote()->transact(REMOVE_STREAM_DEFAULT_EFFECT, data, &reply);
1060 if (status != NO_ERROR) {
1061 return status;
1062 }
1063 return static_cast <status_t> (reply.readInt32());
1064 }
1065
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001066 virtual status_t addSourceDefaultEffect(const effect_uuid_t *type,
1067 const String16& opPackageName,
1068 const effect_uuid_t *uuid,
1069 int32_t priority,
1070 audio_source_t source,
1071 audio_unique_id_t* id)
1072 {
1073 Parcel data, reply;
1074 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1075 data.write(type, sizeof(effect_uuid_t));
1076 data.writeString16(opPackageName);
1077 data.write(uuid, sizeof(effect_uuid_t));
1078 data.writeInt32(priority);
1079 data.writeInt32((int32_t) source);
1080 status_t status = remote()->transact(ADD_SOURCE_DEFAULT_EFFECT, data, &reply);
1081 if (status != NO_ERROR) {
1082 return status;
1083 }
1084 status = static_cast <status_t> (reply.readInt32());
1085 *id = reply.readInt32();
1086 return status;
1087 }
1088
1089 virtual status_t removeSourceDefaultEffect(audio_unique_id_t id)
1090 {
1091 Parcel data, reply;
1092 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1093 data.writeInt32(id);
1094 status_t status = remote()->transact(REMOVE_SOURCE_DEFAULT_EFFECT, data, &reply);
1095 if (status != NO_ERROR) {
1096 return status;
1097 }
1098 return static_cast <status_t> (reply.readInt32());
1099 }
1100
Eric Laurentb78763e2018-10-17 10:08:02 -07001101 virtual status_t setAssistantUid(uid_t uid)
1102 {
1103 Parcel data, reply;
1104 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1105 data.writeInt32(uid);
1106 status_t status = remote()->transact(SET_ASSISTANT_UID, data, &reply);
1107 if (status != NO_ERROR) {
1108 return status;
1109 }
1110 return static_cast <status_t> (reply.readInt32());
1111 }
1112
1113 virtual status_t setA11yServicesUids(const std::vector<uid_t>& uids)
1114 {
1115 Parcel data, reply;
1116 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1117 data.writeInt32(uids.size());
1118 for (auto uid : uids) {
1119 data.writeInt32(uid);
1120 }
1121 status_t status = remote()->transact(SET_A11Y_SERVICES_UIDS, data, &reply);
1122 if (status != NO_ERROR) {
1123 return status;
1124 }
1125 return static_cast <status_t> (reply.readInt32());
1126 }
1127
jiabin6012f912018-11-02 17:06:30 -07001128 virtual bool isHapticPlaybackSupported()
1129 {
1130 Parcel data, reply;
1131 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1132 status_t status = remote()->transact(IS_HAPTIC_PLAYBACK_SUPPORTED, data, &reply);
1133 if (status != NO_ERROR) {
1134 return false;
1135 }
1136 return reply.readBool();
1137 }
1138
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001139 virtual status_t setUidDeviceAffinities(uid_t uid, const Vector<AudioDeviceTypeAddr>& devices)
1140 {
1141 Parcel data, reply;
1142 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1143
1144 data.writeInt32((int32_t) uid);
1145 size_t size = devices.size();
1146 size_t sizePosition = data.dataPosition();
1147 data.writeInt32((int32_t) size);
1148 size_t finalSize = size;
1149 for (size_t i = 0; i < size; i++) {
1150 size_t position = data.dataPosition();
1151 if (devices[i].writeToParcel(&data) != NO_ERROR) {
1152 data.setDataPosition(position);
1153 finalSize--;
1154 }
1155 }
1156 if (size != finalSize) {
1157 size_t position = data.dataPosition();
1158 data.setDataPosition(sizePosition);
1159 data.writeInt32(finalSize);
1160 data.setDataPosition(position);
1161 }
1162
1163 status_t status = remote()->transact(SET_UID_DEVICE_AFFINITY, data, &reply);
1164 if (status == NO_ERROR) {
1165 status = (status_t)reply.readInt32();
1166 }
1167 return status;
1168 }
1169
François Gaffied0ba9ed2018-11-05 11:50:42 +01001170 virtual status_t removeUidDeviceAffinities(uid_t uid) {
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001171 Parcel data, reply;
1172 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1173
1174 data.writeInt32((int32_t) uid);
1175
François Gaffied0ba9ed2018-11-05 11:50:42 +01001176 status_t status =
1177 remote()->transact(REMOVE_UID_DEVICE_AFFINITY, data, &reply);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001178 if (status == NO_ERROR) {
François Gaffied0ba9ed2018-11-05 11:50:42 +01001179 status = (status_t) reply.readInt32();
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001180 }
1181 return status;
1182 }
François Gaffied0ba9ed2018-11-05 11:50:42 +01001183
1184 virtual status_t listAudioProductStrategies(AudioProductStrategyVector &strategies)
1185 {
1186 Parcel data, reply;
1187 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1188
1189 status_t status = remote()->transact(LIST_AUDIO_PRODUCT_STRATEGIES, data, &reply);
1190 if (status != NO_ERROR) {
1191 ALOGE("%s: permission denied", __func__);
1192 return status;
1193 }
1194 status = static_cast<status_t>(reply.readInt32());
François Gaffie4b2018b2018-11-07 11:18:59 +01001195 if (status != NO_ERROR) {
1196 return status;
François Gaffied0ba9ed2018-11-05 11:50:42 +01001197 }
François Gaffie4b2018b2018-11-07 11:18:59 +01001198 uint32_t numStrategies = static_cast<uint32_t>(reply.readInt32());
1199 for (size_t i = 0; i < numStrategies; i++) {
1200 AudioProductStrategy strategy;
1201 status = strategy.readFromParcel(&reply);
1202 if (status != NO_ERROR) {
1203 ALOGE("%s: failed to read strategies", __FUNCTION__);
1204 strategies.clear();
1205 return status;
1206 }
1207 strategies.push_back(strategy);
1208 }
1209 return NO_ERROR;
François Gaffied0ba9ed2018-11-05 11:50:42 +01001210 }
1211
François Gaffie4b2018b2018-11-07 11:18:59 +01001212 virtual status_t getProductStrategyFromAudioAttributes(const AudioAttributes &aa,
1213 product_strategy_t &productStrategy)
François Gaffied0ba9ed2018-11-05 11:50:42 +01001214 {
1215 Parcel data, reply;
1216 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1217 status_t status = aa.writeToParcel(&data);
1218 if (status != NO_ERROR) {
François Gaffie4b2018b2018-11-07 11:18:59 +01001219 return status;
François Gaffied0ba9ed2018-11-05 11:50:42 +01001220 }
1221 status = remote()->transact(GET_STRATEGY_FOR_ATTRIBUTES, data, &reply);
François Gaffie4b2018b2018-11-07 11:18:59 +01001222 if (status != NO_ERROR) {
1223 return status;
François Gaffied0ba9ed2018-11-05 11:50:42 +01001224 }
François Gaffie4b2018b2018-11-07 11:18:59 +01001225 status = static_cast<status_t>(reply.readInt32());
1226 if (status != NO_ERROR) {
1227 return status;
1228 }
1229 productStrategy = static_cast<product_strategy_t>(reply.readInt32());
1230 return NO_ERROR;
1231 }
1232
1233 virtual status_t listAudioVolumeGroups(AudioVolumeGroupVector &groups)
1234 {
1235 Parcel data, reply;
1236 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1237
1238 status_t status = remote()->transact(LIST_AUDIO_VOLUME_GROUPS, data, &reply);
1239 if (status != NO_ERROR) {
1240 return status;
1241 }
1242 status = static_cast<status_t>(reply.readInt32());
1243 if (status != NO_ERROR) {
1244 return status;
1245 }
1246 uint32_t numGroups = static_cast<uint32_t>(reply.readInt32());
1247 for (size_t i = 0; i < numGroups; i++) {
1248 AudioVolumeGroup group;
1249 status = group.readFromParcel(&reply);
1250 if (status != NO_ERROR) {
1251 ALOGE("%s: failed to read volume groups", __FUNCTION__);
1252 groups.clear();
1253 return status;
1254 }
1255 groups.push_back(group);
1256 }
1257 return NO_ERROR;
1258 }
1259
1260 virtual status_t getVolumeGroupFromAudioAttributes(const AudioAttributes &aa,
1261 volume_group_t &volumeGroup)
1262 {
1263 Parcel data, reply;
1264 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1265 status_t status = aa.writeToParcel(&data);
1266 if (status != NO_ERROR) {
1267 return status;
1268 }
1269 status = remote()->transact(GET_VOLUME_GROUP_FOR_ATTRIBUTES, data, &reply);
1270 if (status != NO_ERROR) {
1271 return status;
1272 }
1273 status = static_cast<status_t>(reply.readInt32());
1274 if (status != NO_ERROR) {
1275 return status;
1276 }
1277 volumeGroup = static_cast<volume_group_t>(reply.readInt32());
1278 return NO_ERROR;
François Gaffied0ba9ed2018-11-05 11:50:42 +01001279 }
Eric Laurent6ede98f2019-06-11 14:50:30 -07001280
1281 virtual status_t setRttEnabled(bool enabled)
1282 {
1283 Parcel data, reply;
1284 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1285 data.writeInt32(static_cast<int32_t>(enabled));
1286 status_t status = remote()->transact(SET_RTT_ENABLED, data, &reply);
1287 if (status != NO_ERROR) {
1288 return status;
1289 }
1290 return static_cast<status_t>(reply.readInt32());
1291 }
Eric Laurent8340e672019-11-06 11:01:08 -08001292
1293 virtual bool isCallScreenModeSupported()
1294 {
1295 Parcel data, reply;
1296 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1297 status_t status = remote()->transact(IS_CALL_SCREEN_MODE_SUPPORTED, data, &reply);
1298 if (status != NO_ERROR) {
1299 return false;
1300 }
1301 return reply.readBool();
1302 }
Jean-Michel Trivi30857152019-11-01 11:04:15 -07001303
1304 virtual status_t setPreferredDeviceForStrategy(product_strategy_t strategy,
1305 const AudioDeviceTypeAddr &device)
1306 {
1307 Parcel data, reply;
1308 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1309 data.writeUint32(static_cast<uint32_t>(strategy));
1310 status_t status = device.writeToParcel(&data);
1311 if (status != NO_ERROR) {
1312 return BAD_VALUE;
1313 }
1314 status = remote()->transact(SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY,
1315 data, &reply);
1316 if (status != NO_ERROR) {
1317 return status;
1318 }
1319 return static_cast<status_t>(reply.readInt32());
1320 }
1321
1322 virtual status_t removePreferredDeviceForStrategy(product_strategy_t strategy)
1323 {
1324 Parcel data, reply;
1325 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1326 data.writeUint32(static_cast<uint32_t>(strategy));
1327 status_t status = remote()->transact(REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY,
1328 data, &reply);
1329 if (status != NO_ERROR) {
1330 return status;
1331 }
1332 return static_cast<status_t>(reply.readInt32());
1333 }
1334
1335 virtual status_t getPreferredDeviceForStrategy(product_strategy_t strategy,
1336 AudioDeviceTypeAddr &device)
1337 {
1338 Parcel data, reply;
1339 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1340 data.writeUint32(static_cast<uint32_t>(strategy));
1341 status_t status = remote()->transact(GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY,
1342 data, &reply);
1343 if (status != NO_ERROR) {
1344 return status;
1345 }
1346 status = device.readFromParcel(&reply);
1347 if (status != NO_ERROR) {
1348 return status;
1349 }
1350 return static_cast<status_t>(reply.readInt32());
1351 }
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001352
1353 virtual status_t getDevicesForAttributes(const AudioAttributes &aa,
1354 AudioDeviceTypeAddrVector *devices) const
1355 {
1356 if (devices == nullptr) {
1357 return BAD_VALUE;
1358 }
1359 Parcel data, reply;
1360 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1361 status_t status = aa.writeToParcel(&data);
1362 if (status != NO_ERROR) {
1363 return status;
1364 }
1365 status = remote()->transact(GET_DEVICES_FOR_ATTRIBUTES, data, &reply);
1366 if (status != NO_ERROR) {
1367 // transaction failed, return error
1368 return status;
1369 }
1370 status = static_cast<status_t>(reply.readInt32());
1371 if (status != NO_ERROR) {
1372 // APM method call failed, return error
1373 return status;
1374 }
1375
1376 const size_t numberOfDevices = (size_t)reply.readInt32();
1377 for (size_t i = 0; i < numberOfDevices; i++) {
1378 AudioDeviceTypeAddr device;
1379 if (device.readFromParcel((Parcel*)&reply) == NO_ERROR) {
1380 devices->push_back(device);
1381 } else {
1382 return FAILED_TRANSACTION;
1383 }
1384 }
1385 return NO_ERROR;
1386 }
Eric Laurentc2f1f072009-07-17 12:17:14 -07001387};
1388
1389IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
1390
1391// ----------------------------------------------------------------------
1392
Eric Laurentc2f1f072009-07-17 12:17:14 -07001393status_t BnAudioPolicyService::onTransact(
1394 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
1395{
Eric Laurentb1cc36b2017-12-11 12:14:16 -08001396 // make sure transactions reserved to AudioFlinger do not come from other processes
1397 switch (code) {
1398 case START_OUTPUT:
1399 case STOP_OUTPUT:
1400 case RELEASE_OUTPUT:
1401 case GET_INPUT_FOR_ATTR:
1402 case START_INPUT:
1403 case STOP_INPUT:
1404 case RELEASE_INPUT:
Eric Laurentb1cc36b2017-12-11 12:14:16 -08001405 case GET_OUTPUT_FOR_EFFECT:
1406 case REGISTER_EFFECT:
1407 case UNREGISTER_EFFECT:
1408 case SET_EFFECT_ENABLED:
1409 case GET_OUTPUT_FOR_ATTR:
Eric Laurent6c796322019-04-09 14:13:17 -07001410 case MOVE_EFFECTS_TO_IO:
Eric Laurentb1cc36b2017-12-11 12:14:16 -08001411 ALOGW("%s: transaction %d received from PID %d",
1412 __func__, code, IPCThreadState::self()->getCallingPid());
Eric Laurentef92bff2018-04-26 10:44:50 -07001413 // return status only for non void methods
1414 switch (code) {
1415 case RELEASE_OUTPUT:
1416 case RELEASE_INPUT:
1417 break;
1418 default:
1419 reply->writeInt32(static_cast<int32_t> (INVALID_OPERATION));
1420 break;
1421 }
1422 return OK;
Eric Laurentb1cc36b2017-12-11 12:14:16 -08001423 default:
1424 break;
1425 }
1426
Eric Laurent4980df22018-01-26 18:04:09 -08001427 // make sure the following transactions come from system components
1428 switch (code) {
1429 case SET_DEVICE_CONNECTION_STATE:
1430 case HANDLE_DEVICE_CONFIG_CHANGE:
1431 case SET_PHONE_STATE:
Eric Laurente17378d2018-05-09 14:43:01 -07001432//FIXME: Allow SET_FORCE_USE calls from system apps until a better use case routing API is available
1433// case SET_FORCE_USE:
Eric Laurent4980df22018-01-26 18:04:09 -08001434 case INIT_STREAM_VOLUME:
1435 case SET_STREAM_VOLUME:
1436 case REGISTER_POLICY_MIXES:
Eric Laurent10b71232018-04-13 18:14:44 -07001437 case SET_MASTER_MONO:
jiabin81772902018-04-02 17:52:27 -07001438 case GET_SURROUND_FORMATS:
Eric Laurentb78763e2018-10-17 10:08:02 -07001439 case SET_SURROUND_FORMAT_ENABLED:
1440 case SET_ASSISTANT_UID:
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001441 case SET_A11Y_SERVICES_UIDS:
1442 case SET_UID_DEVICE_AFFINITY:
Arun Mirpuri11029ad2018-12-19 20:45:19 -08001443 case REMOVE_UID_DEVICE_AFFINITY:
François Gaffie4b2018b2018-11-07 11:18:59 +01001444 case GET_OFFLOAD_FORMATS_A2DP:
1445 case LIST_AUDIO_VOLUME_GROUPS:
Eric Laurent6ede98f2019-06-11 14:50:30 -07001446 case GET_VOLUME_GROUP_FOR_ATTRIBUTES:
Ytai Ben-Tsvia32e6012019-10-28 15:39:16 -07001447 case ACQUIRE_SOUNDTRIGGER_SESSION:
1448 case RELEASE_SOUNDTRIGGER_SESSION:
Eric Laurent8340e672019-11-06 11:01:08 -08001449 case SET_RTT_ENABLED:
Jean-Michel Trivi30857152019-11-01 11:04:15 -07001450 case IS_CALL_SCREEN_MODE_SUPPORTED:
1451 case SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY:
1452 case REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY:
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001453 case GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY:
jiabin140a34f2019-12-23 11:17:25 -08001454 case GET_DEVICES_FOR_ATTRIBUTES:
1455 case SET_ALLOWED_CAPTURE_POLICY: {
Andy Hung4ef19fa2018-05-15 19:35:29 -07001456 if (!isServiceUid(IPCThreadState::self()->getCallingUid())) {
Eric Laurent4980df22018-01-26 18:04:09 -08001457 ALOGW("%s: transaction %d received from PID %d unauthorized UID %d",
1458 __func__, code, IPCThreadState::self()->getCallingPid(),
1459 IPCThreadState::self()->getCallingUid());
Eric Laurentef92bff2018-04-26 10:44:50 -07001460 reply->writeInt32(static_cast<int32_t> (INVALID_OPERATION));
1461 return OK;
Eric Laurent4980df22018-01-26 18:04:09 -08001462 }
Eric Laurent96c7eed2018-03-26 17:57:01 -07001463 } break;
Eric Laurent4980df22018-01-26 18:04:09 -08001464 default:
1465 break;
1466 }
1467
Eric Laurent39b09b52018-06-29 12:24:40 -07001468 std::string tag("IAudioPolicyService command " + std::to_string(code));
1469 TimeCheck check(tag.c_str());
Eric Laurent3528c932018-02-23 17:17:22 -08001470
Glenn Kastene53b9ea2012-03-12 16:29:55 -07001471 switch (code) {
Eric Laurentc2f1f072009-07-17 12:17:14 -07001472 case SET_DEVICE_CONNECTION_STATE: {
1473 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001474 audio_devices_t device =
1475 static_cast <audio_devices_t>(data.readInt32());
1476 audio_policy_dev_state_t state =
1477 static_cast <audio_policy_dev_state_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -07001478 const char *device_address = data.readCString();
Paul McLeane743a472015-01-28 11:07:31 -08001479 const char *device_name = data.readCString();
Aniket Kumar Lata4e464702019-01-10 23:38:46 -08001480 audio_format_t codecFormat = static_cast <audio_format_t>(data.readInt32());
Pavlin Radoslavovc694ff42017-01-09 23:27:29 -08001481 if (device_address == nullptr || device_name == nullptr) {
1482 ALOGE("Bad Binder transaction: SET_DEVICE_CONNECTION_STATE for device %u", device);
1483 reply->writeInt32(static_cast<int32_t> (BAD_VALUE));
1484 } else {
1485 reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device,
1486 state,
1487 device_address,
Aniket Kumar Lata4e464702019-01-10 23:38:46 -08001488 device_name,
1489 codecFormat)));
Pavlin Radoslavovc694ff42017-01-09 23:27:29 -08001490 }
Eric Laurentc2f1f072009-07-17 12:17:14 -07001491 return NO_ERROR;
1492 } break;
1493
1494 case GET_DEVICE_CONNECTION_STATE: {
1495 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001496 audio_devices_t device =
1497 static_cast<audio_devices_t> (data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -07001498 const char *device_address = data.readCString();
Pavlin Radoslavovc694ff42017-01-09 23:27:29 -08001499 if (device_address == nullptr) {
1500 ALOGE("Bad Binder transaction: GET_DEVICE_CONNECTION_STATE for device %u", device);
1501 reply->writeInt32(static_cast<int32_t> (AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE));
1502 } else {
1503 reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device,
1504 device_address)));
1505 }
Eric Laurentc2f1f072009-07-17 12:17:14 -07001506 return NO_ERROR;
1507 } break;
1508
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -08001509 case HANDLE_DEVICE_CONFIG_CHANGE: {
1510 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1511 audio_devices_t device =
1512 static_cast <audio_devices_t>(data.readInt32());
1513 const char *device_address = data.readCString();
1514 const char *device_name = data.readCString();
Aniket Kumar Lata4e464702019-01-10 23:38:46 -08001515 audio_format_t codecFormat =
1516 static_cast <audio_format_t>(data.readInt32());
Pavlin Radoslavovc694ff42017-01-09 23:27:29 -08001517 if (device_address == nullptr || device_name == nullptr) {
1518 ALOGE("Bad Binder transaction: HANDLE_DEVICE_CONFIG_CHANGE for device %u", device);
1519 reply->writeInt32(static_cast<int32_t> (BAD_VALUE));
1520 } else {
1521 reply->writeInt32(static_cast<uint32_t> (handleDeviceConfigChange(device,
1522 device_address,
Aniket Kumar Lata4e464702019-01-10 23:38:46 -08001523 device_name,
1524 codecFormat)));
Pavlin Radoslavovc694ff42017-01-09 23:27:29 -08001525 }
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -08001526 return NO_ERROR;
1527 } break;
1528
Eric Laurentc2f1f072009-07-17 12:17:14 -07001529 case SET_PHONE_STATE: {
1530 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kasten85ab62c2012-11-01 11:11:38 -07001531 reply->writeInt32(static_cast <uint32_t>(setPhoneState(
1532 (audio_mode_t) data.readInt32())));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001533 return NO_ERROR;
1534 } break;
1535
Eric Laurentc2f1f072009-07-17 12:17:14 -07001536 case SET_FORCE_USE: {
1537 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kasten85ab62c2012-11-01 11:11:38 -07001538 audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
1539 data.readInt32());
Dima Zavinfce7a472011-04-19 22:30:36 -07001540 audio_policy_forced_cfg_t config =
1541 static_cast <audio_policy_forced_cfg_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -07001542 reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config)));
1543 return NO_ERROR;
1544 } break;
1545
1546 case GET_FORCE_USE: {
1547 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kasten85ab62c2012-11-01 11:11:38 -07001548 audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
1549 data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -07001550 reply->writeInt32(static_cast <uint32_t>(getForceUse(usage)));
1551 return NO_ERROR;
1552 } break;
1553
1554 case GET_OUTPUT: {
1555 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001556 audio_stream_type_t stream =
1557 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentf4e63452017-11-06 19:31:46 +00001558 audio_io_handle_t output = getOutput(stream);
Eric Laurentfa2877b2009-07-28 08:44:33 -07001559 reply->writeInt32(static_cast <int>(output));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001560 return NO_ERROR;
1561 } break;
1562
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -07001563 case GET_OUTPUT_FOR_ATTR: {
1564 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurent42984412019-05-09 17:57:03 -07001565 audio_attributes_t attr = AUDIO_ATTRIBUTES_INITIALIZER;
1566 status_t status = data.read(&attr, sizeof(audio_attributes_t));
1567 if (status != NO_ERROR) {
1568 return status;
Eric Laurente83b55d2014-11-14 10:06:21 -08001569 }
Eric Laurent42984412019-05-09 17:57:03 -07001570 sanetizeAudioAttributes(&attr);
Eric Laurente83b55d2014-11-14 10:06:21 -08001571 audio_session_t session = (audio_session_t)data.readInt32();
1572 audio_stream_type_t stream = AUDIO_STREAM_DEFAULT;
1573 bool hasStream = data.readInt32() != 0;
1574 if (hasStream) {
1575 stream = (audio_stream_type_t)data.readInt32();
1576 }
Nadav Bar766fb022018-01-07 12:18:03 +02001577 pid_t pid = (pid_t)data.readInt32();
Eric Laurent8c7e6da2015-04-21 17:37:00 -07001578 uid_t uid = (uid_t)data.readInt32();
Eric Laurent20b9ef02016-12-05 11:03:16 -08001579 audio_config_t config;
1580 memset(&config, 0, sizeof(audio_config_t));
1581 data.read(&config, sizeof(audio_config_t));
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -07001582 audio_output_flags_t flags =
1583 static_cast <audio_output_flags_t>(data.readInt32());
Paul McLeanaa981192015-03-21 09:55:15 -07001584 audio_port_handle_t selectedDeviceId = data.readInt32();
Eric Laurent20b9ef02016-12-05 11:03:16 -08001585 audio_port_handle_t portId = (audio_port_handle_t)data.readInt32();
Robert Shiha946d842015-09-02 16:46:59 -07001586 audio_io_handle_t output = 0;
Kevin Rocard153f92d2018-12-18 18:33:28 -08001587 std::vector<audio_io_handle_t> secondaryOutputs;
Eric Laurent42984412019-05-09 17:57:03 -07001588 status = getOutputForAttr(&attr,
Nadav Bar766fb022018-01-07 12:18:03 +02001589 &output, session, &stream, pid, uid,
Eric Laurent20b9ef02016-12-05 11:03:16 -08001590 &config,
Kevin Rocard153f92d2018-12-18 18:33:28 -08001591 flags, &selectedDeviceId, &portId, &secondaryOutputs);
Eric Laurente83b55d2014-11-14 10:06:21 -08001592 reply->writeInt32(status);
Eric Laurent42984412019-05-09 17:57:03 -07001593 status = reply->write(&attr, sizeof(audio_attributes_t));
1594 if (status != NO_ERROR) {
1595 return status;
1596 }
Eric Laurente83b55d2014-11-14 10:06:21 -08001597 reply->writeInt32(output);
1598 reply->writeInt32(stream);
Eric Laurent9ae8c592017-06-22 17:17:09 -07001599 reply->writeInt32(selectedDeviceId);
Eric Laurent20b9ef02016-12-05 11:03:16 -08001600 reply->writeInt32(portId);
Kevin Rocard153f92d2018-12-18 18:33:28 -08001601 reply->writeInt32(secondaryOutputs.size());
1602 return reply->write(secondaryOutputs.data(),
1603 secondaryOutputs.size() * sizeof(audio_io_handle_t));
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -07001604 } break;
1605
Eric Laurentc2f1f072009-07-17 12:17:14 -07001606 case START_OUTPUT: {
1607 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentd7fe0862018-07-14 16:48:01 -07001608 const audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
1609 reply->writeInt32(static_cast <uint32_t>(startOutput(portId)));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001610 return NO_ERROR;
1611 } break;
1612
1613 case STOP_OUTPUT: {
1614 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentd7fe0862018-07-14 16:48:01 -07001615 const audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
1616 reply->writeInt32(static_cast <uint32_t>(stopOutput(portId)));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001617 return NO_ERROR;
1618 } break;
1619
1620 case RELEASE_OUTPUT: {
1621 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentd7fe0862018-07-14 16:48:01 -07001622 const audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
1623 releaseOutput(portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -07001624 return NO_ERROR;
1625 } break;
1626
Eric Laurentcaf7f482014-11-25 17:50:47 -08001627 case GET_INPUT_FOR_ATTR: {
Eric Laurentc2f1f072009-07-17 12:17:14 -07001628 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07001629 audio_attributes_t attr = {};
Eric Laurentcaf7f482014-11-25 17:50:47 -08001630 data.read(&attr, sizeof(audio_attributes_t));
Kevin Rocard39fdbd02017-11-13 11:15:27 -08001631 sanetizeAudioAttributes(&attr);
Eric Laurenta54f1282017-07-01 19:39:32 -07001632 audio_io_handle_t input = (audio_io_handle_t)data.readInt32();
Mikhail Naganov2996f672019-04-18 12:29:59 -07001633 audio_unique_id_t riid = (audio_unique_id_t)data.readInt32();
Eric Laurentcaf7f482014-11-25 17:50:47 -08001634 audio_session_t session = (audio_session_t)data.readInt32();
Eric Laurentb2379ba2016-05-23 17:42:12 -07001635 pid_t pid = (pid_t)data.readInt32();
Eric Laurent8c7e6da2015-04-21 17:37:00 -07001636 uid_t uid = (uid_t)data.readInt32();
Eric Laurentfee19762018-01-29 18:44:13 -08001637 const String16 opPackageName = data.readString16();
Eric Laurent20b9ef02016-12-05 11:03:16 -08001638 audio_config_base_t config;
1639 memset(&config, 0, sizeof(audio_config_base_t));
1640 data.read(&config, sizeof(audio_config_base_t));
Glenn Kastenb3b16602014-07-16 08:36:31 -07001641 audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
Paul McLean466dc8e2015-04-17 13:15:36 -06001642 audio_port_handle_t selectedDeviceId = (audio_port_handle_t) data.readInt32();
Eric Laurent20b9ef02016-12-05 11:03:16 -08001643 audio_port_handle_t portId = (audio_port_handle_t)data.readInt32();
Mikhail Naganov2996f672019-04-18 12:29:59 -07001644 status_t status = getInputForAttr(&attr, &input, riid, session, pid, uid,
Eric Laurentfee19762018-01-29 18:44:13 -08001645 opPackageName, &config,
Eric Laurent9ae8c592017-06-22 17:17:09 -07001646 flags, &selectedDeviceId, &portId);
Eric Laurentcaf7f482014-11-25 17:50:47 -08001647 reply->writeInt32(status);
1648 if (status == NO_ERROR) {
1649 reply->writeInt32(input);
Eric Laurent9ae8c592017-06-22 17:17:09 -07001650 reply->writeInt32(selectedDeviceId);
Eric Laurent20b9ef02016-12-05 11:03:16 -08001651 reply->writeInt32(portId);
Eric Laurentcaf7f482014-11-25 17:50:47 -08001652 }
Eric Laurentc2f1f072009-07-17 12:17:14 -07001653 return NO_ERROR;
1654 } break;
1655
1656 case START_INPUT: {
1657 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfee19762018-01-29 18:44:13 -08001658 audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
Eric Laurent4eb58f12018-12-07 16:41:02 -08001659 status_t status = startInput(portId);
Svet Ganovf4ddfef2018-01-16 07:37:58 -08001660 reply->writeInt32(static_cast <uint32_t>(status));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001661 return NO_ERROR;
1662 } break;
1663
1664 case STOP_INPUT: {
1665 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfee19762018-01-29 18:44:13 -08001666 audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
1667 reply->writeInt32(static_cast <uint32_t>(stopInput(portId)));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001668 return NO_ERROR;
1669 } break;
1670
1671 case RELEASE_INPUT: {
1672 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfee19762018-01-29 18:44:13 -08001673 audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
1674 releaseInput(portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -07001675 return NO_ERROR;
1676 } break;
1677
1678 case INIT_STREAM_VOLUME: {
1679 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001680 audio_stream_type_t stream =
1681 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -07001682 int indexMin = data.readInt32();
1683 int indexMax = data.readInt32();
1684 reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax)));
1685 return NO_ERROR;
1686 } break;
1687
1688 case SET_STREAM_VOLUME: {
1689 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001690 audio_stream_type_t stream =
1691 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -07001692 int index = data.readInt32();
Eric Laurent83844cc2011-11-18 16:43:31 -08001693 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
1694 reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream,
1695 index,
1696 device)));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001697 return NO_ERROR;
1698 } break;
1699
1700 case GET_STREAM_VOLUME: {
1701 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001702 audio_stream_type_t stream =
1703 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurent83844cc2011-11-18 16:43:31 -08001704 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
Robert Shih89235432015-09-02 16:46:59 -07001705 int index = 0;
Eric Laurent83844cc2011-11-18 16:43:31 -08001706 status_t status = getStreamVolumeIndex(stream, &index, device);
Eric Laurentc2f1f072009-07-17 12:17:14 -07001707 reply->writeInt32(index);
1708 reply->writeInt32(static_cast <uint32_t>(status));
1709 return NO_ERROR;
1710 } break;
1711
Eric Laurentde070132010-07-13 04:45:46 -07001712 case GET_STRATEGY_FOR_STREAM: {
1713 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001714 audio_stream_type_t stream =
1715 static_cast <audio_stream_type_t>(data.readInt32());
François Gaffiec005e562018-11-06 15:04:49 +01001716 reply->writeUint32(getStrategyForStream(stream));
Eric Laurentde070132010-07-13 04:45:46 -07001717 return NO_ERROR;
1718 } break;
1719
François Gaffiecfe17322018-11-07 13:41:29 +01001720 case SET_VOLUME_ATTRIBUTES: {
1721 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1722 audio_attributes_t attributes = {};
1723 status_t status = data.read(&attributes, sizeof(audio_attributes_t));
1724 if (status != NO_ERROR) {
1725 return status;
1726 }
1727 int index = data.readInt32();
1728 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
1729
1730 reply->writeInt32(static_cast <uint32_t>(setVolumeIndexForAttributes(attributes,
1731 index, device)));
1732 return NO_ERROR;
1733 } break;
1734
1735 case GET_VOLUME_ATTRIBUTES: {
1736 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1737 audio_attributes_t attributes = {};
1738 status_t status = data.read(&attributes, sizeof(audio_attributes_t));
1739 if (status != NO_ERROR) {
1740 return status;
1741 }
1742 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
1743
1744 int index = 0;
1745 status = getVolumeIndexForAttributes(attributes, index, device);
1746 reply->writeInt32(static_cast <uint32_t>(status));
1747 if (status == NO_ERROR) {
1748 reply->writeInt32(index);
1749 }
1750 return NO_ERROR;
1751 } break;
1752
1753 case GET_MIN_VOLUME_FOR_ATTRIBUTES: {
1754 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1755 audio_attributes_t attributes = {};
1756 status_t status = data.read(&attributes, sizeof(audio_attributes_t));
1757 if (status != NO_ERROR) {
1758 return status;
1759 }
1760
1761 int index = 0;
1762 status = getMinVolumeIndexForAttributes(attributes, index);
1763 reply->writeInt32(static_cast <uint32_t>(status));
1764 if (status == NO_ERROR) {
1765 reply->writeInt32(index);
1766 }
1767 return NO_ERROR;
1768 } break;
1769
1770 case GET_MAX_VOLUME_FOR_ATTRIBUTES: {
1771 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1772 audio_attributes_t attributes = {};
1773 status_t status = data.read(&attributes, sizeof(audio_attributes_t));
1774 if (status != NO_ERROR) {
1775 return status;
1776 }
1777
1778 int index = 0;
1779 status = getMaxVolumeIndexForAttributes(attributes, index);
1780 reply->writeInt32(static_cast <uint32_t>(status));
1781 if (status == NO_ERROR) {
1782 reply->writeInt32(index);
1783 }
1784 return NO_ERROR;
1785 } break;
1786
Glenn Kasten6b2718c2011-02-04 13:54:26 -08001787 case GET_DEVICES_FOR_STREAM: {
1788 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001789 audio_stream_type_t stream =
1790 static_cast <audio_stream_type_t>(data.readInt32());
Glenn Kasten6b2718c2011-02-04 13:54:26 -08001791 reply->writeInt32(static_cast <int>(getDevicesForStream(stream)));
1792 return NO_ERROR;
1793 } break;
1794
Eric Laurentde070132010-07-13 04:45:46 -07001795 case GET_OUTPUT_FOR_EFFECT: {
1796 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07001797 effect_descriptor_t desc = {};
1798 if (data.read(&desc, sizeof(desc)) != NO_ERROR) {
1799 android_errorWriteLog(0x534e4554, "73126106");
1800 }
1801 (void)sanitizeEffectDescriptor(&desc);
Eric Laurentde070132010-07-13 04:45:46 -07001802 audio_io_handle_t output = getOutputForEffect(&desc);
1803 reply->writeInt32(static_cast <int>(output));
1804 return NO_ERROR;
1805 } break;
1806
1807 case REGISTER_EFFECT: {
1808 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07001809 effect_descriptor_t desc = {};
1810 if (data.read(&desc, sizeof(desc)) != NO_ERROR) {
1811 android_errorWriteLog(0x534e4554, "73126106");
1812 }
1813 (void)sanitizeEffectDescriptor(&desc);
Eric Laurent7c7f10b2011-06-17 21:29:58 -07001814 audio_io_handle_t io = data.readInt32();
Eric Laurentde070132010-07-13 04:45:46 -07001815 uint32_t strategy = data.readInt32();
Glenn Kastend848eb42016-03-08 13:42:11 -08001816 audio_session_t session = (audio_session_t) data.readInt32();
Eric Laurentde070132010-07-13 04:45:46 -07001817 int id = data.readInt32();
1818 reply->writeInt32(static_cast <int32_t>(registerEffect(&desc,
Eric Laurent7c7f10b2011-06-17 21:29:58 -07001819 io,
Eric Laurentde070132010-07-13 04:45:46 -07001820 strategy,
1821 session,
1822 id)));
1823 return NO_ERROR;
1824 } break;
1825
1826 case UNREGISTER_EFFECT: {
1827 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1828 int id = data.readInt32();
1829 reply->writeInt32(static_cast <int32_t>(unregisterEffect(id)));
1830 return NO_ERROR;
1831 } break;
1832
Eric Laurentdb7c0792011-08-10 10:37:50 -07001833 case SET_EFFECT_ENABLED: {
1834 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1835 int id = data.readInt32();
1836 bool enabled = static_cast <bool>(data.readInt32());
1837 reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled)));
1838 return NO_ERROR;
1839 } break;
1840
Eric Laurent6c796322019-04-09 14:13:17 -07001841 case MOVE_EFFECTS_TO_IO: {
1842 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1843 std::vector<int> ids;
1844 int32_t size;
1845 status_t status = data.readInt32(&size);
1846 if (status != NO_ERROR) {
1847 return status;
1848 }
1849 if (size > MAX_ITEMS_PER_LIST) {
1850 return BAD_VALUE;
1851 }
1852 for (int32_t i = 0; i < size; i++) {
1853 int id;
1854 status = data.readInt32(&id);
1855 if (status != NO_ERROR) {
1856 return status;
1857 }
1858 ids.push_back(id);
1859 }
1860
1861 audio_io_handle_t io = data.readInt32();
1862 reply->writeInt32(static_cast <int32_t>(moveEffectsToIo(ids, io)));
1863 return NO_ERROR;
1864 } break;
1865
Eric Laurenteda6c362011-02-02 09:33:30 -08001866 case IS_STREAM_ACTIVE: {
1867 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kastenfff6d712012-01-12 16:38:12 -08001868 audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
Eric Laurenteda6c362011-02-02 09:33:30 -08001869 uint32_t inPastMs = (uint32_t)data.readInt32();
Eric Laurentebcb2542014-03-05 18:30:08 -08001870 reply->writeInt32( isStreamActive(stream, inPastMs) );
Eric Laurenteda6c362011-02-02 09:33:30 -08001871 return NO_ERROR;
1872 } break;
1873
Jean-Michel Trivi272ab542013-02-04 16:26:02 -08001874 case IS_STREAM_ACTIVE_REMOTELY: {
1875 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1876 audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1877 uint32_t inPastMs = (uint32_t)data.readInt32();
Eric Laurentebcb2542014-03-05 18:30:08 -08001878 reply->writeInt32( isStreamActiveRemotely(stream, inPastMs) );
Jean-Michel Trivi272ab542013-02-04 16:26:02 -08001879 return NO_ERROR;
1880 } break;
1881
Jean-Michel Trivid7086032012-10-10 12:11:16 -07001882 case IS_SOURCE_ACTIVE: {
1883 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1884 audio_source_t source = (audio_source_t) data.readInt32();
1885 reply->writeInt32( isSourceActive(source));
1886 return NO_ERROR;
1887 }
1888
Eric Laurent57dae992011-07-24 13:36:09 -07001889 case QUERY_DEFAULT_PRE_PROCESSING: {
1890 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kastend848eb42016-03-08 13:42:11 -08001891 audio_session_t audioSession = (audio_session_t) data.readInt32();
Eric Laurent57dae992011-07-24 13:36:09 -07001892 uint32_t count = data.readInt32();
Eric Laurent74adca92014-11-05 12:15:36 -08001893 if (count > AudioEffect::kMaxPreProcessing) {
1894 count = AudioEffect::kMaxPreProcessing;
1895 }
Eric Laurent57dae992011-07-24 13:36:09 -07001896 uint32_t retCount = count;
Andy Hungb0272092018-04-12 11:06:56 -07001897 effect_descriptor_t *descriptors = new effect_descriptor_t[count]{};
Eric Laurent57dae992011-07-24 13:36:09 -07001898 status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount);
1899 reply->writeInt32(status);
1900 if (status != NO_ERROR && status != NO_MEMORY) {
1901 retCount = 0;
1902 }
1903 reply->writeInt32(retCount);
Eric Laurent74adca92014-11-05 12:15:36 -08001904 if (retCount != 0) {
Eric Laurent57dae992011-07-24 13:36:09 -07001905 if (retCount < count) {
1906 count = retCount;
1907 }
1908 reply->write(descriptors, sizeof(effect_descriptor_t) * count);
1909 }
1910 delete[] descriptors;
1911 return status;
1912 }
1913
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +01001914 case IS_OFFLOAD_SUPPORTED: {
1915 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07001916 audio_offload_info_t info = {};
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +01001917 data.read(&info, sizeof(audio_offload_info_t));
1918 bool isSupported = isOffloadSupported(info);
1919 reply->writeInt32(isSupported);
1920 return NO_ERROR;
1921 }
1922
Michael Chana94fbb22018-04-24 14:31:19 +10001923 case IS_DIRECT_OUTPUT_SUPPORTED: {
1924 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1925 audio_config_base_t config = {};
1926 audio_attributes_t attributes = {};
1927 status_t status = data.read(&config, sizeof(audio_config_base_t));
1928 if (status != NO_ERROR) return status;
1929 status = data.read(&attributes, sizeof(audio_attributes_t));
1930 if (status != NO_ERROR) return status;
1931 reply->writeInt32(isDirectOutputSupported(config, attributes));
1932 return NO_ERROR;
1933 }
1934
Eric Laurent203b1a12014-04-01 10:34:16 -07001935 case LIST_AUDIO_PORTS: {
1936 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1937 audio_port_role_t role = (audio_port_role_t)data.readInt32();
1938 audio_port_type_t type = (audio_port_type_t)data.readInt32();
1939 unsigned int numPortsReq = data.readInt32();
Eric Laurent1d670b12015-02-06 10:44:24 -08001940 if (numPortsReq > MAX_ITEMS_PER_LIST) {
1941 numPortsReq = MAX_ITEMS_PER_LIST;
1942 }
Eric Laurent203b1a12014-04-01 10:34:16 -07001943 unsigned int numPorts = numPortsReq;
Eric Laurent203b1a12014-04-01 10:34:16 -07001944 struct audio_port *ports =
1945 (struct audio_port *)calloc(numPortsReq, sizeof(struct audio_port));
Eric Laurent1d670b12015-02-06 10:44:24 -08001946 if (ports == NULL) {
1947 reply->writeInt32(NO_MEMORY);
1948 reply->writeInt32(0);
1949 return NO_ERROR;
1950 }
1951 unsigned int generation;
Eric Laurent203b1a12014-04-01 10:34:16 -07001952 status_t status = listAudioPorts(role, type, &numPorts, ports, &generation);
1953 reply->writeInt32(status);
1954 reply->writeInt32(numPorts);
Eric Laurent203b1a12014-04-01 10:34:16 -07001955
1956 if (status == NO_ERROR) {
1957 if (numPortsReq > numPorts) {
1958 numPortsReq = numPorts;
1959 }
1960 reply->write(ports, numPortsReq * sizeof(struct audio_port));
1961 reply->writeInt32(generation);
1962 }
1963 free(ports);
1964 return NO_ERROR;
1965 }
1966
1967 case GET_AUDIO_PORT: {
1968 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Wei Jiae995e472015-09-09 09:48:34 -07001969 struct audio_port port = {};
1970 if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) {
1971 ALOGE("b/23912202");
1972 }
Eric Laurent203b1a12014-04-01 10:34:16 -07001973 status_t status = getAudioPort(&port);
1974 reply->writeInt32(status);
1975 if (status == NO_ERROR) {
1976 reply->write(&port, sizeof(struct audio_port));
1977 }
1978 return NO_ERROR;
1979 }
1980
1981 case CREATE_AUDIO_PATCH: {
1982 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07001983 struct audio_patch patch = {};
Eric Laurent203b1a12014-04-01 10:34:16 -07001984 data.read(&patch, sizeof(struct audio_patch));
Glenn Kastena13cde92016-03-28 15:26:02 -07001985 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
Wei Jiae995e472015-09-09 09:48:34 -07001986 if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) {
1987 ALOGE("b/23912202");
1988 }
Eric Laurent203b1a12014-04-01 10:34:16 -07001989 status_t status = createAudioPatch(&patch, &handle);
1990 reply->writeInt32(status);
1991 if (status == NO_ERROR) {
1992 reply->write(&handle, sizeof(audio_patch_handle_t));
1993 }
1994 return NO_ERROR;
1995 }
1996
1997 case RELEASE_AUDIO_PATCH: {
1998 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07001999 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
Eric Laurent203b1a12014-04-01 10:34:16 -07002000 data.read(&handle, sizeof(audio_patch_handle_t));
2001 status_t status = releaseAudioPatch(handle);
2002 reply->writeInt32(status);
2003 return NO_ERROR;
2004 }
2005
2006 case LIST_AUDIO_PATCHES: {
2007 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2008 unsigned int numPatchesReq = data.readInt32();
Eric Laurent1d670b12015-02-06 10:44:24 -08002009 if (numPatchesReq > MAX_ITEMS_PER_LIST) {
2010 numPatchesReq = MAX_ITEMS_PER_LIST;
2011 }
Eric Laurent203b1a12014-04-01 10:34:16 -07002012 unsigned int numPatches = numPatchesReq;
Eric Laurent203b1a12014-04-01 10:34:16 -07002013 struct audio_patch *patches =
2014 (struct audio_patch *)calloc(numPatchesReq,
2015 sizeof(struct audio_patch));
Eric Laurent1d670b12015-02-06 10:44:24 -08002016 if (patches == NULL) {
2017 reply->writeInt32(NO_MEMORY);
2018 reply->writeInt32(0);
2019 return NO_ERROR;
2020 }
2021 unsigned int generation;
Eric Laurent203b1a12014-04-01 10:34:16 -07002022 status_t status = listAudioPatches(&numPatches, patches, &generation);
2023 reply->writeInt32(status);
2024 reply->writeInt32(numPatches);
2025 if (status == NO_ERROR) {
2026 if (numPatchesReq > numPatches) {
2027 numPatchesReq = numPatches;
2028 }
2029 reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
2030 reply->writeInt32(generation);
2031 }
2032 free(patches);
2033 return NO_ERROR;
2034 }
2035
2036 case SET_AUDIO_PORT_CONFIG: {
2037 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07002038 struct audio_port_config config = {};
Eric Laurent203b1a12014-04-01 10:34:16 -07002039 data.read(&config, sizeof(struct audio_port_config));
Andy Hungb0272092018-04-12 11:06:56 -07002040 (void)sanitizeAudioPortConfig(&config);
Eric Laurent203b1a12014-04-01 10:34:16 -07002041 status_t status = setAudioPortConfig(&config);
2042 reply->writeInt32(status);
2043 return NO_ERROR;
2044 }
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07002045
Eric Laurentb52c1522014-05-20 11:27:36 -07002046 case REGISTER_CLIENT: {
2047 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2048 sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
2049 data.readStrongBinder());
2050 registerClient(client);
2051 return NO_ERROR;
2052 } break;
Eric Laurent203b1a12014-04-01 10:34:16 -07002053
Eric Laurente8726fe2015-06-26 09:39:24 -07002054 case SET_AUDIO_PORT_CALLBACK_ENABLED: {
2055 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2056 setAudioPortCallbacksEnabled(data.readInt32() == 1);
2057 return NO_ERROR;
2058 } break;
2059
François Gaffiecfe17322018-11-07 13:41:29 +01002060 case SET_AUDIO_VOLUME_GROUP_CALLBACK_ENABLED: {
2061 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2062 setAudioVolumeGroupCallbacksEnabled(data.readInt32() == 1);
2063 return NO_ERROR;
2064 } break;
2065
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07002066 case ACQUIRE_SOUNDTRIGGER_SESSION: {
2067 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kastena13cde92016-03-28 15:26:02 -07002068 audio_session_t session = AUDIO_SESSION_NONE;
2069 audio_io_handle_t ioHandle = AUDIO_IO_HANDLE_NONE;
2070 audio_devices_t device = AUDIO_DEVICE_NONE;
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07002071 status_t status = acquireSoundTriggerSession(&session, &ioHandle, &device);
2072 reply->writeInt32(status);
2073 if (status == NO_ERROR) {
2074 reply->writeInt32(session);
2075 reply->writeInt32(ioHandle);
2076 reply->writeInt32(device);
2077 }
2078 return NO_ERROR;
2079 } break;
2080
2081 case RELEASE_SOUNDTRIGGER_SESSION: {
2082 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07002083 audio_session_t session = (audio_session_t)data.readInt32();
2084 status_t status = releaseSoundTriggerSession(session);
2085 reply->writeInt32(status);
2086 return NO_ERROR;
2087 } break;
2088
Eric Laurentbb6c9a02014-09-25 14:11:47 -07002089 case GET_PHONE_STATE: {
2090 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2091 reply->writeInt32((int32_t)getPhoneState());
2092 return NO_ERROR;
2093 } break;
2094
Eric Laurentbaac1832014-12-01 17:52:59 -08002095 case REGISTER_POLICY_MIXES: {
2096 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2097 bool registration = data.readInt32() == 1;
2098 Vector<AudioMix> mixes;
2099 size_t size = (size_t)data.readInt32();
2100 if (size > MAX_MIXES_PER_POLICY) {
2101 size = MAX_MIXES_PER_POLICY;
2102 }
2103 for (size_t i = 0; i < size; i++) {
2104 AudioMix mix;
2105 if (mix.readFromParcel((Parcel*)&data) == NO_ERROR) {
2106 mixes.add(mix);
2107 }
2108 }
2109 status_t status = registerPolicyMixes(mixes, registration);
2110 reply->writeInt32(status);
2111 return NO_ERROR;
2112 } break;
2113
Eric Laurent554a2772015-04-10 11:29:24 -07002114 case START_AUDIO_SOURCE: {
2115 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07002116 struct audio_port_config source = {};
Eric Laurent554a2772015-04-10 11:29:24 -07002117 data.read(&source, sizeof(struct audio_port_config));
Andy Hungb0272092018-04-12 11:06:56 -07002118 (void)sanitizeAudioPortConfig(&source);
2119 audio_attributes_t attributes = {};
Eric Laurent554a2772015-04-10 11:29:24 -07002120 data.read(&attributes, sizeof(audio_attributes_t));
Kevin Rocard39fdbd02017-11-13 11:15:27 -08002121 sanetizeAudioAttributes(&attributes);
Eric Laurent3e6c7e12018-07-27 17:09:23 -07002122 audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
2123 status_t status = startAudioSource(&source, &attributes, &portId);
Eric Laurent554a2772015-04-10 11:29:24 -07002124 reply->writeInt32(status);
Eric Laurent3e6c7e12018-07-27 17:09:23 -07002125 reply->writeInt32(portId);
Eric Laurent554a2772015-04-10 11:29:24 -07002126 return NO_ERROR;
2127 } break;
2128
2129 case STOP_AUDIO_SOURCE: {
2130 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurent3e6c7e12018-07-27 17:09:23 -07002131 audio_port_handle_t portId = (audio_port_handle_t) data.readInt32();
2132 status_t status = stopAudioSource(portId);
Eric Laurent554a2772015-04-10 11:29:24 -07002133 reply->writeInt32(status);
2134 return NO_ERROR;
2135 } break;
2136
Andy Hung2ddee192015-12-18 17:34:44 -08002137 case SET_MASTER_MONO: {
2138 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2139 bool mono = static_cast<bool>(data.readInt32());
2140 status_t status = setMasterMono(mono);
2141 reply->writeInt32(status);
2142 return NO_ERROR;
2143 } break;
2144
2145 case GET_MASTER_MONO: {
2146 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2147 bool mono;
2148 status_t status = getMasterMono(&mono);
2149 reply->writeInt32(status);
2150 if (status == NO_ERROR) {
2151 reply->writeInt32(static_cast<int32_t>(mono));
2152 }
2153 return NO_ERROR;
2154 } break;
2155
Eric Laurentac9cef52017-06-09 15:46:26 -07002156 case GET_STREAM_VOLUME_DB: {
2157 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2158 audio_stream_type_t stream =
2159 static_cast <audio_stream_type_t>(data.readInt32());
2160 int index = static_cast <int>(data.readInt32());
2161 audio_devices_t device =
2162 static_cast <audio_devices_t>(data.readUint32());
2163 reply->writeFloat(getStreamVolumeDB(stream, index, device));
2164 return NO_ERROR;
2165 }
2166
jiabin81772902018-04-02 17:52:27 -07002167 case GET_SURROUND_FORMATS: {
2168 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2169 unsigned int numSurroundFormatsReq = data.readUint32();
2170 if (numSurroundFormatsReq > MAX_ITEMS_PER_LIST) {
2171 numSurroundFormatsReq = MAX_ITEMS_PER_LIST;
2172 }
2173 bool reported = data.readBool();
2174 unsigned int numSurroundFormats = numSurroundFormatsReq;
2175 audio_format_t *surroundFormats = (audio_format_t *)calloc(
2176 numSurroundFormats, sizeof(audio_format_t));
2177 bool *surroundFormatsEnabled = (bool *)calloc(numSurroundFormats, sizeof(bool));
2178 if (numSurroundFormatsReq > 0 &&
2179 (surroundFormats == NULL || surroundFormatsEnabled == NULL)) {
2180 free(surroundFormats);
2181 free(surroundFormatsEnabled);
2182 reply->writeInt32(NO_MEMORY);
2183 return NO_ERROR;
2184 }
2185 status_t status = getSurroundFormats(
2186 &numSurroundFormats, surroundFormats, surroundFormatsEnabled, reported);
2187 reply->writeInt32(status);
2188
2189 if (status == NO_ERROR) {
2190 reply->writeUint32(numSurroundFormats);
2191 if (numSurroundFormatsReq > numSurroundFormats) {
2192 numSurroundFormatsReq = numSurroundFormats;
2193 }
2194 reply->write(surroundFormats, numSurroundFormatsReq * sizeof(audio_format_t));
2195 reply->write(surroundFormatsEnabled, numSurroundFormatsReq * sizeof(bool));
2196 }
2197 free(surroundFormats);
2198 free(surroundFormatsEnabled);
2199 return NO_ERROR;
2200 }
2201
2202 case SET_SURROUND_FORMAT_ENABLED: {
2203 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2204 audio_format_t audioFormat = (audio_format_t) data.readInt32();
2205 bool enabled = data.readBool();
2206 status_t status = setSurroundFormatEnabled(audioFormat, enabled);
2207 reply->writeInt32(status);
2208 return NO_ERROR;
2209 }
2210
Arun Mirpuri11029ad2018-12-19 20:45:19 -08002211 case GET_OFFLOAD_FORMATS_A2DP: {
2212 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2213 std::vector<audio_format_t> encodingFormats;
2214 status_t status = getHwOffloadEncodingFormatsSupportedForA2DP(&encodingFormats);
2215 reply->writeInt32(status);
2216 if (status != NO_ERROR) {
2217 return NO_ERROR;
2218 }
2219 reply->writeUint32(static_cast<uint32_t>(encodingFormats.size()));
2220 for (size_t i = 0; i < encodingFormats.size(); i++)
2221 reply->writeInt32(static_cast<int32_t>(encodingFormats[i]));
2222 return NO_ERROR;
2223 }
2224
2225
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07002226 case ADD_STREAM_DEFAULT_EFFECT: {
2227 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2228 effect_uuid_t type;
2229 status_t status = data.read(&type, sizeof(effect_uuid_t));
2230 if (status != NO_ERROR) {
2231 return status;
2232 }
2233 String16 opPackageName;
2234 status = data.readString16(&opPackageName);
2235 if (status != NO_ERROR) {
2236 return status;
2237 }
2238 effect_uuid_t uuid;
2239 status = data.read(&uuid, sizeof(effect_uuid_t));
2240 if (status != NO_ERROR) {
2241 return status;
2242 }
2243 int32_t priority = data.readInt32();
2244 audio_usage_t usage = (audio_usage_t) data.readInt32();
2245 audio_unique_id_t id = 0;
2246 reply->writeInt32(static_cast <int32_t>(addStreamDefaultEffect(&type,
2247 opPackageName,
2248 &uuid,
2249 priority,
2250 usage,
2251 &id)));
2252 reply->writeInt32(id);
2253 return NO_ERROR;
2254 }
2255
2256 case REMOVE_STREAM_DEFAULT_EFFECT: {
2257 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2258 audio_unique_id_t id = static_cast<audio_unique_id_t>(data.readInt32());
2259 reply->writeInt32(static_cast <int32_t>(removeStreamDefaultEffect(id)));
2260 return NO_ERROR;
2261 }
2262
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07002263 case ADD_SOURCE_DEFAULT_EFFECT: {
2264 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2265 effect_uuid_t type;
2266 status_t status = data.read(&type, sizeof(effect_uuid_t));
2267 if (status != NO_ERROR) {
2268 return status;
2269 }
2270 String16 opPackageName;
2271 status = data.readString16(&opPackageName);
2272 if (status != NO_ERROR) {
2273 return status;
2274 }
2275 effect_uuid_t uuid;
2276 status = data.read(&uuid, sizeof(effect_uuid_t));
2277 if (status != NO_ERROR) {
2278 return status;
2279 }
2280 int32_t priority = data.readInt32();
2281 audio_source_t source = (audio_source_t) data.readInt32();
2282 audio_unique_id_t id = 0;
2283 reply->writeInt32(static_cast <int32_t>(addSourceDefaultEffect(&type,
2284 opPackageName,
2285 &uuid,
2286 priority,
2287 source,
2288 &id)));
2289 reply->writeInt32(id);
2290 return NO_ERROR;
2291 }
2292
2293 case REMOVE_SOURCE_DEFAULT_EFFECT: {
2294 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2295 audio_unique_id_t id = static_cast<audio_unique_id_t>(data.readInt32());
2296 reply->writeInt32(static_cast <int32_t>(removeSourceDefaultEffect(id)));
2297 return NO_ERROR;
2298 }
2299
Eric Laurentb78763e2018-10-17 10:08:02 -07002300 case SET_ASSISTANT_UID: {
2301 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2302 int32_t uid;
2303 status_t status = data.readInt32(&uid);
2304 if (status != NO_ERROR) {
2305 return status;
2306 }
2307 status = setAssistantUid(uid);
2308 reply->writeInt32(static_cast <int32_t>(status));
2309 return NO_ERROR;
2310 }
2311
2312 case SET_A11Y_SERVICES_UIDS: {
2313 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2314 std::vector<uid_t> uids;
2315 int32_t size;
2316 status_t status = data.readInt32(&size);
2317 if (status != NO_ERROR) {
2318 return status;
2319 }
2320 if (size > MAX_ITEMS_PER_LIST) {
2321 size = MAX_ITEMS_PER_LIST;
2322 }
2323 for (int32_t i = 0; i < size; i++) {
2324 int32_t uid;
2325 status = data.readInt32(&uid);
2326 if (status != NO_ERROR) {
2327 return status;
2328 }
2329 uids.push_back(uid);
2330 }
2331 status = setA11yServicesUids(uids);
2332 reply->writeInt32(static_cast <int32_t>(status));
2333 return NO_ERROR;
2334 }
2335
jiabin6012f912018-11-02 17:06:30 -07002336 case IS_HAPTIC_PLAYBACK_SUPPORTED: {
2337 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2338 bool isSupported = isHapticPlaybackSupported();
2339 reply->writeBool(isSupported);
Kevin Rocardb99cc752019-03-21 20:52:24 -07002340 return NO_ERROR;
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002341 }
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002342 case SET_UID_DEVICE_AFFINITY: {
2343 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2344 const uid_t uid = (uid_t) data.readInt32();
2345 Vector<AudioDeviceTypeAddr> devices;
2346 size_t size = (size_t)data.readInt32();
2347 for (size_t i = 0; i < size; i++) {
2348 AudioDeviceTypeAddr device;
2349 if (device.readFromParcel((Parcel*)&data) == NO_ERROR) {
2350 devices.add(device);
2351 }
2352 }
2353 status_t status = setUidDeviceAffinities(uid, devices);
2354 reply->writeInt32(status);
2355 return NO_ERROR;
2356 }
2357
2358 case REMOVE_UID_DEVICE_AFFINITY: {
2359 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2360 const uid_t uid = (uid_t) data.readInt32();
2361 status_t status = removeUidDeviceAffinities(uid);
2362 reply->writeInt32(status);
jiabin6012f912018-11-02 17:06:30 -07002363 return NO_ERROR;
2364 }
2365
François Gaffied0ba9ed2018-11-05 11:50:42 +01002366 case LIST_AUDIO_PRODUCT_STRATEGIES: {
2367 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2368 AudioProductStrategyVector strategies;
2369 status_t status = listAudioProductStrategies(strategies);
2370 reply->writeInt32(status);
2371 if (status != NO_ERROR) {
François Gaffie4b2018b2018-11-07 11:18:59 +01002372 return NO_ERROR;
François Gaffied0ba9ed2018-11-05 11:50:42 +01002373 }
2374 size_t size = strategies.size();
2375 size_t sizePosition = reply->dataPosition();
2376 reply->writeInt32(size);
2377 size_t finalSize = size;
2378 for (size_t i = 0; i < size; i++) {
2379 size_t position = reply->dataPosition();
2380 if (strategies[i].writeToParcel(reply) != NO_ERROR) {
2381 reply->setDataPosition(position);
2382 finalSize--;
2383 }
2384 }
2385 if (size != finalSize) {
2386 size_t position = reply->dataPosition();
2387 reply->setDataPosition(sizePosition);
2388 reply->writeInt32(finalSize);
2389 reply->setDataPosition(position);
2390 }
2391 return NO_ERROR;
2392 }
2393
2394 case GET_STRATEGY_FOR_ATTRIBUTES: {
2395 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2396 AudioAttributes attributes;
2397 status_t status = attributes.readFromParcel(&data);
2398 if (status != NO_ERROR) {
2399 return status;
2400 }
François Gaffie4b2018b2018-11-07 11:18:59 +01002401 product_strategy_t strategy;
2402 status = getProductStrategyFromAudioAttributes(attributes, strategy);
2403 reply->writeInt32(status);
2404 if (status != NO_ERROR) {
2405 return NO_ERROR;
2406 }
François Gaffied0ba9ed2018-11-05 11:50:42 +01002407 reply->writeUint32(static_cast<int>(strategy));
2408 return NO_ERROR;
2409 }
2410
François Gaffie4b2018b2018-11-07 11:18:59 +01002411 case LIST_AUDIO_VOLUME_GROUPS: {
2412 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2413 AudioVolumeGroupVector groups;
2414 status_t status = listAudioVolumeGroups(groups);
2415 reply->writeInt32(status);
2416 if (status != NO_ERROR) {
2417 return NO_ERROR;
2418 }
2419 size_t size = groups.size();
2420 size_t sizePosition = reply->dataPosition();
2421 reply->writeInt32(size);
2422 size_t finalSize = size;
2423 for (size_t i = 0; i < size; i++) {
2424 size_t position = reply->dataPosition();
2425 if (groups[i].writeToParcel(reply) != NO_ERROR) {
2426 reply->setDataPosition(position);
2427 finalSize--;
2428 }
2429 }
2430 if (size != finalSize) {
2431 size_t position = reply->dataPosition();
2432 reply->setDataPosition(sizePosition);
2433 reply->writeInt32(finalSize);
2434 reply->setDataPosition(position);
2435 }
2436 return NO_ERROR;
2437 }
2438
2439 case GET_VOLUME_GROUP_FOR_ATTRIBUTES: {
2440 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2441 AudioAttributes attributes;
2442 status_t status = attributes.readFromParcel(&data);
2443 if (status != NO_ERROR) {
2444 return status;
2445 }
2446 volume_group_t group;
2447 status = getVolumeGroupFromAudioAttributes(attributes, group);
2448 reply->writeInt32(status);
2449 if (status != NO_ERROR) {
2450 return NO_ERROR;
2451 }
2452 reply->writeUint32(static_cast<int>(group));
2453 return NO_ERROR;
2454 }
2455
Kevin Rocardb99cc752019-03-21 20:52:24 -07002456 case SET_ALLOWED_CAPTURE_POLICY: {
2457 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2458 uid_t uid = data.readInt32();
2459 audio_flags_mask_t flags = data.readInt32();
2460 status_t status = setAllowedCapturePolicy(uid, flags);
2461 reply->writeInt32(status);
2462 return NO_ERROR;
2463 }
2464
Eric Laurent6ede98f2019-06-11 14:50:30 -07002465 case SET_RTT_ENABLED: {
2466 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2467 bool enabled = static_cast<bool>(data.readInt32());
2468 status_t status = setRttEnabled(enabled);
2469 reply->writeInt32(status);
2470 return NO_ERROR;
2471 }
2472
Eric Laurent8340e672019-11-06 11:01:08 -08002473 case IS_CALL_SCREEN_MODE_SUPPORTED: {
2474 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2475 bool isAvailable = isCallScreenModeSupported();
2476 reply->writeBool(isAvailable);
2477 return NO_ERROR;
2478 }
2479
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002480 case SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: {
2481 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2482 product_strategy_t strategy = (product_strategy_t) data.readUint32();
2483 AudioDeviceTypeAddr device;
2484 status_t status = device.readFromParcel((Parcel*)&data);
2485 if (status != NO_ERROR) {
2486 return status;
2487 }
2488 status = setPreferredDeviceForStrategy(strategy, device);
2489 reply->writeInt32(status);
2490 return NO_ERROR;
2491 }
2492
2493 case REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: {
2494 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2495 product_strategy_t strategy = (product_strategy_t) data.readUint32();
2496 status_t status = removePreferredDeviceForStrategy(strategy);
2497 reply->writeInt32(status);
2498 return NO_ERROR;
2499 }
2500
2501 case GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: {
2502 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2503 product_strategy_t strategy = (product_strategy_t) data.readUint32();
2504 AudioDeviceTypeAddr device;
2505 status_t status = getPreferredDeviceForStrategy(strategy, device);
2506 status_t marshall_status = device.writeToParcel(reply);
2507 if (marshall_status != NO_ERROR) {
2508 return marshall_status;
2509 }
2510 reply->writeInt32(status);
2511 return NO_ERROR;
2512 }
2513
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08002514 case GET_DEVICES_FOR_ATTRIBUTES: {
2515 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2516 AudioAttributes attributes;
2517 status_t status = attributes.readFromParcel(&data);
2518 if (status != NO_ERROR) {
2519 return status;
2520 }
2521 AudioDeviceTypeAddrVector devices;
2522 status = getDevicesForAttributes(attributes.getAttributes(), &devices);
2523 // reply data formatted as:
2524 // - (int32) method call result from APM
2525 // - (int32) number of devices (n) if method call returned NO_ERROR
2526 // - n AudioDeviceTypeAddr if method call returned NO_ERROR
2527 reply->writeInt32(status);
2528 if (status != NO_ERROR) {
2529 return NO_ERROR;
2530 }
2531 status = reply->writeInt32(devices.size());
2532 if (status != NO_ERROR) {
2533 return status;
2534 }
2535 for (const auto& device : devices) {
2536 status = device.writeToParcel(reply);
2537 if (status != NO_ERROR) {
2538 return status;
2539 }
2540 }
2541
2542 return NO_ERROR;
2543 }
2544
Eric Laurentc2f1f072009-07-17 12:17:14 -07002545 default:
2546 return BBinder::onTransact(code, data, reply, flags);
2547 }
2548}
2549
Andy Hungb0272092018-04-12 11:06:56 -07002550/** returns true if string overflow was prevented by zero termination */
2551template <size_t size>
2552static bool preventStringOverflow(char (&s)[size]) {
2553 if (strnlen(s, size) < size) return false;
2554 s[size - 1] = '\0';
2555 return true;
2556}
2557
Kevin Rocard39fdbd02017-11-13 11:15:27 -08002558void BnAudioPolicyService::sanetizeAudioAttributes(audio_attributes_t* attr)
2559{
2560 const size_t tagsMaxSize = AUDIO_ATTRIBUTES_TAGS_MAX_SIZE;
2561 if (strnlen(attr->tags, tagsMaxSize) >= tagsMaxSize) {
2562 android_errorWriteLog(0x534e4554, "68953950"); // SafetyNet logging
2563 }
2564 attr->tags[tagsMaxSize - 1] = '\0';
2565}
2566
Andy Hungb0272092018-04-12 11:06:56 -07002567/** returns BAD_VALUE if sanitization was required. */
2568status_t BnAudioPolicyService::sanitizeEffectDescriptor(effect_descriptor_t* desc)
2569{
2570 if (preventStringOverflow(desc->name)
2571 | /* always */ preventStringOverflow(desc->implementor)) {
2572 android_errorWriteLog(0x534e4554, "73126106"); // SafetyNet logging
2573 return BAD_VALUE;
2574 }
2575 return NO_ERROR;
2576}
2577
2578/** returns BAD_VALUE if sanitization was required. */
2579status_t BnAudioPolicyService::sanitizeAudioPortConfig(struct audio_port_config* config)
2580{
2581 if (config->type == AUDIO_PORT_TYPE_DEVICE &&
2582 preventStringOverflow(config->ext.device.address)) {
2583 return BAD_VALUE;
2584 }
2585 return NO_ERROR;
2586}
2587
Eric Laurentc2f1f072009-07-17 12:17:14 -07002588// ----------------------------------------------------------------------------
2589
Glenn Kasten40bc9062015-03-20 09:09:33 -07002590} // namespace android