blob: 52eb9a41e048acaa9b26be07f5734b50d57b2c9f [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 Nelissen3230ed82019-09-26 11:20:54 -070030#include <mediautils/TimeCheck.h>
Dima Zavin64760242011-05-11 14:15:23 -070031#include <system/audio.h>
Dima Zavinfce7a472011-04-19 22:30:36 -070032
Eric Laurentc2f1f072009-07-17 12:17:14 -070033namespace android {
34
35enum {
36 SET_DEVICE_CONNECTION_STATE = IBinder::FIRST_CALL_TRANSACTION,
37 GET_DEVICE_CONNECTION_STATE,
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -080038 HANDLE_DEVICE_CONFIG_CHANGE,
Eric Laurentc2f1f072009-07-17 12:17:14 -070039 SET_PHONE_STATE,
Glenn Kasten0b07b802012-01-18 14:56:06 -080040 SET_RINGER_MODE, // reserved, no longer used
Eric Laurentc2f1f072009-07-17 12:17:14 -070041 SET_FORCE_USE,
42 GET_FORCE_USE,
43 GET_OUTPUT,
44 START_OUTPUT,
45 STOP_OUTPUT,
46 RELEASE_OUTPUT,
Eric Laurentcaf7f482014-11-25 17:50:47 -080047 GET_INPUT_FOR_ATTR,
Eric Laurentc2f1f072009-07-17 12:17:14 -070048 START_INPUT,
49 STOP_INPUT,
50 RELEASE_INPUT,
51 INIT_STREAM_VOLUME,
52 SET_STREAM_VOLUME,
Eric Laurentde070132010-07-13 04:45:46 -070053 GET_STREAM_VOLUME,
François Gaffiecfe17322018-11-07 13:41:29 +010054 SET_VOLUME_ATTRIBUTES,
55 GET_VOLUME_ATTRIBUTES,
56 GET_MIN_VOLUME_FOR_ATTRIBUTES,
57 GET_MAX_VOLUME_FOR_ATTRIBUTES,
Eric Laurentde070132010-07-13 04:45:46 -070058 GET_STRATEGY_FOR_STREAM,
59 GET_OUTPUT_FOR_EFFECT,
60 REGISTER_EFFECT,
Eric Laurenteda6c362011-02-02 09:33:30 -080061 UNREGISTER_EFFECT,
Glenn Kasten6b2718c2011-02-04 13:54:26 -080062 IS_STREAM_ACTIVE,
Jean-Michel Trivid7086032012-10-10 12:11:16 -070063 IS_SOURCE_ACTIVE,
Glenn Kasten6b2718c2011-02-04 13:54:26 -080064 GET_DEVICES_FOR_STREAM,
Eric Laurentdb7c0792011-08-10 10:37:50 -070065 QUERY_DEFAULT_PRE_PROCESSING,
Jean-Michel Trivi272ab542013-02-04 16:26:02 -080066 SET_EFFECT_ENABLED,
Richard Fitzgeraldad3af332013-03-25 16:54:37 +000067 IS_STREAM_ACTIVE_REMOTELY,
Eric Laurent203b1a12014-04-01 10:34:16 -070068 IS_OFFLOAD_SUPPORTED,
Michael Chana94fbb22018-04-24 14:31:19 +100069 IS_DIRECT_OUTPUT_SUPPORTED,
Eric Laurent203b1a12014-04-01 10:34:16 -070070 LIST_AUDIO_PORTS,
71 GET_AUDIO_PORT,
72 CREATE_AUDIO_PATCH,
73 RELEASE_AUDIO_PATCH,
74 LIST_AUDIO_PATCHES,
Eric Laurentb52c1522014-05-20 11:27:36 -070075 SET_AUDIO_PORT_CONFIG,
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -070076 REGISTER_CLIENT,
Eric Laurentdf3dc7e2014-07-27 18:39:40 -070077 GET_OUTPUT_FOR_ATTR,
78 ACQUIRE_SOUNDTRIGGER_SESSION,
Eric Laurentbb6c9a02014-09-25 14:11:47 -070079 RELEASE_SOUNDTRIGGER_SESSION,
Eric Laurentbaac1832014-12-01 17:52:59 -080080 GET_PHONE_STATE,
81 REGISTER_POLICY_MIXES,
Eric Laurent554a2772015-04-10 11:29:24 -070082 START_AUDIO_SOURCE,
Eric Laurente8726fe2015-06-26 09:39:24 -070083 STOP_AUDIO_SOURCE,
84 SET_AUDIO_PORT_CALLBACK_ENABLED,
François Gaffiecfe17322018-11-07 13:41:29 +010085 SET_AUDIO_VOLUME_GROUP_CALLBACK_ENABLED,
Andy Hung2ddee192015-12-18 17:34:44 -080086 SET_MASTER_MONO,
87 GET_MASTER_MONO,
jiabin81772902018-04-02 17:52:27 -070088 GET_STREAM_VOLUME_DB,
89 GET_SURROUND_FORMATS,
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -070090 SET_SURROUND_FORMAT_ENABLED,
91 ADD_STREAM_DEFAULT_EFFECT,
Ari Hausman-Cohen24628312018-08-13 15:01:09 -070092 REMOVE_STREAM_DEFAULT_EFFECT,
93 ADD_SOURCE_DEFAULT_EFFECT,
Eric Laurentb78763e2018-10-17 10:08:02 -070094 REMOVE_SOURCE_DEFAULT_EFFECT,
95 SET_ASSISTANT_UID,
96 SET_A11Y_SERVICES_UIDS,
jiabin6012f912018-11-02 17:06:30 -070097 IS_HAPTIC_PLAYBACK_SUPPORTED,
Jean-Michel Trivibda70da2018-12-19 07:30:15 -080098 SET_UID_DEVICE_AFFINITY,
99 REMOVE_UID_DEVICE_AFFINITY,
François Gaffied0ba9ed2018-11-05 11:50:42 +0100100 GET_OFFLOAD_FORMATS_A2DP,
101 LIST_AUDIO_PRODUCT_STRATEGIES,
102 GET_STRATEGY_FOR_ATTRIBUTES,
François Gaffie4b2018b2018-11-07 11:18:59 +0100103 LIST_AUDIO_VOLUME_GROUPS,
Kevin Rocardb99cc752019-03-21 20:52:24 -0700104 GET_VOLUME_GROUP_FOR_ATTRIBUTES,
105 SET_ALLOWED_CAPTURE_POLICY,
Eric Laurent6c796322019-04-09 14:13:17 -0700106 MOVE_EFFECTS_TO_IO,
Jean-Michel Trivi2deb4782019-11-01 11:04:15 -0700107 SET_RTT_ENABLED,
108 SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY,
109 REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY,
110 GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700111};
112
Eric Laurent1d670b12015-02-06 10:44:24 -0800113#define MAX_ITEMS_PER_LIST 1024
114
Eric Laurentc2f1f072009-07-17 12:17:14 -0700115class BpAudioPolicyService : public BpInterface<IAudioPolicyService>
116{
117public:
Chih-Hung Hsieh090ef602016-04-27 10:39:54 -0700118 explicit BpAudioPolicyService(const sp<IBinder>& impl)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700119 : BpInterface<IAudioPolicyService>(impl)
120 {
121 }
122
123 virtual status_t setDeviceConnectionState(
Dima Zavinfce7a472011-04-19 22:30:36 -0700124 audio_devices_t device,
125 audio_policy_dev_state_t state,
Paul McLeane743a472015-01-28 11:07:31 -0800126 const char *device_address,
Aniket Kumar Lata4e464702019-01-10 23:38:46 -0800127 const char *device_name,
128 audio_format_t encodedFormat)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700129 {
130 Parcel data, reply;
131 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
132 data.writeInt32(static_cast <uint32_t>(device));
133 data.writeInt32(static_cast <uint32_t>(state));
134 data.writeCString(device_address);
Paul McLeane743a472015-01-28 11:07:31 -0800135 data.writeCString(device_name);
Aniket Kumar Lata4e464702019-01-10 23:38:46 -0800136 data.writeInt32(static_cast <uint32_t>(encodedFormat));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700137 remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply);
138 return static_cast <status_t> (reply.readInt32());
139 }
140
Dima Zavinfce7a472011-04-19 22:30:36 -0700141 virtual audio_policy_dev_state_t getDeviceConnectionState(
142 audio_devices_t device,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700143 const char *device_address)
144 {
145 Parcel data, reply;
146 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
147 data.writeInt32(static_cast <uint32_t>(device));
148 data.writeCString(device_address);
149 remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700150 return static_cast <audio_policy_dev_state_t>(reply.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700151 }
152
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800153 virtual status_t handleDeviceConfigChange(audio_devices_t device,
154 const char *device_address,
Aniket Kumar Lata4e464702019-01-10 23:38:46 -0800155 const char *device_name,
156 audio_format_t encodedFormat)
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800157 {
158 Parcel data, reply;
159 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
160 data.writeInt32(static_cast <uint32_t>(device));
161 data.writeCString(device_address);
162 data.writeCString(device_name);
Aniket Kumar Lata4e464702019-01-10 23:38:46 -0800163 data.writeInt32(static_cast <uint32_t>(encodedFormat));
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800164 remote()->transact(HANDLE_DEVICE_CONFIG_CHANGE, data, &reply);
165 return static_cast <status_t> (reply.readInt32());
166 }
167
Glenn Kastenf78aee72012-01-04 11:00:47 -0800168 virtual status_t setPhoneState(audio_mode_t state)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700169 {
170 Parcel data, reply;
171 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
172 data.writeInt32(state);
173 remote()->transact(SET_PHONE_STATE, data, &reply);
174 return static_cast <status_t> (reply.readInt32());
175 }
176
Dima Zavinfce7a472011-04-19 22:30:36 -0700177 virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700178 {
179 Parcel data, reply;
180 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
181 data.writeInt32(static_cast <uint32_t>(usage));
182 data.writeInt32(static_cast <uint32_t>(config));
183 remote()->transact(SET_FORCE_USE, data, &reply);
184 return static_cast <status_t> (reply.readInt32());
185 }
186
Dima Zavinfce7a472011-04-19 22:30:36 -0700187 virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700188 {
189 Parcel data, reply;
190 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
191 data.writeInt32(static_cast <uint32_t>(usage));
192 remote()->transact(GET_FORCE_USE, data, &reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700193 return static_cast <audio_policy_forced_cfg_t> (reply.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700194 }
195
Eric Laurentf4e63452017-11-06 19:31:46 +0000196 virtual audio_io_handle_t getOutput(audio_stream_type_t stream)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700197 {
198 Parcel data, reply;
199 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
200 data.writeInt32(static_cast <uint32_t>(stream));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700201 remote()->transact(GET_OUTPUT, data, &reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700202 return static_cast <audio_io_handle_t> (reply.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700203 }
204
Eric Laurent42984412019-05-09 17:57:03 -0700205 status_t getOutputForAttr(audio_attributes_t *attr,
Kevin Rocard153f92d2018-12-18 18:33:28 -0800206 audio_io_handle_t *output,
207 audio_session_t session,
208 audio_stream_type_t *stream,
209 pid_t pid,
210 uid_t uid,
211 const audio_config_t *config,
212 audio_output_flags_t flags,
213 audio_port_handle_t *selectedDeviceId,
214 audio_port_handle_t *portId,
215 std::vector<audio_io_handle_t> *secondaryOutputs) override
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700216 {
217 Parcel data, reply;
218 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurent42984412019-05-09 17:57:03 -0700219 if (attr == nullptr) {
220 ALOGE("%s NULL audio attributes", __func__);
Eric Laurente83b55d2014-11-14 10:06:21 -0800221 return BAD_VALUE;
222 }
Eric Laurent42984412019-05-09 17:57:03 -0700223 if (output == nullptr) {
224 ALOGE("%s NULL output - shouldn't happen", __func__);
Eric Laurent9ae8c592017-06-22 17:17:09 -0700225 return BAD_VALUE;
226 }
Eric Laurent42984412019-05-09 17:57:03 -0700227 if (selectedDeviceId == nullptr) {
228 ALOGE("%s NULL selectedDeviceId - shouldn't happen", __func__);
Eric Laurent20b9ef02016-12-05 11:03:16 -0800229 return BAD_VALUE;
230 }
Eric Laurent42984412019-05-09 17:57:03 -0700231 if (portId == nullptr) {
232 ALOGE("%s NULL portId - shouldn't happen", __func__);
Kevin Rocard153f92d2018-12-18 18:33:28 -0800233 return BAD_VALUE;
234 }
Eric Laurent42984412019-05-09 17:57:03 -0700235 if (secondaryOutputs == nullptr) {
236 ALOGE("%s NULL secondaryOutputs - shouldn't happen", __func__);
237 return BAD_VALUE;
Eric Laurente83b55d2014-11-14 10:06:21 -0800238 }
Eric Laurent42984412019-05-09 17:57:03 -0700239 data.write(attr, sizeof(audio_attributes_t));
Eric Laurente83b55d2014-11-14 10:06:21 -0800240 data.writeInt32(session);
241 if (stream == NULL) {
242 data.writeInt32(0);
243 } else {
244 data.writeInt32(1);
245 data.writeInt32(*stream);
246 }
Nadav Bar766fb022018-01-07 12:18:03 +0200247 data.writeInt32(pid);
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700248 data.writeInt32(uid);
Eric Laurent20b9ef02016-12-05 11:03:16 -0800249 data.write(config, sizeof(audio_config_t));
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700250 data.writeInt32(static_cast <uint32_t>(flags));
Eric Laurent9ae8c592017-06-22 17:17:09 -0700251 data.writeInt32(*selectedDeviceId);
Eric Laurent20b9ef02016-12-05 11:03:16 -0800252 data.writeInt32(*portId);
Eric Laurente83b55d2014-11-14 10:06:21 -0800253 status_t status = remote()->transact(GET_OUTPUT_FOR_ATTR, data, &reply);
254 if (status != NO_ERROR) {
255 return status;
256 }
257 status = (status_t)reply.readInt32();
258 if (status != NO_ERROR) {
259 return status;
260 }
Eric Laurent42984412019-05-09 17:57:03 -0700261 status = (status_t)reply.read(&attr, sizeof(audio_attributes_t));
262 if (status != NO_ERROR) {
263 return status;
264 }
Eric Laurente83b55d2014-11-14 10:06:21 -0800265 *output = (audio_io_handle_t)reply.readInt32();
Eric Laurent20b9ef02016-12-05 11:03:16 -0800266 audio_stream_type_t lStream = (audio_stream_type_t)reply.readInt32();
Eric Laurente83b55d2014-11-14 10:06:21 -0800267 if (stream != NULL) {
Eric Laurent20b9ef02016-12-05 11:03:16 -0800268 *stream = lStream;
Eric Laurente83b55d2014-11-14 10:06:21 -0800269 }
Eric Laurent9ae8c592017-06-22 17:17:09 -0700270 *selectedDeviceId = (audio_port_handle_t)reply.readInt32();
Eric Laurent20b9ef02016-12-05 11:03:16 -0800271 *portId = (audio_port_handle_t)reply.readInt32();
Kevin Rocard153f92d2018-12-18 18:33:28 -0800272 secondaryOutputs->resize(reply.readInt32());
273 return reply.read(secondaryOutputs->data(),
274 secondaryOutputs->size() * sizeof(audio_io_handle_t));
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700275 }
276
Eric Laurentd7fe0862018-07-14 16:48:01 -0700277 virtual status_t startOutput(audio_port_handle_t portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700278 {
279 Parcel data, reply;
280 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentd7fe0862018-07-14 16:48:01 -0700281 data.writeInt32((int32_t)portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700282 remote()->transact(START_OUTPUT, data, &reply);
283 return static_cast <status_t> (reply.readInt32());
284 }
285
Eric Laurentd7fe0862018-07-14 16:48:01 -0700286 virtual status_t stopOutput(audio_port_handle_t portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700287 {
288 Parcel data, reply;
289 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentd7fe0862018-07-14 16:48:01 -0700290 data.writeInt32((int32_t)portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700291 remote()->transact(STOP_OUTPUT, data, &reply);
292 return static_cast <status_t> (reply.readInt32());
293 }
294
Eric Laurentd7fe0862018-07-14 16:48:01 -0700295 virtual void releaseOutput(audio_port_handle_t portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700296 {
297 Parcel data, reply;
298 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentd7fe0862018-07-14 16:48:01 -0700299 data.writeInt32((int32_t)portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700300 remote()->transact(RELEASE_OUTPUT, data, &reply);
301 }
302
Eric Laurentcaf7f482014-11-25 17:50:47 -0800303 virtual status_t getInputForAttr(const audio_attributes_t *attr,
304 audio_io_handle_t *input,
Mikhail Naganov2996f672019-04-18 12:29:59 -0700305 audio_unique_id_t riid,
Eric Laurentcaf7f482014-11-25 17:50:47 -0800306 audio_session_t session,
Eric Laurentb2379ba2016-05-23 17:42:12 -0700307 pid_t pid,
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700308 uid_t uid,
Eric Laurentfee19762018-01-29 18:44:13 -0800309 const String16& opPackageName,
Eric Laurent20b9ef02016-12-05 11:03:16 -0800310 const audio_config_base_t *config,
Paul McLean466dc8e2015-04-17 13:15:36 -0600311 audio_input_flags_t flags,
Eric Laurent9ae8c592017-06-22 17:17:09 -0700312 audio_port_handle_t *selectedDeviceId,
Eric Laurent20b9ef02016-12-05 11:03:16 -0800313 audio_port_handle_t *portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700314 {
315 Parcel data, reply;
316 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentcaf7f482014-11-25 17:50:47 -0800317 if (attr == NULL) {
318 ALOGE("getInputForAttr NULL attr - shouldn't happen");
319 return BAD_VALUE;
320 }
321 if (input == NULL) {
322 ALOGE("getInputForAttr NULL input - shouldn't happen");
323 return BAD_VALUE;
324 }
Eric Laurent9ae8c592017-06-22 17:17:09 -0700325 if (selectedDeviceId == NULL) {
326 ALOGE("getInputForAttr NULL selectedDeviceId - shouldn't happen");
327 return BAD_VALUE;
328 }
Eric Laurent20b9ef02016-12-05 11:03:16 -0800329 if (portId == NULL) {
330 ALOGE("getInputForAttr NULL portId - shouldn't happen");
331 return BAD_VALUE;
332 }
Eric Laurentcaf7f482014-11-25 17:50:47 -0800333 data.write(attr, sizeof(audio_attributes_t));
Eric Laurenta54f1282017-07-01 19:39:32 -0700334 data.writeInt32(*input);
Mikhail Naganov2996f672019-04-18 12:29:59 -0700335 data.writeInt32(riid);
Eric Laurentcaf7f482014-11-25 17:50:47 -0800336 data.writeInt32(session);
Eric Laurentb2379ba2016-05-23 17:42:12 -0700337 data.writeInt32(pid);
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700338 data.writeInt32(uid);
Eric Laurentfee19762018-01-29 18:44:13 -0800339 data.writeString16(opPackageName);
Eric Laurent20b9ef02016-12-05 11:03:16 -0800340 data.write(config, sizeof(audio_config_base_t));
Glenn Kastenb3b16602014-07-16 08:36:31 -0700341 data.writeInt32(flags);
Eric Laurent9ae8c592017-06-22 17:17:09 -0700342 data.writeInt32(*selectedDeviceId);
Eric Laurent20b9ef02016-12-05 11:03:16 -0800343 data.writeInt32(*portId);
Eric Laurentcaf7f482014-11-25 17:50:47 -0800344 status_t status = remote()->transact(GET_INPUT_FOR_ATTR, data, &reply);
345 if (status != NO_ERROR) {
346 return status;
347 }
348 status = reply.readInt32();
349 if (status != NO_ERROR) {
350 return status;
351 }
352 *input = (audio_io_handle_t)reply.readInt32();
Eric Laurent9ae8c592017-06-22 17:17:09 -0700353 *selectedDeviceId = (audio_port_handle_t)reply.readInt32();
Eric Laurent20b9ef02016-12-05 11:03:16 -0800354 *portId = (audio_port_handle_t)reply.readInt32();
Eric Laurentcaf7f482014-11-25 17:50:47 -0800355 return NO_ERROR;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700356 }
357
Eric Laurent4eb58f12018-12-07 16:41:02 -0800358 virtual status_t startInput(audio_port_handle_t portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700359 {
360 Parcel data, reply;
361 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfee19762018-01-29 18:44:13 -0800362 data.writeInt32(portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700363 remote()->transact(START_INPUT, data, &reply);
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800364 status_t status = static_cast <status_t> (reply.readInt32());
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800365 return status;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700366 }
367
Eric Laurentfee19762018-01-29 18:44:13 -0800368 virtual status_t stopInput(audio_port_handle_t portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700369 {
370 Parcel data, reply;
371 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfee19762018-01-29 18:44:13 -0800372 data.writeInt32(portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700373 remote()->transact(STOP_INPUT, data, &reply);
374 return static_cast <status_t> (reply.readInt32());
375 }
376
Eric Laurentfee19762018-01-29 18:44:13 -0800377 virtual void releaseInput(audio_port_handle_t portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700378 {
379 Parcel data, reply;
380 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfee19762018-01-29 18:44:13 -0800381 data.writeInt32(portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700382 remote()->transact(RELEASE_INPUT, data, &reply);
383 }
384
Dima Zavinfce7a472011-04-19 22:30:36 -0700385 virtual status_t initStreamVolume(audio_stream_type_t stream,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700386 int indexMin,
387 int indexMax)
388 {
389 Parcel data, reply;
390 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
391 data.writeInt32(static_cast <uint32_t>(stream));
392 data.writeInt32(indexMin);
393 data.writeInt32(indexMax);
394 remote()->transact(INIT_STREAM_VOLUME, data, &reply);
395 return static_cast <status_t> (reply.readInt32());
396 }
397
Eric Laurent83844cc2011-11-18 16:43:31 -0800398 virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
399 int index,
400 audio_devices_t device)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700401 {
402 Parcel data, reply;
403 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
404 data.writeInt32(static_cast <uint32_t>(stream));
405 data.writeInt32(index);
Eric Laurent83844cc2011-11-18 16:43:31 -0800406 data.writeInt32(static_cast <uint32_t>(device));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700407 remote()->transact(SET_STREAM_VOLUME, data, &reply);
408 return static_cast <status_t> (reply.readInt32());
409 }
410
Eric Laurent83844cc2011-11-18 16:43:31 -0800411 virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
412 int *index,
413 audio_devices_t device)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700414 {
415 Parcel data, reply;
416 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
417 data.writeInt32(static_cast <uint32_t>(stream));
Eric Laurent83844cc2011-11-18 16:43:31 -0800418 data.writeInt32(static_cast <uint32_t>(device));
419
Eric Laurentc2f1f072009-07-17 12:17:14 -0700420 remote()->transact(GET_STREAM_VOLUME, data, &reply);
421 int lIndex = reply.readInt32();
422 if (index) *index = lIndex;
423 return static_cast <status_t> (reply.readInt32());
424 }
Eric Laurentde070132010-07-13 04:45:46 -0700425
François Gaffiecfe17322018-11-07 13:41:29 +0100426 virtual status_t setVolumeIndexForAttributes(const audio_attributes_t &attr, int index,
427 audio_devices_t device)
428 {
429 Parcel data, reply;
430 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
431 data.write(&attr, sizeof(audio_attributes_t));
432 data.writeInt32(index);
433 data.writeInt32(static_cast <uint32_t>(device));
434 status_t status = remote()->transact(SET_VOLUME_ATTRIBUTES, data, &reply);
435 if (status != NO_ERROR) {
436 return status;
437 }
438 return static_cast <status_t> (reply.readInt32());
439 }
440 virtual status_t getVolumeIndexForAttributes(const audio_attributes_t &attr, int &index,
441 audio_devices_t device)
442 {
443 Parcel data, reply;
444 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
445 data.write(&attr, sizeof(audio_attributes_t));
446 data.writeInt32(static_cast <uint32_t>(device));
447 status_t status = remote()->transact(GET_VOLUME_ATTRIBUTES, data, &reply);
448 if (status != NO_ERROR) {
449 return status;
450 }
451 status = static_cast <status_t> (reply.readInt32());
452 if (status != NO_ERROR) {
453 return status;
454 }
455 index = reply.readInt32();
456 return NO_ERROR;
457 }
458 virtual status_t getMinVolumeIndexForAttributes(const audio_attributes_t &attr, int &index)
459 {
460 Parcel data, reply;
461 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
462 data.write(&attr, sizeof(audio_attributes_t));
463 status_t status = remote()->transact(GET_MIN_VOLUME_FOR_ATTRIBUTES, data, &reply);
464 if (status != NO_ERROR) {
465 return status;
466 }
467 status = static_cast <status_t> (reply.readInt32());
468 if (status != NO_ERROR) {
469 return status;
470 }
471 index = reply.readInt32();
472 return NO_ERROR;
473 }
474 virtual status_t getMaxVolumeIndexForAttributes(const audio_attributes_t &attr, int &index)
475 {
476 Parcel data, reply;
477 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
478 data.write(&attr, sizeof(audio_attributes_t));
479 status_t status = remote()->transact(GET_MAX_VOLUME_FOR_ATTRIBUTES, data, &reply);
480 if (status != NO_ERROR) {
481 return status;
482 }
483 status = static_cast <status_t> (reply.readInt32());
484 if (status != NO_ERROR) {
485 return status;
486 }
487 index = reply.readInt32();
488 return NO_ERROR;
489 }
Dima Zavinfce7a472011-04-19 22:30:36 -0700490 virtual uint32_t getStrategyForStream(audio_stream_type_t stream)
Eric Laurentde070132010-07-13 04:45:46 -0700491 {
492 Parcel data, reply;
493 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
494 data.writeInt32(static_cast <uint32_t>(stream));
495 remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply);
François Gaffiec005e562018-11-06 15:04:49 +0100496 return reply.readUint32();
Eric Laurentde070132010-07-13 04:45:46 -0700497 }
498
Eric Laurent63742522012-03-08 13:42:42 -0800499 virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream)
Glenn Kasten6b2718c2011-02-04 13:54:26 -0800500 {
501 Parcel data, reply;
502 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
503 data.writeInt32(static_cast <uint32_t>(stream));
504 remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply);
Eric Laurent63742522012-03-08 13:42:42 -0800505 return (audio_devices_t) reply.readInt32();
Glenn Kasten6b2718c2011-02-04 13:54:26 -0800506 }
507
Glenn Kasten58e5aa32012-06-20 14:08:14 -0700508 virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc)
Eric Laurentde070132010-07-13 04:45:46 -0700509 {
510 Parcel data, reply;
511 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
512 data.write(desc, sizeof(effect_descriptor_t));
513 remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply);
514 return static_cast <audio_io_handle_t> (reply.readInt32());
515 }
516
Glenn Kasten58e5aa32012-06-20 14:08:14 -0700517 virtual status_t registerEffect(const effect_descriptor_t *desc,
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700518 audio_io_handle_t io,
Eric Laurentde070132010-07-13 04:45:46 -0700519 uint32_t strategy,
Glenn Kastend848eb42016-03-08 13:42:11 -0800520 audio_session_t session,
Eric Laurentde070132010-07-13 04:45:46 -0700521 int id)
522 {
523 Parcel data, reply;
524 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
525 data.write(desc, sizeof(effect_descriptor_t));
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700526 data.writeInt32(io);
Eric Laurentde070132010-07-13 04:45:46 -0700527 data.writeInt32(strategy);
528 data.writeInt32(session);
529 data.writeInt32(id);
530 remote()->transact(REGISTER_EFFECT, data, &reply);
531 return static_cast <status_t> (reply.readInt32());
532 }
533
534 virtual status_t unregisterEffect(int id)
535 {
536 Parcel data, reply;
537 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
538 data.writeInt32(id);
539 remote()->transact(UNREGISTER_EFFECT, data, &reply);
540 return static_cast <status_t> (reply.readInt32());
541 }
542
Eric Laurentdb7c0792011-08-10 10:37:50 -0700543 virtual status_t setEffectEnabled(int id, bool enabled)
544 {
545 Parcel data, reply;
546 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
547 data.writeInt32(id);
548 data.writeInt32(enabled);
549 remote()->transact(SET_EFFECT_ENABLED, data, &reply);
550 return static_cast <status_t> (reply.readInt32());
551 }
552
Eric Laurent6c796322019-04-09 14:13:17 -0700553 status_t moveEffectsToIo(const std::vector<int>& ids, audio_io_handle_t io) override
554 {
555 Parcel data, reply;
556 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
557 data.writeInt32(ids.size());
558 for (auto id : ids) {
559 data.writeInt32(id);
560 }
561 data.writeInt32(io);
562 status_t status = remote()->transact(MOVE_EFFECTS_TO_IO, data, &reply);
563 if (status != NO_ERROR) {
564 return status;
565 }
566 return static_cast <status_t> (reply.readInt32());
567 }
568
Glenn Kastenfff6d712012-01-12 16:38:12 -0800569 virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
Eric Laurenteda6c362011-02-02 09:33:30 -0800570 {
571 Parcel data, reply;
572 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800573 data.writeInt32((int32_t) stream);
Eric Laurenteda6c362011-02-02 09:33:30 -0800574 data.writeInt32(inPastMs);
575 remote()->transact(IS_STREAM_ACTIVE, data, &reply);
576 return reply.readInt32();
577 }
Eric Laurent57dae992011-07-24 13:36:09 -0700578
Jean-Michel Trivi272ab542013-02-04 16:26:02 -0800579 virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
580 {
581 Parcel data, reply;
582 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
583 data.writeInt32((int32_t) stream);
584 data.writeInt32(inPastMs);
585 remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply);
586 return reply.readInt32();
587 }
588
Jean-Michel Trivid7086032012-10-10 12:11:16 -0700589 virtual bool isSourceActive(audio_source_t source) const
590 {
591 Parcel data, reply;
592 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
593 data.writeInt32((int32_t) source);
594 remote()->transact(IS_SOURCE_ACTIVE, data, &reply);
595 return reply.readInt32();
596 }
597
Glenn Kastend848eb42016-03-08 13:42:11 -0800598 virtual status_t queryDefaultPreProcessing(audio_session_t audioSession,
Eric Laurent57dae992011-07-24 13:36:09 -0700599 effect_descriptor_t *descriptors,
600 uint32_t *count)
601 {
602 if (descriptors == NULL || count == NULL) {
603 return BAD_VALUE;
604 }
605 Parcel data, reply;
606 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
607 data.writeInt32(audioSession);
608 data.writeInt32(*count);
609 status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply);
610 if (status != NO_ERROR) {
611 return status;
612 }
613 status = static_cast <status_t> (reply.readInt32());
614 uint32_t retCount = reply.readInt32();
615 if (retCount != 0) {
616 uint32_t numDesc = (retCount < *count) ? retCount : *count;
617 reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc);
618 }
619 *count = retCount;
620 return status;
621 }
Richard Fitzgeraldad3af332013-03-25 16:54:37 +0000622
Kevin Rocardb99cc752019-03-21 20:52:24 -0700623 status_t setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t flags) override {
624 Parcel data, reply;
625 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
626 data.writeInt32(uid);
627 data.writeInt32(flags);
628 remote()->transact(SET_ALLOWED_CAPTURE_POLICY, data, &reply);
629 return reply.readInt32();
630 }
631
Richard Fitzgeraldad3af332013-03-25 16:54:37 +0000632 virtual bool isOffloadSupported(const audio_offload_info_t& info)
633 {
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +0100634 Parcel data, reply;
635 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
636 data.write(&info, sizeof(audio_offload_info_t));
637 remote()->transact(IS_OFFLOAD_SUPPORTED, data, &reply);
Eric Laurent203b1a12014-04-01 10:34:16 -0700638 return reply.readInt32();
639 }
640
Michael Chana94fbb22018-04-24 14:31:19 +1000641 virtual bool isDirectOutputSupported(const audio_config_base_t& config,
642 const audio_attributes_t& attributes) {
643 Parcel data, reply;
644 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
645 data.write(&config, sizeof(audio_config_base_t));
646 data.write(&attributes, sizeof(audio_attributes_t));
647 status_t status = remote()->transact(IS_DIRECT_OUTPUT_SUPPORTED, data, &reply);
648 return status == NO_ERROR ? static_cast<bool>(reply.readInt32()) : false;
649 }
650
Eric Laurent203b1a12014-04-01 10:34:16 -0700651 virtual status_t listAudioPorts(audio_port_role_t role,
652 audio_port_type_t type,
653 unsigned int *num_ports,
654 struct audio_port *ports,
655 unsigned int *generation)
656 {
657 if (num_ports == NULL || (*num_ports != 0 && ports == NULL) ||
658 generation == NULL) {
659 return BAD_VALUE;
660 }
661 Parcel data, reply;
662 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
663 unsigned int numPortsReq = (ports == NULL) ? 0 : *num_ports;
664 data.writeInt32(role);
665 data.writeInt32(type);
666 data.writeInt32(numPortsReq);
667 status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply);
668 if (status == NO_ERROR) {
669 status = (status_t)reply.readInt32();
670 *num_ports = (unsigned int)reply.readInt32();
671 }
Eric Laurent203b1a12014-04-01 10:34:16 -0700672 if (status == NO_ERROR) {
673 if (numPortsReq > *num_ports) {
674 numPortsReq = *num_ports;
675 }
676 if (numPortsReq > 0) {
677 reply.read(ports, numPortsReq * sizeof(struct audio_port));
678 }
679 *generation = reply.readInt32();
680 }
681 return status;
682 }
683
684 virtual status_t getAudioPort(struct audio_port *port)
685 {
686 if (port == NULL) {
687 return BAD_VALUE;
688 }
689 Parcel data, reply;
690 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
691 data.write(port, sizeof(struct audio_port));
692 status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply);
693 if (status != NO_ERROR ||
694 (status = (status_t)reply.readInt32()) != NO_ERROR) {
695 return status;
696 }
697 reply.read(port, sizeof(struct audio_port));
698 return status;
699 }
700
701 virtual status_t createAudioPatch(const struct audio_patch *patch,
702 audio_patch_handle_t *handle)
703 {
704 if (patch == NULL || handle == NULL) {
705 return BAD_VALUE;
706 }
707 Parcel data, reply;
708 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
709 data.write(patch, sizeof(struct audio_patch));
710 data.write(handle, sizeof(audio_patch_handle_t));
711 status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply);
712 if (status != NO_ERROR ||
713 (status = (status_t)reply.readInt32()) != NO_ERROR) {
714 return status;
715 }
716 reply.read(handle, sizeof(audio_patch_handle_t));
717 return status;
718 }
719
720 virtual status_t releaseAudioPatch(audio_patch_handle_t handle)
721 {
722 Parcel data, reply;
723 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
724 data.write(&handle, sizeof(audio_patch_handle_t));
725 status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply);
726 if (status != NO_ERROR) {
727 status = (status_t)reply.readInt32();
728 }
729 return status;
730 }
731
732 virtual status_t listAudioPatches(unsigned int *num_patches,
733 struct audio_patch *patches,
734 unsigned int *generation)
735 {
736 if (num_patches == NULL || (*num_patches != 0 && patches == NULL) ||
737 generation == NULL) {
738 return BAD_VALUE;
739 }
740 Parcel data, reply;
741 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
742 unsigned int numPatchesReq = (patches == NULL) ? 0 : *num_patches;
743 data.writeInt32(numPatchesReq);
744 status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply);
745 if (status == NO_ERROR) {
746 status = (status_t)reply.readInt32();
747 *num_patches = (unsigned int)reply.readInt32();
748 }
749 if (status == NO_ERROR) {
750 if (numPatchesReq > *num_patches) {
751 numPatchesReq = *num_patches;
752 }
753 if (numPatchesReq > 0) {
754 reply.read(patches, numPatchesReq * sizeof(struct audio_patch));
755 }
756 *generation = reply.readInt32();
757 }
758 return status;
759 }
760
761 virtual status_t setAudioPortConfig(const struct audio_port_config *config)
762 {
763 if (config == NULL) {
764 return BAD_VALUE;
765 }
766 Parcel data, reply;
767 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
768 data.write(config, sizeof(struct audio_port_config));
769 status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply);
770 if (status != NO_ERROR) {
771 status = (status_t)reply.readInt32();
772 }
773 return status;
774 }
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700775
Eric Laurentb52c1522014-05-20 11:27:36 -0700776 virtual void registerClient(const sp<IAudioPolicyServiceClient>& client)
777 {
778 Parcel data, reply;
779 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Marco Nelissenf8880202014-11-14 07:58:25 -0800780 data.writeStrongBinder(IInterface::asBinder(client));
Eric Laurentb52c1522014-05-20 11:27:36 -0700781 remote()->transact(REGISTER_CLIENT, data, &reply);
782 }
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700783
Eric Laurente8726fe2015-06-26 09:39:24 -0700784 virtual void setAudioPortCallbacksEnabled(bool enabled)
785 {
786 Parcel data, reply;
787 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
788 data.writeInt32(enabled ? 1 : 0);
789 remote()->transact(SET_AUDIO_PORT_CALLBACK_ENABLED, data, &reply);
790 }
791
François Gaffiecfe17322018-11-07 13:41:29 +0100792 virtual void setAudioVolumeGroupCallbacksEnabled(bool enabled)
793 {
794 Parcel data, reply;
795 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
796 data.writeInt32(enabled ? 1 : 0);
797 remote()->transact(SET_AUDIO_VOLUME_GROUP_CALLBACK_ENABLED, data, &reply);
798 }
799
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700800 virtual status_t acquireSoundTriggerSession(audio_session_t *session,
801 audio_io_handle_t *ioHandle,
802 audio_devices_t *device)
803 {
804 if (session == NULL || ioHandle == NULL || device == NULL) {
805 return BAD_VALUE;
806 }
807 Parcel data, reply;
808 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
809 status_t status = remote()->transact(ACQUIRE_SOUNDTRIGGER_SESSION, data, &reply);
810 if (status != NO_ERROR) {
811 return status;
812 }
813 status = (status_t)reply.readInt32();
814 if (status == NO_ERROR) {
815 *session = (audio_session_t)reply.readInt32();
816 *ioHandle = (audio_io_handle_t)reply.readInt32();
817 *device = (audio_devices_t)reply.readInt32();
818 }
819 return status;
820 }
821
822 virtual status_t releaseSoundTriggerSession(audio_session_t session)
823 {
824 Parcel data, reply;
825 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
826 data.writeInt32(session);
827 status_t status = remote()->transact(RELEASE_SOUNDTRIGGER_SESSION, data, &reply);
828 if (status != NO_ERROR) {
829 return status;
830 }
831 return (status_t)reply.readInt32();
832 }
Eric Laurentbb6c9a02014-09-25 14:11:47 -0700833
834 virtual audio_mode_t getPhoneState()
835 {
836 Parcel data, reply;
837 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
838 status_t status = remote()->transact(GET_PHONE_STATE, data, &reply);
839 if (status != NO_ERROR) {
840 return AUDIO_MODE_INVALID;
841 }
842 return (audio_mode_t)reply.readInt32();
843 }
Eric Laurentbaac1832014-12-01 17:52:59 -0800844
Chih-Hung Hsiehe964d4e2016-08-09 14:31:32 -0700845 virtual status_t registerPolicyMixes(const Vector<AudioMix>& mixes, bool registration)
Eric Laurentbaac1832014-12-01 17:52:59 -0800846 {
847 Parcel data, reply;
848 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
849 data.writeInt32(registration ? 1 : 0);
850 size_t size = mixes.size();
851 if (size > MAX_MIXES_PER_POLICY) {
852 size = MAX_MIXES_PER_POLICY;
853 }
854 size_t sizePosition = data.dataPosition();
855 data.writeInt32(size);
856 size_t finalSize = size;
857 for (size_t i = 0; i < size; i++) {
858 size_t position = data.dataPosition();
859 if (mixes[i].writeToParcel(&data) != NO_ERROR) {
860 data.setDataPosition(position);
861 finalSize--;
862 }
863 }
864 if (size != finalSize) {
865 size_t position = data.dataPosition();
866 data.setDataPosition(sizePosition);
867 data.writeInt32(finalSize);
868 data.setDataPosition(position);
869 }
870 status_t status = remote()->transact(REGISTER_POLICY_MIXES, data, &reply);
871 if (status == NO_ERROR) {
872 status = (status_t)reply.readInt32();
873 }
874 return status;
875 }
Eric Laurent554a2772015-04-10 11:29:24 -0700876
877 virtual status_t startAudioSource(const struct audio_port_config *source,
878 const audio_attributes_t *attributes,
Eric Laurent3e6c7e12018-07-27 17:09:23 -0700879 audio_port_handle_t *portId)
Eric Laurent554a2772015-04-10 11:29:24 -0700880 {
881 Parcel data, reply;
882 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurent3e6c7e12018-07-27 17:09:23 -0700883 if (source == NULL || attributes == NULL || portId == NULL) {
Eric Laurent554a2772015-04-10 11:29:24 -0700884 return BAD_VALUE;
885 }
886 data.write(source, sizeof(struct audio_port_config));
887 data.write(attributes, sizeof(audio_attributes_t));
888 status_t status = remote()->transact(START_AUDIO_SOURCE, data, &reply);
889 if (status != NO_ERROR) {
890 return status;
891 }
892 status = (status_t)reply.readInt32();
893 if (status != NO_ERROR) {
894 return status;
895 }
Eric Laurent3e6c7e12018-07-27 17:09:23 -0700896 *portId = (audio_port_handle_t)reply.readInt32();
Eric Laurent554a2772015-04-10 11:29:24 -0700897 return status;
898 }
899
Eric Laurent3e6c7e12018-07-27 17:09:23 -0700900 virtual status_t stopAudioSource(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 data.writeInt32(portId);
Eric Laurent554a2772015-04-10 11:29:24 -0700905 status_t status = remote()->transact(STOP_AUDIO_SOURCE, data, &reply);
906 if (status != NO_ERROR) {
907 return status;
908 }
909 status = (status_t)reply.readInt32();
910 return status;
911 }
Andy Hung2ddee192015-12-18 17:34:44 -0800912
913 virtual status_t setMasterMono(bool mono)
914 {
915 Parcel data, reply;
916 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
917 data.writeInt32(static_cast<int32_t>(mono));
918 status_t status = remote()->transact(SET_MASTER_MONO, data, &reply);
919 if (status != NO_ERROR) {
920 return status;
921 }
922 return static_cast<status_t>(reply.readInt32());
923 }
924
925 virtual status_t getMasterMono(bool *mono)
926 {
927 if (mono == nullptr) {
928 return BAD_VALUE;
929 }
930 Parcel data, reply;
931 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
932
933 status_t status = remote()->transact(GET_MASTER_MONO, data, &reply);
934 if (status != NO_ERROR) {
935 return status;
936 }
937 status = static_cast<status_t>(reply.readInt32());
938 if (status == NO_ERROR) {
939 *mono = static_cast<bool>(reply.readInt32());
940 }
941 return status;
942 }
Eric Laurentac9cef52017-06-09 15:46:26 -0700943
944 virtual float getStreamVolumeDB(audio_stream_type_t stream, int index, audio_devices_t device)
945 {
946 Parcel data, reply;
947 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
948 data.writeInt32(static_cast <int32_t>(stream));
949 data.writeInt32(static_cast <int32_t>(index));
950 data.writeUint32(static_cast <uint32_t>(device));
951 status_t status = remote()->transact(GET_STREAM_VOLUME_DB, data, &reply);
952 if (status != NO_ERROR) {
953 return NAN;
954 }
955 return reply.readFloat();
956 }
jiabin81772902018-04-02 17:52:27 -0700957
958 virtual status_t getSurroundFormats(unsigned int *numSurroundFormats,
959 audio_format_t *surroundFormats,
960 bool *surroundFormatsEnabled,
961 bool reported)
962 {
963 if (numSurroundFormats == NULL || (*numSurroundFormats != 0 &&
964 (surroundFormats == NULL || surroundFormatsEnabled == NULL))) {
965 return BAD_VALUE;
966 }
967 Parcel data, reply;
968 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
969 unsigned int numSurroundFormatsReq = *numSurroundFormats;
970 data.writeUint32(numSurroundFormatsReq);
971 data.writeBool(reported);
972 status_t status = remote()->transact(GET_SURROUND_FORMATS, data, &reply);
973 if (status == NO_ERROR && (status = (status_t)reply.readInt32()) == NO_ERROR) {
974 *numSurroundFormats = reply.readUint32();
975 }
976 if (status == NO_ERROR) {
977 if (numSurroundFormatsReq > *numSurroundFormats) {
978 numSurroundFormatsReq = *numSurroundFormats;
979 }
980 if (numSurroundFormatsReq > 0) {
981 status = reply.read(surroundFormats,
982 numSurroundFormatsReq * sizeof(audio_format_t));
983 if (status != NO_ERROR) {
984 return status;
985 }
986 status = reply.read(surroundFormatsEnabled,
987 numSurroundFormatsReq * sizeof(bool));
988 }
989 }
990 return status;
991 }
992
993 virtual status_t setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled)
994 {
995 Parcel data, reply;
996 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
997 data.writeInt32(audioFormat);
998 data.writeBool(enabled);
999 status_t status = remote()->transact(SET_SURROUND_FORMAT_ENABLED, data, &reply);
1000 if (status != NO_ERROR) {
1001 return status;
1002 }
1003 return reply.readInt32();
1004 }
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001005
Arun Mirpuri11029ad2018-12-19 20:45:19 -08001006 virtual status_t getHwOffloadEncodingFormatsSupportedForA2DP(
1007 std::vector<audio_format_t> *formats)
1008 {
1009 if (formats == NULL) {
1010 return BAD_VALUE;
1011 }
1012
1013 Parcel data, reply;
1014 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1015 status_t status = remote()->transact(GET_OFFLOAD_FORMATS_A2DP, data, &reply);
1016 if (status != NO_ERROR || (status = (status_t)reply.readInt32()) != NO_ERROR) {
1017 return status;
1018 }
1019
1020 size_t list_size = reply.readUint32();
1021
1022 for (size_t i = 0; i < list_size; i++) {
1023 formats->push_back(static_cast<audio_format_t>(reply.readInt32()));
1024 }
1025 return NO_ERROR;
1026 }
1027
1028
1029 virtual status_t addStreamDefaultEffect(const effect_uuid_t *type,
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001030 const String16& opPackageName,
1031 const effect_uuid_t *uuid,
1032 int32_t priority,
1033 audio_usage_t usage,
1034 audio_unique_id_t* id)
1035 {
1036 Parcel data, reply;
1037 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1038 data.write(type, sizeof(effect_uuid_t));
1039 data.writeString16(opPackageName);
1040 data.write(uuid, sizeof(effect_uuid_t));
1041 data.writeInt32(priority);
1042 data.writeInt32((int32_t) usage);
1043 status_t status = remote()->transact(ADD_STREAM_DEFAULT_EFFECT, data, &reply);
1044 if (status != NO_ERROR) {
1045 return status;
1046 }
1047 status = static_cast <status_t> (reply.readInt32());
1048 *id = reply.readInt32();
1049 return status;
1050 }
1051
1052 virtual status_t removeStreamDefaultEffect(audio_unique_id_t id)
1053 {
1054 Parcel data, reply;
1055 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1056 data.writeInt32(id);
1057 status_t status = remote()->transact(REMOVE_STREAM_DEFAULT_EFFECT, data, &reply);
1058 if (status != NO_ERROR) {
1059 return status;
1060 }
1061 return static_cast <status_t> (reply.readInt32());
1062 }
1063
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001064 virtual status_t addSourceDefaultEffect(const effect_uuid_t *type,
1065 const String16& opPackageName,
1066 const effect_uuid_t *uuid,
1067 int32_t priority,
1068 audio_source_t source,
1069 audio_unique_id_t* id)
1070 {
1071 Parcel data, reply;
1072 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1073 data.write(type, sizeof(effect_uuid_t));
1074 data.writeString16(opPackageName);
1075 data.write(uuid, sizeof(effect_uuid_t));
1076 data.writeInt32(priority);
1077 data.writeInt32((int32_t) source);
1078 status_t status = remote()->transact(ADD_SOURCE_DEFAULT_EFFECT, data, &reply);
1079 if (status != NO_ERROR) {
1080 return status;
1081 }
1082 status = static_cast <status_t> (reply.readInt32());
1083 *id = reply.readInt32();
1084 return status;
1085 }
1086
1087 virtual status_t removeSourceDefaultEffect(audio_unique_id_t id)
1088 {
1089 Parcel data, reply;
1090 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1091 data.writeInt32(id);
1092 status_t status = remote()->transact(REMOVE_SOURCE_DEFAULT_EFFECT, data, &reply);
1093 if (status != NO_ERROR) {
1094 return status;
1095 }
1096 return static_cast <status_t> (reply.readInt32());
1097 }
1098
Eric Laurentb78763e2018-10-17 10:08:02 -07001099 virtual status_t setAssistantUid(uid_t uid)
1100 {
1101 Parcel data, reply;
1102 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1103 data.writeInt32(uid);
1104 status_t status = remote()->transact(SET_ASSISTANT_UID, data, &reply);
1105 if (status != NO_ERROR) {
1106 return status;
1107 }
1108 return static_cast <status_t> (reply.readInt32());
1109 }
1110
1111 virtual status_t setA11yServicesUids(const std::vector<uid_t>& uids)
1112 {
1113 Parcel data, reply;
1114 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1115 data.writeInt32(uids.size());
1116 for (auto uid : uids) {
1117 data.writeInt32(uid);
1118 }
1119 status_t status = remote()->transact(SET_A11Y_SERVICES_UIDS, data, &reply);
1120 if (status != NO_ERROR) {
1121 return status;
1122 }
1123 return static_cast <status_t> (reply.readInt32());
1124 }
1125
jiabin6012f912018-11-02 17:06:30 -07001126 virtual bool isHapticPlaybackSupported()
1127 {
1128 Parcel data, reply;
1129 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1130 status_t status = remote()->transact(IS_HAPTIC_PLAYBACK_SUPPORTED, data, &reply);
1131 if (status != NO_ERROR) {
1132 return false;
1133 }
1134 return reply.readBool();
1135 }
1136
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001137 virtual status_t setUidDeviceAffinities(uid_t uid, const Vector<AudioDeviceTypeAddr>& devices)
1138 {
1139 Parcel data, reply;
1140 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1141
1142 data.writeInt32((int32_t) uid);
1143 size_t size = devices.size();
1144 size_t sizePosition = data.dataPosition();
1145 data.writeInt32((int32_t) size);
1146 size_t finalSize = size;
1147 for (size_t i = 0; i < size; i++) {
1148 size_t position = data.dataPosition();
1149 if (devices[i].writeToParcel(&data) != NO_ERROR) {
1150 data.setDataPosition(position);
1151 finalSize--;
1152 }
1153 }
1154 if (size != finalSize) {
1155 size_t position = data.dataPosition();
1156 data.setDataPosition(sizePosition);
1157 data.writeInt32(finalSize);
1158 data.setDataPosition(position);
1159 }
1160
1161 status_t status = remote()->transact(SET_UID_DEVICE_AFFINITY, data, &reply);
1162 if (status == NO_ERROR) {
1163 status = (status_t)reply.readInt32();
1164 }
1165 return status;
1166 }
1167
François Gaffied0ba9ed2018-11-05 11:50:42 +01001168 virtual status_t removeUidDeviceAffinities(uid_t uid) {
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001169 Parcel data, reply;
1170 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1171
1172 data.writeInt32((int32_t) uid);
1173
François Gaffied0ba9ed2018-11-05 11:50:42 +01001174 status_t status =
1175 remote()->transact(REMOVE_UID_DEVICE_AFFINITY, data, &reply);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001176 if (status == NO_ERROR) {
François Gaffied0ba9ed2018-11-05 11:50:42 +01001177 status = (status_t) reply.readInt32();
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001178 }
1179 return status;
1180 }
François Gaffied0ba9ed2018-11-05 11:50:42 +01001181
1182 virtual status_t listAudioProductStrategies(AudioProductStrategyVector &strategies)
1183 {
1184 Parcel data, reply;
1185 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1186
1187 status_t status = remote()->transact(LIST_AUDIO_PRODUCT_STRATEGIES, data, &reply);
1188 if (status != NO_ERROR) {
1189 ALOGE("%s: permission denied", __func__);
1190 return status;
1191 }
1192 status = static_cast<status_t>(reply.readInt32());
François Gaffie4b2018b2018-11-07 11:18:59 +01001193 if (status != NO_ERROR) {
1194 return status;
François Gaffied0ba9ed2018-11-05 11:50:42 +01001195 }
François Gaffie4b2018b2018-11-07 11:18:59 +01001196 uint32_t numStrategies = static_cast<uint32_t>(reply.readInt32());
1197 for (size_t i = 0; i < numStrategies; i++) {
1198 AudioProductStrategy strategy;
1199 status = strategy.readFromParcel(&reply);
1200 if (status != NO_ERROR) {
1201 ALOGE("%s: failed to read strategies", __FUNCTION__);
1202 strategies.clear();
1203 return status;
1204 }
1205 strategies.push_back(strategy);
1206 }
1207 return NO_ERROR;
François Gaffied0ba9ed2018-11-05 11:50:42 +01001208 }
1209
François Gaffie4b2018b2018-11-07 11:18:59 +01001210 virtual status_t getProductStrategyFromAudioAttributes(const AudioAttributes &aa,
1211 product_strategy_t &productStrategy)
François Gaffied0ba9ed2018-11-05 11:50:42 +01001212 {
1213 Parcel data, reply;
1214 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1215 status_t status = aa.writeToParcel(&data);
1216 if (status != NO_ERROR) {
François Gaffie4b2018b2018-11-07 11:18:59 +01001217 return status;
François Gaffied0ba9ed2018-11-05 11:50:42 +01001218 }
1219 status = remote()->transact(GET_STRATEGY_FOR_ATTRIBUTES, data, &reply);
François Gaffie4b2018b2018-11-07 11:18:59 +01001220 if (status != NO_ERROR) {
1221 return status;
François Gaffied0ba9ed2018-11-05 11:50:42 +01001222 }
François Gaffie4b2018b2018-11-07 11:18:59 +01001223 status = static_cast<status_t>(reply.readInt32());
1224 if (status != NO_ERROR) {
1225 return status;
1226 }
1227 productStrategy = static_cast<product_strategy_t>(reply.readInt32());
1228 return NO_ERROR;
1229 }
1230
1231 virtual status_t listAudioVolumeGroups(AudioVolumeGroupVector &groups)
1232 {
1233 Parcel data, reply;
1234 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1235
1236 status_t status = remote()->transact(LIST_AUDIO_VOLUME_GROUPS, data, &reply);
1237 if (status != NO_ERROR) {
1238 return status;
1239 }
1240 status = static_cast<status_t>(reply.readInt32());
1241 if (status != NO_ERROR) {
1242 return status;
1243 }
1244 uint32_t numGroups = static_cast<uint32_t>(reply.readInt32());
1245 for (size_t i = 0; i < numGroups; i++) {
1246 AudioVolumeGroup group;
1247 status = group.readFromParcel(&reply);
1248 if (status != NO_ERROR) {
1249 ALOGE("%s: failed to read volume groups", __FUNCTION__);
1250 groups.clear();
1251 return status;
1252 }
1253 groups.push_back(group);
1254 }
1255 return NO_ERROR;
1256 }
1257
1258 virtual status_t getVolumeGroupFromAudioAttributes(const AudioAttributes &aa,
1259 volume_group_t &volumeGroup)
1260 {
1261 Parcel data, reply;
1262 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1263 status_t status = aa.writeToParcel(&data);
1264 if (status != NO_ERROR) {
1265 return status;
1266 }
1267 status = remote()->transact(GET_VOLUME_GROUP_FOR_ATTRIBUTES, data, &reply);
1268 if (status != NO_ERROR) {
1269 return status;
1270 }
1271 status = static_cast<status_t>(reply.readInt32());
1272 if (status != NO_ERROR) {
1273 return status;
1274 }
1275 volumeGroup = static_cast<volume_group_t>(reply.readInt32());
1276 return NO_ERROR;
François Gaffied0ba9ed2018-11-05 11:50:42 +01001277 }
Eric Laurent6ede98f2019-06-11 14:50:30 -07001278
1279 virtual status_t setRttEnabled(bool enabled)
1280 {
1281 Parcel data, reply;
1282 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1283 data.writeInt32(static_cast<int32_t>(enabled));
1284 status_t status = remote()->transact(SET_RTT_ENABLED, data, &reply);
1285 if (status != NO_ERROR) {
1286 return status;
1287 }
1288 return static_cast<status_t>(reply.readInt32());
1289 }
Jean-Michel Trivi2deb4782019-11-01 11:04:15 -07001290
1291 virtual status_t setPreferredDeviceForStrategy(product_strategy_t strategy,
1292 const AudioDeviceTypeAddr &device)
1293 {
1294 Parcel data, reply;
1295 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1296 data.writeUint32(static_cast<uint32_t>(strategy));
1297 status_t status = device.writeToParcel(&data);
1298 if (status != NO_ERROR) {
1299 return BAD_VALUE;
1300 }
1301 status = remote()->transact(SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY,
1302 data, &reply);
1303 if (status != NO_ERROR) {
1304 return status;
1305 }
1306 return static_cast<status_t>(reply.readInt32());
1307 }
1308
1309 virtual status_t removePreferredDeviceForStrategy(product_strategy_t strategy)
1310 {
1311 Parcel data, reply;
1312 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1313 data.writeUint32(static_cast<uint32_t>(strategy));
1314 status_t status = remote()->transact(REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY,
1315 data, &reply);
1316 if (status != NO_ERROR) {
1317 return status;
1318 }
1319 return static_cast<status_t>(reply.readInt32());
1320 }
1321
1322 virtual status_t getPreferredDeviceForStrategy(product_strategy_t strategy,
1323 AudioDeviceTypeAddr &device)
1324 {
1325 Parcel data, reply;
1326 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1327 data.writeUint32(static_cast<uint32_t>(strategy));
1328 status_t status = remote()->transact(GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY,
1329 data, &reply);
1330 if (status != NO_ERROR) {
1331 return status;
1332 }
1333 status = device.readFromParcel(&reply);
1334 if (status != NO_ERROR) {
1335 return status;
1336 }
1337 return static_cast<status_t>(reply.readInt32());
1338 }
Eric Laurentc2f1f072009-07-17 12:17:14 -07001339};
1340
1341IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
1342
1343// ----------------------------------------------------------------------
1344
Eric Laurentc2f1f072009-07-17 12:17:14 -07001345status_t BnAudioPolicyService::onTransact(
1346 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
1347{
Eric Laurentb1cc36b2017-12-11 12:14:16 -08001348 // make sure transactions reserved to AudioFlinger do not come from other processes
1349 switch (code) {
1350 case START_OUTPUT:
1351 case STOP_OUTPUT:
1352 case RELEASE_OUTPUT:
1353 case GET_INPUT_FOR_ATTR:
1354 case START_INPUT:
1355 case STOP_INPUT:
1356 case RELEASE_INPUT:
Eric Laurentb1cc36b2017-12-11 12:14:16 -08001357 case GET_OUTPUT_FOR_EFFECT:
1358 case REGISTER_EFFECT:
1359 case UNREGISTER_EFFECT:
1360 case SET_EFFECT_ENABLED:
1361 case GET_OUTPUT_FOR_ATTR:
1362 case ACQUIRE_SOUNDTRIGGER_SESSION:
1363 case RELEASE_SOUNDTRIGGER_SESSION:
Eric Laurent6c796322019-04-09 14:13:17 -07001364 case MOVE_EFFECTS_TO_IO:
Eric Laurentb1cc36b2017-12-11 12:14:16 -08001365 ALOGW("%s: transaction %d received from PID %d",
1366 __func__, code, IPCThreadState::self()->getCallingPid());
Eric Laurentef92bff2018-04-26 10:44:50 -07001367 // return status only for non void methods
1368 switch (code) {
1369 case RELEASE_OUTPUT:
1370 case RELEASE_INPUT:
1371 break;
1372 default:
1373 reply->writeInt32(static_cast<int32_t> (INVALID_OPERATION));
1374 break;
1375 }
1376 return OK;
Eric Laurentb1cc36b2017-12-11 12:14:16 -08001377 default:
1378 break;
1379 }
1380
Eric Laurent4980df22018-01-26 18:04:09 -08001381 // make sure the following transactions come from system components
1382 switch (code) {
1383 case SET_DEVICE_CONNECTION_STATE:
1384 case HANDLE_DEVICE_CONFIG_CHANGE:
1385 case SET_PHONE_STATE:
Eric Laurente17378d2018-05-09 14:43:01 -07001386//FIXME: Allow SET_FORCE_USE calls from system apps until a better use case routing API is available
1387// case SET_FORCE_USE:
Eric Laurent4980df22018-01-26 18:04:09 -08001388 case INIT_STREAM_VOLUME:
1389 case SET_STREAM_VOLUME:
1390 case REGISTER_POLICY_MIXES:
Eric Laurent10b71232018-04-13 18:14:44 -07001391 case SET_MASTER_MONO:
jiabin81772902018-04-02 17:52:27 -07001392 case GET_SURROUND_FORMATS:
Eric Laurentb78763e2018-10-17 10:08:02 -07001393 case SET_SURROUND_FORMAT_ENABLED:
1394 case SET_ASSISTANT_UID:
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001395 case SET_A11Y_SERVICES_UIDS:
1396 case SET_UID_DEVICE_AFFINITY:
Arun Mirpuri11029ad2018-12-19 20:45:19 -08001397 case REMOVE_UID_DEVICE_AFFINITY:
François Gaffie4b2018b2018-11-07 11:18:59 +01001398 case GET_OFFLOAD_FORMATS_A2DP:
1399 case LIST_AUDIO_VOLUME_GROUPS:
Eric Laurent6ede98f2019-06-11 14:50:30 -07001400 case GET_VOLUME_GROUP_FOR_ATTRIBUTES:
Jean-Michel Trivi2deb4782019-11-01 11:04:15 -07001401 case SET_RTT_ENABLED:
1402 case SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY:
1403 case REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY:
Nadav Bard3824242020-03-05 12:32:50 +00001404 case GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY:
jiabin56d41832019-12-23 11:17:25 -08001405 case SET_ALLOWED_CAPTURE_POLICY: {
Andy Hung4ef19fa2018-05-15 19:35:29 -07001406 if (!isServiceUid(IPCThreadState::self()->getCallingUid())) {
Eric Laurent4980df22018-01-26 18:04:09 -08001407 ALOGW("%s: transaction %d received from PID %d unauthorized UID %d",
1408 __func__, code, IPCThreadState::self()->getCallingPid(),
1409 IPCThreadState::self()->getCallingUid());
Eric Laurentef92bff2018-04-26 10:44:50 -07001410 reply->writeInt32(static_cast<int32_t> (INVALID_OPERATION));
1411 return OK;
Eric Laurent4980df22018-01-26 18:04:09 -08001412 }
Eric Laurent96c7eed2018-03-26 17:57:01 -07001413 } break;
Eric Laurent4980df22018-01-26 18:04:09 -08001414 default:
1415 break;
1416 }
1417
Eric Laurent39b09b52018-06-29 12:24:40 -07001418 std::string tag("IAudioPolicyService command " + std::to_string(code));
1419 TimeCheck check(tag.c_str());
Eric Laurent3528c932018-02-23 17:17:22 -08001420
Glenn Kastene53b9ea2012-03-12 16:29:55 -07001421 switch (code) {
Eric Laurentc2f1f072009-07-17 12:17:14 -07001422 case SET_DEVICE_CONNECTION_STATE: {
1423 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001424 audio_devices_t device =
1425 static_cast <audio_devices_t>(data.readInt32());
1426 audio_policy_dev_state_t state =
1427 static_cast <audio_policy_dev_state_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -07001428 const char *device_address = data.readCString();
Paul McLeane743a472015-01-28 11:07:31 -08001429 const char *device_name = data.readCString();
Aniket Kumar Lata4e464702019-01-10 23:38:46 -08001430 audio_format_t codecFormat = static_cast <audio_format_t>(data.readInt32());
Pavlin Radoslavovc694ff42017-01-09 23:27:29 -08001431 if (device_address == nullptr || device_name == nullptr) {
1432 ALOGE("Bad Binder transaction: SET_DEVICE_CONNECTION_STATE for device %u", device);
1433 reply->writeInt32(static_cast<int32_t> (BAD_VALUE));
1434 } else {
1435 reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device,
1436 state,
1437 device_address,
Aniket Kumar Lata4e464702019-01-10 23:38:46 -08001438 device_name,
1439 codecFormat)));
Pavlin Radoslavovc694ff42017-01-09 23:27:29 -08001440 }
Eric Laurentc2f1f072009-07-17 12:17:14 -07001441 return NO_ERROR;
1442 } break;
1443
1444 case GET_DEVICE_CONNECTION_STATE: {
1445 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001446 audio_devices_t device =
1447 static_cast<audio_devices_t> (data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -07001448 const char *device_address = data.readCString();
Pavlin Radoslavovc694ff42017-01-09 23:27:29 -08001449 if (device_address == nullptr) {
1450 ALOGE("Bad Binder transaction: GET_DEVICE_CONNECTION_STATE for device %u", device);
1451 reply->writeInt32(static_cast<int32_t> (AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE));
1452 } else {
1453 reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device,
1454 device_address)));
1455 }
Eric Laurentc2f1f072009-07-17 12:17:14 -07001456 return NO_ERROR;
1457 } break;
1458
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -08001459 case HANDLE_DEVICE_CONFIG_CHANGE: {
1460 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1461 audio_devices_t device =
1462 static_cast <audio_devices_t>(data.readInt32());
1463 const char *device_address = data.readCString();
1464 const char *device_name = data.readCString();
Aniket Kumar Lata4e464702019-01-10 23:38:46 -08001465 audio_format_t codecFormat =
1466 static_cast <audio_format_t>(data.readInt32());
Pavlin Radoslavovc694ff42017-01-09 23:27:29 -08001467 if (device_address == nullptr || device_name == nullptr) {
1468 ALOGE("Bad Binder transaction: HANDLE_DEVICE_CONFIG_CHANGE for device %u", device);
1469 reply->writeInt32(static_cast<int32_t> (BAD_VALUE));
1470 } else {
1471 reply->writeInt32(static_cast<uint32_t> (handleDeviceConfigChange(device,
1472 device_address,
Aniket Kumar Lata4e464702019-01-10 23:38:46 -08001473 device_name,
1474 codecFormat)));
Pavlin Radoslavovc694ff42017-01-09 23:27:29 -08001475 }
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -08001476 return NO_ERROR;
1477 } break;
1478
Eric Laurentc2f1f072009-07-17 12:17:14 -07001479 case SET_PHONE_STATE: {
1480 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kasten85ab62c2012-11-01 11:11:38 -07001481 reply->writeInt32(static_cast <uint32_t>(setPhoneState(
1482 (audio_mode_t) data.readInt32())));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001483 return NO_ERROR;
1484 } break;
1485
Eric Laurentc2f1f072009-07-17 12:17:14 -07001486 case SET_FORCE_USE: {
1487 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kasten85ab62c2012-11-01 11:11:38 -07001488 audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
1489 data.readInt32());
Dima Zavinfce7a472011-04-19 22:30:36 -07001490 audio_policy_forced_cfg_t config =
1491 static_cast <audio_policy_forced_cfg_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -07001492 reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config)));
1493 return NO_ERROR;
1494 } break;
1495
1496 case GET_FORCE_USE: {
1497 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kasten85ab62c2012-11-01 11:11:38 -07001498 audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
1499 data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -07001500 reply->writeInt32(static_cast <uint32_t>(getForceUse(usage)));
1501 return NO_ERROR;
1502 } break;
1503
1504 case GET_OUTPUT: {
1505 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001506 audio_stream_type_t stream =
1507 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentf4e63452017-11-06 19:31:46 +00001508 audio_io_handle_t output = getOutput(stream);
Eric Laurentfa2877b2009-07-28 08:44:33 -07001509 reply->writeInt32(static_cast <int>(output));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001510 return NO_ERROR;
1511 } break;
1512
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -07001513 case GET_OUTPUT_FOR_ATTR: {
1514 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurent42984412019-05-09 17:57:03 -07001515 audio_attributes_t attr = AUDIO_ATTRIBUTES_INITIALIZER;
1516 status_t status = data.read(&attr, sizeof(audio_attributes_t));
1517 if (status != NO_ERROR) {
1518 return status;
Eric Laurente83b55d2014-11-14 10:06:21 -08001519 }
Eric Laurent42984412019-05-09 17:57:03 -07001520 sanetizeAudioAttributes(&attr);
Eric Laurente83b55d2014-11-14 10:06:21 -08001521 audio_session_t session = (audio_session_t)data.readInt32();
1522 audio_stream_type_t stream = AUDIO_STREAM_DEFAULT;
1523 bool hasStream = data.readInt32() != 0;
1524 if (hasStream) {
1525 stream = (audio_stream_type_t)data.readInt32();
1526 }
Nadav Bar766fb022018-01-07 12:18:03 +02001527 pid_t pid = (pid_t)data.readInt32();
Eric Laurent8c7e6da2015-04-21 17:37:00 -07001528 uid_t uid = (uid_t)data.readInt32();
Eric Laurent20b9ef02016-12-05 11:03:16 -08001529 audio_config_t config;
1530 memset(&config, 0, sizeof(audio_config_t));
1531 data.read(&config, sizeof(audio_config_t));
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -07001532 audio_output_flags_t flags =
1533 static_cast <audio_output_flags_t>(data.readInt32());
Paul McLeanaa981192015-03-21 09:55:15 -07001534 audio_port_handle_t selectedDeviceId = data.readInt32();
Eric Laurent20b9ef02016-12-05 11:03:16 -08001535 audio_port_handle_t portId = (audio_port_handle_t)data.readInt32();
Robert Shiha946d842015-09-02 16:46:59 -07001536 audio_io_handle_t output = 0;
Kevin Rocard153f92d2018-12-18 18:33:28 -08001537 std::vector<audio_io_handle_t> secondaryOutputs;
Eric Laurent42984412019-05-09 17:57:03 -07001538 status = getOutputForAttr(&attr,
Nadav Bar766fb022018-01-07 12:18:03 +02001539 &output, session, &stream, pid, uid,
Eric Laurent20b9ef02016-12-05 11:03:16 -08001540 &config,
Kevin Rocard153f92d2018-12-18 18:33:28 -08001541 flags, &selectedDeviceId, &portId, &secondaryOutputs);
Eric Laurente83b55d2014-11-14 10:06:21 -08001542 reply->writeInt32(status);
Eric Laurent42984412019-05-09 17:57:03 -07001543 status = reply->write(&attr, sizeof(audio_attributes_t));
1544 if (status != NO_ERROR) {
1545 return status;
1546 }
Eric Laurente83b55d2014-11-14 10:06:21 -08001547 reply->writeInt32(output);
1548 reply->writeInt32(stream);
Eric Laurent9ae8c592017-06-22 17:17:09 -07001549 reply->writeInt32(selectedDeviceId);
Eric Laurent20b9ef02016-12-05 11:03:16 -08001550 reply->writeInt32(portId);
Kevin Rocard153f92d2018-12-18 18:33:28 -08001551 reply->writeInt32(secondaryOutputs.size());
1552 return reply->write(secondaryOutputs.data(),
1553 secondaryOutputs.size() * sizeof(audio_io_handle_t));
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -07001554 } break;
1555
Eric Laurentc2f1f072009-07-17 12:17:14 -07001556 case START_OUTPUT: {
1557 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentd7fe0862018-07-14 16:48:01 -07001558 const audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
1559 reply->writeInt32(static_cast <uint32_t>(startOutput(portId)));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001560 return NO_ERROR;
1561 } break;
1562
1563 case STOP_OUTPUT: {
1564 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentd7fe0862018-07-14 16:48:01 -07001565 const audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
1566 reply->writeInt32(static_cast <uint32_t>(stopOutput(portId)));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001567 return NO_ERROR;
1568 } break;
1569
1570 case RELEASE_OUTPUT: {
1571 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentd7fe0862018-07-14 16:48:01 -07001572 const audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
1573 releaseOutput(portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -07001574 return NO_ERROR;
1575 } break;
1576
Eric Laurentcaf7f482014-11-25 17:50:47 -08001577 case GET_INPUT_FOR_ATTR: {
Eric Laurentc2f1f072009-07-17 12:17:14 -07001578 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07001579 audio_attributes_t attr = {};
Eric Laurentcaf7f482014-11-25 17:50:47 -08001580 data.read(&attr, sizeof(audio_attributes_t));
Kevin Rocard39fdbd02017-11-13 11:15:27 -08001581 sanetizeAudioAttributes(&attr);
Eric Laurenta54f1282017-07-01 19:39:32 -07001582 audio_io_handle_t input = (audio_io_handle_t)data.readInt32();
Mikhail Naganov2996f672019-04-18 12:29:59 -07001583 audio_unique_id_t riid = (audio_unique_id_t)data.readInt32();
Eric Laurentcaf7f482014-11-25 17:50:47 -08001584 audio_session_t session = (audio_session_t)data.readInt32();
Eric Laurentb2379ba2016-05-23 17:42:12 -07001585 pid_t pid = (pid_t)data.readInt32();
Eric Laurent8c7e6da2015-04-21 17:37:00 -07001586 uid_t uid = (uid_t)data.readInt32();
Eric Laurentfee19762018-01-29 18:44:13 -08001587 const String16 opPackageName = data.readString16();
Eric Laurent20b9ef02016-12-05 11:03:16 -08001588 audio_config_base_t config;
1589 memset(&config, 0, sizeof(audio_config_base_t));
1590 data.read(&config, sizeof(audio_config_base_t));
Glenn Kastenb3b16602014-07-16 08:36:31 -07001591 audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
Paul McLean466dc8e2015-04-17 13:15:36 -06001592 audio_port_handle_t selectedDeviceId = (audio_port_handle_t) data.readInt32();
Eric Laurent20b9ef02016-12-05 11:03:16 -08001593 audio_port_handle_t portId = (audio_port_handle_t)data.readInt32();
Mikhail Naganov2996f672019-04-18 12:29:59 -07001594 status_t status = getInputForAttr(&attr, &input, riid, session, pid, uid,
Eric Laurentfee19762018-01-29 18:44:13 -08001595 opPackageName, &config,
Eric Laurent9ae8c592017-06-22 17:17:09 -07001596 flags, &selectedDeviceId, &portId);
Eric Laurentcaf7f482014-11-25 17:50:47 -08001597 reply->writeInt32(status);
1598 if (status == NO_ERROR) {
1599 reply->writeInt32(input);
Eric Laurent9ae8c592017-06-22 17:17:09 -07001600 reply->writeInt32(selectedDeviceId);
Eric Laurent20b9ef02016-12-05 11:03:16 -08001601 reply->writeInt32(portId);
Eric Laurentcaf7f482014-11-25 17:50:47 -08001602 }
Eric Laurentc2f1f072009-07-17 12:17:14 -07001603 return NO_ERROR;
1604 } break;
1605
1606 case START_INPUT: {
1607 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfee19762018-01-29 18:44:13 -08001608 audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
Eric Laurent4eb58f12018-12-07 16:41:02 -08001609 status_t status = startInput(portId);
Svet Ganovf4ddfef2018-01-16 07:37:58 -08001610 reply->writeInt32(static_cast <uint32_t>(status));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001611 return NO_ERROR;
1612 } break;
1613
1614 case STOP_INPUT: {
1615 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfee19762018-01-29 18:44:13 -08001616 audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
1617 reply->writeInt32(static_cast <uint32_t>(stopInput(portId)));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001618 return NO_ERROR;
1619 } break;
1620
1621 case RELEASE_INPUT: {
1622 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfee19762018-01-29 18:44:13 -08001623 audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
1624 releaseInput(portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -07001625 return NO_ERROR;
1626 } break;
1627
1628 case INIT_STREAM_VOLUME: {
1629 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001630 audio_stream_type_t stream =
1631 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -07001632 int indexMin = data.readInt32();
1633 int indexMax = data.readInt32();
1634 reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax)));
1635 return NO_ERROR;
1636 } break;
1637
1638 case SET_STREAM_VOLUME: {
1639 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001640 audio_stream_type_t stream =
1641 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -07001642 int index = data.readInt32();
Eric Laurent83844cc2011-11-18 16:43:31 -08001643 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
1644 reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream,
1645 index,
1646 device)));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001647 return NO_ERROR;
1648 } break;
1649
1650 case GET_STREAM_VOLUME: {
1651 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001652 audio_stream_type_t stream =
1653 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurent83844cc2011-11-18 16:43:31 -08001654 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
Robert Shih89235432015-09-02 16:46:59 -07001655 int index = 0;
Eric Laurent83844cc2011-11-18 16:43:31 -08001656 status_t status = getStreamVolumeIndex(stream, &index, device);
Eric Laurentc2f1f072009-07-17 12:17:14 -07001657 reply->writeInt32(index);
1658 reply->writeInt32(static_cast <uint32_t>(status));
1659 return NO_ERROR;
1660 } break;
1661
Eric Laurentde070132010-07-13 04:45:46 -07001662 case GET_STRATEGY_FOR_STREAM: {
1663 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001664 audio_stream_type_t stream =
1665 static_cast <audio_stream_type_t>(data.readInt32());
François Gaffiec005e562018-11-06 15:04:49 +01001666 reply->writeUint32(getStrategyForStream(stream));
Eric Laurentde070132010-07-13 04:45:46 -07001667 return NO_ERROR;
1668 } break;
1669
François Gaffiecfe17322018-11-07 13:41:29 +01001670 case SET_VOLUME_ATTRIBUTES: {
1671 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1672 audio_attributes_t attributes = {};
1673 status_t status = data.read(&attributes, sizeof(audio_attributes_t));
1674 if (status != NO_ERROR) {
1675 return status;
1676 }
1677 int index = data.readInt32();
1678 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
1679
1680 reply->writeInt32(static_cast <uint32_t>(setVolumeIndexForAttributes(attributes,
1681 index, device)));
1682 return NO_ERROR;
1683 } break;
1684
1685 case GET_VOLUME_ATTRIBUTES: {
1686 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1687 audio_attributes_t attributes = {};
1688 status_t status = data.read(&attributes, sizeof(audio_attributes_t));
1689 if (status != NO_ERROR) {
1690 return status;
1691 }
1692 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
1693
1694 int index = 0;
1695 status = getVolumeIndexForAttributes(attributes, index, device);
1696 reply->writeInt32(static_cast <uint32_t>(status));
1697 if (status == NO_ERROR) {
1698 reply->writeInt32(index);
1699 }
1700 return NO_ERROR;
1701 } break;
1702
1703 case GET_MIN_VOLUME_FOR_ATTRIBUTES: {
1704 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1705 audio_attributes_t attributes = {};
1706 status_t status = data.read(&attributes, sizeof(audio_attributes_t));
1707 if (status != NO_ERROR) {
1708 return status;
1709 }
1710
1711 int index = 0;
1712 status = getMinVolumeIndexForAttributes(attributes, index);
1713 reply->writeInt32(static_cast <uint32_t>(status));
1714 if (status == NO_ERROR) {
1715 reply->writeInt32(index);
1716 }
1717 return NO_ERROR;
1718 } break;
1719
1720 case GET_MAX_VOLUME_FOR_ATTRIBUTES: {
1721 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1722 audio_attributes_t attributes = {};
1723 status_t status = data.read(&attributes, sizeof(audio_attributes_t));
1724 if (status != NO_ERROR) {
1725 return status;
1726 }
1727
1728 int index = 0;
1729 status = getMaxVolumeIndexForAttributes(attributes, index);
1730 reply->writeInt32(static_cast <uint32_t>(status));
1731 if (status == NO_ERROR) {
1732 reply->writeInt32(index);
1733 }
1734 return NO_ERROR;
1735 } break;
1736
Glenn Kasten6b2718c2011-02-04 13:54:26 -08001737 case GET_DEVICES_FOR_STREAM: {
1738 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001739 audio_stream_type_t stream =
1740 static_cast <audio_stream_type_t>(data.readInt32());
Glenn Kasten6b2718c2011-02-04 13:54:26 -08001741 reply->writeInt32(static_cast <int>(getDevicesForStream(stream)));
1742 return NO_ERROR;
1743 } break;
1744
Eric Laurentde070132010-07-13 04:45:46 -07001745 case GET_OUTPUT_FOR_EFFECT: {
1746 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07001747 effect_descriptor_t desc = {};
1748 if (data.read(&desc, sizeof(desc)) != NO_ERROR) {
1749 android_errorWriteLog(0x534e4554, "73126106");
1750 }
1751 (void)sanitizeEffectDescriptor(&desc);
Eric Laurentde070132010-07-13 04:45:46 -07001752 audio_io_handle_t output = getOutputForEffect(&desc);
1753 reply->writeInt32(static_cast <int>(output));
1754 return NO_ERROR;
1755 } break;
1756
1757 case REGISTER_EFFECT: {
1758 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07001759 effect_descriptor_t desc = {};
1760 if (data.read(&desc, sizeof(desc)) != NO_ERROR) {
1761 android_errorWriteLog(0x534e4554, "73126106");
1762 }
1763 (void)sanitizeEffectDescriptor(&desc);
Eric Laurent7c7f10b2011-06-17 21:29:58 -07001764 audio_io_handle_t io = data.readInt32();
Eric Laurentde070132010-07-13 04:45:46 -07001765 uint32_t strategy = data.readInt32();
Glenn Kastend848eb42016-03-08 13:42:11 -08001766 audio_session_t session = (audio_session_t) data.readInt32();
Eric Laurentde070132010-07-13 04:45:46 -07001767 int id = data.readInt32();
1768 reply->writeInt32(static_cast <int32_t>(registerEffect(&desc,
Eric Laurent7c7f10b2011-06-17 21:29:58 -07001769 io,
Eric Laurentde070132010-07-13 04:45:46 -07001770 strategy,
1771 session,
1772 id)));
1773 return NO_ERROR;
1774 } break;
1775
1776 case UNREGISTER_EFFECT: {
1777 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1778 int id = data.readInt32();
1779 reply->writeInt32(static_cast <int32_t>(unregisterEffect(id)));
1780 return NO_ERROR;
1781 } break;
1782
Eric Laurentdb7c0792011-08-10 10:37:50 -07001783 case SET_EFFECT_ENABLED: {
1784 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1785 int id = data.readInt32();
1786 bool enabled = static_cast <bool>(data.readInt32());
1787 reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled)));
1788 return NO_ERROR;
1789 } break;
1790
Eric Laurent6c796322019-04-09 14:13:17 -07001791 case MOVE_EFFECTS_TO_IO: {
1792 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1793 std::vector<int> ids;
1794 int32_t size;
1795 status_t status = data.readInt32(&size);
1796 if (status != NO_ERROR) {
1797 return status;
1798 }
1799 if (size > MAX_ITEMS_PER_LIST) {
1800 return BAD_VALUE;
1801 }
1802 for (int32_t i = 0; i < size; i++) {
1803 int id;
1804 status = data.readInt32(&id);
1805 if (status != NO_ERROR) {
1806 return status;
1807 }
1808 ids.push_back(id);
1809 }
1810
1811 audio_io_handle_t io = data.readInt32();
1812 reply->writeInt32(static_cast <int32_t>(moveEffectsToIo(ids, io)));
1813 return NO_ERROR;
1814 } break;
1815
Eric Laurenteda6c362011-02-02 09:33:30 -08001816 case IS_STREAM_ACTIVE: {
1817 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kastenfff6d712012-01-12 16:38:12 -08001818 audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
Eric Laurenteda6c362011-02-02 09:33:30 -08001819 uint32_t inPastMs = (uint32_t)data.readInt32();
Eric Laurentebcb2542014-03-05 18:30:08 -08001820 reply->writeInt32( isStreamActive(stream, inPastMs) );
Eric Laurenteda6c362011-02-02 09:33:30 -08001821 return NO_ERROR;
1822 } break;
1823
Jean-Michel Trivi272ab542013-02-04 16:26:02 -08001824 case IS_STREAM_ACTIVE_REMOTELY: {
1825 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1826 audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1827 uint32_t inPastMs = (uint32_t)data.readInt32();
Eric Laurentebcb2542014-03-05 18:30:08 -08001828 reply->writeInt32( isStreamActiveRemotely(stream, inPastMs) );
Jean-Michel Trivi272ab542013-02-04 16:26:02 -08001829 return NO_ERROR;
1830 } break;
1831
Jean-Michel Trivid7086032012-10-10 12:11:16 -07001832 case IS_SOURCE_ACTIVE: {
1833 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1834 audio_source_t source = (audio_source_t) data.readInt32();
1835 reply->writeInt32( isSourceActive(source));
1836 return NO_ERROR;
1837 }
1838
Eric Laurent57dae992011-07-24 13:36:09 -07001839 case QUERY_DEFAULT_PRE_PROCESSING: {
1840 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kastend848eb42016-03-08 13:42:11 -08001841 audio_session_t audioSession = (audio_session_t) data.readInt32();
Eric Laurent57dae992011-07-24 13:36:09 -07001842 uint32_t count = data.readInt32();
Eric Laurent74adca92014-11-05 12:15:36 -08001843 if (count > AudioEffect::kMaxPreProcessing) {
1844 count = AudioEffect::kMaxPreProcessing;
1845 }
Eric Laurent57dae992011-07-24 13:36:09 -07001846 uint32_t retCount = count;
Andy Hungb0272092018-04-12 11:06:56 -07001847 effect_descriptor_t *descriptors = new effect_descriptor_t[count]{};
Eric Laurent57dae992011-07-24 13:36:09 -07001848 status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount);
1849 reply->writeInt32(status);
1850 if (status != NO_ERROR && status != NO_MEMORY) {
1851 retCount = 0;
1852 }
1853 reply->writeInt32(retCount);
Eric Laurent74adca92014-11-05 12:15:36 -08001854 if (retCount != 0) {
Eric Laurent57dae992011-07-24 13:36:09 -07001855 if (retCount < count) {
1856 count = retCount;
1857 }
1858 reply->write(descriptors, sizeof(effect_descriptor_t) * count);
1859 }
1860 delete[] descriptors;
1861 return status;
1862 }
1863
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +01001864 case IS_OFFLOAD_SUPPORTED: {
1865 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07001866 audio_offload_info_t info = {};
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +01001867 data.read(&info, sizeof(audio_offload_info_t));
1868 bool isSupported = isOffloadSupported(info);
1869 reply->writeInt32(isSupported);
1870 return NO_ERROR;
1871 }
1872
Michael Chana94fbb22018-04-24 14:31:19 +10001873 case IS_DIRECT_OUTPUT_SUPPORTED: {
1874 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1875 audio_config_base_t config = {};
1876 audio_attributes_t attributes = {};
1877 status_t status = data.read(&config, sizeof(audio_config_base_t));
1878 if (status != NO_ERROR) return status;
1879 status = data.read(&attributes, sizeof(audio_attributes_t));
1880 if (status != NO_ERROR) return status;
1881 reply->writeInt32(isDirectOutputSupported(config, attributes));
1882 return NO_ERROR;
1883 }
1884
Eric Laurent203b1a12014-04-01 10:34:16 -07001885 case LIST_AUDIO_PORTS: {
1886 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1887 audio_port_role_t role = (audio_port_role_t)data.readInt32();
1888 audio_port_type_t type = (audio_port_type_t)data.readInt32();
1889 unsigned int numPortsReq = data.readInt32();
Eric Laurent1d670b12015-02-06 10:44:24 -08001890 if (numPortsReq > MAX_ITEMS_PER_LIST) {
1891 numPortsReq = MAX_ITEMS_PER_LIST;
1892 }
Eric Laurent203b1a12014-04-01 10:34:16 -07001893 unsigned int numPorts = numPortsReq;
Eric Laurent203b1a12014-04-01 10:34:16 -07001894 struct audio_port *ports =
1895 (struct audio_port *)calloc(numPortsReq, sizeof(struct audio_port));
Eric Laurent1d670b12015-02-06 10:44:24 -08001896 if (ports == NULL) {
1897 reply->writeInt32(NO_MEMORY);
1898 reply->writeInt32(0);
1899 return NO_ERROR;
1900 }
1901 unsigned int generation;
Eric Laurent203b1a12014-04-01 10:34:16 -07001902 status_t status = listAudioPorts(role, type, &numPorts, ports, &generation);
1903 reply->writeInt32(status);
1904 reply->writeInt32(numPorts);
Eric Laurent203b1a12014-04-01 10:34:16 -07001905
1906 if (status == NO_ERROR) {
1907 if (numPortsReq > numPorts) {
1908 numPortsReq = numPorts;
1909 }
1910 reply->write(ports, numPortsReq * sizeof(struct audio_port));
1911 reply->writeInt32(generation);
1912 }
1913 free(ports);
1914 return NO_ERROR;
1915 }
1916
1917 case GET_AUDIO_PORT: {
1918 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Wei Jiae995e472015-09-09 09:48:34 -07001919 struct audio_port port = {};
1920 if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) {
1921 ALOGE("b/23912202");
1922 }
Eric Laurent203b1a12014-04-01 10:34:16 -07001923 status_t status = getAudioPort(&port);
1924 reply->writeInt32(status);
1925 if (status == NO_ERROR) {
1926 reply->write(&port, sizeof(struct audio_port));
1927 }
1928 return NO_ERROR;
1929 }
1930
1931 case CREATE_AUDIO_PATCH: {
1932 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07001933 struct audio_patch patch = {};
Eric Laurent203b1a12014-04-01 10:34:16 -07001934 data.read(&patch, sizeof(struct audio_patch));
Glenn Kastena13cde92016-03-28 15:26:02 -07001935 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
Wei Jiae995e472015-09-09 09:48:34 -07001936 if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) {
1937 ALOGE("b/23912202");
1938 }
Eric Laurent203b1a12014-04-01 10:34:16 -07001939 status_t status = createAudioPatch(&patch, &handle);
1940 reply->writeInt32(status);
1941 if (status == NO_ERROR) {
1942 reply->write(&handle, sizeof(audio_patch_handle_t));
1943 }
1944 return NO_ERROR;
1945 }
1946
1947 case RELEASE_AUDIO_PATCH: {
1948 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07001949 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
Eric Laurent203b1a12014-04-01 10:34:16 -07001950 data.read(&handle, sizeof(audio_patch_handle_t));
1951 status_t status = releaseAudioPatch(handle);
1952 reply->writeInt32(status);
1953 return NO_ERROR;
1954 }
1955
1956 case LIST_AUDIO_PATCHES: {
1957 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1958 unsigned int numPatchesReq = data.readInt32();
Eric Laurent1d670b12015-02-06 10:44:24 -08001959 if (numPatchesReq > MAX_ITEMS_PER_LIST) {
1960 numPatchesReq = MAX_ITEMS_PER_LIST;
1961 }
Eric Laurent203b1a12014-04-01 10:34:16 -07001962 unsigned int numPatches = numPatchesReq;
Eric Laurent203b1a12014-04-01 10:34:16 -07001963 struct audio_patch *patches =
1964 (struct audio_patch *)calloc(numPatchesReq,
1965 sizeof(struct audio_patch));
Eric Laurent1d670b12015-02-06 10:44:24 -08001966 if (patches == NULL) {
1967 reply->writeInt32(NO_MEMORY);
1968 reply->writeInt32(0);
1969 return NO_ERROR;
1970 }
1971 unsigned int generation;
Eric Laurent203b1a12014-04-01 10:34:16 -07001972 status_t status = listAudioPatches(&numPatches, patches, &generation);
1973 reply->writeInt32(status);
1974 reply->writeInt32(numPatches);
1975 if (status == NO_ERROR) {
1976 if (numPatchesReq > numPatches) {
1977 numPatchesReq = numPatches;
1978 }
1979 reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
1980 reply->writeInt32(generation);
1981 }
1982 free(patches);
1983 return NO_ERROR;
1984 }
1985
1986 case SET_AUDIO_PORT_CONFIG: {
1987 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07001988 struct audio_port_config config = {};
Eric Laurent203b1a12014-04-01 10:34:16 -07001989 data.read(&config, sizeof(struct audio_port_config));
Andy Hungb0272092018-04-12 11:06:56 -07001990 (void)sanitizeAudioPortConfig(&config);
Eric Laurent203b1a12014-04-01 10:34:16 -07001991 status_t status = setAudioPortConfig(&config);
1992 reply->writeInt32(status);
1993 return NO_ERROR;
1994 }
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001995
Eric Laurentb52c1522014-05-20 11:27:36 -07001996 case REGISTER_CLIENT: {
1997 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1998 sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
1999 data.readStrongBinder());
2000 registerClient(client);
2001 return NO_ERROR;
2002 } break;
Eric Laurent203b1a12014-04-01 10:34:16 -07002003
Eric Laurente8726fe2015-06-26 09:39:24 -07002004 case SET_AUDIO_PORT_CALLBACK_ENABLED: {
2005 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2006 setAudioPortCallbacksEnabled(data.readInt32() == 1);
2007 return NO_ERROR;
2008 } break;
2009
François Gaffiecfe17322018-11-07 13:41:29 +01002010 case SET_AUDIO_VOLUME_GROUP_CALLBACK_ENABLED: {
2011 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2012 setAudioVolumeGroupCallbacksEnabled(data.readInt32() == 1);
2013 return NO_ERROR;
2014 } break;
2015
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07002016 case ACQUIRE_SOUNDTRIGGER_SESSION: {
2017 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2018 sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
2019 data.readStrongBinder());
Glenn Kastena13cde92016-03-28 15:26:02 -07002020 audio_session_t session = AUDIO_SESSION_NONE;
2021 audio_io_handle_t ioHandle = AUDIO_IO_HANDLE_NONE;
2022 audio_devices_t device = AUDIO_DEVICE_NONE;
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07002023 status_t status = acquireSoundTriggerSession(&session, &ioHandle, &device);
2024 reply->writeInt32(status);
2025 if (status == NO_ERROR) {
2026 reply->writeInt32(session);
2027 reply->writeInt32(ioHandle);
2028 reply->writeInt32(device);
2029 }
2030 return NO_ERROR;
2031 } break;
2032
2033 case RELEASE_SOUNDTRIGGER_SESSION: {
2034 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2035 sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
2036 data.readStrongBinder());
2037 audio_session_t session = (audio_session_t)data.readInt32();
2038 status_t status = releaseSoundTriggerSession(session);
2039 reply->writeInt32(status);
2040 return NO_ERROR;
2041 } break;
2042
Eric Laurentbb6c9a02014-09-25 14:11:47 -07002043 case GET_PHONE_STATE: {
2044 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2045 reply->writeInt32((int32_t)getPhoneState());
2046 return NO_ERROR;
2047 } break;
2048
Eric Laurentbaac1832014-12-01 17:52:59 -08002049 case REGISTER_POLICY_MIXES: {
2050 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2051 bool registration = data.readInt32() == 1;
2052 Vector<AudioMix> mixes;
2053 size_t size = (size_t)data.readInt32();
2054 if (size > MAX_MIXES_PER_POLICY) {
2055 size = MAX_MIXES_PER_POLICY;
2056 }
2057 for (size_t i = 0; i < size; i++) {
2058 AudioMix mix;
2059 if (mix.readFromParcel((Parcel*)&data) == NO_ERROR) {
2060 mixes.add(mix);
2061 }
2062 }
2063 status_t status = registerPolicyMixes(mixes, registration);
2064 reply->writeInt32(status);
2065 return NO_ERROR;
2066 } break;
2067
Eric Laurent554a2772015-04-10 11:29:24 -07002068 case START_AUDIO_SOURCE: {
2069 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07002070 struct audio_port_config source = {};
Eric Laurent554a2772015-04-10 11:29:24 -07002071 data.read(&source, sizeof(struct audio_port_config));
Andy Hungb0272092018-04-12 11:06:56 -07002072 (void)sanitizeAudioPortConfig(&source);
2073 audio_attributes_t attributes = {};
Eric Laurent554a2772015-04-10 11:29:24 -07002074 data.read(&attributes, sizeof(audio_attributes_t));
Kevin Rocard39fdbd02017-11-13 11:15:27 -08002075 sanetizeAudioAttributes(&attributes);
Eric Laurent3e6c7e12018-07-27 17:09:23 -07002076 audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
2077 status_t status = startAudioSource(&source, &attributes, &portId);
Eric Laurent554a2772015-04-10 11:29:24 -07002078 reply->writeInt32(status);
Eric Laurent3e6c7e12018-07-27 17:09:23 -07002079 reply->writeInt32(portId);
Eric Laurent554a2772015-04-10 11:29:24 -07002080 return NO_ERROR;
2081 } break;
2082
2083 case STOP_AUDIO_SOURCE: {
2084 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurent3e6c7e12018-07-27 17:09:23 -07002085 audio_port_handle_t portId = (audio_port_handle_t) data.readInt32();
2086 status_t status = stopAudioSource(portId);
Eric Laurent554a2772015-04-10 11:29:24 -07002087 reply->writeInt32(status);
2088 return NO_ERROR;
2089 } break;
2090
Andy Hung2ddee192015-12-18 17:34:44 -08002091 case SET_MASTER_MONO: {
2092 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2093 bool mono = static_cast<bool>(data.readInt32());
2094 status_t status = setMasterMono(mono);
2095 reply->writeInt32(status);
2096 return NO_ERROR;
2097 } break;
2098
2099 case GET_MASTER_MONO: {
2100 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2101 bool mono;
2102 status_t status = getMasterMono(&mono);
2103 reply->writeInt32(status);
2104 if (status == NO_ERROR) {
2105 reply->writeInt32(static_cast<int32_t>(mono));
2106 }
2107 return NO_ERROR;
2108 } break;
2109
Eric Laurentac9cef52017-06-09 15:46:26 -07002110 case GET_STREAM_VOLUME_DB: {
2111 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2112 audio_stream_type_t stream =
2113 static_cast <audio_stream_type_t>(data.readInt32());
2114 int index = static_cast <int>(data.readInt32());
2115 audio_devices_t device =
2116 static_cast <audio_devices_t>(data.readUint32());
2117 reply->writeFloat(getStreamVolumeDB(stream, index, device));
2118 return NO_ERROR;
2119 }
2120
jiabin81772902018-04-02 17:52:27 -07002121 case GET_SURROUND_FORMATS: {
2122 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2123 unsigned int numSurroundFormatsReq = data.readUint32();
2124 if (numSurroundFormatsReq > MAX_ITEMS_PER_LIST) {
2125 numSurroundFormatsReq = MAX_ITEMS_PER_LIST;
2126 }
2127 bool reported = data.readBool();
2128 unsigned int numSurroundFormats = numSurroundFormatsReq;
2129 audio_format_t *surroundFormats = (audio_format_t *)calloc(
2130 numSurroundFormats, sizeof(audio_format_t));
2131 bool *surroundFormatsEnabled = (bool *)calloc(numSurroundFormats, sizeof(bool));
2132 if (numSurroundFormatsReq > 0 &&
2133 (surroundFormats == NULL || surroundFormatsEnabled == NULL)) {
2134 free(surroundFormats);
2135 free(surroundFormatsEnabled);
2136 reply->writeInt32(NO_MEMORY);
2137 return NO_ERROR;
2138 }
2139 status_t status = getSurroundFormats(
2140 &numSurroundFormats, surroundFormats, surroundFormatsEnabled, reported);
2141 reply->writeInt32(status);
2142
2143 if (status == NO_ERROR) {
2144 reply->writeUint32(numSurroundFormats);
2145 if (numSurroundFormatsReq > numSurroundFormats) {
2146 numSurroundFormatsReq = numSurroundFormats;
2147 }
2148 reply->write(surroundFormats, numSurroundFormatsReq * sizeof(audio_format_t));
2149 reply->write(surroundFormatsEnabled, numSurroundFormatsReq * sizeof(bool));
2150 }
2151 free(surroundFormats);
2152 free(surroundFormatsEnabled);
2153 return NO_ERROR;
2154 }
2155
2156 case SET_SURROUND_FORMAT_ENABLED: {
2157 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2158 audio_format_t audioFormat = (audio_format_t) data.readInt32();
2159 bool enabled = data.readBool();
2160 status_t status = setSurroundFormatEnabled(audioFormat, enabled);
2161 reply->writeInt32(status);
2162 return NO_ERROR;
2163 }
2164
Arun Mirpuri11029ad2018-12-19 20:45:19 -08002165 case GET_OFFLOAD_FORMATS_A2DP: {
2166 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2167 std::vector<audio_format_t> encodingFormats;
2168 status_t status = getHwOffloadEncodingFormatsSupportedForA2DP(&encodingFormats);
2169 reply->writeInt32(status);
2170 if (status != NO_ERROR) {
2171 return NO_ERROR;
2172 }
2173 reply->writeUint32(static_cast<uint32_t>(encodingFormats.size()));
2174 for (size_t i = 0; i < encodingFormats.size(); i++)
2175 reply->writeInt32(static_cast<int32_t>(encodingFormats[i]));
2176 return NO_ERROR;
2177 }
2178
2179
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07002180 case ADD_STREAM_DEFAULT_EFFECT: {
2181 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2182 effect_uuid_t type;
2183 status_t status = data.read(&type, sizeof(effect_uuid_t));
2184 if (status != NO_ERROR) {
2185 return status;
2186 }
2187 String16 opPackageName;
2188 status = data.readString16(&opPackageName);
2189 if (status != NO_ERROR) {
2190 return status;
2191 }
2192 effect_uuid_t uuid;
2193 status = data.read(&uuid, sizeof(effect_uuid_t));
2194 if (status != NO_ERROR) {
2195 return status;
2196 }
2197 int32_t priority = data.readInt32();
2198 audio_usage_t usage = (audio_usage_t) data.readInt32();
2199 audio_unique_id_t id = 0;
2200 reply->writeInt32(static_cast <int32_t>(addStreamDefaultEffect(&type,
2201 opPackageName,
2202 &uuid,
2203 priority,
2204 usage,
2205 &id)));
2206 reply->writeInt32(id);
2207 return NO_ERROR;
2208 }
2209
2210 case REMOVE_STREAM_DEFAULT_EFFECT: {
2211 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2212 audio_unique_id_t id = static_cast<audio_unique_id_t>(data.readInt32());
2213 reply->writeInt32(static_cast <int32_t>(removeStreamDefaultEffect(id)));
2214 return NO_ERROR;
2215 }
2216
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07002217 case ADD_SOURCE_DEFAULT_EFFECT: {
2218 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2219 effect_uuid_t type;
2220 status_t status = data.read(&type, sizeof(effect_uuid_t));
2221 if (status != NO_ERROR) {
2222 return status;
2223 }
2224 String16 opPackageName;
2225 status = data.readString16(&opPackageName);
2226 if (status != NO_ERROR) {
2227 return status;
2228 }
2229 effect_uuid_t uuid;
2230 status = data.read(&uuid, sizeof(effect_uuid_t));
2231 if (status != NO_ERROR) {
2232 return status;
2233 }
2234 int32_t priority = data.readInt32();
2235 audio_source_t source = (audio_source_t) data.readInt32();
2236 audio_unique_id_t id = 0;
2237 reply->writeInt32(static_cast <int32_t>(addSourceDefaultEffect(&type,
2238 opPackageName,
2239 &uuid,
2240 priority,
2241 source,
2242 &id)));
2243 reply->writeInt32(id);
2244 return NO_ERROR;
2245 }
2246
2247 case REMOVE_SOURCE_DEFAULT_EFFECT: {
2248 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2249 audio_unique_id_t id = static_cast<audio_unique_id_t>(data.readInt32());
2250 reply->writeInt32(static_cast <int32_t>(removeSourceDefaultEffect(id)));
2251 return NO_ERROR;
2252 }
2253
Eric Laurentb78763e2018-10-17 10:08:02 -07002254 case SET_ASSISTANT_UID: {
2255 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2256 int32_t uid;
2257 status_t status = data.readInt32(&uid);
2258 if (status != NO_ERROR) {
2259 return status;
2260 }
2261 status = setAssistantUid(uid);
2262 reply->writeInt32(static_cast <int32_t>(status));
2263 return NO_ERROR;
2264 }
2265
2266 case SET_A11Y_SERVICES_UIDS: {
2267 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2268 std::vector<uid_t> uids;
2269 int32_t size;
2270 status_t status = data.readInt32(&size);
2271 if (status != NO_ERROR) {
2272 return status;
2273 }
2274 if (size > MAX_ITEMS_PER_LIST) {
2275 size = MAX_ITEMS_PER_LIST;
2276 }
2277 for (int32_t i = 0; i < size; i++) {
2278 int32_t uid;
2279 status = data.readInt32(&uid);
2280 if (status != NO_ERROR) {
2281 return status;
2282 }
2283 uids.push_back(uid);
2284 }
2285 status = setA11yServicesUids(uids);
2286 reply->writeInt32(static_cast <int32_t>(status));
2287 return NO_ERROR;
2288 }
2289
jiabin6012f912018-11-02 17:06:30 -07002290 case IS_HAPTIC_PLAYBACK_SUPPORTED: {
2291 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2292 bool isSupported = isHapticPlaybackSupported();
2293 reply->writeBool(isSupported);
Kevin Rocardb99cc752019-03-21 20:52:24 -07002294 return NO_ERROR;
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002295 }
2296
2297 case SET_UID_DEVICE_AFFINITY: {
2298 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2299 const uid_t uid = (uid_t) data.readInt32();
2300 Vector<AudioDeviceTypeAddr> devices;
2301 size_t size = (size_t)data.readInt32();
2302 for (size_t i = 0; i < size; i++) {
2303 AudioDeviceTypeAddr device;
2304 if (device.readFromParcel((Parcel*)&data) == NO_ERROR) {
2305 devices.add(device);
2306 }
2307 }
2308 status_t status = setUidDeviceAffinities(uid, devices);
2309 reply->writeInt32(status);
2310 return NO_ERROR;
2311 }
2312
2313 case REMOVE_UID_DEVICE_AFFINITY: {
2314 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2315 const uid_t uid = (uid_t) data.readInt32();
2316 status_t status = removeUidDeviceAffinities(uid);
2317 reply->writeInt32(status);
jiabin6012f912018-11-02 17:06:30 -07002318 return NO_ERROR;
2319 }
2320
François Gaffied0ba9ed2018-11-05 11:50:42 +01002321 case LIST_AUDIO_PRODUCT_STRATEGIES: {
2322 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2323 AudioProductStrategyVector strategies;
2324 status_t status = listAudioProductStrategies(strategies);
2325 reply->writeInt32(status);
2326 if (status != NO_ERROR) {
François Gaffie4b2018b2018-11-07 11:18:59 +01002327 return NO_ERROR;
François Gaffied0ba9ed2018-11-05 11:50:42 +01002328 }
2329 size_t size = strategies.size();
2330 size_t sizePosition = reply->dataPosition();
2331 reply->writeInt32(size);
2332 size_t finalSize = size;
2333 for (size_t i = 0; i < size; i++) {
2334 size_t position = reply->dataPosition();
2335 if (strategies[i].writeToParcel(reply) != NO_ERROR) {
2336 reply->setDataPosition(position);
2337 finalSize--;
2338 }
2339 }
2340 if (size != finalSize) {
2341 size_t position = reply->dataPosition();
2342 reply->setDataPosition(sizePosition);
2343 reply->writeInt32(finalSize);
2344 reply->setDataPosition(position);
2345 }
2346 return NO_ERROR;
2347 }
2348
2349 case GET_STRATEGY_FOR_ATTRIBUTES: {
2350 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2351 AudioAttributes attributes;
2352 status_t status = attributes.readFromParcel(&data);
2353 if (status != NO_ERROR) {
2354 return status;
2355 }
François Gaffie4b2018b2018-11-07 11:18:59 +01002356 product_strategy_t strategy;
2357 status = getProductStrategyFromAudioAttributes(attributes, strategy);
2358 reply->writeInt32(status);
2359 if (status != NO_ERROR) {
2360 return NO_ERROR;
2361 }
François Gaffied0ba9ed2018-11-05 11:50:42 +01002362 reply->writeUint32(static_cast<int>(strategy));
2363 return NO_ERROR;
2364 }
2365
François Gaffie4b2018b2018-11-07 11:18:59 +01002366 case LIST_AUDIO_VOLUME_GROUPS: {
2367 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2368 AudioVolumeGroupVector groups;
2369 status_t status = listAudioVolumeGroups(groups);
2370 reply->writeInt32(status);
2371 if (status != NO_ERROR) {
2372 return NO_ERROR;
2373 }
2374 size_t size = groups.size();
2375 size_t sizePosition = reply->dataPosition();
2376 reply->writeInt32(size);
2377 size_t finalSize = size;
2378 for (size_t i = 0; i < size; i++) {
2379 size_t position = reply->dataPosition();
2380 if (groups[i].writeToParcel(reply) != NO_ERROR) {
2381 reply->setDataPosition(position);
2382 finalSize--;
2383 }
2384 }
2385 if (size != finalSize) {
2386 size_t position = reply->dataPosition();
2387 reply->setDataPosition(sizePosition);
2388 reply->writeInt32(finalSize);
2389 reply->setDataPosition(position);
2390 }
2391 return NO_ERROR;
2392 }
2393
2394 case GET_VOLUME_GROUP_FOR_ATTRIBUTES: {
2395 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2396 AudioAttributes attributes;
2397 status_t status = attributes.readFromParcel(&data);
2398 if (status != NO_ERROR) {
2399 return status;
2400 }
2401 volume_group_t group;
2402 status = getVolumeGroupFromAudioAttributes(attributes, group);
2403 reply->writeInt32(status);
2404 if (status != NO_ERROR) {
2405 return NO_ERROR;
2406 }
2407 reply->writeUint32(static_cast<int>(group));
2408 return NO_ERROR;
2409 }
2410
Kevin Rocardb99cc752019-03-21 20:52:24 -07002411 case SET_ALLOWED_CAPTURE_POLICY: {
2412 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2413 uid_t uid = data.readInt32();
2414 audio_flags_mask_t flags = data.readInt32();
2415 status_t status = setAllowedCapturePolicy(uid, flags);
2416 reply->writeInt32(status);
2417 return NO_ERROR;
2418 }
2419
Eric Laurent6ede98f2019-06-11 14:50:30 -07002420 case SET_RTT_ENABLED: {
2421 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2422 bool enabled = static_cast<bool>(data.readInt32());
2423 status_t status = setRttEnabled(enabled);
2424 reply->writeInt32(status);
2425 return NO_ERROR;
2426 }
2427
Jean-Michel Trivi2deb4782019-11-01 11:04:15 -07002428 case SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: {
2429 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2430 product_strategy_t strategy = (product_strategy_t) data.readUint32();
2431 AudioDeviceTypeAddr device;
2432 status_t status = device.readFromParcel((Parcel*)&data);
2433 if (status != NO_ERROR) {
2434 return status;
2435 }
2436 status = setPreferredDeviceForStrategy(strategy, device);
2437 reply->writeInt32(status);
2438 return NO_ERROR;
2439 }
2440
2441 case REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: {
2442 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2443 product_strategy_t strategy = (product_strategy_t) data.readUint32();
2444 status_t status = removePreferredDeviceForStrategy(strategy);
2445 reply->writeInt32(status);
2446 return NO_ERROR;
2447 }
2448
2449 case GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: {
2450 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2451 product_strategy_t strategy = (product_strategy_t) data.readUint32();
2452 AudioDeviceTypeAddr device;
2453 status_t status = getPreferredDeviceForStrategy(strategy, device);
2454 status_t marshall_status = device.writeToParcel(reply);
2455 if (marshall_status != NO_ERROR) {
2456 return marshall_status;
2457 }
2458 reply->writeInt32(status);
2459 return NO_ERROR;
2460 }
2461
Eric Laurentc2f1f072009-07-17 12:17:14 -07002462 default:
2463 return BBinder::onTransact(code, data, reply, flags);
2464 }
2465}
2466
Andy Hungb0272092018-04-12 11:06:56 -07002467/** returns true if string overflow was prevented by zero termination */
2468template <size_t size>
2469static bool preventStringOverflow(char (&s)[size]) {
2470 if (strnlen(s, size) < size) return false;
2471 s[size - 1] = '\0';
2472 return true;
2473}
2474
Kevin Rocard39fdbd02017-11-13 11:15:27 -08002475void BnAudioPolicyService::sanetizeAudioAttributes(audio_attributes_t* attr)
2476{
2477 const size_t tagsMaxSize = AUDIO_ATTRIBUTES_TAGS_MAX_SIZE;
2478 if (strnlen(attr->tags, tagsMaxSize) >= tagsMaxSize) {
2479 android_errorWriteLog(0x534e4554, "68953950"); // SafetyNet logging
2480 }
2481 attr->tags[tagsMaxSize - 1] = '\0';
2482}
2483
Andy Hungb0272092018-04-12 11:06:56 -07002484/** returns BAD_VALUE if sanitization was required. */
2485status_t BnAudioPolicyService::sanitizeEffectDescriptor(effect_descriptor_t* desc)
2486{
2487 if (preventStringOverflow(desc->name)
2488 | /* always */ preventStringOverflow(desc->implementor)) {
2489 android_errorWriteLog(0x534e4554, "73126106"); // SafetyNet logging
2490 return BAD_VALUE;
2491 }
2492 return NO_ERROR;
2493}
2494
2495/** returns BAD_VALUE if sanitization was required. */
2496status_t BnAudioPolicyService::sanitizeAudioPortConfig(struct audio_port_config* config)
2497{
2498 if (config->type == AUDIO_PORT_TYPE_DEVICE &&
2499 preventStringOverflow(config->ext.device.address)) {
2500 return BAD_VALUE;
2501 }
2502 return NO_ERROR;
2503}
2504
Eric Laurentc2f1f072009-07-17 12:17:14 -07002505// ----------------------------------------------------------------------------
2506
Glenn Kasten40bc9062015-03-20 09:09:33 -07002507} // namespace android