blob: 5b3a0573e8fa48f4d713dd18477c05854f47c949 [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,
Oscar Azucena90e77632019-11-27 17:12:28 -0800100 SET_USERID_DEVICE_AFFINITY,
101 REMOVE_USERID_DEVICE_AFFINITY,
François Gaffied0ba9ed2018-11-05 11:50:42 +0100102 GET_OFFLOAD_FORMATS_A2DP,
103 LIST_AUDIO_PRODUCT_STRATEGIES,
104 GET_STRATEGY_FOR_ATTRIBUTES,
François Gaffie4b2018b2018-11-07 11:18:59 +0100105 LIST_AUDIO_VOLUME_GROUPS,
Kevin Rocardb99cc752019-03-21 20:52:24 -0700106 GET_VOLUME_GROUP_FOR_ATTRIBUTES,
Hayden Gomes524159d2019-12-23 14:41:47 -0800107 SET_SUPPORTED_SYSTEM_USAGES,
Kevin Rocardb99cc752019-03-21 20:52:24 -0700108 SET_ALLOWED_CAPTURE_POLICY,
Eric Laurent6c796322019-04-09 14:13:17 -0700109 MOVE_EFFECTS_TO_IO,
Eric Laurent8340e672019-11-06 11:01:08 -0800110 SET_RTT_ENABLED,
Jean-Michel Trivi30857152019-11-01 11:04:15 -0700111 IS_CALL_SCREEN_MODE_SUPPORTED,
112 SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY,
113 REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY,
114 GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY,
Jean-Michel Trivif41599b2020-01-07 14:22:08 -0800115 GET_DEVICES_FOR_ATTRIBUTES,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700116};
117
Eric Laurent1d670b12015-02-06 10:44:24 -0800118#define MAX_ITEMS_PER_LIST 1024
119
Eric Laurentc2f1f072009-07-17 12:17:14 -0700120class BpAudioPolicyService : public BpInterface<IAudioPolicyService>
121{
122public:
Chih-Hung Hsieh090ef602016-04-27 10:39:54 -0700123 explicit BpAudioPolicyService(const sp<IBinder>& impl)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700124 : BpInterface<IAudioPolicyService>(impl)
125 {
126 }
127
128 virtual status_t setDeviceConnectionState(
Dima Zavinfce7a472011-04-19 22:30:36 -0700129 audio_devices_t device,
130 audio_policy_dev_state_t state,
Paul McLeane743a472015-01-28 11:07:31 -0800131 const char *device_address,
Aniket Kumar Lata4e464702019-01-10 23:38:46 -0800132 const char *device_name,
133 audio_format_t encodedFormat)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700134 {
135 Parcel data, reply;
136 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
137 data.writeInt32(static_cast <uint32_t>(device));
138 data.writeInt32(static_cast <uint32_t>(state));
139 data.writeCString(device_address);
Paul McLeane743a472015-01-28 11:07:31 -0800140 data.writeCString(device_name);
Aniket Kumar Lata4e464702019-01-10 23:38:46 -0800141 data.writeInt32(static_cast <uint32_t>(encodedFormat));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700142 remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply);
143 return static_cast <status_t> (reply.readInt32());
144 }
145
Dima Zavinfce7a472011-04-19 22:30:36 -0700146 virtual audio_policy_dev_state_t getDeviceConnectionState(
147 audio_devices_t device,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700148 const char *device_address)
149 {
150 Parcel data, reply;
151 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
152 data.writeInt32(static_cast <uint32_t>(device));
153 data.writeCString(device_address);
154 remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700155 return static_cast <audio_policy_dev_state_t>(reply.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700156 }
157
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800158 virtual status_t handleDeviceConfigChange(audio_devices_t device,
159 const char *device_address,
Aniket Kumar Lata4e464702019-01-10 23:38:46 -0800160 const char *device_name,
161 audio_format_t encodedFormat)
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800162 {
163 Parcel data, reply;
164 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
165 data.writeInt32(static_cast <uint32_t>(device));
166 data.writeCString(device_address);
167 data.writeCString(device_name);
Aniket Kumar Lata4e464702019-01-10 23:38:46 -0800168 data.writeInt32(static_cast <uint32_t>(encodedFormat));
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800169 remote()->transact(HANDLE_DEVICE_CONFIG_CHANGE, data, &reply);
170 return static_cast <status_t> (reply.readInt32());
171 }
172
Eric Laurent00dba062020-02-11 15:52:09 -0800173 virtual status_t setPhoneState(audio_mode_t state, uid_t uid)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700174 {
175 Parcel data, reply;
176 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
177 data.writeInt32(state);
Eric Laurent00dba062020-02-11 15:52:09 -0800178 data.writeInt32(uid);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700179 remote()->transact(SET_PHONE_STATE, data, &reply);
180 return static_cast <status_t> (reply.readInt32());
181 }
182
Dima Zavinfce7a472011-04-19 22:30:36 -0700183 virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700184 {
185 Parcel data, reply;
186 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
187 data.writeInt32(static_cast <uint32_t>(usage));
188 data.writeInt32(static_cast <uint32_t>(config));
189 remote()->transact(SET_FORCE_USE, data, &reply);
190 return static_cast <status_t> (reply.readInt32());
191 }
192
Dima Zavinfce7a472011-04-19 22:30:36 -0700193 virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700194 {
195 Parcel data, reply;
196 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
197 data.writeInt32(static_cast <uint32_t>(usage));
198 remote()->transact(GET_FORCE_USE, data, &reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700199 return static_cast <audio_policy_forced_cfg_t> (reply.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700200 }
201
Eric Laurentf4e63452017-11-06 19:31:46 +0000202 virtual audio_io_handle_t getOutput(audio_stream_type_t stream)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700203 {
204 Parcel data, reply;
205 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
206 data.writeInt32(static_cast <uint32_t>(stream));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700207 remote()->transact(GET_OUTPUT, data, &reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700208 return static_cast <audio_io_handle_t> (reply.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700209 }
210
Eric Laurent42984412019-05-09 17:57:03 -0700211 status_t getOutputForAttr(audio_attributes_t *attr,
Kevin Rocard153f92d2018-12-18 18:33:28 -0800212 audio_io_handle_t *output,
213 audio_session_t session,
214 audio_stream_type_t *stream,
215 pid_t pid,
216 uid_t uid,
217 const audio_config_t *config,
218 audio_output_flags_t flags,
219 audio_port_handle_t *selectedDeviceId,
220 audio_port_handle_t *portId,
221 std::vector<audio_io_handle_t> *secondaryOutputs) override
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700222 {
223 Parcel data, reply;
224 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurent42984412019-05-09 17:57:03 -0700225 if (attr == nullptr) {
226 ALOGE("%s NULL audio attributes", __func__);
Eric Laurente83b55d2014-11-14 10:06:21 -0800227 return BAD_VALUE;
228 }
Eric Laurent42984412019-05-09 17:57:03 -0700229 if (output == nullptr) {
230 ALOGE("%s NULL output - shouldn't happen", __func__);
Eric Laurent9ae8c592017-06-22 17:17:09 -0700231 return BAD_VALUE;
232 }
Eric Laurent42984412019-05-09 17:57:03 -0700233 if (selectedDeviceId == nullptr) {
234 ALOGE("%s NULL selectedDeviceId - shouldn't happen", __func__);
Eric Laurent20b9ef02016-12-05 11:03:16 -0800235 return BAD_VALUE;
236 }
Eric Laurent42984412019-05-09 17:57:03 -0700237 if (portId == nullptr) {
238 ALOGE("%s NULL portId - shouldn't happen", __func__);
Kevin Rocard153f92d2018-12-18 18:33:28 -0800239 return BAD_VALUE;
240 }
Eric Laurent42984412019-05-09 17:57:03 -0700241 if (secondaryOutputs == nullptr) {
242 ALOGE("%s NULL secondaryOutputs - shouldn't happen", __func__);
243 return BAD_VALUE;
Eric Laurente83b55d2014-11-14 10:06:21 -0800244 }
Eric Laurent42984412019-05-09 17:57:03 -0700245 data.write(attr, sizeof(audio_attributes_t));
Eric Laurente83b55d2014-11-14 10:06:21 -0800246 data.writeInt32(session);
247 if (stream == NULL) {
248 data.writeInt32(0);
249 } else {
250 data.writeInt32(1);
251 data.writeInt32(*stream);
252 }
Nadav Bar766fb022018-01-07 12:18:03 +0200253 data.writeInt32(pid);
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700254 data.writeInt32(uid);
Eric Laurent20b9ef02016-12-05 11:03:16 -0800255 data.write(config, sizeof(audio_config_t));
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700256 data.writeInt32(static_cast <uint32_t>(flags));
Eric Laurent9ae8c592017-06-22 17:17:09 -0700257 data.writeInt32(*selectedDeviceId);
Eric Laurent20b9ef02016-12-05 11:03:16 -0800258 data.writeInt32(*portId);
Eric Laurente83b55d2014-11-14 10:06:21 -0800259 status_t status = remote()->transact(GET_OUTPUT_FOR_ATTR, data, &reply);
260 if (status != NO_ERROR) {
261 return status;
262 }
263 status = (status_t)reply.readInt32();
264 if (status != NO_ERROR) {
265 return status;
266 }
Eric Laurent42984412019-05-09 17:57:03 -0700267 status = (status_t)reply.read(&attr, sizeof(audio_attributes_t));
268 if (status != NO_ERROR) {
269 return status;
270 }
Eric Laurente83b55d2014-11-14 10:06:21 -0800271 *output = (audio_io_handle_t)reply.readInt32();
Eric Laurent20b9ef02016-12-05 11:03:16 -0800272 audio_stream_type_t lStream = (audio_stream_type_t)reply.readInt32();
Eric Laurente83b55d2014-11-14 10:06:21 -0800273 if (stream != NULL) {
Eric Laurent20b9ef02016-12-05 11:03:16 -0800274 *stream = lStream;
Eric Laurente83b55d2014-11-14 10:06:21 -0800275 }
Eric Laurent9ae8c592017-06-22 17:17:09 -0700276 *selectedDeviceId = (audio_port_handle_t)reply.readInt32();
Eric Laurent20b9ef02016-12-05 11:03:16 -0800277 *portId = (audio_port_handle_t)reply.readInt32();
Kevin Rocard153f92d2018-12-18 18:33:28 -0800278 secondaryOutputs->resize(reply.readInt32());
279 return reply.read(secondaryOutputs->data(),
280 secondaryOutputs->size() * sizeof(audio_io_handle_t));
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700281 }
282
Eric Laurentd7fe0862018-07-14 16:48:01 -0700283 virtual status_t startOutput(audio_port_handle_t portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700284 {
285 Parcel data, reply;
286 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentd7fe0862018-07-14 16:48:01 -0700287 data.writeInt32((int32_t)portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700288 remote()->transact(START_OUTPUT, data, &reply);
289 return static_cast <status_t> (reply.readInt32());
290 }
291
Eric Laurentd7fe0862018-07-14 16:48:01 -0700292 virtual status_t stopOutput(audio_port_handle_t portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700293 {
294 Parcel data, reply;
295 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentd7fe0862018-07-14 16:48:01 -0700296 data.writeInt32((int32_t)portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700297 remote()->transact(STOP_OUTPUT, data, &reply);
298 return static_cast <status_t> (reply.readInt32());
299 }
300
Eric Laurentd7fe0862018-07-14 16:48:01 -0700301 virtual void releaseOutput(audio_port_handle_t portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700302 {
303 Parcel data, reply;
304 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentd7fe0862018-07-14 16:48:01 -0700305 data.writeInt32((int32_t)portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700306 remote()->transact(RELEASE_OUTPUT, data, &reply);
307 }
308
Eric Laurentcaf7f482014-11-25 17:50:47 -0800309 virtual status_t getInputForAttr(const audio_attributes_t *attr,
310 audio_io_handle_t *input,
Mikhail Naganov2996f672019-04-18 12:29:59 -0700311 audio_unique_id_t riid,
Eric Laurentcaf7f482014-11-25 17:50:47 -0800312 audio_session_t session,
Eric Laurentb2379ba2016-05-23 17:42:12 -0700313 pid_t pid,
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700314 uid_t uid,
Eric Laurentfee19762018-01-29 18:44:13 -0800315 const String16& opPackageName,
Eric Laurent20b9ef02016-12-05 11:03:16 -0800316 const audio_config_base_t *config,
Paul McLean466dc8e2015-04-17 13:15:36 -0600317 audio_input_flags_t flags,
Eric Laurent9ae8c592017-06-22 17:17:09 -0700318 audio_port_handle_t *selectedDeviceId,
Eric Laurent20b9ef02016-12-05 11:03:16 -0800319 audio_port_handle_t *portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700320 {
321 Parcel data, reply;
322 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentcaf7f482014-11-25 17:50:47 -0800323 if (attr == NULL) {
324 ALOGE("getInputForAttr NULL attr - shouldn't happen");
325 return BAD_VALUE;
326 }
327 if (input == NULL) {
328 ALOGE("getInputForAttr NULL input - shouldn't happen");
329 return BAD_VALUE;
330 }
Eric Laurent9ae8c592017-06-22 17:17:09 -0700331 if (selectedDeviceId == NULL) {
332 ALOGE("getInputForAttr NULL selectedDeviceId - shouldn't happen");
333 return BAD_VALUE;
334 }
Eric Laurent20b9ef02016-12-05 11:03:16 -0800335 if (portId == NULL) {
336 ALOGE("getInputForAttr NULL portId - shouldn't happen");
337 return BAD_VALUE;
338 }
Hayden Gomes524159d2019-12-23 14:41:47 -0800339
Eric Laurentcaf7f482014-11-25 17:50:47 -0800340 data.write(attr, sizeof(audio_attributes_t));
Eric Laurenta54f1282017-07-01 19:39:32 -0700341 data.writeInt32(*input);
Mikhail Naganov2996f672019-04-18 12:29:59 -0700342 data.writeInt32(riid);
Eric Laurentcaf7f482014-11-25 17:50:47 -0800343 data.writeInt32(session);
Eric Laurentb2379ba2016-05-23 17:42:12 -0700344 data.writeInt32(pid);
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700345 data.writeInt32(uid);
Eric Laurentfee19762018-01-29 18:44:13 -0800346 data.writeString16(opPackageName);
Eric Laurent20b9ef02016-12-05 11:03:16 -0800347 data.write(config, sizeof(audio_config_base_t));
Glenn Kastenb3b16602014-07-16 08:36:31 -0700348 data.writeInt32(flags);
Eric Laurent9ae8c592017-06-22 17:17:09 -0700349 data.writeInt32(*selectedDeviceId);
Eric Laurent20b9ef02016-12-05 11:03:16 -0800350 data.writeInt32(*portId);
Eric Laurentcaf7f482014-11-25 17:50:47 -0800351 status_t status = remote()->transact(GET_INPUT_FOR_ATTR, data, &reply);
352 if (status != NO_ERROR) {
353 return status;
354 }
355 status = reply.readInt32();
356 if (status != NO_ERROR) {
357 return status;
358 }
359 *input = (audio_io_handle_t)reply.readInt32();
Eric Laurent9ae8c592017-06-22 17:17:09 -0700360 *selectedDeviceId = (audio_port_handle_t)reply.readInt32();
Eric Laurent20b9ef02016-12-05 11:03:16 -0800361 *portId = (audio_port_handle_t)reply.readInt32();
Eric Laurentcaf7f482014-11-25 17:50:47 -0800362 return NO_ERROR;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700363 }
364
Eric Laurent4eb58f12018-12-07 16:41:02 -0800365 virtual status_t startInput(audio_port_handle_t portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700366 {
367 Parcel data, reply;
368 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfee19762018-01-29 18:44:13 -0800369 data.writeInt32(portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700370 remote()->transact(START_INPUT, data, &reply);
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800371 status_t status = static_cast <status_t> (reply.readInt32());
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800372 return status;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700373 }
374
Eric Laurentfee19762018-01-29 18:44:13 -0800375 virtual status_t stopInput(audio_port_handle_t portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700376 {
377 Parcel data, reply;
378 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfee19762018-01-29 18:44:13 -0800379 data.writeInt32(portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700380 remote()->transact(STOP_INPUT, data, &reply);
381 return static_cast <status_t> (reply.readInt32());
382 }
383
Eric Laurentfee19762018-01-29 18:44:13 -0800384 virtual void releaseInput(audio_port_handle_t portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700385 {
386 Parcel data, reply;
387 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfee19762018-01-29 18:44:13 -0800388 data.writeInt32(portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700389 remote()->transact(RELEASE_INPUT, data, &reply);
390 }
391
Dima Zavinfce7a472011-04-19 22:30:36 -0700392 virtual status_t initStreamVolume(audio_stream_type_t stream,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700393 int indexMin,
394 int indexMax)
395 {
396 Parcel data, reply;
397 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
398 data.writeInt32(static_cast <uint32_t>(stream));
399 data.writeInt32(indexMin);
400 data.writeInt32(indexMax);
401 remote()->transact(INIT_STREAM_VOLUME, data, &reply);
402 return static_cast <status_t> (reply.readInt32());
403 }
404
Eric Laurent83844cc2011-11-18 16:43:31 -0800405 virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
406 int index,
407 audio_devices_t device)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700408 {
409 Parcel data, reply;
410 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
411 data.writeInt32(static_cast <uint32_t>(stream));
412 data.writeInt32(index);
Eric Laurent83844cc2011-11-18 16:43:31 -0800413 data.writeInt32(static_cast <uint32_t>(device));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700414 remote()->transact(SET_STREAM_VOLUME, data, &reply);
415 return static_cast <status_t> (reply.readInt32());
416 }
417
Eric Laurent83844cc2011-11-18 16:43:31 -0800418 virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
419 int *index,
420 audio_devices_t device)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700421 {
422 Parcel data, reply;
423 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
424 data.writeInt32(static_cast <uint32_t>(stream));
Eric Laurent83844cc2011-11-18 16:43:31 -0800425 data.writeInt32(static_cast <uint32_t>(device));
426
Eric Laurentc2f1f072009-07-17 12:17:14 -0700427 remote()->transact(GET_STREAM_VOLUME, data, &reply);
428 int lIndex = reply.readInt32();
429 if (index) *index = lIndex;
430 return static_cast <status_t> (reply.readInt32());
431 }
Eric Laurentde070132010-07-13 04:45:46 -0700432
François Gaffiecfe17322018-11-07 13:41:29 +0100433 virtual status_t setVolumeIndexForAttributes(const audio_attributes_t &attr, int index,
434 audio_devices_t device)
435 {
436 Parcel data, reply;
437 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
438 data.write(&attr, sizeof(audio_attributes_t));
439 data.writeInt32(index);
440 data.writeInt32(static_cast <uint32_t>(device));
441 status_t status = remote()->transact(SET_VOLUME_ATTRIBUTES, data, &reply);
442 if (status != NO_ERROR) {
443 return status;
444 }
445 return static_cast <status_t> (reply.readInt32());
446 }
447 virtual status_t getVolumeIndexForAttributes(const audio_attributes_t &attr, int &index,
448 audio_devices_t device)
449 {
450 Parcel data, reply;
451 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
452 data.write(&attr, sizeof(audio_attributes_t));
453 data.writeInt32(static_cast <uint32_t>(device));
454 status_t status = remote()->transact(GET_VOLUME_ATTRIBUTES, data, &reply);
455 if (status != NO_ERROR) {
456 return status;
457 }
458 status = static_cast <status_t> (reply.readInt32());
459 if (status != NO_ERROR) {
460 return status;
461 }
462 index = reply.readInt32();
463 return NO_ERROR;
464 }
465 virtual status_t getMinVolumeIndexForAttributes(const audio_attributes_t &attr, int &index)
466 {
467 Parcel data, reply;
468 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
469 data.write(&attr, sizeof(audio_attributes_t));
470 status_t status = remote()->transact(GET_MIN_VOLUME_FOR_ATTRIBUTES, data, &reply);
471 if (status != NO_ERROR) {
472 return status;
473 }
474 status = static_cast <status_t> (reply.readInt32());
475 if (status != NO_ERROR) {
476 return status;
477 }
478 index = reply.readInt32();
479 return NO_ERROR;
480 }
481 virtual status_t getMaxVolumeIndexForAttributes(const audio_attributes_t &attr, int &index)
482 {
483 Parcel data, reply;
484 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
485 data.write(&attr, sizeof(audio_attributes_t));
486 status_t status = remote()->transact(GET_MAX_VOLUME_FOR_ATTRIBUTES, data, &reply);
487 if (status != NO_ERROR) {
488 return status;
489 }
490 status = static_cast <status_t> (reply.readInt32());
491 if (status != NO_ERROR) {
492 return status;
493 }
494 index = reply.readInt32();
495 return NO_ERROR;
496 }
Dima Zavinfce7a472011-04-19 22:30:36 -0700497 virtual uint32_t getStrategyForStream(audio_stream_type_t stream)
Eric Laurentde070132010-07-13 04:45:46 -0700498 {
499 Parcel data, reply;
500 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
501 data.writeInt32(static_cast <uint32_t>(stream));
502 remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply);
François Gaffiec005e562018-11-06 15:04:49 +0100503 return reply.readUint32();
Eric Laurentde070132010-07-13 04:45:46 -0700504 }
505
Eric Laurent63742522012-03-08 13:42:42 -0800506 virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream)
Glenn Kasten6b2718c2011-02-04 13:54:26 -0800507 {
508 Parcel data, reply;
509 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
510 data.writeInt32(static_cast <uint32_t>(stream));
511 remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply);
Eric Laurent63742522012-03-08 13:42:42 -0800512 return (audio_devices_t) reply.readInt32();
Glenn Kasten6b2718c2011-02-04 13:54:26 -0800513 }
514
Glenn Kasten58e5aa32012-06-20 14:08:14 -0700515 virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc)
Eric Laurentde070132010-07-13 04:45:46 -0700516 {
517 Parcel data, reply;
518 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
519 data.write(desc, sizeof(effect_descriptor_t));
520 remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply);
521 return static_cast <audio_io_handle_t> (reply.readInt32());
522 }
523
Glenn Kasten58e5aa32012-06-20 14:08:14 -0700524 virtual status_t registerEffect(const effect_descriptor_t *desc,
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700525 audio_io_handle_t io,
Eric Laurentde070132010-07-13 04:45:46 -0700526 uint32_t strategy,
Glenn Kastend848eb42016-03-08 13:42:11 -0800527 audio_session_t session,
Eric Laurentde070132010-07-13 04:45:46 -0700528 int id)
529 {
530 Parcel data, reply;
531 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
532 data.write(desc, sizeof(effect_descriptor_t));
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700533 data.writeInt32(io);
Eric Laurentde070132010-07-13 04:45:46 -0700534 data.writeInt32(strategy);
535 data.writeInt32(session);
536 data.writeInt32(id);
537 remote()->transact(REGISTER_EFFECT, data, &reply);
538 return static_cast <status_t> (reply.readInt32());
539 }
540
541 virtual status_t unregisterEffect(int id)
542 {
543 Parcel data, reply;
544 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
545 data.writeInt32(id);
546 remote()->transact(UNREGISTER_EFFECT, data, &reply);
547 return static_cast <status_t> (reply.readInt32());
548 }
549
Eric Laurentdb7c0792011-08-10 10:37:50 -0700550 virtual status_t setEffectEnabled(int id, bool enabled)
551 {
552 Parcel data, reply;
553 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
554 data.writeInt32(id);
555 data.writeInt32(enabled);
556 remote()->transact(SET_EFFECT_ENABLED, data, &reply);
557 return static_cast <status_t> (reply.readInt32());
558 }
559
Eric Laurent6c796322019-04-09 14:13:17 -0700560 status_t moveEffectsToIo(const std::vector<int>& ids, audio_io_handle_t io) override
561 {
562 Parcel data, reply;
563 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
564 data.writeInt32(ids.size());
565 for (auto id : ids) {
566 data.writeInt32(id);
567 }
568 data.writeInt32(io);
569 status_t status = remote()->transact(MOVE_EFFECTS_TO_IO, data, &reply);
570 if (status != NO_ERROR) {
571 return status;
572 }
573 return static_cast <status_t> (reply.readInt32());
574 }
575
Glenn Kastenfff6d712012-01-12 16:38:12 -0800576 virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
Eric Laurenteda6c362011-02-02 09:33:30 -0800577 {
578 Parcel data, reply;
579 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800580 data.writeInt32((int32_t) stream);
Eric Laurenteda6c362011-02-02 09:33:30 -0800581 data.writeInt32(inPastMs);
582 remote()->transact(IS_STREAM_ACTIVE, data, &reply);
583 return reply.readInt32();
584 }
Eric Laurent57dae992011-07-24 13:36:09 -0700585
Jean-Michel Trivi272ab542013-02-04 16:26:02 -0800586 virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
587 {
588 Parcel data, reply;
589 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
590 data.writeInt32((int32_t) stream);
591 data.writeInt32(inPastMs);
592 remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply);
593 return reply.readInt32();
594 }
595
Jean-Michel Trivid7086032012-10-10 12:11:16 -0700596 virtual bool isSourceActive(audio_source_t source) const
597 {
598 Parcel data, reply;
599 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
600 data.writeInt32((int32_t) source);
601 remote()->transact(IS_SOURCE_ACTIVE, data, &reply);
602 return reply.readInt32();
603 }
604
Glenn Kastend848eb42016-03-08 13:42:11 -0800605 virtual status_t queryDefaultPreProcessing(audio_session_t audioSession,
Eric Laurent57dae992011-07-24 13:36:09 -0700606 effect_descriptor_t *descriptors,
607 uint32_t *count)
608 {
609 if (descriptors == NULL || count == NULL) {
610 return BAD_VALUE;
611 }
612 Parcel data, reply;
613 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
614 data.writeInt32(audioSession);
615 data.writeInt32(*count);
616 status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply);
617 if (status != NO_ERROR) {
618 return status;
619 }
620 status = static_cast <status_t> (reply.readInt32());
621 uint32_t retCount = reply.readInt32();
622 if (retCount != 0) {
623 uint32_t numDesc = (retCount < *count) ? retCount : *count;
624 reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc);
625 }
626 *count = retCount;
627 return status;
628 }
Richard Fitzgeraldad3af332013-03-25 16:54:37 +0000629
Hayden Gomes524159d2019-12-23 14:41:47 -0800630 status_t setSupportedSystemUsages(const std::vector<audio_usage_t>& systemUsages) {
631 Parcel data, reply;
632 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
633 data.writeInt32(systemUsages.size());
634 for (auto systemUsage : systemUsages) {
635 data.writeInt32(systemUsage);
636 }
637 status_t status = remote()->transact(SET_SUPPORTED_SYSTEM_USAGES, data, &reply);
638 if (status != NO_ERROR) {
639 return status;
640 }
641 return static_cast <status_t> (reply.readInt32());
642 }
643
Kevin Rocardb99cc752019-03-21 20:52:24 -0700644 status_t setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t flags) override {
645 Parcel data, reply;
646 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
647 data.writeInt32(uid);
648 data.writeInt32(flags);
649 remote()->transact(SET_ALLOWED_CAPTURE_POLICY, data, &reply);
650 return reply.readInt32();
651 }
652
Richard Fitzgeraldad3af332013-03-25 16:54:37 +0000653 virtual bool isOffloadSupported(const audio_offload_info_t& info)
654 {
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +0100655 Parcel data, reply;
656 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
657 data.write(&info, sizeof(audio_offload_info_t));
658 remote()->transact(IS_OFFLOAD_SUPPORTED, data, &reply);
Eric Laurent203b1a12014-04-01 10:34:16 -0700659 return reply.readInt32();
660 }
661
Michael Chana94fbb22018-04-24 14:31:19 +1000662 virtual bool isDirectOutputSupported(const audio_config_base_t& config,
663 const audio_attributes_t& attributes) {
664 Parcel data, reply;
665 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
666 data.write(&config, sizeof(audio_config_base_t));
667 data.write(&attributes, sizeof(audio_attributes_t));
668 status_t status = remote()->transact(IS_DIRECT_OUTPUT_SUPPORTED, data, &reply);
669 return status == NO_ERROR ? static_cast<bool>(reply.readInt32()) : false;
670 }
671
Eric Laurent203b1a12014-04-01 10:34:16 -0700672 virtual status_t listAudioPorts(audio_port_role_t role,
673 audio_port_type_t type,
674 unsigned int *num_ports,
675 struct audio_port *ports,
676 unsigned int *generation)
677 {
678 if (num_ports == NULL || (*num_ports != 0 && ports == NULL) ||
679 generation == NULL) {
680 return BAD_VALUE;
681 }
682 Parcel data, reply;
683 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
684 unsigned int numPortsReq = (ports == NULL) ? 0 : *num_ports;
685 data.writeInt32(role);
686 data.writeInt32(type);
687 data.writeInt32(numPortsReq);
688 status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply);
689 if (status == NO_ERROR) {
690 status = (status_t)reply.readInt32();
691 *num_ports = (unsigned int)reply.readInt32();
692 }
Eric Laurent203b1a12014-04-01 10:34:16 -0700693 if (status == NO_ERROR) {
694 if (numPortsReq > *num_ports) {
695 numPortsReq = *num_ports;
696 }
697 if (numPortsReq > 0) {
698 reply.read(ports, numPortsReq * sizeof(struct audio_port));
699 }
700 *generation = reply.readInt32();
701 }
702 return status;
703 }
704
705 virtual status_t getAudioPort(struct audio_port *port)
706 {
707 if (port == NULL) {
708 return BAD_VALUE;
709 }
710 Parcel data, reply;
711 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
712 data.write(port, sizeof(struct audio_port));
713 status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply);
714 if (status != NO_ERROR ||
715 (status = (status_t)reply.readInt32()) != NO_ERROR) {
716 return status;
717 }
718 reply.read(port, sizeof(struct audio_port));
719 return status;
720 }
721
722 virtual status_t createAudioPatch(const struct audio_patch *patch,
723 audio_patch_handle_t *handle)
724 {
725 if (patch == NULL || handle == NULL) {
726 return BAD_VALUE;
727 }
728 Parcel data, reply;
729 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
730 data.write(patch, sizeof(struct audio_patch));
731 data.write(handle, sizeof(audio_patch_handle_t));
732 status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply);
733 if (status != NO_ERROR ||
734 (status = (status_t)reply.readInt32()) != NO_ERROR) {
735 return status;
736 }
737 reply.read(handle, sizeof(audio_patch_handle_t));
738 return status;
739 }
740
741 virtual status_t releaseAudioPatch(audio_patch_handle_t handle)
742 {
743 Parcel data, reply;
744 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
745 data.write(&handle, sizeof(audio_patch_handle_t));
746 status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply);
747 if (status != NO_ERROR) {
748 status = (status_t)reply.readInt32();
749 }
750 return status;
751 }
752
753 virtual status_t listAudioPatches(unsigned int *num_patches,
754 struct audio_patch *patches,
755 unsigned int *generation)
756 {
757 if (num_patches == NULL || (*num_patches != 0 && patches == NULL) ||
758 generation == NULL) {
759 return BAD_VALUE;
760 }
761 Parcel data, reply;
762 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
763 unsigned int numPatchesReq = (patches == NULL) ? 0 : *num_patches;
764 data.writeInt32(numPatchesReq);
765 status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply);
766 if (status == NO_ERROR) {
767 status = (status_t)reply.readInt32();
768 *num_patches = (unsigned int)reply.readInt32();
769 }
770 if (status == NO_ERROR) {
771 if (numPatchesReq > *num_patches) {
772 numPatchesReq = *num_patches;
773 }
774 if (numPatchesReq > 0) {
775 reply.read(patches, numPatchesReq * sizeof(struct audio_patch));
776 }
777 *generation = reply.readInt32();
778 }
779 return status;
780 }
781
782 virtual status_t setAudioPortConfig(const struct audio_port_config *config)
783 {
784 if (config == NULL) {
785 return BAD_VALUE;
786 }
787 Parcel data, reply;
788 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
789 data.write(config, sizeof(struct audio_port_config));
790 status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply);
791 if (status != NO_ERROR) {
792 status = (status_t)reply.readInt32();
793 }
794 return status;
795 }
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700796
Eric Laurentb52c1522014-05-20 11:27:36 -0700797 virtual void registerClient(const sp<IAudioPolicyServiceClient>& client)
798 {
799 Parcel data, reply;
800 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Marco Nelissenf8880202014-11-14 07:58:25 -0800801 data.writeStrongBinder(IInterface::asBinder(client));
Eric Laurentb52c1522014-05-20 11:27:36 -0700802 remote()->transact(REGISTER_CLIENT, data, &reply);
803 }
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700804
Eric Laurente8726fe2015-06-26 09:39:24 -0700805 virtual void setAudioPortCallbacksEnabled(bool enabled)
806 {
807 Parcel data, reply;
808 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
809 data.writeInt32(enabled ? 1 : 0);
810 remote()->transact(SET_AUDIO_PORT_CALLBACK_ENABLED, data, &reply);
811 }
812
François Gaffiecfe17322018-11-07 13:41:29 +0100813 virtual void setAudioVolumeGroupCallbacksEnabled(bool enabled)
814 {
815 Parcel data, reply;
816 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
817 data.writeInt32(enabled ? 1 : 0);
818 remote()->transact(SET_AUDIO_VOLUME_GROUP_CALLBACK_ENABLED, data, &reply);
819 }
820
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700821 virtual status_t acquireSoundTriggerSession(audio_session_t *session,
822 audio_io_handle_t *ioHandle,
823 audio_devices_t *device)
824 {
825 if (session == NULL || ioHandle == NULL || device == NULL) {
826 return BAD_VALUE;
827 }
828 Parcel data, reply;
829 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
830 status_t status = remote()->transact(ACQUIRE_SOUNDTRIGGER_SESSION, data, &reply);
831 if (status != NO_ERROR) {
832 return status;
833 }
834 status = (status_t)reply.readInt32();
835 if (status == NO_ERROR) {
836 *session = (audio_session_t)reply.readInt32();
837 *ioHandle = (audio_io_handle_t)reply.readInt32();
838 *device = (audio_devices_t)reply.readInt32();
839 }
840 return status;
841 }
842
843 virtual status_t releaseSoundTriggerSession(audio_session_t session)
844 {
845 Parcel data, reply;
846 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
847 data.writeInt32(session);
848 status_t status = remote()->transact(RELEASE_SOUNDTRIGGER_SESSION, data, &reply);
849 if (status != NO_ERROR) {
850 return status;
851 }
852 return (status_t)reply.readInt32();
853 }
Eric Laurentbb6c9a02014-09-25 14:11:47 -0700854
855 virtual audio_mode_t getPhoneState()
856 {
857 Parcel data, reply;
858 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
859 status_t status = remote()->transact(GET_PHONE_STATE, data, &reply);
860 if (status != NO_ERROR) {
861 return AUDIO_MODE_INVALID;
862 }
863 return (audio_mode_t)reply.readInt32();
864 }
Eric Laurentbaac1832014-12-01 17:52:59 -0800865
Chih-Hung Hsiehe964d4e2016-08-09 14:31:32 -0700866 virtual status_t registerPolicyMixes(const Vector<AudioMix>& mixes, bool registration)
Eric Laurentbaac1832014-12-01 17:52:59 -0800867 {
868 Parcel data, reply;
869 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
870 data.writeInt32(registration ? 1 : 0);
871 size_t size = mixes.size();
872 if (size > MAX_MIXES_PER_POLICY) {
873 size = MAX_MIXES_PER_POLICY;
874 }
875 size_t sizePosition = data.dataPosition();
876 data.writeInt32(size);
877 size_t finalSize = size;
878 for (size_t i = 0; i < size; i++) {
879 size_t position = data.dataPosition();
880 if (mixes[i].writeToParcel(&data) != NO_ERROR) {
881 data.setDataPosition(position);
882 finalSize--;
883 }
884 }
885 if (size != finalSize) {
886 size_t position = data.dataPosition();
887 data.setDataPosition(sizePosition);
888 data.writeInt32(finalSize);
889 data.setDataPosition(position);
890 }
891 status_t status = remote()->transact(REGISTER_POLICY_MIXES, data, &reply);
892 if (status == NO_ERROR) {
893 status = (status_t)reply.readInt32();
894 }
895 return status;
896 }
Eric Laurent554a2772015-04-10 11:29:24 -0700897
898 virtual status_t startAudioSource(const struct audio_port_config *source,
899 const audio_attributes_t *attributes,
Eric Laurent3e6c7e12018-07-27 17:09:23 -0700900 audio_port_handle_t *portId)
Eric Laurent554a2772015-04-10 11:29:24 -0700901 {
902 Parcel data, reply;
903 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurent3e6c7e12018-07-27 17:09:23 -0700904 if (source == NULL || attributes == NULL || portId == NULL) {
Eric Laurent554a2772015-04-10 11:29:24 -0700905 return BAD_VALUE;
906 }
907 data.write(source, sizeof(struct audio_port_config));
908 data.write(attributes, sizeof(audio_attributes_t));
909 status_t status = remote()->transact(START_AUDIO_SOURCE, data, &reply);
910 if (status != NO_ERROR) {
911 return status;
912 }
913 status = (status_t)reply.readInt32();
914 if (status != NO_ERROR) {
915 return status;
916 }
Eric Laurent3e6c7e12018-07-27 17:09:23 -0700917 *portId = (audio_port_handle_t)reply.readInt32();
Eric Laurent554a2772015-04-10 11:29:24 -0700918 return status;
919 }
920
Eric Laurent3e6c7e12018-07-27 17:09:23 -0700921 virtual status_t stopAudioSource(audio_port_handle_t portId)
Eric Laurent554a2772015-04-10 11:29:24 -0700922 {
923 Parcel data, reply;
924 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurent3e6c7e12018-07-27 17:09:23 -0700925 data.writeInt32(portId);
Eric Laurent554a2772015-04-10 11:29:24 -0700926 status_t status = remote()->transact(STOP_AUDIO_SOURCE, data, &reply);
927 if (status != NO_ERROR) {
928 return status;
929 }
930 status = (status_t)reply.readInt32();
931 return status;
932 }
Andy Hung2ddee192015-12-18 17:34:44 -0800933
934 virtual status_t setMasterMono(bool mono)
935 {
936 Parcel data, reply;
937 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
938 data.writeInt32(static_cast<int32_t>(mono));
939 status_t status = remote()->transact(SET_MASTER_MONO, data, &reply);
940 if (status != NO_ERROR) {
941 return status;
942 }
943 return static_cast<status_t>(reply.readInt32());
944 }
945
946 virtual status_t getMasterMono(bool *mono)
947 {
948 if (mono == nullptr) {
949 return BAD_VALUE;
950 }
951 Parcel data, reply;
952 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
953
954 status_t status = remote()->transact(GET_MASTER_MONO, data, &reply);
955 if (status != NO_ERROR) {
956 return status;
957 }
958 status = static_cast<status_t>(reply.readInt32());
959 if (status == NO_ERROR) {
960 *mono = static_cast<bool>(reply.readInt32());
961 }
962 return status;
963 }
Eric Laurentac9cef52017-06-09 15:46:26 -0700964
965 virtual float getStreamVolumeDB(audio_stream_type_t stream, int index, audio_devices_t device)
966 {
967 Parcel data, reply;
968 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
969 data.writeInt32(static_cast <int32_t>(stream));
970 data.writeInt32(static_cast <int32_t>(index));
971 data.writeUint32(static_cast <uint32_t>(device));
972 status_t status = remote()->transact(GET_STREAM_VOLUME_DB, data, &reply);
973 if (status != NO_ERROR) {
974 return NAN;
975 }
976 return reply.readFloat();
977 }
jiabin81772902018-04-02 17:52:27 -0700978
979 virtual status_t getSurroundFormats(unsigned int *numSurroundFormats,
980 audio_format_t *surroundFormats,
981 bool *surroundFormatsEnabled,
982 bool reported)
983 {
984 if (numSurroundFormats == NULL || (*numSurroundFormats != 0 &&
985 (surroundFormats == NULL || surroundFormatsEnabled == NULL))) {
986 return BAD_VALUE;
987 }
988 Parcel data, reply;
989 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
990 unsigned int numSurroundFormatsReq = *numSurroundFormats;
991 data.writeUint32(numSurroundFormatsReq);
992 data.writeBool(reported);
993 status_t status = remote()->transact(GET_SURROUND_FORMATS, data, &reply);
994 if (status == NO_ERROR && (status = (status_t)reply.readInt32()) == NO_ERROR) {
995 *numSurroundFormats = reply.readUint32();
996 }
997 if (status == NO_ERROR) {
998 if (numSurroundFormatsReq > *numSurroundFormats) {
999 numSurroundFormatsReq = *numSurroundFormats;
1000 }
1001 if (numSurroundFormatsReq > 0) {
1002 status = reply.read(surroundFormats,
1003 numSurroundFormatsReq * sizeof(audio_format_t));
1004 if (status != NO_ERROR) {
1005 return status;
1006 }
1007 status = reply.read(surroundFormatsEnabled,
1008 numSurroundFormatsReq * sizeof(bool));
1009 }
1010 }
1011 return status;
1012 }
1013
1014 virtual status_t setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled)
1015 {
1016 Parcel data, reply;
1017 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1018 data.writeInt32(audioFormat);
1019 data.writeBool(enabled);
1020 status_t status = remote()->transact(SET_SURROUND_FORMAT_ENABLED, data, &reply);
1021 if (status != NO_ERROR) {
1022 return status;
1023 }
1024 return reply.readInt32();
1025 }
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001026
Arun Mirpuri11029ad2018-12-19 20:45:19 -08001027 virtual status_t getHwOffloadEncodingFormatsSupportedForA2DP(
1028 std::vector<audio_format_t> *formats)
1029 {
1030 if (formats == NULL) {
1031 return BAD_VALUE;
1032 }
1033
1034 Parcel data, reply;
1035 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1036 status_t status = remote()->transact(GET_OFFLOAD_FORMATS_A2DP, data, &reply);
1037 if (status != NO_ERROR || (status = (status_t)reply.readInt32()) != NO_ERROR) {
1038 return status;
1039 }
1040
1041 size_t list_size = reply.readUint32();
1042
1043 for (size_t i = 0; i < list_size; i++) {
1044 formats->push_back(static_cast<audio_format_t>(reply.readInt32()));
1045 }
1046 return NO_ERROR;
1047 }
1048
1049
1050 virtual status_t addStreamDefaultEffect(const effect_uuid_t *type,
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001051 const String16& opPackageName,
1052 const effect_uuid_t *uuid,
1053 int32_t priority,
1054 audio_usage_t usage,
1055 audio_unique_id_t* id)
1056 {
1057 Parcel data, reply;
1058 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1059 data.write(type, sizeof(effect_uuid_t));
1060 data.writeString16(opPackageName);
1061 data.write(uuid, sizeof(effect_uuid_t));
1062 data.writeInt32(priority);
1063 data.writeInt32((int32_t) usage);
1064 status_t status = remote()->transact(ADD_STREAM_DEFAULT_EFFECT, data, &reply);
1065 if (status != NO_ERROR) {
1066 return status;
1067 }
1068 status = static_cast <status_t> (reply.readInt32());
1069 *id = reply.readInt32();
1070 return status;
1071 }
1072
1073 virtual status_t removeStreamDefaultEffect(audio_unique_id_t id)
1074 {
1075 Parcel data, reply;
1076 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1077 data.writeInt32(id);
1078 status_t status = remote()->transact(REMOVE_STREAM_DEFAULT_EFFECT, data, &reply);
1079 if (status != NO_ERROR) {
1080 return status;
1081 }
1082 return static_cast <status_t> (reply.readInt32());
1083 }
1084
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001085 virtual status_t addSourceDefaultEffect(const effect_uuid_t *type,
1086 const String16& opPackageName,
1087 const effect_uuid_t *uuid,
1088 int32_t priority,
1089 audio_source_t source,
1090 audio_unique_id_t* id)
1091 {
1092 Parcel data, reply;
1093 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1094 data.write(type, sizeof(effect_uuid_t));
1095 data.writeString16(opPackageName);
1096 data.write(uuid, sizeof(effect_uuid_t));
1097 data.writeInt32(priority);
1098 data.writeInt32((int32_t) source);
1099 status_t status = remote()->transact(ADD_SOURCE_DEFAULT_EFFECT, data, &reply);
1100 if (status != NO_ERROR) {
1101 return status;
1102 }
1103 status = static_cast <status_t> (reply.readInt32());
1104 *id = reply.readInt32();
1105 return status;
1106 }
1107
1108 virtual status_t removeSourceDefaultEffect(audio_unique_id_t id)
1109 {
1110 Parcel data, reply;
1111 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1112 data.writeInt32(id);
1113 status_t status = remote()->transact(REMOVE_SOURCE_DEFAULT_EFFECT, data, &reply);
1114 if (status != NO_ERROR) {
1115 return status;
1116 }
1117 return static_cast <status_t> (reply.readInt32());
1118 }
1119
Eric Laurentb78763e2018-10-17 10:08:02 -07001120 virtual status_t setAssistantUid(uid_t uid)
1121 {
1122 Parcel data, reply;
1123 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1124 data.writeInt32(uid);
1125 status_t status = remote()->transact(SET_ASSISTANT_UID, data, &reply);
1126 if (status != NO_ERROR) {
1127 return status;
1128 }
1129 return static_cast <status_t> (reply.readInt32());
1130 }
1131
1132 virtual status_t setA11yServicesUids(const std::vector<uid_t>& uids)
1133 {
1134 Parcel data, reply;
1135 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1136 data.writeInt32(uids.size());
1137 for (auto uid : uids) {
1138 data.writeInt32(uid);
1139 }
1140 status_t status = remote()->transact(SET_A11Y_SERVICES_UIDS, data, &reply);
1141 if (status != NO_ERROR) {
1142 return status;
1143 }
1144 return static_cast <status_t> (reply.readInt32());
1145 }
1146
jiabin6012f912018-11-02 17:06:30 -07001147 virtual bool isHapticPlaybackSupported()
1148 {
1149 Parcel data, reply;
1150 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1151 status_t status = remote()->transact(IS_HAPTIC_PLAYBACK_SUPPORTED, data, &reply);
1152 if (status != NO_ERROR) {
1153 return false;
1154 }
1155 return reply.readBool();
1156 }
1157
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001158 virtual status_t setUidDeviceAffinities(uid_t uid, const Vector<AudioDeviceTypeAddr>& devices)
1159 {
1160 Parcel data, reply;
1161 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1162
1163 data.writeInt32((int32_t) uid);
1164 size_t size = devices.size();
1165 size_t sizePosition = data.dataPosition();
1166 data.writeInt32((int32_t) size);
1167 size_t finalSize = size;
1168 for (size_t i = 0; i < size; i++) {
1169 size_t position = data.dataPosition();
1170 if (devices[i].writeToParcel(&data) != NO_ERROR) {
1171 data.setDataPosition(position);
1172 finalSize--;
1173 }
1174 }
1175 if (size != finalSize) {
1176 size_t position = data.dataPosition();
1177 data.setDataPosition(sizePosition);
1178 data.writeInt32(finalSize);
1179 data.setDataPosition(position);
1180 }
1181
1182 status_t status = remote()->transact(SET_UID_DEVICE_AFFINITY, data, &reply);
1183 if (status == NO_ERROR) {
1184 status = (status_t)reply.readInt32();
1185 }
1186 return status;
1187 }
1188
François Gaffied0ba9ed2018-11-05 11:50:42 +01001189 virtual status_t removeUidDeviceAffinities(uid_t uid) {
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001190 Parcel data, reply;
1191 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1192
1193 data.writeInt32((int32_t) uid);
1194
François Gaffied0ba9ed2018-11-05 11:50:42 +01001195 status_t status =
1196 remote()->transact(REMOVE_UID_DEVICE_AFFINITY, data, &reply);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001197 if (status == NO_ERROR) {
François Gaffied0ba9ed2018-11-05 11:50:42 +01001198 status = (status_t) reply.readInt32();
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001199 }
1200 return status;
1201 }
François Gaffied0ba9ed2018-11-05 11:50:42 +01001202
Oscar Azucena90e77632019-11-27 17:12:28 -08001203 virtual status_t setUserIdDeviceAffinities(int userId,
1204 const Vector<AudioDeviceTypeAddr>& devices)
1205 {
1206 Parcel data, reply;
1207 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1208
1209 data.writeInt32((int32_t) userId);
1210 size_t size = devices.size();
1211 size_t sizePosition = data.dataPosition();
1212 data.writeInt32((int32_t) size);
1213 size_t finalSize = size;
1214 for (size_t i = 0; i < size; i++) {
1215 size_t position = data.dataPosition();
1216 if (devices[i].writeToParcel(&data) != NO_ERROR) {
1217 data.setDataPosition(position);
1218 finalSize--;
1219 }
1220 }
1221 if (size != finalSize) {
1222 size_t position = data.dataPosition();
1223 data.setDataPosition(sizePosition);
1224 data.writeInt32(finalSize);
1225 data.setDataPosition(position);
1226 }
1227
1228 status_t status = remote()->transact(SET_USERID_DEVICE_AFFINITY, data, &reply);
1229 if (status == NO_ERROR) {
1230 status = (status_t)reply.readInt32();
1231 }
1232 return status;
1233 }
1234
1235 virtual status_t removeUserIdDeviceAffinities(int userId) {
1236 Parcel data, reply;
1237 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1238
1239 data.writeInt32((int32_t) userId);
1240
1241 status_t status =
1242 remote()->transact(REMOVE_USERID_DEVICE_AFFINITY, data, &reply);
1243 if (status == NO_ERROR) {
1244 status = (status_t) reply.readInt32();
1245 }
1246 return status;
1247 }
1248
François Gaffied0ba9ed2018-11-05 11:50:42 +01001249 virtual status_t listAudioProductStrategies(AudioProductStrategyVector &strategies)
1250 {
1251 Parcel data, reply;
1252 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1253
1254 status_t status = remote()->transact(LIST_AUDIO_PRODUCT_STRATEGIES, data, &reply);
1255 if (status != NO_ERROR) {
1256 ALOGE("%s: permission denied", __func__);
1257 return status;
1258 }
1259 status = static_cast<status_t>(reply.readInt32());
François Gaffie4b2018b2018-11-07 11:18:59 +01001260 if (status != NO_ERROR) {
1261 return status;
François Gaffied0ba9ed2018-11-05 11:50:42 +01001262 }
François Gaffie4b2018b2018-11-07 11:18:59 +01001263 uint32_t numStrategies = static_cast<uint32_t>(reply.readInt32());
1264 for (size_t i = 0; i < numStrategies; i++) {
1265 AudioProductStrategy strategy;
1266 status = strategy.readFromParcel(&reply);
1267 if (status != NO_ERROR) {
1268 ALOGE("%s: failed to read strategies", __FUNCTION__);
1269 strategies.clear();
1270 return status;
1271 }
1272 strategies.push_back(strategy);
1273 }
1274 return NO_ERROR;
François Gaffied0ba9ed2018-11-05 11:50:42 +01001275 }
1276
François Gaffie4b2018b2018-11-07 11:18:59 +01001277 virtual status_t getProductStrategyFromAudioAttributes(const AudioAttributes &aa,
1278 product_strategy_t &productStrategy)
François Gaffied0ba9ed2018-11-05 11:50:42 +01001279 {
1280 Parcel data, reply;
1281 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1282 status_t status = aa.writeToParcel(&data);
1283 if (status != NO_ERROR) {
François Gaffie4b2018b2018-11-07 11:18:59 +01001284 return status;
François Gaffied0ba9ed2018-11-05 11:50:42 +01001285 }
1286 status = remote()->transact(GET_STRATEGY_FOR_ATTRIBUTES, data, &reply);
François Gaffie4b2018b2018-11-07 11:18:59 +01001287 if (status != NO_ERROR) {
1288 return status;
François Gaffied0ba9ed2018-11-05 11:50:42 +01001289 }
François Gaffie4b2018b2018-11-07 11:18:59 +01001290 status = static_cast<status_t>(reply.readInt32());
1291 if (status != NO_ERROR) {
1292 return status;
1293 }
1294 productStrategy = static_cast<product_strategy_t>(reply.readInt32());
1295 return NO_ERROR;
1296 }
1297
1298 virtual status_t listAudioVolumeGroups(AudioVolumeGroupVector &groups)
1299 {
1300 Parcel data, reply;
1301 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1302
1303 status_t status = remote()->transact(LIST_AUDIO_VOLUME_GROUPS, data, &reply);
1304 if (status != NO_ERROR) {
1305 return status;
1306 }
1307 status = static_cast<status_t>(reply.readInt32());
1308 if (status != NO_ERROR) {
1309 return status;
1310 }
1311 uint32_t numGroups = static_cast<uint32_t>(reply.readInt32());
1312 for (size_t i = 0; i < numGroups; i++) {
1313 AudioVolumeGroup group;
1314 status = group.readFromParcel(&reply);
1315 if (status != NO_ERROR) {
1316 ALOGE("%s: failed to read volume groups", __FUNCTION__);
1317 groups.clear();
1318 return status;
1319 }
1320 groups.push_back(group);
1321 }
1322 return NO_ERROR;
1323 }
1324
1325 virtual status_t getVolumeGroupFromAudioAttributes(const AudioAttributes &aa,
1326 volume_group_t &volumeGroup)
1327 {
1328 Parcel data, reply;
1329 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1330 status_t status = aa.writeToParcel(&data);
1331 if (status != NO_ERROR) {
1332 return status;
1333 }
1334 status = remote()->transact(GET_VOLUME_GROUP_FOR_ATTRIBUTES, data, &reply);
1335 if (status != NO_ERROR) {
1336 return status;
1337 }
1338 status = static_cast<status_t>(reply.readInt32());
1339 if (status != NO_ERROR) {
1340 return status;
1341 }
1342 volumeGroup = static_cast<volume_group_t>(reply.readInt32());
1343 return NO_ERROR;
François Gaffied0ba9ed2018-11-05 11:50:42 +01001344 }
Eric Laurent6ede98f2019-06-11 14:50:30 -07001345
1346 virtual status_t setRttEnabled(bool enabled)
1347 {
1348 Parcel data, reply;
1349 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1350 data.writeInt32(static_cast<int32_t>(enabled));
1351 status_t status = remote()->transact(SET_RTT_ENABLED, data, &reply);
1352 if (status != NO_ERROR) {
1353 return status;
1354 }
1355 return static_cast<status_t>(reply.readInt32());
1356 }
Eric Laurent8340e672019-11-06 11:01:08 -08001357
1358 virtual bool isCallScreenModeSupported()
1359 {
1360 Parcel data, reply;
1361 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1362 status_t status = remote()->transact(IS_CALL_SCREEN_MODE_SUPPORTED, data, &reply);
1363 if (status != NO_ERROR) {
1364 return false;
1365 }
1366 return reply.readBool();
1367 }
Jean-Michel Trivi30857152019-11-01 11:04:15 -07001368
1369 virtual status_t setPreferredDeviceForStrategy(product_strategy_t strategy,
1370 const AudioDeviceTypeAddr &device)
1371 {
1372 Parcel data, reply;
1373 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1374 data.writeUint32(static_cast<uint32_t>(strategy));
1375 status_t status = device.writeToParcel(&data);
1376 if (status != NO_ERROR) {
1377 return BAD_VALUE;
1378 }
1379 status = remote()->transact(SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY,
1380 data, &reply);
1381 if (status != NO_ERROR) {
1382 return status;
1383 }
1384 return static_cast<status_t>(reply.readInt32());
1385 }
1386
1387 virtual status_t removePreferredDeviceForStrategy(product_strategy_t strategy)
1388 {
1389 Parcel data, reply;
1390 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1391 data.writeUint32(static_cast<uint32_t>(strategy));
1392 status_t status = remote()->transact(REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY,
1393 data, &reply);
1394 if (status != NO_ERROR) {
1395 return status;
1396 }
1397 return static_cast<status_t>(reply.readInt32());
1398 }
1399
1400 virtual status_t getPreferredDeviceForStrategy(product_strategy_t strategy,
1401 AudioDeviceTypeAddr &device)
1402 {
1403 Parcel data, reply;
1404 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1405 data.writeUint32(static_cast<uint32_t>(strategy));
1406 status_t status = remote()->transact(GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY,
1407 data, &reply);
1408 if (status != NO_ERROR) {
1409 return status;
1410 }
1411 status = device.readFromParcel(&reply);
1412 if (status != NO_ERROR) {
1413 return status;
1414 }
1415 return static_cast<status_t>(reply.readInt32());
1416 }
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001417
1418 virtual status_t getDevicesForAttributes(const AudioAttributes &aa,
1419 AudioDeviceTypeAddrVector *devices) const
1420 {
1421 if (devices == nullptr) {
1422 return BAD_VALUE;
1423 }
1424 Parcel data, reply;
1425 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1426 status_t status = aa.writeToParcel(&data);
1427 if (status != NO_ERROR) {
1428 return status;
1429 }
1430 status = remote()->transact(GET_DEVICES_FOR_ATTRIBUTES, data, &reply);
1431 if (status != NO_ERROR) {
1432 // transaction failed, return error
1433 return status;
1434 }
1435 status = static_cast<status_t>(reply.readInt32());
1436 if (status != NO_ERROR) {
1437 // APM method call failed, return error
1438 return status;
1439 }
1440
1441 const size_t numberOfDevices = (size_t)reply.readInt32();
1442 for (size_t i = 0; i < numberOfDevices; i++) {
1443 AudioDeviceTypeAddr device;
1444 if (device.readFromParcel((Parcel*)&reply) == NO_ERROR) {
1445 devices->push_back(device);
1446 } else {
1447 return FAILED_TRANSACTION;
1448 }
1449 }
1450 return NO_ERROR;
1451 }
Eric Laurentc2f1f072009-07-17 12:17:14 -07001452};
1453
1454IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
1455
1456// ----------------------------------------------------------------------
1457
Eric Laurentc2f1f072009-07-17 12:17:14 -07001458status_t BnAudioPolicyService::onTransact(
1459 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
1460{
Eric Laurentb1cc36b2017-12-11 12:14:16 -08001461 // make sure transactions reserved to AudioFlinger do not come from other processes
1462 switch (code) {
1463 case START_OUTPUT:
1464 case STOP_OUTPUT:
1465 case RELEASE_OUTPUT:
1466 case GET_INPUT_FOR_ATTR:
1467 case START_INPUT:
1468 case STOP_INPUT:
1469 case RELEASE_INPUT:
Eric Laurentb1cc36b2017-12-11 12:14:16 -08001470 case GET_OUTPUT_FOR_EFFECT:
1471 case REGISTER_EFFECT:
1472 case UNREGISTER_EFFECT:
1473 case SET_EFFECT_ENABLED:
1474 case GET_OUTPUT_FOR_ATTR:
Eric Laurent6c796322019-04-09 14:13:17 -07001475 case MOVE_EFFECTS_TO_IO:
Eric Laurentb1cc36b2017-12-11 12:14:16 -08001476 ALOGW("%s: transaction %d received from PID %d",
1477 __func__, code, IPCThreadState::self()->getCallingPid());
Eric Laurentef92bff2018-04-26 10:44:50 -07001478 // return status only for non void methods
1479 switch (code) {
1480 case RELEASE_OUTPUT:
1481 case RELEASE_INPUT:
1482 break;
1483 default:
1484 reply->writeInt32(static_cast<int32_t> (INVALID_OPERATION));
1485 break;
1486 }
1487 return OK;
Eric Laurentb1cc36b2017-12-11 12:14:16 -08001488 default:
1489 break;
1490 }
1491
Eric Laurent4980df22018-01-26 18:04:09 -08001492 // make sure the following transactions come from system components
1493 switch (code) {
1494 case SET_DEVICE_CONNECTION_STATE:
1495 case HANDLE_DEVICE_CONFIG_CHANGE:
1496 case SET_PHONE_STATE:
Eric Laurente17378d2018-05-09 14:43:01 -07001497//FIXME: Allow SET_FORCE_USE calls from system apps until a better use case routing API is available
1498// case SET_FORCE_USE:
Eric Laurent4980df22018-01-26 18:04:09 -08001499 case INIT_STREAM_VOLUME:
1500 case SET_STREAM_VOLUME:
1501 case REGISTER_POLICY_MIXES:
Eric Laurent10b71232018-04-13 18:14:44 -07001502 case SET_MASTER_MONO:
jiabin81772902018-04-02 17:52:27 -07001503 case GET_SURROUND_FORMATS:
Eric Laurentb78763e2018-10-17 10:08:02 -07001504 case SET_SURROUND_FORMAT_ENABLED:
1505 case SET_ASSISTANT_UID:
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001506 case SET_A11Y_SERVICES_UIDS:
1507 case SET_UID_DEVICE_AFFINITY:
Arun Mirpuri11029ad2018-12-19 20:45:19 -08001508 case REMOVE_UID_DEVICE_AFFINITY:
Oscar Azucena90e77632019-11-27 17:12:28 -08001509 case SET_USERID_DEVICE_AFFINITY:
1510 case REMOVE_USERID_DEVICE_AFFINITY:
François Gaffie4b2018b2018-11-07 11:18:59 +01001511 case GET_OFFLOAD_FORMATS_A2DP:
1512 case LIST_AUDIO_VOLUME_GROUPS:
Eric Laurent6ede98f2019-06-11 14:50:30 -07001513 case GET_VOLUME_GROUP_FOR_ATTRIBUTES:
Ytai Ben-Tsvia32e6012019-10-28 15:39:16 -07001514 case ACQUIRE_SOUNDTRIGGER_SESSION:
1515 case RELEASE_SOUNDTRIGGER_SESSION:
Eric Laurent8340e672019-11-06 11:01:08 -08001516 case SET_RTT_ENABLED:
Jean-Michel Trivi30857152019-11-01 11:04:15 -07001517 case IS_CALL_SCREEN_MODE_SUPPORTED:
1518 case SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY:
Hayden Gomes524159d2019-12-23 14:41:47 -08001519 case SET_SUPPORTED_SYSTEM_USAGES:
Jean-Michel Trivi30857152019-11-01 11:04:15 -07001520 case REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY:
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001521 case GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY:
jiabin140a34f2019-12-23 11:17:25 -08001522 case GET_DEVICES_FOR_ATTRIBUTES:
1523 case SET_ALLOWED_CAPTURE_POLICY: {
Andy Hung4ef19fa2018-05-15 19:35:29 -07001524 if (!isServiceUid(IPCThreadState::self()->getCallingUid())) {
Eric Laurent4980df22018-01-26 18:04:09 -08001525 ALOGW("%s: transaction %d received from PID %d unauthorized UID %d",
1526 __func__, code, IPCThreadState::self()->getCallingPid(),
1527 IPCThreadState::self()->getCallingUid());
Eric Laurentef92bff2018-04-26 10:44:50 -07001528 reply->writeInt32(static_cast<int32_t> (INVALID_OPERATION));
1529 return OK;
Eric Laurent4980df22018-01-26 18:04:09 -08001530 }
Eric Laurent96c7eed2018-03-26 17:57:01 -07001531 } break;
Eric Laurent4980df22018-01-26 18:04:09 -08001532 default:
1533 break;
1534 }
1535
Eric Laurent39b09b52018-06-29 12:24:40 -07001536 std::string tag("IAudioPolicyService command " + std::to_string(code));
1537 TimeCheck check(tag.c_str());
Eric Laurent3528c932018-02-23 17:17:22 -08001538
Glenn Kastene53b9ea2012-03-12 16:29:55 -07001539 switch (code) {
Eric Laurentc2f1f072009-07-17 12:17:14 -07001540 case SET_DEVICE_CONNECTION_STATE: {
1541 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001542 audio_devices_t device =
1543 static_cast <audio_devices_t>(data.readInt32());
1544 audio_policy_dev_state_t state =
1545 static_cast <audio_policy_dev_state_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -07001546 const char *device_address = data.readCString();
Paul McLeane743a472015-01-28 11:07:31 -08001547 const char *device_name = data.readCString();
Aniket Kumar Lata4e464702019-01-10 23:38:46 -08001548 audio_format_t codecFormat = static_cast <audio_format_t>(data.readInt32());
Pavlin Radoslavovc694ff42017-01-09 23:27:29 -08001549 if (device_address == nullptr || device_name == nullptr) {
1550 ALOGE("Bad Binder transaction: SET_DEVICE_CONNECTION_STATE for device %u", device);
1551 reply->writeInt32(static_cast<int32_t> (BAD_VALUE));
1552 } else {
1553 reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device,
1554 state,
1555 device_address,
Aniket Kumar Lata4e464702019-01-10 23:38:46 -08001556 device_name,
1557 codecFormat)));
Pavlin Radoslavovc694ff42017-01-09 23:27:29 -08001558 }
Eric Laurentc2f1f072009-07-17 12:17:14 -07001559 return NO_ERROR;
1560 } break;
1561
1562 case GET_DEVICE_CONNECTION_STATE: {
1563 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001564 audio_devices_t device =
1565 static_cast<audio_devices_t> (data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -07001566 const char *device_address = data.readCString();
Pavlin Radoslavovc694ff42017-01-09 23:27:29 -08001567 if (device_address == nullptr) {
1568 ALOGE("Bad Binder transaction: GET_DEVICE_CONNECTION_STATE for device %u", device);
1569 reply->writeInt32(static_cast<int32_t> (AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE));
1570 } else {
1571 reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device,
1572 device_address)));
1573 }
Eric Laurentc2f1f072009-07-17 12:17:14 -07001574 return NO_ERROR;
1575 } break;
1576
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -08001577 case HANDLE_DEVICE_CONFIG_CHANGE: {
1578 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1579 audio_devices_t device =
1580 static_cast <audio_devices_t>(data.readInt32());
1581 const char *device_address = data.readCString();
1582 const char *device_name = data.readCString();
Aniket Kumar Lata4e464702019-01-10 23:38:46 -08001583 audio_format_t codecFormat =
1584 static_cast <audio_format_t>(data.readInt32());
Pavlin Radoslavovc694ff42017-01-09 23:27:29 -08001585 if (device_address == nullptr || device_name == nullptr) {
1586 ALOGE("Bad Binder transaction: HANDLE_DEVICE_CONFIG_CHANGE for device %u", device);
1587 reply->writeInt32(static_cast<int32_t> (BAD_VALUE));
1588 } else {
1589 reply->writeInt32(static_cast<uint32_t> (handleDeviceConfigChange(device,
1590 device_address,
Aniket Kumar Lata4e464702019-01-10 23:38:46 -08001591 device_name,
1592 codecFormat)));
Pavlin Radoslavovc694ff42017-01-09 23:27:29 -08001593 }
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -08001594 return NO_ERROR;
1595 } break;
1596
Eric Laurentc2f1f072009-07-17 12:17:14 -07001597 case SET_PHONE_STATE: {
1598 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kasten85ab62c2012-11-01 11:11:38 -07001599 reply->writeInt32(static_cast <uint32_t>(setPhoneState(
Eric Laurent00dba062020-02-11 15:52:09 -08001600 (audio_mode_t) data.readInt32(),
1601 (uid_t) data.readInt32())));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001602 return NO_ERROR;
1603 } break;
1604
Eric Laurentc2f1f072009-07-17 12:17:14 -07001605 case SET_FORCE_USE: {
1606 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kasten85ab62c2012-11-01 11:11:38 -07001607 audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
1608 data.readInt32());
Dima Zavinfce7a472011-04-19 22:30:36 -07001609 audio_policy_forced_cfg_t config =
1610 static_cast <audio_policy_forced_cfg_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -07001611 reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config)));
1612 return NO_ERROR;
1613 } break;
1614
1615 case GET_FORCE_USE: {
1616 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kasten85ab62c2012-11-01 11:11:38 -07001617 audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
1618 data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -07001619 reply->writeInt32(static_cast <uint32_t>(getForceUse(usage)));
1620 return NO_ERROR;
1621 } break;
1622
1623 case GET_OUTPUT: {
1624 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001625 audio_stream_type_t stream =
1626 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentf4e63452017-11-06 19:31:46 +00001627 audio_io_handle_t output = getOutput(stream);
Eric Laurentfa2877b2009-07-28 08:44:33 -07001628 reply->writeInt32(static_cast <int>(output));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001629 return NO_ERROR;
1630 } break;
1631
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -07001632 case GET_OUTPUT_FOR_ATTR: {
1633 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurent42984412019-05-09 17:57:03 -07001634 audio_attributes_t attr = AUDIO_ATTRIBUTES_INITIALIZER;
1635 status_t status = data.read(&attr, sizeof(audio_attributes_t));
1636 if (status != NO_ERROR) {
1637 return status;
Eric Laurente83b55d2014-11-14 10:06:21 -08001638 }
Eric Laurent42984412019-05-09 17:57:03 -07001639 sanetizeAudioAttributes(&attr);
Eric Laurente83b55d2014-11-14 10:06:21 -08001640 audio_session_t session = (audio_session_t)data.readInt32();
1641 audio_stream_type_t stream = AUDIO_STREAM_DEFAULT;
1642 bool hasStream = data.readInt32() != 0;
1643 if (hasStream) {
1644 stream = (audio_stream_type_t)data.readInt32();
1645 }
Nadav Bar766fb022018-01-07 12:18:03 +02001646 pid_t pid = (pid_t)data.readInt32();
Eric Laurent8c7e6da2015-04-21 17:37:00 -07001647 uid_t uid = (uid_t)data.readInt32();
Eric Laurent20b9ef02016-12-05 11:03:16 -08001648 audio_config_t config;
1649 memset(&config, 0, sizeof(audio_config_t));
1650 data.read(&config, sizeof(audio_config_t));
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -07001651 audio_output_flags_t flags =
1652 static_cast <audio_output_flags_t>(data.readInt32());
Paul McLeanaa981192015-03-21 09:55:15 -07001653 audio_port_handle_t selectedDeviceId = data.readInt32();
Eric Laurent20b9ef02016-12-05 11:03:16 -08001654 audio_port_handle_t portId = (audio_port_handle_t)data.readInt32();
Robert Shiha946d842015-09-02 16:46:59 -07001655 audio_io_handle_t output = 0;
Kevin Rocard153f92d2018-12-18 18:33:28 -08001656 std::vector<audio_io_handle_t> secondaryOutputs;
Eric Laurent42984412019-05-09 17:57:03 -07001657 status = getOutputForAttr(&attr,
Nadav Bar766fb022018-01-07 12:18:03 +02001658 &output, session, &stream, pid, uid,
Eric Laurent20b9ef02016-12-05 11:03:16 -08001659 &config,
Kevin Rocard153f92d2018-12-18 18:33:28 -08001660 flags, &selectedDeviceId, &portId, &secondaryOutputs);
Eric Laurente83b55d2014-11-14 10:06:21 -08001661 reply->writeInt32(status);
Eric Laurent42984412019-05-09 17:57:03 -07001662 status = reply->write(&attr, sizeof(audio_attributes_t));
1663 if (status != NO_ERROR) {
1664 return status;
1665 }
Eric Laurente83b55d2014-11-14 10:06:21 -08001666 reply->writeInt32(output);
1667 reply->writeInt32(stream);
Eric Laurent9ae8c592017-06-22 17:17:09 -07001668 reply->writeInt32(selectedDeviceId);
Eric Laurent20b9ef02016-12-05 11:03:16 -08001669 reply->writeInt32(portId);
Kevin Rocard153f92d2018-12-18 18:33:28 -08001670 reply->writeInt32(secondaryOutputs.size());
1671 return reply->write(secondaryOutputs.data(),
1672 secondaryOutputs.size() * sizeof(audio_io_handle_t));
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -07001673 } break;
1674
Eric Laurentc2f1f072009-07-17 12:17:14 -07001675 case START_OUTPUT: {
1676 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentd7fe0862018-07-14 16:48:01 -07001677 const audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
1678 reply->writeInt32(static_cast <uint32_t>(startOutput(portId)));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001679 return NO_ERROR;
1680 } break;
1681
1682 case STOP_OUTPUT: {
1683 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentd7fe0862018-07-14 16:48:01 -07001684 const audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
1685 reply->writeInt32(static_cast <uint32_t>(stopOutput(portId)));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001686 return NO_ERROR;
1687 } break;
1688
1689 case RELEASE_OUTPUT: {
1690 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentd7fe0862018-07-14 16:48:01 -07001691 const audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
1692 releaseOutput(portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -07001693 return NO_ERROR;
1694 } break;
1695
Eric Laurentcaf7f482014-11-25 17:50:47 -08001696 case GET_INPUT_FOR_ATTR: {
Eric Laurentc2f1f072009-07-17 12:17:14 -07001697 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07001698 audio_attributes_t attr = {};
Eric Laurentcaf7f482014-11-25 17:50:47 -08001699 data.read(&attr, sizeof(audio_attributes_t));
Kevin Rocard39fdbd02017-11-13 11:15:27 -08001700 sanetizeAudioAttributes(&attr);
Eric Laurenta54f1282017-07-01 19:39:32 -07001701 audio_io_handle_t input = (audio_io_handle_t)data.readInt32();
Mikhail Naganov2996f672019-04-18 12:29:59 -07001702 audio_unique_id_t riid = (audio_unique_id_t)data.readInt32();
Eric Laurentcaf7f482014-11-25 17:50:47 -08001703 audio_session_t session = (audio_session_t)data.readInt32();
Eric Laurentb2379ba2016-05-23 17:42:12 -07001704 pid_t pid = (pid_t)data.readInt32();
Eric Laurent8c7e6da2015-04-21 17:37:00 -07001705 uid_t uid = (uid_t)data.readInt32();
Eric Laurentfee19762018-01-29 18:44:13 -08001706 const String16 opPackageName = data.readString16();
Eric Laurent20b9ef02016-12-05 11:03:16 -08001707 audio_config_base_t config;
1708 memset(&config, 0, sizeof(audio_config_base_t));
1709 data.read(&config, sizeof(audio_config_base_t));
Glenn Kastenb3b16602014-07-16 08:36:31 -07001710 audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
Paul McLean466dc8e2015-04-17 13:15:36 -06001711 audio_port_handle_t selectedDeviceId = (audio_port_handle_t) data.readInt32();
Eric Laurent20b9ef02016-12-05 11:03:16 -08001712 audio_port_handle_t portId = (audio_port_handle_t)data.readInt32();
Mikhail Naganov2996f672019-04-18 12:29:59 -07001713 status_t status = getInputForAttr(&attr, &input, riid, session, pid, uid,
Eric Laurentfee19762018-01-29 18:44:13 -08001714 opPackageName, &config,
Eric Laurent9ae8c592017-06-22 17:17:09 -07001715 flags, &selectedDeviceId, &portId);
Eric Laurentcaf7f482014-11-25 17:50:47 -08001716 reply->writeInt32(status);
1717 if (status == NO_ERROR) {
1718 reply->writeInt32(input);
Eric Laurent9ae8c592017-06-22 17:17:09 -07001719 reply->writeInt32(selectedDeviceId);
Eric Laurent20b9ef02016-12-05 11:03:16 -08001720 reply->writeInt32(portId);
Eric Laurentcaf7f482014-11-25 17:50:47 -08001721 }
Eric Laurentc2f1f072009-07-17 12:17:14 -07001722 return NO_ERROR;
1723 } break;
1724
1725 case START_INPUT: {
1726 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfee19762018-01-29 18:44:13 -08001727 audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
Eric Laurent4eb58f12018-12-07 16:41:02 -08001728 status_t status = startInput(portId);
Svet Ganovf4ddfef2018-01-16 07:37:58 -08001729 reply->writeInt32(static_cast <uint32_t>(status));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001730 return NO_ERROR;
1731 } break;
1732
1733 case STOP_INPUT: {
1734 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfee19762018-01-29 18:44:13 -08001735 audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
1736 reply->writeInt32(static_cast <uint32_t>(stopInput(portId)));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001737 return NO_ERROR;
1738 } break;
1739
1740 case RELEASE_INPUT: {
1741 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfee19762018-01-29 18:44:13 -08001742 audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
1743 releaseInput(portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -07001744 return NO_ERROR;
1745 } break;
1746
1747 case INIT_STREAM_VOLUME: {
1748 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001749 audio_stream_type_t stream =
1750 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -07001751 int indexMin = data.readInt32();
1752 int indexMax = data.readInt32();
1753 reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax)));
1754 return NO_ERROR;
1755 } break;
1756
1757 case SET_STREAM_VOLUME: {
1758 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001759 audio_stream_type_t stream =
1760 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -07001761 int index = data.readInt32();
Eric Laurent83844cc2011-11-18 16:43:31 -08001762 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
1763 reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream,
1764 index,
1765 device)));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001766 return NO_ERROR;
1767 } break;
1768
1769 case GET_STREAM_VOLUME: {
1770 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001771 audio_stream_type_t stream =
1772 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurent83844cc2011-11-18 16:43:31 -08001773 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
Robert Shih89235432015-09-02 16:46:59 -07001774 int index = 0;
Eric Laurent83844cc2011-11-18 16:43:31 -08001775 status_t status = getStreamVolumeIndex(stream, &index, device);
Eric Laurentc2f1f072009-07-17 12:17:14 -07001776 reply->writeInt32(index);
1777 reply->writeInt32(static_cast <uint32_t>(status));
1778 return NO_ERROR;
1779 } break;
1780
Eric Laurentde070132010-07-13 04:45:46 -07001781 case GET_STRATEGY_FOR_STREAM: {
1782 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001783 audio_stream_type_t stream =
1784 static_cast <audio_stream_type_t>(data.readInt32());
François Gaffiec005e562018-11-06 15:04:49 +01001785 reply->writeUint32(getStrategyForStream(stream));
Eric Laurentde070132010-07-13 04:45:46 -07001786 return NO_ERROR;
1787 } break;
1788
François Gaffiecfe17322018-11-07 13:41:29 +01001789 case SET_VOLUME_ATTRIBUTES: {
1790 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1791 audio_attributes_t attributes = {};
1792 status_t status = data.read(&attributes, sizeof(audio_attributes_t));
1793 if (status != NO_ERROR) {
1794 return status;
1795 }
1796 int index = data.readInt32();
1797 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
1798
1799 reply->writeInt32(static_cast <uint32_t>(setVolumeIndexForAttributes(attributes,
1800 index, device)));
1801 return NO_ERROR;
1802 } break;
1803
1804 case GET_VOLUME_ATTRIBUTES: {
1805 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1806 audio_attributes_t attributes = {};
1807 status_t status = data.read(&attributes, sizeof(audio_attributes_t));
1808 if (status != NO_ERROR) {
1809 return status;
1810 }
1811 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
1812
1813 int index = 0;
1814 status = getVolumeIndexForAttributes(attributes, index, device);
1815 reply->writeInt32(static_cast <uint32_t>(status));
1816 if (status == NO_ERROR) {
1817 reply->writeInt32(index);
1818 }
1819 return NO_ERROR;
1820 } break;
1821
1822 case GET_MIN_VOLUME_FOR_ATTRIBUTES: {
1823 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1824 audio_attributes_t attributes = {};
1825 status_t status = data.read(&attributes, sizeof(audio_attributes_t));
1826 if (status != NO_ERROR) {
1827 return status;
1828 }
1829
1830 int index = 0;
1831 status = getMinVolumeIndexForAttributes(attributes, index);
1832 reply->writeInt32(static_cast <uint32_t>(status));
1833 if (status == NO_ERROR) {
1834 reply->writeInt32(index);
1835 }
1836 return NO_ERROR;
1837 } break;
1838
1839 case GET_MAX_VOLUME_FOR_ATTRIBUTES: {
1840 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1841 audio_attributes_t attributes = {};
1842 status_t status = data.read(&attributes, sizeof(audio_attributes_t));
1843 if (status != NO_ERROR) {
1844 return status;
1845 }
1846
1847 int index = 0;
1848 status = getMaxVolumeIndexForAttributes(attributes, index);
1849 reply->writeInt32(static_cast <uint32_t>(status));
1850 if (status == NO_ERROR) {
1851 reply->writeInt32(index);
1852 }
1853 return NO_ERROR;
1854 } break;
1855
Glenn Kasten6b2718c2011-02-04 13:54:26 -08001856 case GET_DEVICES_FOR_STREAM: {
1857 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001858 audio_stream_type_t stream =
1859 static_cast <audio_stream_type_t>(data.readInt32());
Glenn Kasten6b2718c2011-02-04 13:54:26 -08001860 reply->writeInt32(static_cast <int>(getDevicesForStream(stream)));
1861 return NO_ERROR;
1862 } break;
1863
Eric Laurentde070132010-07-13 04:45:46 -07001864 case GET_OUTPUT_FOR_EFFECT: {
1865 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07001866 effect_descriptor_t desc = {};
1867 if (data.read(&desc, sizeof(desc)) != NO_ERROR) {
1868 android_errorWriteLog(0x534e4554, "73126106");
1869 }
1870 (void)sanitizeEffectDescriptor(&desc);
Eric Laurentde070132010-07-13 04:45:46 -07001871 audio_io_handle_t output = getOutputForEffect(&desc);
1872 reply->writeInt32(static_cast <int>(output));
1873 return NO_ERROR;
1874 } break;
1875
1876 case REGISTER_EFFECT: {
1877 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07001878 effect_descriptor_t desc = {};
1879 if (data.read(&desc, sizeof(desc)) != NO_ERROR) {
1880 android_errorWriteLog(0x534e4554, "73126106");
1881 }
1882 (void)sanitizeEffectDescriptor(&desc);
Eric Laurent7c7f10b2011-06-17 21:29:58 -07001883 audio_io_handle_t io = data.readInt32();
Eric Laurentde070132010-07-13 04:45:46 -07001884 uint32_t strategy = data.readInt32();
Glenn Kastend848eb42016-03-08 13:42:11 -08001885 audio_session_t session = (audio_session_t) data.readInt32();
Eric Laurentde070132010-07-13 04:45:46 -07001886 int id = data.readInt32();
1887 reply->writeInt32(static_cast <int32_t>(registerEffect(&desc,
Eric Laurent7c7f10b2011-06-17 21:29:58 -07001888 io,
Eric Laurentde070132010-07-13 04:45:46 -07001889 strategy,
1890 session,
1891 id)));
1892 return NO_ERROR;
1893 } break;
1894
1895 case UNREGISTER_EFFECT: {
1896 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1897 int id = data.readInt32();
1898 reply->writeInt32(static_cast <int32_t>(unregisterEffect(id)));
1899 return NO_ERROR;
1900 } break;
1901
Eric Laurentdb7c0792011-08-10 10:37:50 -07001902 case SET_EFFECT_ENABLED: {
1903 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1904 int id = data.readInt32();
1905 bool enabled = static_cast <bool>(data.readInt32());
1906 reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled)));
1907 return NO_ERROR;
1908 } break;
1909
Eric Laurent6c796322019-04-09 14:13:17 -07001910 case MOVE_EFFECTS_TO_IO: {
1911 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1912 std::vector<int> ids;
1913 int32_t size;
1914 status_t status = data.readInt32(&size);
1915 if (status != NO_ERROR) {
1916 return status;
1917 }
1918 if (size > MAX_ITEMS_PER_LIST) {
1919 return BAD_VALUE;
1920 }
1921 for (int32_t i = 0; i < size; i++) {
1922 int id;
1923 status = data.readInt32(&id);
1924 if (status != NO_ERROR) {
1925 return status;
1926 }
1927 ids.push_back(id);
1928 }
1929
1930 audio_io_handle_t io = data.readInt32();
1931 reply->writeInt32(static_cast <int32_t>(moveEffectsToIo(ids, io)));
1932 return NO_ERROR;
1933 } break;
1934
Eric Laurenteda6c362011-02-02 09:33:30 -08001935 case IS_STREAM_ACTIVE: {
1936 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kastenfff6d712012-01-12 16:38:12 -08001937 audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
Eric Laurenteda6c362011-02-02 09:33:30 -08001938 uint32_t inPastMs = (uint32_t)data.readInt32();
Eric Laurentebcb2542014-03-05 18:30:08 -08001939 reply->writeInt32( isStreamActive(stream, inPastMs) );
Eric Laurenteda6c362011-02-02 09:33:30 -08001940 return NO_ERROR;
1941 } break;
1942
Jean-Michel Trivi272ab542013-02-04 16:26:02 -08001943 case IS_STREAM_ACTIVE_REMOTELY: {
1944 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1945 audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1946 uint32_t inPastMs = (uint32_t)data.readInt32();
Eric Laurentebcb2542014-03-05 18:30:08 -08001947 reply->writeInt32( isStreamActiveRemotely(stream, inPastMs) );
Jean-Michel Trivi272ab542013-02-04 16:26:02 -08001948 return NO_ERROR;
1949 } break;
1950
Jean-Michel Trivid7086032012-10-10 12:11:16 -07001951 case IS_SOURCE_ACTIVE: {
1952 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1953 audio_source_t source = (audio_source_t) data.readInt32();
1954 reply->writeInt32( isSourceActive(source));
1955 return NO_ERROR;
1956 }
1957
Eric Laurent57dae992011-07-24 13:36:09 -07001958 case QUERY_DEFAULT_PRE_PROCESSING: {
1959 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kastend848eb42016-03-08 13:42:11 -08001960 audio_session_t audioSession = (audio_session_t) data.readInt32();
Eric Laurent57dae992011-07-24 13:36:09 -07001961 uint32_t count = data.readInt32();
Eric Laurent74adca92014-11-05 12:15:36 -08001962 if (count > AudioEffect::kMaxPreProcessing) {
1963 count = AudioEffect::kMaxPreProcessing;
1964 }
Eric Laurent57dae992011-07-24 13:36:09 -07001965 uint32_t retCount = count;
Andy Hungb0272092018-04-12 11:06:56 -07001966 effect_descriptor_t *descriptors = new effect_descriptor_t[count]{};
Eric Laurent57dae992011-07-24 13:36:09 -07001967 status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount);
1968 reply->writeInt32(status);
1969 if (status != NO_ERROR && status != NO_MEMORY) {
1970 retCount = 0;
1971 }
1972 reply->writeInt32(retCount);
Eric Laurent74adca92014-11-05 12:15:36 -08001973 if (retCount != 0) {
Eric Laurent57dae992011-07-24 13:36:09 -07001974 if (retCount < count) {
1975 count = retCount;
1976 }
1977 reply->write(descriptors, sizeof(effect_descriptor_t) * count);
1978 }
1979 delete[] descriptors;
1980 return status;
1981 }
1982
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +01001983 case IS_OFFLOAD_SUPPORTED: {
1984 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07001985 audio_offload_info_t info = {};
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +01001986 data.read(&info, sizeof(audio_offload_info_t));
1987 bool isSupported = isOffloadSupported(info);
1988 reply->writeInt32(isSupported);
1989 return NO_ERROR;
1990 }
1991
Michael Chana94fbb22018-04-24 14:31:19 +10001992 case IS_DIRECT_OUTPUT_SUPPORTED: {
1993 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1994 audio_config_base_t config = {};
1995 audio_attributes_t attributes = {};
1996 status_t status = data.read(&config, sizeof(audio_config_base_t));
1997 if (status != NO_ERROR) return status;
1998 status = data.read(&attributes, sizeof(audio_attributes_t));
1999 if (status != NO_ERROR) return status;
2000 reply->writeInt32(isDirectOutputSupported(config, attributes));
2001 return NO_ERROR;
2002 }
2003
Eric Laurent203b1a12014-04-01 10:34:16 -07002004 case LIST_AUDIO_PORTS: {
2005 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2006 audio_port_role_t role = (audio_port_role_t)data.readInt32();
2007 audio_port_type_t type = (audio_port_type_t)data.readInt32();
2008 unsigned int numPortsReq = data.readInt32();
Eric Laurent1d670b12015-02-06 10:44:24 -08002009 if (numPortsReq > MAX_ITEMS_PER_LIST) {
2010 numPortsReq = MAX_ITEMS_PER_LIST;
2011 }
Eric Laurent203b1a12014-04-01 10:34:16 -07002012 unsigned int numPorts = numPortsReq;
Eric Laurent203b1a12014-04-01 10:34:16 -07002013 struct audio_port *ports =
2014 (struct audio_port *)calloc(numPortsReq, sizeof(struct audio_port));
Eric Laurent1d670b12015-02-06 10:44:24 -08002015 if (ports == NULL) {
2016 reply->writeInt32(NO_MEMORY);
2017 reply->writeInt32(0);
2018 return NO_ERROR;
2019 }
2020 unsigned int generation;
Eric Laurent203b1a12014-04-01 10:34:16 -07002021 status_t status = listAudioPorts(role, type, &numPorts, ports, &generation);
2022 reply->writeInt32(status);
2023 reply->writeInt32(numPorts);
Eric Laurent203b1a12014-04-01 10:34:16 -07002024
2025 if (status == NO_ERROR) {
2026 if (numPortsReq > numPorts) {
2027 numPortsReq = numPorts;
2028 }
2029 reply->write(ports, numPortsReq * sizeof(struct audio_port));
2030 reply->writeInt32(generation);
2031 }
2032 free(ports);
2033 return NO_ERROR;
2034 }
2035
2036 case GET_AUDIO_PORT: {
2037 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Wei Jiae995e472015-09-09 09:48:34 -07002038 struct audio_port port = {};
2039 if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) {
2040 ALOGE("b/23912202");
2041 }
Eric Laurent203b1a12014-04-01 10:34:16 -07002042 status_t status = getAudioPort(&port);
2043 reply->writeInt32(status);
2044 if (status == NO_ERROR) {
2045 reply->write(&port, sizeof(struct audio_port));
2046 }
2047 return NO_ERROR;
2048 }
2049
2050 case CREATE_AUDIO_PATCH: {
2051 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07002052 struct audio_patch patch = {};
Eric Laurent203b1a12014-04-01 10:34:16 -07002053 data.read(&patch, sizeof(struct audio_patch));
Glenn Kastena13cde92016-03-28 15:26:02 -07002054 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
Wei Jiae995e472015-09-09 09:48:34 -07002055 if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) {
2056 ALOGE("b/23912202");
2057 }
Eric Laurent203b1a12014-04-01 10:34:16 -07002058 status_t status = createAudioPatch(&patch, &handle);
2059 reply->writeInt32(status);
2060 if (status == NO_ERROR) {
2061 reply->write(&handle, sizeof(audio_patch_handle_t));
2062 }
2063 return NO_ERROR;
2064 }
2065
2066 case RELEASE_AUDIO_PATCH: {
2067 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07002068 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
Eric Laurent203b1a12014-04-01 10:34:16 -07002069 data.read(&handle, sizeof(audio_patch_handle_t));
2070 status_t status = releaseAudioPatch(handle);
2071 reply->writeInt32(status);
2072 return NO_ERROR;
2073 }
2074
2075 case LIST_AUDIO_PATCHES: {
2076 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2077 unsigned int numPatchesReq = data.readInt32();
Eric Laurent1d670b12015-02-06 10:44:24 -08002078 if (numPatchesReq > MAX_ITEMS_PER_LIST) {
2079 numPatchesReq = MAX_ITEMS_PER_LIST;
2080 }
Eric Laurent203b1a12014-04-01 10:34:16 -07002081 unsigned int numPatches = numPatchesReq;
Eric Laurent203b1a12014-04-01 10:34:16 -07002082 struct audio_patch *patches =
2083 (struct audio_patch *)calloc(numPatchesReq,
2084 sizeof(struct audio_patch));
Eric Laurent1d670b12015-02-06 10:44:24 -08002085 if (patches == NULL) {
2086 reply->writeInt32(NO_MEMORY);
2087 reply->writeInt32(0);
2088 return NO_ERROR;
2089 }
2090 unsigned int generation;
Eric Laurent203b1a12014-04-01 10:34:16 -07002091 status_t status = listAudioPatches(&numPatches, patches, &generation);
2092 reply->writeInt32(status);
2093 reply->writeInt32(numPatches);
2094 if (status == NO_ERROR) {
2095 if (numPatchesReq > numPatches) {
2096 numPatchesReq = numPatches;
2097 }
2098 reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
2099 reply->writeInt32(generation);
2100 }
2101 free(patches);
2102 return NO_ERROR;
2103 }
2104
2105 case SET_AUDIO_PORT_CONFIG: {
2106 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07002107 struct audio_port_config config = {};
Eric Laurent203b1a12014-04-01 10:34:16 -07002108 data.read(&config, sizeof(struct audio_port_config));
Andy Hungb0272092018-04-12 11:06:56 -07002109 (void)sanitizeAudioPortConfig(&config);
Eric Laurent203b1a12014-04-01 10:34:16 -07002110 status_t status = setAudioPortConfig(&config);
2111 reply->writeInt32(status);
2112 return NO_ERROR;
2113 }
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07002114
Eric Laurentb52c1522014-05-20 11:27:36 -07002115 case REGISTER_CLIENT: {
2116 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2117 sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
2118 data.readStrongBinder());
2119 registerClient(client);
2120 return NO_ERROR;
2121 } break;
Eric Laurent203b1a12014-04-01 10:34:16 -07002122
Eric Laurente8726fe2015-06-26 09:39:24 -07002123 case SET_AUDIO_PORT_CALLBACK_ENABLED: {
2124 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2125 setAudioPortCallbacksEnabled(data.readInt32() == 1);
2126 return NO_ERROR;
2127 } break;
2128
François Gaffiecfe17322018-11-07 13:41:29 +01002129 case SET_AUDIO_VOLUME_GROUP_CALLBACK_ENABLED: {
2130 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2131 setAudioVolumeGroupCallbacksEnabled(data.readInt32() == 1);
2132 return NO_ERROR;
2133 } break;
2134
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07002135 case ACQUIRE_SOUNDTRIGGER_SESSION: {
2136 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kastena13cde92016-03-28 15:26:02 -07002137 audio_session_t session = AUDIO_SESSION_NONE;
2138 audio_io_handle_t ioHandle = AUDIO_IO_HANDLE_NONE;
2139 audio_devices_t device = AUDIO_DEVICE_NONE;
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07002140 status_t status = acquireSoundTriggerSession(&session, &ioHandle, &device);
2141 reply->writeInt32(status);
2142 if (status == NO_ERROR) {
2143 reply->writeInt32(session);
2144 reply->writeInt32(ioHandle);
2145 reply->writeInt32(device);
2146 }
2147 return NO_ERROR;
2148 } break;
2149
2150 case RELEASE_SOUNDTRIGGER_SESSION: {
2151 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07002152 audio_session_t session = (audio_session_t)data.readInt32();
2153 status_t status = releaseSoundTriggerSession(session);
2154 reply->writeInt32(status);
2155 return NO_ERROR;
2156 } break;
2157
Eric Laurentbb6c9a02014-09-25 14:11:47 -07002158 case GET_PHONE_STATE: {
2159 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2160 reply->writeInt32((int32_t)getPhoneState());
2161 return NO_ERROR;
2162 } break;
2163
Eric Laurentbaac1832014-12-01 17:52:59 -08002164 case REGISTER_POLICY_MIXES: {
2165 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2166 bool registration = data.readInt32() == 1;
2167 Vector<AudioMix> mixes;
2168 size_t size = (size_t)data.readInt32();
2169 if (size > MAX_MIXES_PER_POLICY) {
2170 size = MAX_MIXES_PER_POLICY;
2171 }
2172 for (size_t i = 0; i < size; i++) {
2173 AudioMix mix;
2174 if (mix.readFromParcel((Parcel*)&data) == NO_ERROR) {
2175 mixes.add(mix);
2176 }
2177 }
2178 status_t status = registerPolicyMixes(mixes, registration);
2179 reply->writeInt32(status);
2180 return NO_ERROR;
2181 } break;
2182
Eric Laurent554a2772015-04-10 11:29:24 -07002183 case START_AUDIO_SOURCE: {
2184 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07002185 struct audio_port_config source = {};
Eric Laurent554a2772015-04-10 11:29:24 -07002186 data.read(&source, sizeof(struct audio_port_config));
Andy Hungb0272092018-04-12 11:06:56 -07002187 (void)sanitizeAudioPortConfig(&source);
2188 audio_attributes_t attributes = {};
Eric Laurent554a2772015-04-10 11:29:24 -07002189 data.read(&attributes, sizeof(audio_attributes_t));
Kevin Rocard39fdbd02017-11-13 11:15:27 -08002190 sanetizeAudioAttributes(&attributes);
Eric Laurent3e6c7e12018-07-27 17:09:23 -07002191 audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
2192 status_t status = startAudioSource(&source, &attributes, &portId);
Eric Laurent554a2772015-04-10 11:29:24 -07002193 reply->writeInt32(status);
Eric Laurent3e6c7e12018-07-27 17:09:23 -07002194 reply->writeInt32(portId);
Eric Laurent554a2772015-04-10 11:29:24 -07002195 return NO_ERROR;
2196 } break;
2197
2198 case STOP_AUDIO_SOURCE: {
2199 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurent3e6c7e12018-07-27 17:09:23 -07002200 audio_port_handle_t portId = (audio_port_handle_t) data.readInt32();
2201 status_t status = stopAudioSource(portId);
Eric Laurent554a2772015-04-10 11:29:24 -07002202 reply->writeInt32(status);
2203 return NO_ERROR;
2204 } break;
2205
Andy Hung2ddee192015-12-18 17:34:44 -08002206 case SET_MASTER_MONO: {
2207 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2208 bool mono = static_cast<bool>(data.readInt32());
2209 status_t status = setMasterMono(mono);
2210 reply->writeInt32(status);
2211 return NO_ERROR;
2212 } break;
2213
2214 case GET_MASTER_MONO: {
2215 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2216 bool mono;
2217 status_t status = getMasterMono(&mono);
2218 reply->writeInt32(status);
2219 if (status == NO_ERROR) {
2220 reply->writeInt32(static_cast<int32_t>(mono));
2221 }
2222 return NO_ERROR;
2223 } break;
2224
Eric Laurentac9cef52017-06-09 15:46:26 -07002225 case GET_STREAM_VOLUME_DB: {
2226 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2227 audio_stream_type_t stream =
2228 static_cast <audio_stream_type_t>(data.readInt32());
2229 int index = static_cast <int>(data.readInt32());
2230 audio_devices_t device =
2231 static_cast <audio_devices_t>(data.readUint32());
2232 reply->writeFloat(getStreamVolumeDB(stream, index, device));
2233 return NO_ERROR;
2234 }
2235
jiabin81772902018-04-02 17:52:27 -07002236 case GET_SURROUND_FORMATS: {
2237 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2238 unsigned int numSurroundFormatsReq = data.readUint32();
2239 if (numSurroundFormatsReq > MAX_ITEMS_PER_LIST) {
2240 numSurroundFormatsReq = MAX_ITEMS_PER_LIST;
2241 }
2242 bool reported = data.readBool();
2243 unsigned int numSurroundFormats = numSurroundFormatsReq;
2244 audio_format_t *surroundFormats = (audio_format_t *)calloc(
2245 numSurroundFormats, sizeof(audio_format_t));
2246 bool *surroundFormatsEnabled = (bool *)calloc(numSurroundFormats, sizeof(bool));
2247 if (numSurroundFormatsReq > 0 &&
2248 (surroundFormats == NULL || surroundFormatsEnabled == NULL)) {
2249 free(surroundFormats);
2250 free(surroundFormatsEnabled);
2251 reply->writeInt32(NO_MEMORY);
2252 return NO_ERROR;
2253 }
2254 status_t status = getSurroundFormats(
2255 &numSurroundFormats, surroundFormats, surroundFormatsEnabled, reported);
2256 reply->writeInt32(status);
2257
2258 if (status == NO_ERROR) {
2259 reply->writeUint32(numSurroundFormats);
2260 if (numSurroundFormatsReq > numSurroundFormats) {
2261 numSurroundFormatsReq = numSurroundFormats;
2262 }
2263 reply->write(surroundFormats, numSurroundFormatsReq * sizeof(audio_format_t));
2264 reply->write(surroundFormatsEnabled, numSurroundFormatsReq * sizeof(bool));
2265 }
2266 free(surroundFormats);
2267 free(surroundFormatsEnabled);
2268 return NO_ERROR;
2269 }
2270
2271 case SET_SURROUND_FORMAT_ENABLED: {
2272 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2273 audio_format_t audioFormat = (audio_format_t) data.readInt32();
2274 bool enabled = data.readBool();
2275 status_t status = setSurroundFormatEnabled(audioFormat, enabled);
2276 reply->writeInt32(status);
2277 return NO_ERROR;
2278 }
2279
Arun Mirpuri11029ad2018-12-19 20:45:19 -08002280 case GET_OFFLOAD_FORMATS_A2DP: {
2281 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2282 std::vector<audio_format_t> encodingFormats;
2283 status_t status = getHwOffloadEncodingFormatsSupportedForA2DP(&encodingFormats);
2284 reply->writeInt32(status);
2285 if (status != NO_ERROR) {
2286 return NO_ERROR;
2287 }
2288 reply->writeUint32(static_cast<uint32_t>(encodingFormats.size()));
2289 for (size_t i = 0; i < encodingFormats.size(); i++)
2290 reply->writeInt32(static_cast<int32_t>(encodingFormats[i]));
2291 return NO_ERROR;
2292 }
2293
2294
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07002295 case ADD_STREAM_DEFAULT_EFFECT: {
2296 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2297 effect_uuid_t type;
2298 status_t status = data.read(&type, sizeof(effect_uuid_t));
2299 if (status != NO_ERROR) {
2300 return status;
2301 }
2302 String16 opPackageName;
2303 status = data.readString16(&opPackageName);
2304 if (status != NO_ERROR) {
2305 return status;
2306 }
2307 effect_uuid_t uuid;
2308 status = data.read(&uuid, sizeof(effect_uuid_t));
2309 if (status != NO_ERROR) {
2310 return status;
2311 }
2312 int32_t priority = data.readInt32();
2313 audio_usage_t usage = (audio_usage_t) data.readInt32();
2314 audio_unique_id_t id = 0;
2315 reply->writeInt32(static_cast <int32_t>(addStreamDefaultEffect(&type,
2316 opPackageName,
2317 &uuid,
2318 priority,
2319 usage,
2320 &id)));
2321 reply->writeInt32(id);
2322 return NO_ERROR;
2323 }
2324
2325 case REMOVE_STREAM_DEFAULT_EFFECT: {
2326 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2327 audio_unique_id_t id = static_cast<audio_unique_id_t>(data.readInt32());
2328 reply->writeInt32(static_cast <int32_t>(removeStreamDefaultEffect(id)));
2329 return NO_ERROR;
2330 }
2331
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07002332 case ADD_SOURCE_DEFAULT_EFFECT: {
2333 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2334 effect_uuid_t type;
2335 status_t status = data.read(&type, sizeof(effect_uuid_t));
2336 if (status != NO_ERROR) {
2337 return status;
2338 }
2339 String16 opPackageName;
2340 status = data.readString16(&opPackageName);
2341 if (status != NO_ERROR) {
2342 return status;
2343 }
2344 effect_uuid_t uuid;
2345 status = data.read(&uuid, sizeof(effect_uuid_t));
2346 if (status != NO_ERROR) {
2347 return status;
2348 }
2349 int32_t priority = data.readInt32();
2350 audio_source_t source = (audio_source_t) data.readInt32();
2351 audio_unique_id_t id = 0;
2352 reply->writeInt32(static_cast <int32_t>(addSourceDefaultEffect(&type,
2353 opPackageName,
2354 &uuid,
2355 priority,
2356 source,
2357 &id)));
2358 reply->writeInt32(id);
2359 return NO_ERROR;
2360 }
2361
2362 case REMOVE_SOURCE_DEFAULT_EFFECT: {
2363 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2364 audio_unique_id_t id = static_cast<audio_unique_id_t>(data.readInt32());
2365 reply->writeInt32(static_cast <int32_t>(removeSourceDefaultEffect(id)));
2366 return NO_ERROR;
2367 }
2368
Eric Laurentb78763e2018-10-17 10:08:02 -07002369 case SET_ASSISTANT_UID: {
2370 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2371 int32_t uid;
2372 status_t status = data.readInt32(&uid);
2373 if (status != NO_ERROR) {
2374 return status;
2375 }
2376 status = setAssistantUid(uid);
2377 reply->writeInt32(static_cast <int32_t>(status));
2378 return NO_ERROR;
2379 }
2380
2381 case SET_A11Y_SERVICES_UIDS: {
2382 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2383 std::vector<uid_t> uids;
2384 int32_t size;
2385 status_t status = data.readInt32(&size);
2386 if (status != NO_ERROR) {
2387 return status;
2388 }
2389 if (size > MAX_ITEMS_PER_LIST) {
2390 size = MAX_ITEMS_PER_LIST;
2391 }
2392 for (int32_t i = 0; i < size; i++) {
2393 int32_t uid;
2394 status = data.readInt32(&uid);
2395 if (status != NO_ERROR) {
2396 return status;
2397 }
2398 uids.push_back(uid);
2399 }
2400 status = setA11yServicesUids(uids);
2401 reply->writeInt32(static_cast <int32_t>(status));
2402 return NO_ERROR;
2403 }
2404
jiabin6012f912018-11-02 17:06:30 -07002405 case IS_HAPTIC_PLAYBACK_SUPPORTED: {
2406 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2407 bool isSupported = isHapticPlaybackSupported();
2408 reply->writeBool(isSupported);
Kevin Rocardb99cc752019-03-21 20:52:24 -07002409 return NO_ERROR;
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002410 }
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002411 case SET_UID_DEVICE_AFFINITY: {
2412 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2413 const uid_t uid = (uid_t) data.readInt32();
2414 Vector<AudioDeviceTypeAddr> devices;
2415 size_t size = (size_t)data.readInt32();
2416 for (size_t i = 0; i < size; i++) {
2417 AudioDeviceTypeAddr device;
2418 if (device.readFromParcel((Parcel*)&data) == NO_ERROR) {
2419 devices.add(device);
2420 }
2421 }
2422 status_t status = setUidDeviceAffinities(uid, devices);
2423 reply->writeInt32(status);
2424 return NO_ERROR;
2425 }
2426
2427 case REMOVE_UID_DEVICE_AFFINITY: {
2428 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2429 const uid_t uid = (uid_t) data.readInt32();
2430 status_t status = removeUidDeviceAffinities(uid);
2431 reply->writeInt32(status);
jiabin6012f912018-11-02 17:06:30 -07002432 return NO_ERROR;
2433 }
2434
Oscar Azucena90e77632019-11-27 17:12:28 -08002435 case SET_USERID_DEVICE_AFFINITY: {
2436 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2437 const int userId = (int) data.readInt32();
2438 Vector<AudioDeviceTypeAddr> devices;
2439 size_t size = (size_t)data.readInt32();
2440 for (size_t i = 0; i < size; i++) {
2441 AudioDeviceTypeAddr device;
2442 if (device.readFromParcel((Parcel*)&data) == NO_ERROR) {
2443 devices.add(device);
2444 }
2445 }
2446 status_t status = setUserIdDeviceAffinities(userId, devices);
2447 reply->writeInt32(status);
2448 return NO_ERROR;
2449 }
2450
2451 case REMOVE_USERID_DEVICE_AFFINITY: {
2452 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2453 const int userId = (int) data.readInt32();
2454 status_t status = removeUserIdDeviceAffinities(userId);
2455 reply->writeInt32(status);
2456 return NO_ERROR;
2457 }
2458
François Gaffied0ba9ed2018-11-05 11:50:42 +01002459 case LIST_AUDIO_PRODUCT_STRATEGIES: {
2460 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2461 AudioProductStrategyVector strategies;
2462 status_t status = listAudioProductStrategies(strategies);
2463 reply->writeInt32(status);
2464 if (status != NO_ERROR) {
François Gaffie4b2018b2018-11-07 11:18:59 +01002465 return NO_ERROR;
François Gaffied0ba9ed2018-11-05 11:50:42 +01002466 }
2467 size_t size = strategies.size();
2468 size_t sizePosition = reply->dataPosition();
2469 reply->writeInt32(size);
2470 size_t finalSize = size;
2471 for (size_t i = 0; i < size; i++) {
2472 size_t position = reply->dataPosition();
2473 if (strategies[i].writeToParcel(reply) != NO_ERROR) {
2474 reply->setDataPosition(position);
2475 finalSize--;
2476 }
2477 }
2478 if (size != finalSize) {
2479 size_t position = reply->dataPosition();
2480 reply->setDataPosition(sizePosition);
2481 reply->writeInt32(finalSize);
2482 reply->setDataPosition(position);
2483 }
2484 return NO_ERROR;
2485 }
2486
2487 case GET_STRATEGY_FOR_ATTRIBUTES: {
2488 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2489 AudioAttributes attributes;
2490 status_t status = attributes.readFromParcel(&data);
2491 if (status != NO_ERROR) {
2492 return status;
2493 }
François Gaffie4b2018b2018-11-07 11:18:59 +01002494 product_strategy_t strategy;
2495 status = getProductStrategyFromAudioAttributes(attributes, strategy);
2496 reply->writeInt32(status);
2497 if (status != NO_ERROR) {
2498 return NO_ERROR;
2499 }
François Gaffied0ba9ed2018-11-05 11:50:42 +01002500 reply->writeUint32(static_cast<int>(strategy));
2501 return NO_ERROR;
2502 }
2503
François Gaffie4b2018b2018-11-07 11:18:59 +01002504 case LIST_AUDIO_VOLUME_GROUPS: {
2505 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2506 AudioVolumeGroupVector groups;
2507 status_t status = listAudioVolumeGroups(groups);
2508 reply->writeInt32(status);
2509 if (status != NO_ERROR) {
2510 return NO_ERROR;
2511 }
2512 size_t size = groups.size();
2513 size_t sizePosition = reply->dataPosition();
2514 reply->writeInt32(size);
2515 size_t finalSize = size;
2516 for (size_t i = 0; i < size; i++) {
2517 size_t position = reply->dataPosition();
2518 if (groups[i].writeToParcel(reply) != NO_ERROR) {
2519 reply->setDataPosition(position);
2520 finalSize--;
2521 }
2522 }
2523 if (size != finalSize) {
2524 size_t position = reply->dataPosition();
2525 reply->setDataPosition(sizePosition);
2526 reply->writeInt32(finalSize);
2527 reply->setDataPosition(position);
2528 }
2529 return NO_ERROR;
2530 }
2531
2532 case GET_VOLUME_GROUP_FOR_ATTRIBUTES: {
2533 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2534 AudioAttributes attributes;
2535 status_t status = attributes.readFromParcel(&data);
2536 if (status != NO_ERROR) {
2537 return status;
2538 }
Hayden Gomes524159d2019-12-23 14:41:47 -08002539
François Gaffie4b2018b2018-11-07 11:18:59 +01002540 volume_group_t group;
2541 status = getVolumeGroupFromAudioAttributes(attributes, group);
François Gaffie4b2018b2018-11-07 11:18:59 +01002542 if (status != NO_ERROR) {
2543 return NO_ERROR;
2544 }
Hayden Gomes524159d2019-12-23 14:41:47 -08002545
2546 reply->writeInt32(status);
François Gaffie4b2018b2018-11-07 11:18:59 +01002547 reply->writeUint32(static_cast<int>(group));
2548 return NO_ERROR;
2549 }
2550
Hayden Gomes524159d2019-12-23 14:41:47 -08002551 case SET_SUPPORTED_SYSTEM_USAGES: {
2552 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2553 std::vector<audio_usage_t> systemUsages;
2554
2555 int32_t size;
2556 status_t status = data.readInt32(&size);
2557 if (status != NO_ERROR) {
2558 return status;
2559 }
2560 if (size > MAX_ITEMS_PER_LIST) {
2561 size = MAX_ITEMS_PER_LIST;
2562 }
2563
2564 for (int32_t i = 0; i < size; i++) {
2565 int32_t systemUsageInt;
2566 status = data.readInt32(&systemUsageInt);
2567 if (status != NO_ERROR) {
2568 return status;
2569 }
2570
2571 audio_usage_t systemUsage = static_cast<audio_usage_t>(systemUsageInt);
2572 systemUsages.push_back(systemUsage);
2573 }
2574 status = setSupportedSystemUsages(systemUsages);
2575 reply->writeInt32(static_cast <int32_t>(status));
2576 return NO_ERROR;
2577 }
2578
Kevin Rocardb99cc752019-03-21 20:52:24 -07002579 case SET_ALLOWED_CAPTURE_POLICY: {
2580 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2581 uid_t uid = data.readInt32();
2582 audio_flags_mask_t flags = data.readInt32();
2583 status_t status = setAllowedCapturePolicy(uid, flags);
2584 reply->writeInt32(status);
2585 return NO_ERROR;
2586 }
2587
Eric Laurent6ede98f2019-06-11 14:50:30 -07002588 case SET_RTT_ENABLED: {
2589 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2590 bool enabled = static_cast<bool>(data.readInt32());
2591 status_t status = setRttEnabled(enabled);
2592 reply->writeInt32(status);
2593 return NO_ERROR;
2594 }
2595
Eric Laurent8340e672019-11-06 11:01:08 -08002596 case IS_CALL_SCREEN_MODE_SUPPORTED: {
2597 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2598 bool isAvailable = isCallScreenModeSupported();
2599 reply->writeBool(isAvailable);
2600 return NO_ERROR;
2601 }
2602
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002603 case SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: {
2604 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2605 product_strategy_t strategy = (product_strategy_t) data.readUint32();
2606 AudioDeviceTypeAddr device;
2607 status_t status = device.readFromParcel((Parcel*)&data);
2608 if (status != NO_ERROR) {
2609 return status;
2610 }
2611 status = setPreferredDeviceForStrategy(strategy, device);
2612 reply->writeInt32(status);
2613 return NO_ERROR;
2614 }
2615
2616 case REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: {
2617 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2618 product_strategy_t strategy = (product_strategy_t) data.readUint32();
2619 status_t status = removePreferredDeviceForStrategy(strategy);
2620 reply->writeInt32(status);
2621 return NO_ERROR;
2622 }
2623
2624 case GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: {
2625 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2626 product_strategy_t strategy = (product_strategy_t) data.readUint32();
2627 AudioDeviceTypeAddr device;
2628 status_t status = getPreferredDeviceForStrategy(strategy, device);
2629 status_t marshall_status = device.writeToParcel(reply);
2630 if (marshall_status != NO_ERROR) {
2631 return marshall_status;
2632 }
2633 reply->writeInt32(status);
2634 return NO_ERROR;
2635 }
2636
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08002637 case GET_DEVICES_FOR_ATTRIBUTES: {
2638 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2639 AudioAttributes attributes;
2640 status_t status = attributes.readFromParcel(&data);
2641 if (status != NO_ERROR) {
2642 return status;
2643 }
2644 AudioDeviceTypeAddrVector devices;
2645 status = getDevicesForAttributes(attributes.getAttributes(), &devices);
2646 // reply data formatted as:
2647 // - (int32) method call result from APM
2648 // - (int32) number of devices (n) if method call returned NO_ERROR
2649 // - n AudioDeviceTypeAddr if method call returned NO_ERROR
2650 reply->writeInt32(status);
2651 if (status != NO_ERROR) {
2652 return NO_ERROR;
2653 }
2654 status = reply->writeInt32(devices.size());
2655 if (status != NO_ERROR) {
2656 return status;
2657 }
2658 for (const auto& device : devices) {
2659 status = device.writeToParcel(reply);
2660 if (status != NO_ERROR) {
2661 return status;
2662 }
2663 }
2664
2665 return NO_ERROR;
2666 }
2667
Eric Laurentc2f1f072009-07-17 12:17:14 -07002668 default:
2669 return BBinder::onTransact(code, data, reply, flags);
2670 }
2671}
2672
Andy Hungb0272092018-04-12 11:06:56 -07002673/** returns true if string overflow was prevented by zero termination */
2674template <size_t size>
2675static bool preventStringOverflow(char (&s)[size]) {
2676 if (strnlen(s, size) < size) return false;
2677 s[size - 1] = '\0';
2678 return true;
2679}
2680
Kevin Rocard39fdbd02017-11-13 11:15:27 -08002681void BnAudioPolicyService::sanetizeAudioAttributes(audio_attributes_t* attr)
2682{
2683 const size_t tagsMaxSize = AUDIO_ATTRIBUTES_TAGS_MAX_SIZE;
2684 if (strnlen(attr->tags, tagsMaxSize) >= tagsMaxSize) {
2685 android_errorWriteLog(0x534e4554, "68953950"); // SafetyNet logging
2686 }
2687 attr->tags[tagsMaxSize - 1] = '\0';
2688}
2689
Andy Hungb0272092018-04-12 11:06:56 -07002690/** returns BAD_VALUE if sanitization was required. */
2691status_t BnAudioPolicyService::sanitizeEffectDescriptor(effect_descriptor_t* desc)
2692{
2693 if (preventStringOverflow(desc->name)
2694 | /* always */ preventStringOverflow(desc->implementor)) {
2695 android_errorWriteLog(0x534e4554, "73126106"); // SafetyNet logging
2696 return BAD_VALUE;
2697 }
2698 return NO_ERROR;
2699}
2700
2701/** returns BAD_VALUE if sanitization was required. */
2702status_t BnAudioPolicyService::sanitizeAudioPortConfig(struct audio_port_config* config)
2703{
2704 if (config->type == AUDIO_PORT_TYPE_DEVICE &&
2705 preventStringOverflow(config->ext.device.address)) {
2706 return BAD_VALUE;
2707 }
2708 return NO_ERROR;
2709}
2710
Eric Laurentc2f1f072009-07-17 12:17:14 -07002711// ----------------------------------------------------------------------------
2712
Glenn Kasten40bc9062015-03-20 09:09:33 -07002713} // namespace android