blob: 9d3212b0e11c8ec63056a56b6db3392418c6ae08 [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
Ytai Ben-Tsvi1ef846b2020-03-26 09:41:15 -070025#include <android/media/ICaptureStateListener.h>
Eric Laurentb1cc36b2017-12-11 12:14:16 -080026#include <binder/IPCThreadState.h>
Eric Laurentc2f1f072009-07-17 12:17:14 -070027#include <binder/Parcel.h>
Eric Laurent74adca92014-11-05 12:15:36 -080028#include <media/AudioEffect.h>
Eric Laurentc2f1f072009-07-17 12:17:14 -070029#include <media/IAudioPolicyService.h>
Andy Hung4ef19fa2018-05-15 19:35:29 -070030#include <mediautils/ServiceUtilities.h>
Marco Nelissencf90b492019-09-26 11:20:54 -070031#include <mediautils/TimeCheck.h>
Dima Zavin64760242011-05-11 14:15:23 -070032#include <system/audio.h>
Dima Zavinfce7a472011-04-19 22:30:36 -070033
Eric Laurentc2f1f072009-07-17 12:17:14 -070034namespace android {
35
Ytai Ben-Tsvi1ef846b2020-03-26 09:41:15 -070036using media::ICaptureStateListener;
37
Eric Laurentc2f1f072009-07-17 12:17:14 -070038enum {
39 SET_DEVICE_CONNECTION_STATE = IBinder::FIRST_CALL_TRANSACTION,
40 GET_DEVICE_CONNECTION_STATE,
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -080041 HANDLE_DEVICE_CONFIG_CHANGE,
Eric Laurentc2f1f072009-07-17 12:17:14 -070042 SET_PHONE_STATE,
Glenn Kasten0b07b802012-01-18 14:56:06 -080043 SET_RINGER_MODE, // reserved, no longer used
Eric Laurentc2f1f072009-07-17 12:17:14 -070044 SET_FORCE_USE,
45 GET_FORCE_USE,
46 GET_OUTPUT,
47 START_OUTPUT,
48 STOP_OUTPUT,
49 RELEASE_OUTPUT,
Eric Laurentcaf7f482014-11-25 17:50:47 -080050 GET_INPUT_FOR_ATTR,
Eric Laurentc2f1f072009-07-17 12:17:14 -070051 START_INPUT,
52 STOP_INPUT,
53 RELEASE_INPUT,
54 INIT_STREAM_VOLUME,
55 SET_STREAM_VOLUME,
Eric Laurentde070132010-07-13 04:45:46 -070056 GET_STREAM_VOLUME,
François Gaffiecfe17322018-11-07 13:41:29 +010057 SET_VOLUME_ATTRIBUTES,
58 GET_VOLUME_ATTRIBUTES,
59 GET_MIN_VOLUME_FOR_ATTRIBUTES,
60 GET_MAX_VOLUME_FOR_ATTRIBUTES,
Eric Laurentde070132010-07-13 04:45:46 -070061 GET_STRATEGY_FOR_STREAM,
62 GET_OUTPUT_FOR_EFFECT,
63 REGISTER_EFFECT,
Eric Laurenteda6c362011-02-02 09:33:30 -080064 UNREGISTER_EFFECT,
Glenn Kasten6b2718c2011-02-04 13:54:26 -080065 IS_STREAM_ACTIVE,
Jean-Michel Trivid7086032012-10-10 12:11:16 -070066 IS_SOURCE_ACTIVE,
Glenn Kasten6b2718c2011-02-04 13:54:26 -080067 GET_DEVICES_FOR_STREAM,
Eric Laurentdb7c0792011-08-10 10:37:50 -070068 QUERY_DEFAULT_PRE_PROCESSING,
Jean-Michel Trivi272ab542013-02-04 16:26:02 -080069 SET_EFFECT_ENABLED,
Richard Fitzgeraldad3af332013-03-25 16:54:37 +000070 IS_STREAM_ACTIVE_REMOTELY,
Eric Laurent203b1a12014-04-01 10:34:16 -070071 IS_OFFLOAD_SUPPORTED,
Michael Chana94fbb22018-04-24 14:31:19 +100072 IS_DIRECT_OUTPUT_SUPPORTED,
Eric Laurent203b1a12014-04-01 10:34:16 -070073 LIST_AUDIO_PORTS,
74 GET_AUDIO_PORT,
75 CREATE_AUDIO_PATCH,
76 RELEASE_AUDIO_PATCH,
77 LIST_AUDIO_PATCHES,
Eric Laurentb52c1522014-05-20 11:27:36 -070078 SET_AUDIO_PORT_CONFIG,
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -070079 REGISTER_CLIENT,
Eric Laurentdf3dc7e2014-07-27 18:39:40 -070080 GET_OUTPUT_FOR_ATTR,
81 ACQUIRE_SOUNDTRIGGER_SESSION,
Eric Laurentbb6c9a02014-09-25 14:11:47 -070082 RELEASE_SOUNDTRIGGER_SESSION,
Eric Laurentbaac1832014-12-01 17:52:59 -080083 GET_PHONE_STATE,
84 REGISTER_POLICY_MIXES,
Eric Laurent554a2772015-04-10 11:29:24 -070085 START_AUDIO_SOURCE,
Eric Laurente8726fe2015-06-26 09:39:24 -070086 STOP_AUDIO_SOURCE,
87 SET_AUDIO_PORT_CALLBACK_ENABLED,
François Gaffiecfe17322018-11-07 13:41:29 +010088 SET_AUDIO_VOLUME_GROUP_CALLBACK_ENABLED,
Andy Hung2ddee192015-12-18 17:34:44 -080089 SET_MASTER_MONO,
90 GET_MASTER_MONO,
jiabin81772902018-04-02 17:52:27 -070091 GET_STREAM_VOLUME_DB,
92 GET_SURROUND_FORMATS,
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -070093 SET_SURROUND_FORMAT_ENABLED,
94 ADD_STREAM_DEFAULT_EFFECT,
Ari Hausman-Cohen24628312018-08-13 15:01:09 -070095 REMOVE_STREAM_DEFAULT_EFFECT,
96 ADD_SOURCE_DEFAULT_EFFECT,
Eric Laurentb78763e2018-10-17 10:08:02 -070097 REMOVE_SOURCE_DEFAULT_EFFECT,
98 SET_ASSISTANT_UID,
99 SET_A11Y_SERVICES_UIDS,
jiabin6012f912018-11-02 17:06:30 -0700100 IS_HAPTIC_PLAYBACK_SUPPORTED,
Jean-Michel Trivibda70da2018-12-19 07:30:15 -0800101 SET_UID_DEVICE_AFFINITY,
102 REMOVE_UID_DEVICE_AFFINITY,
Oscar Azucena90e77632019-11-27 17:12:28 -0800103 SET_USERID_DEVICE_AFFINITY,
104 REMOVE_USERID_DEVICE_AFFINITY,
François Gaffied0ba9ed2018-11-05 11:50:42 +0100105 GET_OFFLOAD_FORMATS_A2DP,
106 LIST_AUDIO_PRODUCT_STRATEGIES,
107 GET_STRATEGY_FOR_ATTRIBUTES,
François Gaffie4b2018b2018-11-07 11:18:59 +0100108 LIST_AUDIO_VOLUME_GROUPS,
Kevin Rocardb99cc752019-03-21 20:52:24 -0700109 GET_VOLUME_GROUP_FOR_ATTRIBUTES,
Hayden Gomes524159d2019-12-23 14:41:47 -0800110 SET_SUPPORTED_SYSTEM_USAGES,
Kevin Rocardb99cc752019-03-21 20:52:24 -0700111 SET_ALLOWED_CAPTURE_POLICY,
Eric Laurent6c796322019-04-09 14:13:17 -0700112 MOVE_EFFECTS_TO_IO,
Eric Laurent8340e672019-11-06 11:01:08 -0800113 SET_RTT_ENABLED,
Jean-Michel Trivi30857152019-11-01 11:04:15 -0700114 IS_CALL_SCREEN_MODE_SUPPORTED,
jiabin0a488932020-08-07 17:32:40 -0700115 SET_DEVICES_ROLE_FOR_PRODUCT_STRATEGY,
116 REMOVE_DEVICES_ROLE_FOR_PRODUCT_STRATEGY,
117 GET_DEVICES_FOR_ROLE_AND_PRODUCT_STRATEGY,
Jean-Michel Trivif41599b2020-01-07 14:22:08 -0800118 GET_DEVICES_FOR_ATTRIBUTES,
Mikhail Naganov88b30d22020-03-09 19:43:13 +0000119 AUDIO_MODULES_UPDATED, // oneway
Kohsuke Yatoha623a132020-03-24 20:10:26 -0700120 SET_CURRENT_IME_UID,
Ytai Ben-Tsvi1ef846b2020-03-26 09:41:15 -0700121 REGISTER_SOUNDTRIGGER_CAPTURE_STATE_LISTENER,
Jiabin Huang3b98d322020-09-03 17:54:16 +0000122 SET_DEVICES_ROLE_FOR_CAPTURE_PRESET,
123 ADD_DEVICES_ROLE_FOR_CAPTURE_PRESET,
124 REMOVE_DEVICES_ROLE_FOR_CAPTURE_PRESET,
125 CLEAR_DEVICES_ROLE_FOR_CAPTURE_PRESET,
126 GET_DEVICES_FOR_ROLE_AND_CAPTURE_PRESET,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700127};
128
Eric Laurent1d670b12015-02-06 10:44:24 -0800129#define MAX_ITEMS_PER_LIST 1024
130
Eric Laurentc2f1f072009-07-17 12:17:14 -0700131class BpAudioPolicyService : public BpInterface<IAudioPolicyService>
132{
133public:
Chih-Hung Hsieh090ef602016-04-27 10:39:54 -0700134 explicit BpAudioPolicyService(const sp<IBinder>& impl)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700135 : BpInterface<IAudioPolicyService>(impl)
136 {
137 }
138
139 virtual status_t setDeviceConnectionState(
Dima Zavinfce7a472011-04-19 22:30:36 -0700140 audio_devices_t device,
141 audio_policy_dev_state_t state,
Paul McLeane743a472015-01-28 11:07:31 -0800142 const char *device_address,
Aniket Kumar Lata4e464702019-01-10 23:38:46 -0800143 const char *device_name,
144 audio_format_t encodedFormat)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700145 {
146 Parcel data, reply;
147 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
148 data.writeInt32(static_cast <uint32_t>(device));
149 data.writeInt32(static_cast <uint32_t>(state));
150 data.writeCString(device_address);
Paul McLeane743a472015-01-28 11:07:31 -0800151 data.writeCString(device_name);
Aniket Kumar Lata4e464702019-01-10 23:38:46 -0800152 data.writeInt32(static_cast <uint32_t>(encodedFormat));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700153 remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply);
154 return static_cast <status_t> (reply.readInt32());
155 }
156
Dima Zavinfce7a472011-04-19 22:30:36 -0700157 virtual audio_policy_dev_state_t getDeviceConnectionState(
158 audio_devices_t device,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700159 const char *device_address)
160 {
161 Parcel data, reply;
162 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
163 data.writeInt32(static_cast <uint32_t>(device));
164 data.writeCString(device_address);
165 remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700166 return static_cast <audio_policy_dev_state_t>(reply.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700167 }
168
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800169 virtual status_t handleDeviceConfigChange(audio_devices_t device,
170 const char *device_address,
Aniket Kumar Lata4e464702019-01-10 23:38:46 -0800171 const char *device_name,
172 audio_format_t encodedFormat)
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800173 {
174 Parcel data, reply;
175 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
176 data.writeInt32(static_cast <uint32_t>(device));
177 data.writeCString(device_address);
178 data.writeCString(device_name);
Aniket Kumar Lata4e464702019-01-10 23:38:46 -0800179 data.writeInt32(static_cast <uint32_t>(encodedFormat));
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800180 remote()->transact(HANDLE_DEVICE_CONFIG_CHANGE, data, &reply);
181 return static_cast <status_t> (reply.readInt32());
182 }
183
Eric Laurent00dba062020-02-11 15:52:09 -0800184 virtual status_t setPhoneState(audio_mode_t state, uid_t uid)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700185 {
186 Parcel data, reply;
187 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
188 data.writeInt32(state);
Eric Laurent00dba062020-02-11 15:52:09 -0800189 data.writeInt32(uid);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700190 remote()->transact(SET_PHONE_STATE, data, &reply);
191 return static_cast <status_t> (reply.readInt32());
192 }
193
Dima Zavinfce7a472011-04-19 22:30:36 -0700194 virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700195 {
196 Parcel data, reply;
197 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
198 data.writeInt32(static_cast <uint32_t>(usage));
199 data.writeInt32(static_cast <uint32_t>(config));
200 remote()->transact(SET_FORCE_USE, data, &reply);
201 return static_cast <status_t> (reply.readInt32());
202 }
203
Dima Zavinfce7a472011-04-19 22:30:36 -0700204 virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700205 {
206 Parcel data, reply;
207 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
208 data.writeInt32(static_cast <uint32_t>(usage));
209 remote()->transact(GET_FORCE_USE, data, &reply);
Dima Zavinfce7a472011-04-19 22:30:36 -0700210 return static_cast <audio_policy_forced_cfg_t> (reply.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700211 }
212
Eric Laurentf4e63452017-11-06 19:31:46 +0000213 virtual audio_io_handle_t getOutput(audio_stream_type_t stream)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700214 {
215 Parcel data, reply;
216 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
217 data.writeInt32(static_cast <uint32_t>(stream));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700218 remote()->transact(GET_OUTPUT, data, &reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700219 return static_cast <audio_io_handle_t> (reply.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700220 }
221
Eric Laurent42984412019-05-09 17:57:03 -0700222 status_t getOutputForAttr(audio_attributes_t *attr,
Kevin Rocard153f92d2018-12-18 18:33:28 -0800223 audio_io_handle_t *output,
224 audio_session_t session,
225 audio_stream_type_t *stream,
226 pid_t pid,
227 uid_t uid,
228 const audio_config_t *config,
229 audio_output_flags_t flags,
230 audio_port_handle_t *selectedDeviceId,
231 audio_port_handle_t *portId,
232 std::vector<audio_io_handle_t> *secondaryOutputs) override
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700233 {
234 Parcel data, reply;
235 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurent42984412019-05-09 17:57:03 -0700236 if (attr == nullptr) {
237 ALOGE("%s NULL audio attributes", __func__);
Eric Laurente83b55d2014-11-14 10:06:21 -0800238 return BAD_VALUE;
239 }
Eric Laurent42984412019-05-09 17:57:03 -0700240 if (output == nullptr) {
241 ALOGE("%s NULL output - shouldn't happen", __func__);
Eric Laurent9ae8c592017-06-22 17:17:09 -0700242 return BAD_VALUE;
243 }
Eric Laurent42984412019-05-09 17:57:03 -0700244 if (selectedDeviceId == nullptr) {
245 ALOGE("%s NULL selectedDeviceId - shouldn't happen", __func__);
Eric Laurent20b9ef02016-12-05 11:03:16 -0800246 return BAD_VALUE;
247 }
Eric Laurent42984412019-05-09 17:57:03 -0700248 if (portId == nullptr) {
249 ALOGE("%s NULL portId - shouldn't happen", __func__);
Kevin Rocard153f92d2018-12-18 18:33:28 -0800250 return BAD_VALUE;
251 }
Eric Laurent42984412019-05-09 17:57:03 -0700252 if (secondaryOutputs == nullptr) {
253 ALOGE("%s NULL secondaryOutputs - shouldn't happen", __func__);
254 return BAD_VALUE;
Eric Laurente83b55d2014-11-14 10:06:21 -0800255 }
Eric Laurent42984412019-05-09 17:57:03 -0700256 data.write(attr, sizeof(audio_attributes_t));
Eric Laurente83b55d2014-11-14 10:06:21 -0800257 data.writeInt32(session);
258 if (stream == NULL) {
259 data.writeInt32(0);
260 } else {
261 data.writeInt32(1);
262 data.writeInt32(*stream);
263 }
Nadav Bar766fb022018-01-07 12:18:03 +0200264 data.writeInt32(pid);
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700265 data.writeInt32(uid);
Eric Laurent20b9ef02016-12-05 11:03:16 -0800266 data.write(config, sizeof(audio_config_t));
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700267 data.writeInt32(static_cast <uint32_t>(flags));
Eric Laurent9ae8c592017-06-22 17:17:09 -0700268 data.writeInt32(*selectedDeviceId);
Eric Laurent20b9ef02016-12-05 11:03:16 -0800269 data.writeInt32(*portId);
Eric Laurente83b55d2014-11-14 10:06:21 -0800270 status_t status = remote()->transact(GET_OUTPUT_FOR_ATTR, data, &reply);
271 if (status != NO_ERROR) {
272 return status;
273 }
274 status = (status_t)reply.readInt32();
275 if (status != NO_ERROR) {
276 return status;
277 }
Eric Laurent42984412019-05-09 17:57:03 -0700278 status = (status_t)reply.read(&attr, sizeof(audio_attributes_t));
279 if (status != NO_ERROR) {
280 return status;
281 }
Eric Laurente83b55d2014-11-14 10:06:21 -0800282 *output = (audio_io_handle_t)reply.readInt32();
Eric Laurent20b9ef02016-12-05 11:03:16 -0800283 audio_stream_type_t lStream = (audio_stream_type_t)reply.readInt32();
Eric Laurente83b55d2014-11-14 10:06:21 -0800284 if (stream != NULL) {
Eric Laurent20b9ef02016-12-05 11:03:16 -0800285 *stream = lStream;
Eric Laurente83b55d2014-11-14 10:06:21 -0800286 }
Eric Laurent9ae8c592017-06-22 17:17:09 -0700287 *selectedDeviceId = (audio_port_handle_t)reply.readInt32();
Eric Laurent20b9ef02016-12-05 11:03:16 -0800288 *portId = (audio_port_handle_t)reply.readInt32();
Kevin Rocard153f92d2018-12-18 18:33:28 -0800289 secondaryOutputs->resize(reply.readInt32());
290 return reply.read(secondaryOutputs->data(),
291 secondaryOutputs->size() * sizeof(audio_io_handle_t));
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700292 }
293
Eric Laurentd7fe0862018-07-14 16:48:01 -0700294 virtual status_t startOutput(audio_port_handle_t portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700295 {
296 Parcel data, reply;
297 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentd7fe0862018-07-14 16:48:01 -0700298 data.writeInt32((int32_t)portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700299 remote()->transact(START_OUTPUT, data, &reply);
300 return static_cast <status_t> (reply.readInt32());
301 }
302
Eric Laurentd7fe0862018-07-14 16:48:01 -0700303 virtual status_t stopOutput(audio_port_handle_t portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700304 {
305 Parcel data, reply;
306 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentd7fe0862018-07-14 16:48:01 -0700307 data.writeInt32((int32_t)portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700308 remote()->transact(STOP_OUTPUT, data, &reply);
309 return static_cast <status_t> (reply.readInt32());
310 }
311
Eric Laurentd7fe0862018-07-14 16:48:01 -0700312 virtual void releaseOutput(audio_port_handle_t portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700313 {
314 Parcel data, reply;
315 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentd7fe0862018-07-14 16:48:01 -0700316 data.writeInt32((int32_t)portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700317 remote()->transact(RELEASE_OUTPUT, data, &reply);
318 }
319
Eric Laurentcaf7f482014-11-25 17:50:47 -0800320 virtual status_t getInputForAttr(const audio_attributes_t *attr,
321 audio_io_handle_t *input,
Mikhail Naganov2996f672019-04-18 12:29:59 -0700322 audio_unique_id_t riid,
Eric Laurentcaf7f482014-11-25 17:50:47 -0800323 audio_session_t session,
Eric Laurentb2379ba2016-05-23 17:42:12 -0700324 pid_t pid,
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700325 uid_t uid,
Eric Laurentfee19762018-01-29 18:44:13 -0800326 const String16& opPackageName,
Eric Laurent20b9ef02016-12-05 11:03:16 -0800327 const audio_config_base_t *config,
Paul McLean466dc8e2015-04-17 13:15:36 -0600328 audio_input_flags_t flags,
Eric Laurent9ae8c592017-06-22 17:17:09 -0700329 audio_port_handle_t *selectedDeviceId,
Eric Laurent20b9ef02016-12-05 11:03:16 -0800330 audio_port_handle_t *portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700331 {
332 Parcel data, reply;
333 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentcaf7f482014-11-25 17:50:47 -0800334 if (attr == NULL) {
335 ALOGE("getInputForAttr NULL attr - shouldn't happen");
336 return BAD_VALUE;
337 }
338 if (input == NULL) {
339 ALOGE("getInputForAttr NULL input - shouldn't happen");
340 return BAD_VALUE;
341 }
Eric Laurent9ae8c592017-06-22 17:17:09 -0700342 if (selectedDeviceId == NULL) {
343 ALOGE("getInputForAttr NULL selectedDeviceId - shouldn't happen");
344 return BAD_VALUE;
345 }
Eric Laurent20b9ef02016-12-05 11:03:16 -0800346 if (portId == NULL) {
347 ALOGE("getInputForAttr NULL portId - shouldn't happen");
348 return BAD_VALUE;
349 }
Hayden Gomes524159d2019-12-23 14:41:47 -0800350
Eric Laurentcaf7f482014-11-25 17:50:47 -0800351 data.write(attr, sizeof(audio_attributes_t));
Eric Laurenta54f1282017-07-01 19:39:32 -0700352 data.writeInt32(*input);
Mikhail Naganov2996f672019-04-18 12:29:59 -0700353 data.writeInt32(riid);
Eric Laurentcaf7f482014-11-25 17:50:47 -0800354 data.writeInt32(session);
Eric Laurentb2379ba2016-05-23 17:42:12 -0700355 data.writeInt32(pid);
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700356 data.writeInt32(uid);
Eric Laurentfee19762018-01-29 18:44:13 -0800357 data.writeString16(opPackageName);
Eric Laurent20b9ef02016-12-05 11:03:16 -0800358 data.write(config, sizeof(audio_config_base_t));
Glenn Kastenb3b16602014-07-16 08:36:31 -0700359 data.writeInt32(flags);
Eric Laurent9ae8c592017-06-22 17:17:09 -0700360 data.writeInt32(*selectedDeviceId);
Eric Laurent20b9ef02016-12-05 11:03:16 -0800361 data.writeInt32(*portId);
Eric Laurentcaf7f482014-11-25 17:50:47 -0800362 status_t status = remote()->transact(GET_INPUT_FOR_ATTR, data, &reply);
363 if (status != NO_ERROR) {
364 return status;
365 }
366 status = reply.readInt32();
367 if (status != NO_ERROR) {
368 return status;
369 }
370 *input = (audio_io_handle_t)reply.readInt32();
Eric Laurent9ae8c592017-06-22 17:17:09 -0700371 *selectedDeviceId = (audio_port_handle_t)reply.readInt32();
Eric Laurent20b9ef02016-12-05 11:03:16 -0800372 *portId = (audio_port_handle_t)reply.readInt32();
Eric Laurentcaf7f482014-11-25 17:50:47 -0800373 return NO_ERROR;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700374 }
375
Eric Laurent4eb58f12018-12-07 16:41:02 -0800376 virtual status_t startInput(audio_port_handle_t portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700377 {
378 Parcel data, reply;
379 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfee19762018-01-29 18:44:13 -0800380 data.writeInt32(portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700381 remote()->transact(START_INPUT, data, &reply);
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800382 status_t status = static_cast <status_t> (reply.readInt32());
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800383 return status;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700384 }
385
Eric Laurentfee19762018-01-29 18:44:13 -0800386 virtual status_t stopInput(audio_port_handle_t portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700387 {
388 Parcel data, reply;
389 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfee19762018-01-29 18:44:13 -0800390 data.writeInt32(portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700391 remote()->transact(STOP_INPUT, data, &reply);
392 return static_cast <status_t> (reply.readInt32());
393 }
394
Eric Laurentfee19762018-01-29 18:44:13 -0800395 virtual void releaseInput(audio_port_handle_t portId)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700396 {
397 Parcel data, reply;
398 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfee19762018-01-29 18:44:13 -0800399 data.writeInt32(portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700400 remote()->transact(RELEASE_INPUT, data, &reply);
401 }
402
Dima Zavinfce7a472011-04-19 22:30:36 -0700403 virtual status_t initStreamVolume(audio_stream_type_t stream,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700404 int indexMin,
405 int indexMax)
406 {
407 Parcel data, reply;
408 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
409 data.writeInt32(static_cast <uint32_t>(stream));
410 data.writeInt32(indexMin);
411 data.writeInt32(indexMax);
412 remote()->transact(INIT_STREAM_VOLUME, data, &reply);
413 return static_cast <status_t> (reply.readInt32());
414 }
415
Eric Laurent83844cc2011-11-18 16:43:31 -0800416 virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
417 int index,
418 audio_devices_t device)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700419 {
420 Parcel data, reply;
421 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
422 data.writeInt32(static_cast <uint32_t>(stream));
423 data.writeInt32(index);
Eric Laurent83844cc2011-11-18 16:43:31 -0800424 data.writeInt32(static_cast <uint32_t>(device));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700425 remote()->transact(SET_STREAM_VOLUME, data, &reply);
426 return static_cast <status_t> (reply.readInt32());
427 }
428
Eric Laurent83844cc2011-11-18 16:43:31 -0800429 virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
430 int *index,
431 audio_devices_t device)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700432 {
433 Parcel data, reply;
434 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
435 data.writeInt32(static_cast <uint32_t>(stream));
Eric Laurent83844cc2011-11-18 16:43:31 -0800436 data.writeInt32(static_cast <uint32_t>(device));
437
Eric Laurentc2f1f072009-07-17 12:17:14 -0700438 remote()->transact(GET_STREAM_VOLUME, data, &reply);
439 int lIndex = reply.readInt32();
440 if (index) *index = lIndex;
441 return static_cast <status_t> (reply.readInt32());
442 }
Eric Laurentde070132010-07-13 04:45:46 -0700443
François Gaffiecfe17322018-11-07 13:41:29 +0100444 virtual status_t setVolumeIndexForAttributes(const audio_attributes_t &attr, int index,
445 audio_devices_t device)
446 {
447 Parcel data, reply;
448 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
449 data.write(&attr, sizeof(audio_attributes_t));
450 data.writeInt32(index);
451 data.writeInt32(static_cast <uint32_t>(device));
452 status_t status = remote()->transact(SET_VOLUME_ATTRIBUTES, data, &reply);
453 if (status != NO_ERROR) {
454 return status;
455 }
456 return static_cast <status_t> (reply.readInt32());
457 }
458 virtual status_t getVolumeIndexForAttributes(const audio_attributes_t &attr, int &index,
459 audio_devices_t device)
460 {
461 Parcel data, reply;
462 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
463 data.write(&attr, sizeof(audio_attributes_t));
464 data.writeInt32(static_cast <uint32_t>(device));
465 status_t status = remote()->transact(GET_VOLUME_ATTRIBUTES, data, &reply);
466 if (status != NO_ERROR) {
467 return status;
468 }
469 status = static_cast <status_t> (reply.readInt32());
470 if (status != NO_ERROR) {
471 return status;
472 }
473 index = reply.readInt32();
474 return NO_ERROR;
475 }
476 virtual status_t getMinVolumeIndexForAttributes(const audio_attributes_t &attr, int &index)
477 {
478 Parcel data, reply;
479 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
480 data.write(&attr, sizeof(audio_attributes_t));
481 status_t status = remote()->transact(GET_MIN_VOLUME_FOR_ATTRIBUTES, data, &reply);
482 if (status != NO_ERROR) {
483 return status;
484 }
485 status = static_cast <status_t> (reply.readInt32());
486 if (status != NO_ERROR) {
487 return status;
488 }
489 index = reply.readInt32();
490 return NO_ERROR;
491 }
492 virtual status_t getMaxVolumeIndexForAttributes(const audio_attributes_t &attr, int &index)
493 {
494 Parcel data, reply;
495 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
496 data.write(&attr, sizeof(audio_attributes_t));
497 status_t status = remote()->transact(GET_MAX_VOLUME_FOR_ATTRIBUTES, data, &reply);
498 if (status != NO_ERROR) {
499 return status;
500 }
501 status = static_cast <status_t> (reply.readInt32());
502 if (status != NO_ERROR) {
503 return status;
504 }
505 index = reply.readInt32();
506 return NO_ERROR;
507 }
Dima Zavinfce7a472011-04-19 22:30:36 -0700508 virtual uint32_t getStrategyForStream(audio_stream_type_t stream)
Eric Laurentde070132010-07-13 04:45:46 -0700509 {
510 Parcel data, reply;
511 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
512 data.writeInt32(static_cast <uint32_t>(stream));
513 remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply);
François Gaffiec005e562018-11-06 15:04:49 +0100514 return reply.readUint32();
Eric Laurentde070132010-07-13 04:45:46 -0700515 }
516
Eric Laurent63742522012-03-08 13:42:42 -0800517 virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream)
Glenn Kasten6b2718c2011-02-04 13:54:26 -0800518 {
519 Parcel data, reply;
520 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
521 data.writeInt32(static_cast <uint32_t>(stream));
522 remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply);
Eric Laurent63742522012-03-08 13:42:42 -0800523 return (audio_devices_t) reply.readInt32();
Glenn Kasten6b2718c2011-02-04 13:54:26 -0800524 }
525
Glenn Kasten58e5aa32012-06-20 14:08:14 -0700526 virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc)
Eric Laurentde070132010-07-13 04:45:46 -0700527 {
528 Parcel data, reply;
529 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
530 data.write(desc, sizeof(effect_descriptor_t));
531 remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply);
532 return static_cast <audio_io_handle_t> (reply.readInt32());
533 }
534
Glenn Kasten58e5aa32012-06-20 14:08:14 -0700535 virtual status_t registerEffect(const effect_descriptor_t *desc,
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700536 audio_io_handle_t io,
Eric Laurentde070132010-07-13 04:45:46 -0700537 uint32_t strategy,
Glenn Kastend848eb42016-03-08 13:42:11 -0800538 audio_session_t session,
Eric Laurentde070132010-07-13 04:45:46 -0700539 int id)
540 {
541 Parcel data, reply;
542 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
543 data.write(desc, sizeof(effect_descriptor_t));
Eric Laurent7c7f10b2011-06-17 21:29:58 -0700544 data.writeInt32(io);
Eric Laurentde070132010-07-13 04:45:46 -0700545 data.writeInt32(strategy);
546 data.writeInt32(session);
547 data.writeInt32(id);
548 remote()->transact(REGISTER_EFFECT, data, &reply);
549 return static_cast <status_t> (reply.readInt32());
550 }
551
552 virtual status_t unregisterEffect(int id)
553 {
554 Parcel data, reply;
555 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
556 data.writeInt32(id);
557 remote()->transact(UNREGISTER_EFFECT, data, &reply);
558 return static_cast <status_t> (reply.readInt32());
559 }
560
Eric Laurentdb7c0792011-08-10 10:37:50 -0700561 virtual status_t setEffectEnabled(int id, bool enabled)
562 {
563 Parcel data, reply;
564 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
565 data.writeInt32(id);
566 data.writeInt32(enabled);
567 remote()->transact(SET_EFFECT_ENABLED, data, &reply);
568 return static_cast <status_t> (reply.readInt32());
569 }
570
Eric Laurent6c796322019-04-09 14:13:17 -0700571 status_t moveEffectsToIo(const std::vector<int>& ids, audio_io_handle_t io) override
572 {
573 Parcel data, reply;
574 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
575 data.writeInt32(ids.size());
576 for (auto id : ids) {
577 data.writeInt32(id);
578 }
579 data.writeInt32(io);
580 status_t status = remote()->transact(MOVE_EFFECTS_TO_IO, data, &reply);
581 if (status != NO_ERROR) {
582 return status;
583 }
584 return static_cast <status_t> (reply.readInt32());
585 }
586
Glenn Kastenfff6d712012-01-12 16:38:12 -0800587 virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
Eric Laurenteda6c362011-02-02 09:33:30 -0800588 {
589 Parcel data, reply;
590 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800591 data.writeInt32((int32_t) stream);
Eric Laurenteda6c362011-02-02 09:33:30 -0800592 data.writeInt32(inPastMs);
593 remote()->transact(IS_STREAM_ACTIVE, data, &reply);
594 return reply.readInt32();
595 }
Eric Laurent57dae992011-07-24 13:36:09 -0700596
Jean-Michel Trivi272ab542013-02-04 16:26:02 -0800597 virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
598 {
599 Parcel data, reply;
600 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
601 data.writeInt32((int32_t) stream);
602 data.writeInt32(inPastMs);
603 remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply);
604 return reply.readInt32();
605 }
606
Jean-Michel Trivid7086032012-10-10 12:11:16 -0700607 virtual bool isSourceActive(audio_source_t source) const
608 {
609 Parcel data, reply;
610 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
611 data.writeInt32((int32_t) source);
612 remote()->transact(IS_SOURCE_ACTIVE, data, &reply);
613 return reply.readInt32();
614 }
615
Glenn Kastend848eb42016-03-08 13:42:11 -0800616 virtual status_t queryDefaultPreProcessing(audio_session_t audioSession,
Eric Laurent57dae992011-07-24 13:36:09 -0700617 effect_descriptor_t *descriptors,
618 uint32_t *count)
619 {
620 if (descriptors == NULL || count == NULL) {
621 return BAD_VALUE;
622 }
623 Parcel data, reply;
624 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
625 data.writeInt32(audioSession);
626 data.writeInt32(*count);
627 status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply);
628 if (status != NO_ERROR) {
629 return status;
630 }
631 status = static_cast <status_t> (reply.readInt32());
632 uint32_t retCount = reply.readInt32();
633 if (retCount != 0) {
634 uint32_t numDesc = (retCount < *count) ? retCount : *count;
635 reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc);
636 }
637 *count = retCount;
638 return status;
639 }
Richard Fitzgeraldad3af332013-03-25 16:54:37 +0000640
Hayden Gomes524159d2019-12-23 14:41:47 -0800641 status_t setSupportedSystemUsages(const std::vector<audio_usage_t>& systemUsages) {
642 Parcel data, reply;
643 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
644 data.writeInt32(systemUsages.size());
645 for (auto systemUsage : systemUsages) {
646 data.writeInt32(systemUsage);
647 }
648 status_t status = remote()->transact(SET_SUPPORTED_SYSTEM_USAGES, data, &reply);
649 if (status != NO_ERROR) {
650 return status;
651 }
652 return static_cast <status_t> (reply.readInt32());
653 }
654
Kevin Rocardb99cc752019-03-21 20:52:24 -0700655 status_t setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t flags) override {
656 Parcel data, reply;
657 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
658 data.writeInt32(uid);
659 data.writeInt32(flags);
660 remote()->transact(SET_ALLOWED_CAPTURE_POLICY, data, &reply);
661 return reply.readInt32();
662 }
663
Richard Fitzgeraldad3af332013-03-25 16:54:37 +0000664 virtual bool isOffloadSupported(const audio_offload_info_t& info)
665 {
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +0100666 Parcel data, reply;
667 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
668 data.write(&info, sizeof(audio_offload_info_t));
669 remote()->transact(IS_OFFLOAD_SUPPORTED, data, &reply);
Eric Laurent203b1a12014-04-01 10:34:16 -0700670 return reply.readInt32();
671 }
672
Michael Chana94fbb22018-04-24 14:31:19 +1000673 virtual bool isDirectOutputSupported(const audio_config_base_t& config,
674 const audio_attributes_t& attributes) {
675 Parcel data, reply;
676 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
677 data.write(&config, sizeof(audio_config_base_t));
678 data.write(&attributes, sizeof(audio_attributes_t));
679 status_t status = remote()->transact(IS_DIRECT_OUTPUT_SUPPORTED, data, &reply);
680 return status == NO_ERROR ? static_cast<bool>(reply.readInt32()) : false;
681 }
682
Eric Laurent203b1a12014-04-01 10:34:16 -0700683 virtual status_t listAudioPorts(audio_port_role_t role,
684 audio_port_type_t type,
685 unsigned int *num_ports,
686 struct audio_port *ports,
687 unsigned int *generation)
688 {
689 if (num_ports == NULL || (*num_ports != 0 && ports == NULL) ||
690 generation == NULL) {
691 return BAD_VALUE;
692 }
693 Parcel data, reply;
694 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
695 unsigned int numPortsReq = (ports == NULL) ? 0 : *num_ports;
696 data.writeInt32(role);
697 data.writeInt32(type);
698 data.writeInt32(numPortsReq);
699 status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply);
700 if (status == NO_ERROR) {
701 status = (status_t)reply.readInt32();
702 *num_ports = (unsigned int)reply.readInt32();
703 }
Eric Laurent203b1a12014-04-01 10:34:16 -0700704 if (status == NO_ERROR) {
705 if (numPortsReq > *num_ports) {
706 numPortsReq = *num_ports;
707 }
708 if (numPortsReq > 0) {
709 reply.read(ports, numPortsReq * sizeof(struct audio_port));
710 }
711 *generation = reply.readInt32();
712 }
713 return status;
714 }
715
716 virtual status_t getAudioPort(struct audio_port *port)
717 {
718 if (port == NULL) {
719 return BAD_VALUE;
720 }
721 Parcel data, reply;
722 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
723 data.write(port, sizeof(struct audio_port));
724 status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply);
725 if (status != NO_ERROR ||
726 (status = (status_t)reply.readInt32()) != NO_ERROR) {
727 return status;
728 }
729 reply.read(port, sizeof(struct audio_port));
730 return status;
731 }
732
733 virtual status_t createAudioPatch(const struct audio_patch *patch,
734 audio_patch_handle_t *handle)
735 {
736 if (patch == NULL || handle == NULL) {
737 return BAD_VALUE;
738 }
739 Parcel data, reply;
740 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
741 data.write(patch, sizeof(struct audio_patch));
742 data.write(handle, sizeof(audio_patch_handle_t));
743 status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply);
744 if (status != NO_ERROR ||
745 (status = (status_t)reply.readInt32()) != NO_ERROR) {
746 return status;
747 }
748 reply.read(handle, sizeof(audio_patch_handle_t));
749 return status;
750 }
751
752 virtual status_t releaseAudioPatch(audio_patch_handle_t handle)
753 {
754 Parcel data, reply;
755 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
756 data.write(&handle, sizeof(audio_patch_handle_t));
757 status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply);
758 if (status != NO_ERROR) {
759 status = (status_t)reply.readInt32();
760 }
761 return status;
762 }
763
764 virtual status_t listAudioPatches(unsigned int *num_patches,
765 struct audio_patch *patches,
766 unsigned int *generation)
767 {
768 if (num_patches == NULL || (*num_patches != 0 && patches == NULL) ||
769 generation == NULL) {
770 return BAD_VALUE;
771 }
772 Parcel data, reply;
773 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
774 unsigned int numPatchesReq = (patches == NULL) ? 0 : *num_patches;
775 data.writeInt32(numPatchesReq);
776 status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply);
777 if (status == NO_ERROR) {
778 status = (status_t)reply.readInt32();
779 *num_patches = (unsigned int)reply.readInt32();
780 }
781 if (status == NO_ERROR) {
782 if (numPatchesReq > *num_patches) {
783 numPatchesReq = *num_patches;
784 }
785 if (numPatchesReq > 0) {
786 reply.read(patches, numPatchesReq * sizeof(struct audio_patch));
787 }
788 *generation = reply.readInt32();
789 }
790 return status;
791 }
792
793 virtual status_t setAudioPortConfig(const struct audio_port_config *config)
794 {
795 if (config == NULL) {
796 return BAD_VALUE;
797 }
798 Parcel data, reply;
799 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
800 data.write(config, sizeof(struct audio_port_config));
801 status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply);
802 if (status != NO_ERROR) {
803 status = (status_t)reply.readInt32();
804 }
805 return status;
806 }
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700807
Eric Laurentb52c1522014-05-20 11:27:36 -0700808 virtual void registerClient(const sp<IAudioPolicyServiceClient>& client)
809 {
810 Parcel data, reply;
811 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Marco Nelissenf8880202014-11-14 07:58:25 -0800812 data.writeStrongBinder(IInterface::asBinder(client));
Eric Laurentb52c1522014-05-20 11:27:36 -0700813 remote()->transact(REGISTER_CLIENT, data, &reply);
814 }
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700815
Eric Laurente8726fe2015-06-26 09:39:24 -0700816 virtual void setAudioPortCallbacksEnabled(bool enabled)
817 {
818 Parcel data, reply;
819 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
820 data.writeInt32(enabled ? 1 : 0);
821 remote()->transact(SET_AUDIO_PORT_CALLBACK_ENABLED, data, &reply);
822 }
823
François Gaffiecfe17322018-11-07 13:41:29 +0100824 virtual void setAudioVolumeGroupCallbacksEnabled(bool enabled)
825 {
826 Parcel data, reply;
827 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
828 data.writeInt32(enabled ? 1 : 0);
829 remote()->transact(SET_AUDIO_VOLUME_GROUP_CALLBACK_ENABLED, data, &reply);
830 }
831
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700832 virtual status_t acquireSoundTriggerSession(audio_session_t *session,
833 audio_io_handle_t *ioHandle,
834 audio_devices_t *device)
835 {
836 if (session == NULL || ioHandle == NULL || device == NULL) {
837 return BAD_VALUE;
838 }
839 Parcel data, reply;
840 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
841 status_t status = remote()->transact(ACQUIRE_SOUNDTRIGGER_SESSION, data, &reply);
842 if (status != NO_ERROR) {
843 return status;
844 }
845 status = (status_t)reply.readInt32();
846 if (status == NO_ERROR) {
847 *session = (audio_session_t)reply.readInt32();
848 *ioHandle = (audio_io_handle_t)reply.readInt32();
849 *device = (audio_devices_t)reply.readInt32();
850 }
851 return status;
852 }
853
854 virtual status_t releaseSoundTriggerSession(audio_session_t session)
855 {
856 Parcel data, reply;
857 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
858 data.writeInt32(session);
859 status_t status = remote()->transact(RELEASE_SOUNDTRIGGER_SESSION, data, &reply);
860 if (status != NO_ERROR) {
861 return status;
862 }
863 return (status_t)reply.readInt32();
864 }
Eric Laurentbb6c9a02014-09-25 14:11:47 -0700865
866 virtual audio_mode_t getPhoneState()
867 {
868 Parcel data, reply;
869 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
870 status_t status = remote()->transact(GET_PHONE_STATE, data, &reply);
871 if (status != NO_ERROR) {
872 return AUDIO_MODE_INVALID;
873 }
874 return (audio_mode_t)reply.readInt32();
875 }
Eric Laurentbaac1832014-12-01 17:52:59 -0800876
Chih-Hung Hsiehe964d4e2016-08-09 14:31:32 -0700877 virtual status_t registerPolicyMixes(const Vector<AudioMix>& mixes, bool registration)
Eric Laurentbaac1832014-12-01 17:52:59 -0800878 {
879 Parcel data, reply;
880 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
881 data.writeInt32(registration ? 1 : 0);
882 size_t size = mixes.size();
883 if (size > MAX_MIXES_PER_POLICY) {
884 size = MAX_MIXES_PER_POLICY;
885 }
886 size_t sizePosition = data.dataPosition();
887 data.writeInt32(size);
888 size_t finalSize = size;
889 for (size_t i = 0; i < size; i++) {
890 size_t position = data.dataPosition();
891 if (mixes[i].writeToParcel(&data) != NO_ERROR) {
892 data.setDataPosition(position);
893 finalSize--;
894 }
895 }
896 if (size != finalSize) {
897 size_t position = data.dataPosition();
898 data.setDataPosition(sizePosition);
899 data.writeInt32(finalSize);
900 data.setDataPosition(position);
901 }
902 status_t status = remote()->transact(REGISTER_POLICY_MIXES, data, &reply);
903 if (status == NO_ERROR) {
904 status = (status_t)reply.readInt32();
905 }
906 return status;
907 }
Eric Laurent554a2772015-04-10 11:29:24 -0700908
909 virtual status_t startAudioSource(const struct audio_port_config *source,
910 const audio_attributes_t *attributes,
Eric Laurent3e6c7e12018-07-27 17:09:23 -0700911 audio_port_handle_t *portId)
Eric Laurent554a2772015-04-10 11:29:24 -0700912 {
913 Parcel data, reply;
914 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurent3e6c7e12018-07-27 17:09:23 -0700915 if (source == NULL || attributes == NULL || portId == NULL) {
Eric Laurent554a2772015-04-10 11:29:24 -0700916 return BAD_VALUE;
917 }
918 data.write(source, sizeof(struct audio_port_config));
919 data.write(attributes, sizeof(audio_attributes_t));
920 status_t status = remote()->transact(START_AUDIO_SOURCE, data, &reply);
921 if (status != NO_ERROR) {
922 return status;
923 }
924 status = (status_t)reply.readInt32();
925 if (status != NO_ERROR) {
926 return status;
927 }
Eric Laurent3e6c7e12018-07-27 17:09:23 -0700928 *portId = (audio_port_handle_t)reply.readInt32();
Eric Laurent554a2772015-04-10 11:29:24 -0700929 return status;
930 }
931
Eric Laurent3e6c7e12018-07-27 17:09:23 -0700932 virtual status_t stopAudioSource(audio_port_handle_t portId)
Eric Laurent554a2772015-04-10 11:29:24 -0700933 {
934 Parcel data, reply;
935 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurent3e6c7e12018-07-27 17:09:23 -0700936 data.writeInt32(portId);
Eric Laurent554a2772015-04-10 11:29:24 -0700937 status_t status = remote()->transact(STOP_AUDIO_SOURCE, data, &reply);
938 if (status != NO_ERROR) {
939 return status;
940 }
941 status = (status_t)reply.readInt32();
942 return status;
943 }
Andy Hung2ddee192015-12-18 17:34:44 -0800944
945 virtual status_t setMasterMono(bool mono)
946 {
947 Parcel data, reply;
948 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
949 data.writeInt32(static_cast<int32_t>(mono));
950 status_t status = remote()->transact(SET_MASTER_MONO, data, &reply);
951 if (status != NO_ERROR) {
952 return status;
953 }
954 return static_cast<status_t>(reply.readInt32());
955 }
956
957 virtual status_t getMasterMono(bool *mono)
958 {
959 if (mono == nullptr) {
960 return BAD_VALUE;
961 }
962 Parcel data, reply;
963 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
964
965 status_t status = remote()->transact(GET_MASTER_MONO, data, &reply);
966 if (status != NO_ERROR) {
967 return status;
968 }
969 status = static_cast<status_t>(reply.readInt32());
970 if (status == NO_ERROR) {
971 *mono = static_cast<bool>(reply.readInt32());
972 }
973 return status;
974 }
Eric Laurentac9cef52017-06-09 15:46:26 -0700975
976 virtual float getStreamVolumeDB(audio_stream_type_t stream, int index, audio_devices_t device)
977 {
978 Parcel data, reply;
979 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
980 data.writeInt32(static_cast <int32_t>(stream));
981 data.writeInt32(static_cast <int32_t>(index));
982 data.writeUint32(static_cast <uint32_t>(device));
983 status_t status = remote()->transact(GET_STREAM_VOLUME_DB, data, &reply);
984 if (status != NO_ERROR) {
985 return NAN;
986 }
987 return reply.readFloat();
988 }
jiabin81772902018-04-02 17:52:27 -0700989
990 virtual status_t getSurroundFormats(unsigned int *numSurroundFormats,
991 audio_format_t *surroundFormats,
992 bool *surroundFormatsEnabled,
993 bool reported)
994 {
995 if (numSurroundFormats == NULL || (*numSurroundFormats != 0 &&
996 (surroundFormats == NULL || surroundFormatsEnabled == NULL))) {
997 return BAD_VALUE;
998 }
999 Parcel data, reply;
1000 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1001 unsigned int numSurroundFormatsReq = *numSurroundFormats;
1002 data.writeUint32(numSurroundFormatsReq);
1003 data.writeBool(reported);
1004 status_t status = remote()->transact(GET_SURROUND_FORMATS, data, &reply);
1005 if (status == NO_ERROR && (status = (status_t)reply.readInt32()) == NO_ERROR) {
1006 *numSurroundFormats = reply.readUint32();
1007 }
1008 if (status == NO_ERROR) {
1009 if (numSurroundFormatsReq > *numSurroundFormats) {
1010 numSurroundFormatsReq = *numSurroundFormats;
1011 }
1012 if (numSurroundFormatsReq > 0) {
1013 status = reply.read(surroundFormats,
1014 numSurroundFormatsReq * sizeof(audio_format_t));
1015 if (status != NO_ERROR) {
1016 return status;
1017 }
1018 status = reply.read(surroundFormatsEnabled,
1019 numSurroundFormatsReq * sizeof(bool));
1020 }
1021 }
1022 return status;
1023 }
1024
1025 virtual status_t setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled)
1026 {
1027 Parcel data, reply;
1028 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1029 data.writeInt32(audioFormat);
1030 data.writeBool(enabled);
1031 status_t status = remote()->transact(SET_SURROUND_FORMAT_ENABLED, data, &reply);
1032 if (status != NO_ERROR) {
1033 return status;
1034 }
1035 return reply.readInt32();
1036 }
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001037
Arun Mirpuri11029ad2018-12-19 20:45:19 -08001038 virtual status_t getHwOffloadEncodingFormatsSupportedForA2DP(
1039 std::vector<audio_format_t> *formats)
1040 {
1041 if (formats == NULL) {
1042 return BAD_VALUE;
1043 }
1044
1045 Parcel data, reply;
1046 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1047 status_t status = remote()->transact(GET_OFFLOAD_FORMATS_A2DP, data, &reply);
1048 if (status != NO_ERROR || (status = (status_t)reply.readInt32()) != NO_ERROR) {
1049 return status;
1050 }
1051
1052 size_t list_size = reply.readUint32();
1053
1054 for (size_t i = 0; i < list_size; i++) {
1055 formats->push_back(static_cast<audio_format_t>(reply.readInt32()));
1056 }
1057 return NO_ERROR;
1058 }
1059
1060
1061 virtual status_t addStreamDefaultEffect(const effect_uuid_t *type,
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001062 const String16& opPackageName,
1063 const effect_uuid_t *uuid,
1064 int32_t priority,
1065 audio_usage_t usage,
1066 audio_unique_id_t* id)
1067 {
1068 Parcel data, reply;
1069 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1070 data.write(type, sizeof(effect_uuid_t));
1071 data.writeString16(opPackageName);
1072 data.write(uuid, sizeof(effect_uuid_t));
1073 data.writeInt32(priority);
1074 data.writeInt32((int32_t) usage);
1075 status_t status = remote()->transact(ADD_STREAM_DEFAULT_EFFECT, data, &reply);
1076 if (status != NO_ERROR) {
1077 return status;
1078 }
1079 status = static_cast <status_t> (reply.readInt32());
1080 *id = reply.readInt32();
1081 return status;
1082 }
1083
1084 virtual status_t removeStreamDefaultEffect(audio_unique_id_t id)
1085 {
1086 Parcel data, reply;
1087 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1088 data.writeInt32(id);
1089 status_t status = remote()->transact(REMOVE_STREAM_DEFAULT_EFFECT, data, &reply);
1090 if (status != NO_ERROR) {
1091 return status;
1092 }
1093 return static_cast <status_t> (reply.readInt32());
1094 }
1095
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001096 virtual status_t addSourceDefaultEffect(const effect_uuid_t *type,
1097 const String16& opPackageName,
1098 const effect_uuid_t *uuid,
1099 int32_t priority,
1100 audio_source_t source,
1101 audio_unique_id_t* id)
1102 {
1103 Parcel data, reply;
1104 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1105 data.write(type, sizeof(effect_uuid_t));
1106 data.writeString16(opPackageName);
1107 data.write(uuid, sizeof(effect_uuid_t));
1108 data.writeInt32(priority);
1109 data.writeInt32((int32_t) source);
1110 status_t status = remote()->transact(ADD_SOURCE_DEFAULT_EFFECT, data, &reply);
1111 if (status != NO_ERROR) {
1112 return status;
1113 }
1114 status = static_cast <status_t> (reply.readInt32());
1115 *id = reply.readInt32();
1116 return status;
1117 }
1118
1119 virtual status_t removeSourceDefaultEffect(audio_unique_id_t id)
1120 {
1121 Parcel data, reply;
1122 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1123 data.writeInt32(id);
1124 status_t status = remote()->transact(REMOVE_SOURCE_DEFAULT_EFFECT, data, &reply);
1125 if (status != NO_ERROR) {
1126 return status;
1127 }
1128 return static_cast <status_t> (reply.readInt32());
1129 }
1130
Eric Laurentb78763e2018-10-17 10:08:02 -07001131 virtual status_t setAssistantUid(uid_t uid)
1132 {
1133 Parcel data, reply;
1134 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1135 data.writeInt32(uid);
1136 status_t status = remote()->transact(SET_ASSISTANT_UID, data, &reply);
1137 if (status != NO_ERROR) {
1138 return status;
1139 }
1140 return static_cast <status_t> (reply.readInt32());
1141 }
1142
1143 virtual status_t setA11yServicesUids(const std::vector<uid_t>& uids)
1144 {
1145 Parcel data, reply;
1146 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1147 data.writeInt32(uids.size());
1148 for (auto uid : uids) {
1149 data.writeInt32(uid);
1150 }
1151 status_t status = remote()->transact(SET_A11Y_SERVICES_UIDS, data, &reply);
1152 if (status != NO_ERROR) {
1153 return status;
1154 }
1155 return static_cast <status_t> (reply.readInt32());
1156 }
1157
Kohsuke Yatoha623a132020-03-24 20:10:26 -07001158 virtual status_t setCurrentImeUid(uid_t uid)
1159 {
1160 Parcel data, reply;
1161 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1162 data.writeInt32(uid);
1163 status_t status = remote()->transact(SET_CURRENT_IME_UID, data, &reply);
1164 if (status != NO_ERROR) {
1165 return status;
1166 }
1167 return static_cast <status_t> (reply.readInt32());
1168 }
1169
jiabin6012f912018-11-02 17:06:30 -07001170 virtual bool isHapticPlaybackSupported()
1171 {
1172 Parcel data, reply;
1173 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1174 status_t status = remote()->transact(IS_HAPTIC_PLAYBACK_SUPPORTED, data, &reply);
1175 if (status != NO_ERROR) {
1176 return false;
1177 }
1178 return reply.readBool();
1179 }
1180
jiabin6a02d532020-08-07 11:56:38 -07001181 virtual status_t setUidDeviceAffinities(uid_t uid, const AudioDeviceTypeAddrVector& devices)
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001182 {
1183 Parcel data, reply;
1184 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1185
1186 data.writeInt32((int32_t) uid);
jiabin6a02d532020-08-07 11:56:38 -07001187 status_t status = data.writeParcelableVector(devices);
1188 if (status != NO_ERROR) {
1189 return status;
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001190 }
1191
jiabin6a02d532020-08-07 11:56:38 -07001192 status = remote()->transact(SET_UID_DEVICE_AFFINITY, data, &reply);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001193 if (status == NO_ERROR) {
1194 status = (status_t)reply.readInt32();
1195 }
1196 return status;
1197 }
1198
François Gaffied0ba9ed2018-11-05 11:50:42 +01001199 virtual status_t removeUidDeviceAffinities(uid_t uid) {
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001200 Parcel data, reply;
1201 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1202
1203 data.writeInt32((int32_t) uid);
1204
François Gaffied0ba9ed2018-11-05 11:50:42 +01001205 status_t status =
1206 remote()->transact(REMOVE_UID_DEVICE_AFFINITY, data, &reply);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001207 if (status == NO_ERROR) {
François Gaffied0ba9ed2018-11-05 11:50:42 +01001208 status = (status_t) reply.readInt32();
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001209 }
1210 return status;
1211 }
François Gaffied0ba9ed2018-11-05 11:50:42 +01001212
jiabin6a02d532020-08-07 11:56:38 -07001213 virtual status_t setUserIdDeviceAffinities(int userId, const AudioDeviceTypeAddrVector& devices)
1214 {
1215 Parcel data, reply;
1216 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Oscar Azucena90e77632019-11-27 17:12:28 -08001217
jiabin6a02d532020-08-07 11:56:38 -07001218 data.writeInt32((int32_t) userId);
1219 status_t status = data.writeParcelableVector(devices);
1220 if (status != NO_ERROR) {
Oscar Azucena90e77632019-11-27 17:12:28 -08001221 return status;
1222 }
1223
jiabin6a02d532020-08-07 11:56:38 -07001224 status = remote()->transact(SET_USERID_DEVICE_AFFINITY, data, &reply);
1225 if (status == NO_ERROR) {
1226 status = (status_t)reply.readInt32();
Oscar Azucena90e77632019-11-27 17:12:28 -08001227 }
jiabin6a02d532020-08-07 11:56:38 -07001228 return status;
1229 }
1230
1231 virtual status_t removeUserIdDeviceAffinities(int userId) {
1232 Parcel data, reply;
1233 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1234
1235 data.writeInt32((int32_t) userId);
1236
1237 status_t status =
1238 remote()->transact(REMOVE_USERID_DEVICE_AFFINITY, data, &reply);
1239 if (status == NO_ERROR) {
1240 status = (status_t) reply.readInt32();
1241 }
1242 return status;
1243 }
Oscar Azucena90e77632019-11-27 17:12:28 -08001244
François Gaffied0ba9ed2018-11-05 11:50:42 +01001245 virtual status_t listAudioProductStrategies(AudioProductStrategyVector &strategies)
1246 {
1247 Parcel data, reply;
1248 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1249
1250 status_t status = remote()->transact(LIST_AUDIO_PRODUCT_STRATEGIES, data, &reply);
1251 if (status != NO_ERROR) {
1252 ALOGE("%s: permission denied", __func__);
1253 return status;
1254 }
1255 status = static_cast<status_t>(reply.readInt32());
François Gaffie4b2018b2018-11-07 11:18:59 +01001256 if (status != NO_ERROR) {
1257 return status;
François Gaffied0ba9ed2018-11-05 11:50:42 +01001258 }
François Gaffie4b2018b2018-11-07 11:18:59 +01001259 uint32_t numStrategies = static_cast<uint32_t>(reply.readInt32());
1260 for (size_t i = 0; i < numStrategies; i++) {
1261 AudioProductStrategy strategy;
1262 status = strategy.readFromParcel(&reply);
1263 if (status != NO_ERROR) {
1264 ALOGE("%s: failed to read strategies", __FUNCTION__);
1265 strategies.clear();
1266 return status;
1267 }
1268 strategies.push_back(strategy);
1269 }
1270 return NO_ERROR;
François Gaffied0ba9ed2018-11-05 11:50:42 +01001271 }
1272
François Gaffie4b2018b2018-11-07 11:18:59 +01001273 virtual status_t getProductStrategyFromAudioAttributes(const AudioAttributes &aa,
1274 product_strategy_t &productStrategy)
François Gaffied0ba9ed2018-11-05 11:50:42 +01001275 {
1276 Parcel data, reply;
1277 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1278 status_t status = aa.writeToParcel(&data);
1279 if (status != NO_ERROR) {
François Gaffie4b2018b2018-11-07 11:18:59 +01001280 return status;
François Gaffied0ba9ed2018-11-05 11:50:42 +01001281 }
1282 status = remote()->transact(GET_STRATEGY_FOR_ATTRIBUTES, data, &reply);
François Gaffie4b2018b2018-11-07 11:18:59 +01001283 if (status != NO_ERROR) {
1284 return status;
François Gaffied0ba9ed2018-11-05 11:50:42 +01001285 }
François Gaffie4b2018b2018-11-07 11:18:59 +01001286 status = static_cast<status_t>(reply.readInt32());
1287 if (status != NO_ERROR) {
1288 return status;
1289 }
1290 productStrategy = static_cast<product_strategy_t>(reply.readInt32());
1291 return NO_ERROR;
1292 }
1293
1294 virtual status_t listAudioVolumeGroups(AudioVolumeGroupVector &groups)
1295 {
1296 Parcel data, reply;
1297 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1298
1299 status_t status = remote()->transact(LIST_AUDIO_VOLUME_GROUPS, data, &reply);
1300 if (status != NO_ERROR) {
1301 return status;
1302 }
1303 status = static_cast<status_t>(reply.readInt32());
1304 if (status != NO_ERROR) {
1305 return status;
1306 }
1307 uint32_t numGroups = static_cast<uint32_t>(reply.readInt32());
1308 for (size_t i = 0; i < numGroups; i++) {
1309 AudioVolumeGroup group;
1310 status = group.readFromParcel(&reply);
1311 if (status != NO_ERROR) {
1312 ALOGE("%s: failed to read volume groups", __FUNCTION__);
1313 groups.clear();
1314 return status;
1315 }
1316 groups.push_back(group);
1317 }
1318 return NO_ERROR;
1319 }
1320
1321 virtual status_t getVolumeGroupFromAudioAttributes(const AudioAttributes &aa,
1322 volume_group_t &volumeGroup)
1323 {
1324 Parcel data, reply;
1325 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1326 status_t status = aa.writeToParcel(&data);
1327 if (status != NO_ERROR) {
1328 return status;
1329 }
1330 status = remote()->transact(GET_VOLUME_GROUP_FOR_ATTRIBUTES, data, &reply);
1331 if (status != NO_ERROR) {
1332 return status;
1333 }
1334 status = static_cast<status_t>(reply.readInt32());
1335 if (status != NO_ERROR) {
1336 return status;
1337 }
1338 volumeGroup = static_cast<volume_group_t>(reply.readInt32());
1339 return NO_ERROR;
François Gaffied0ba9ed2018-11-05 11:50:42 +01001340 }
Eric Laurent6ede98f2019-06-11 14:50:30 -07001341
1342 virtual status_t setRttEnabled(bool enabled)
1343 {
1344 Parcel data, reply;
1345 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1346 data.writeInt32(static_cast<int32_t>(enabled));
1347 status_t status = remote()->transact(SET_RTT_ENABLED, data, &reply);
1348 if (status != NO_ERROR) {
1349 return status;
1350 }
1351 return static_cast<status_t>(reply.readInt32());
1352 }
Eric Laurent8340e672019-11-06 11:01:08 -08001353
1354 virtual bool isCallScreenModeSupported()
1355 {
1356 Parcel data, reply;
1357 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1358 status_t status = remote()->transact(IS_CALL_SCREEN_MODE_SUPPORTED, data, &reply);
1359 if (status != NO_ERROR) {
1360 return false;
1361 }
1362 return reply.readBool();
1363 }
Jean-Michel Trivi30857152019-11-01 11:04:15 -07001364
jiabin0a488932020-08-07 17:32:40 -07001365 virtual status_t setDevicesRoleForStrategy(product_strategy_t strategy,
1366 device_role_t role, const AudioDeviceTypeAddrVector &devices)
Jean-Michel Trivi30857152019-11-01 11:04:15 -07001367 {
1368 Parcel data, reply;
1369 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1370 data.writeUint32(static_cast<uint32_t>(strategy));
jiabin0a488932020-08-07 17:32:40 -07001371 data.writeUint32(static_cast<uint32_t>(role));
1372 status_t status = data.writeParcelableVector(devices);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07001373 if (status != NO_ERROR) {
1374 return BAD_VALUE;
1375 }
jiabin0a488932020-08-07 17:32:40 -07001376 status = remote()->transact(SET_DEVICES_ROLE_FOR_PRODUCT_STRATEGY, data, &reply);
1377 if (status != NO_ERROR) {
1378 return status;
1379 }
1380 return static_cast<status_t>(reply.readInt32());
1381 }
1382
1383 virtual status_t removeDevicesRoleForStrategy(product_strategy_t strategy, device_role_t role)
1384 {
1385 Parcel data, reply;
1386 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1387 data.writeUint32(static_cast<uint32_t>(strategy));
1388 data.writeUint32(static_cast<uint32_t>(role));
1389 status_t status = remote()->transact(REMOVE_DEVICES_ROLE_FOR_PRODUCT_STRATEGY,
Jean-Michel Trivi30857152019-11-01 11:04:15 -07001390 data, &reply);
1391 if (status != NO_ERROR) {
1392 return status;
1393 }
1394 return static_cast<status_t>(reply.readInt32());
1395 }
1396
jiabin0a488932020-08-07 17:32:40 -07001397 virtual status_t getDevicesForRoleAndStrategy(product_strategy_t strategy,
1398 device_role_t role, AudioDeviceTypeAddrVector &devices)
Jean-Michel Trivi30857152019-11-01 11:04:15 -07001399 {
1400 Parcel data, reply;
1401 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1402 data.writeUint32(static_cast<uint32_t>(strategy));
jiabin0a488932020-08-07 17:32:40 -07001403 data.writeUint32(static_cast<uint32_t>(role));
1404 status_t status = remote()->transact(GET_DEVICES_FOR_ROLE_AND_PRODUCT_STRATEGY,
Jean-Michel Trivi30857152019-11-01 11:04:15 -07001405 data, &reply);
1406 if (status != NO_ERROR) {
1407 return status;
1408 }
jiabin0a488932020-08-07 17:32:40 -07001409 status = reply.readParcelableVector(&devices);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07001410 if (status != NO_ERROR) {
1411 return status;
1412 }
1413 return static_cast<status_t>(reply.readInt32());
1414 }
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001415
Jiabin Huang3b98d322020-09-03 17:54:16 +00001416 virtual status_t setDevicesRoleForCapturePreset(audio_source_t audioSource,
1417 device_role_t role, const AudioDeviceTypeAddrVector &devices) {
1418 Parcel data, reply;
1419 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1420 data.writeUint32(static_cast<uint32_t>(audioSource));
1421 data.writeUint32(static_cast<uint32_t>(role));
1422 status_t status = data.writeParcelableVector(devices);
1423 if (status != NO_ERROR) {
1424 return status;
1425 }
1426 status = remote()->transact(SET_DEVICES_ROLE_FOR_CAPTURE_PRESET, data, &reply);
1427 if (status != NO_ERROR) {
1428 return status;
1429 }
1430 return static_cast<status_t>(reply.readInt32());
1431 }
1432
1433 virtual status_t addDevicesRoleForCapturePreset(audio_source_t audioSource,
1434 device_role_t role, const AudioDeviceTypeAddrVector &devices)
1435 {
1436 Parcel data, reply;
1437 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1438 data.writeUint32(static_cast<uint32_t>(audioSource));
1439 data.writeUint32(static_cast<uint32_t>(role));
1440 status_t status = data.writeParcelableVector(devices);
1441 if (status != NO_ERROR) {
1442 return status;
1443 }
1444 status = remote()->transact(ADD_DEVICES_ROLE_FOR_CAPTURE_PRESET, data, &reply);
1445 if (status != NO_ERROR) {
1446 return status;
1447 }
1448 return static_cast<status_t>(reply.readInt32());
1449 }
1450
1451 virtual status_t removeDevicesRoleForCapturePreset(
1452 audio_source_t audioSource, device_role_t role,
1453 const AudioDeviceTypeAddrVector& devices)
1454 {
1455 Parcel data, reply;
1456 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1457 data.writeUint32(static_cast<uint32_t>(audioSource));
1458 data.writeUint32(static_cast<uint32_t>(role));
1459 status_t status = data.writeParcelableVector(devices);
1460 if (status != NO_ERROR) {
1461 return status;
1462 }
1463 status = remote()->transact(REMOVE_DEVICES_ROLE_FOR_CAPTURE_PRESET,
1464 data, &reply);
1465 if (status != NO_ERROR) {
1466 return status;
1467 }
1468 return static_cast<status_t>(reply.readInt32());
1469 }
1470
1471 virtual status_t clearDevicesRoleForCapturePreset(
1472 audio_source_t audioSource, device_role_t role)
1473 {
1474 Parcel data, reply;
1475 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1476 data.writeUint32(static_cast<uint32_t>(audioSource));
1477 data.writeUint32(static_cast<uint32_t>(role));
1478 status_t status = remote()->transact(CLEAR_DEVICES_ROLE_FOR_CAPTURE_PRESET,
1479 data, &reply);
1480 if (status != NO_ERROR) {
1481 return status;
1482 }
1483 return static_cast<status_t>(reply.readInt32());
1484 }
1485
1486 virtual status_t getDevicesForRoleAndCapturePreset(audio_source_t audioSource,
1487 device_role_t role, AudioDeviceTypeAddrVector &devices)
1488 {
1489 Parcel data, reply;
1490 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1491 data.writeUint32(static_cast<uint32_t>(audioSource));
1492 data.writeUint32(static_cast<uint32_t>(role));
1493 status_t status = remote()->transact(GET_DEVICES_FOR_ROLE_AND_CAPTURE_PRESET,
1494 data, &reply);
1495 if (status != NO_ERROR) {
1496 return status;
1497 }
1498 status = reply.readParcelableVector(&devices);
1499 if (status != NO_ERROR) {
1500 return status;
1501 }
1502 return static_cast<status_t>(reply.readInt32());
1503 }
1504
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001505 virtual status_t getDevicesForAttributes(const AudioAttributes &aa,
1506 AudioDeviceTypeAddrVector *devices) const
1507 {
1508 if (devices == nullptr) {
1509 return BAD_VALUE;
1510 }
1511 Parcel data, reply;
1512 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1513 status_t status = aa.writeToParcel(&data);
1514 if (status != NO_ERROR) {
1515 return status;
1516 }
1517 status = remote()->transact(GET_DEVICES_FOR_ATTRIBUTES, data, &reply);
1518 if (status != NO_ERROR) {
1519 // transaction failed, return error
1520 return status;
1521 }
1522 status = static_cast<status_t>(reply.readInt32());
1523 if (status != NO_ERROR) {
1524 // APM method call failed, return error
1525 return status;
1526 }
1527
1528 const size_t numberOfDevices = (size_t)reply.readInt32();
1529 for (size_t i = 0; i < numberOfDevices; i++) {
1530 AudioDeviceTypeAddr device;
1531 if (device.readFromParcel((Parcel*)&reply) == NO_ERROR) {
1532 devices->push_back(device);
1533 } else {
1534 return FAILED_TRANSACTION;
1535 }
1536 }
1537 return NO_ERROR;
1538 }
Mikhail Naganov88b30d22020-03-09 19:43:13 +00001539
1540 virtual void onNewAudioModulesAvailable()
1541 {
1542 Parcel data, reply;
1543 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1544 remote()->transact(AUDIO_MODULES_UPDATED, data, &reply, IBinder::FLAG_ONEWAY);
1545 }
Ytai Ben-Tsvi1ef846b2020-03-26 09:41:15 -07001546
1547 status_t registerSoundTriggerCaptureStateListener(
1548 const sp<media::ICaptureStateListener>& listener,
1549 bool* result) override {
1550 Parcel data, reply;
1551 status_t status;
1552 status =
1553 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1554 if (status != NO_ERROR) return status;
1555 status = data.writeStrongBinder(IInterface::asBinder(listener));
1556 if (status != NO_ERROR) return status;
1557 status =
1558 remote()->transact(REGISTER_SOUNDTRIGGER_CAPTURE_STATE_LISTENER,
1559 data,
1560 &reply,
1561 0);
1562 if (status != NO_ERROR) return status;
1563 status = reply.readBool(result);
1564 if (status != NO_ERROR) return status;
1565 return NO_ERROR;
1566 }
Eric Laurentc2f1f072009-07-17 12:17:14 -07001567};
1568
1569IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
1570
1571// ----------------------------------------------------------------------
1572
Eric Laurentc2f1f072009-07-17 12:17:14 -07001573status_t BnAudioPolicyService::onTransact(
1574 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
1575{
Eric Laurentb1cc36b2017-12-11 12:14:16 -08001576 // make sure transactions reserved to AudioFlinger do not come from other processes
1577 switch (code) {
1578 case START_OUTPUT:
1579 case STOP_OUTPUT:
1580 case RELEASE_OUTPUT:
1581 case GET_INPUT_FOR_ATTR:
1582 case START_INPUT:
1583 case STOP_INPUT:
1584 case RELEASE_INPUT:
Eric Laurentb1cc36b2017-12-11 12:14:16 -08001585 case GET_OUTPUT_FOR_EFFECT:
1586 case REGISTER_EFFECT:
1587 case UNREGISTER_EFFECT:
1588 case SET_EFFECT_ENABLED:
1589 case GET_OUTPUT_FOR_ATTR:
Eric Laurent6c796322019-04-09 14:13:17 -07001590 case MOVE_EFFECTS_TO_IO:
Eric Laurentb1cc36b2017-12-11 12:14:16 -08001591 ALOGW("%s: transaction %d received from PID %d",
1592 __func__, code, IPCThreadState::self()->getCallingPid());
Eric Laurentef92bff2018-04-26 10:44:50 -07001593 // return status only for non void methods
1594 switch (code) {
1595 case RELEASE_OUTPUT:
1596 case RELEASE_INPUT:
1597 break;
1598 default:
1599 reply->writeInt32(static_cast<int32_t> (INVALID_OPERATION));
1600 break;
1601 }
1602 return OK;
Eric Laurentb1cc36b2017-12-11 12:14:16 -08001603 default:
1604 break;
1605 }
1606
Eric Laurent4980df22018-01-26 18:04:09 -08001607 // make sure the following transactions come from system components
1608 switch (code) {
1609 case SET_DEVICE_CONNECTION_STATE:
1610 case HANDLE_DEVICE_CONFIG_CHANGE:
1611 case SET_PHONE_STATE:
Eric Laurente17378d2018-05-09 14:43:01 -07001612//FIXME: Allow SET_FORCE_USE calls from system apps until a better use case routing API is available
1613// case SET_FORCE_USE:
Eric Laurent4980df22018-01-26 18:04:09 -08001614 case INIT_STREAM_VOLUME:
1615 case SET_STREAM_VOLUME:
1616 case REGISTER_POLICY_MIXES:
Eric Laurent10b71232018-04-13 18:14:44 -07001617 case SET_MASTER_MONO:
jiabin81772902018-04-02 17:52:27 -07001618 case GET_SURROUND_FORMATS:
Eric Laurentb78763e2018-10-17 10:08:02 -07001619 case SET_SURROUND_FORMAT_ENABLED:
1620 case SET_ASSISTANT_UID:
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001621 case SET_A11Y_SERVICES_UIDS:
1622 case SET_UID_DEVICE_AFFINITY:
Arun Mirpuri11029ad2018-12-19 20:45:19 -08001623 case REMOVE_UID_DEVICE_AFFINITY:
Oscar Azucena90e77632019-11-27 17:12:28 -08001624 case SET_USERID_DEVICE_AFFINITY:
1625 case REMOVE_USERID_DEVICE_AFFINITY:
François Gaffie4b2018b2018-11-07 11:18:59 +01001626 case GET_OFFLOAD_FORMATS_A2DP:
1627 case LIST_AUDIO_VOLUME_GROUPS:
Eric Laurent6ede98f2019-06-11 14:50:30 -07001628 case GET_VOLUME_GROUP_FOR_ATTRIBUTES:
Ytai Ben-Tsvia32e6012019-10-28 15:39:16 -07001629 case ACQUIRE_SOUNDTRIGGER_SESSION:
1630 case RELEASE_SOUNDTRIGGER_SESSION:
Eric Laurent8340e672019-11-06 11:01:08 -08001631 case SET_RTT_ENABLED:
Jean-Michel Trivi30857152019-11-01 11:04:15 -07001632 case IS_CALL_SCREEN_MODE_SUPPORTED:
jiabin0a488932020-08-07 17:32:40 -07001633 case SET_DEVICES_ROLE_FOR_PRODUCT_STRATEGY:
Hayden Gomes524159d2019-12-23 14:41:47 -08001634 case SET_SUPPORTED_SYSTEM_USAGES:
jiabin0a488932020-08-07 17:32:40 -07001635 case REMOVE_DEVICES_ROLE_FOR_PRODUCT_STRATEGY:
1636 case GET_DEVICES_FOR_ROLE_AND_PRODUCT_STRATEGY:
jiabin140a34f2019-12-23 11:17:25 -08001637 case GET_DEVICES_FOR_ATTRIBUTES:
Mikhail Naganov88b30d22020-03-09 19:43:13 +00001638 case SET_ALLOWED_CAPTURE_POLICY:
Kohsuke Yatoha623a132020-03-24 20:10:26 -07001639 case AUDIO_MODULES_UPDATED:
Ytai Ben-Tsvi1ef846b2020-03-26 09:41:15 -07001640 case SET_CURRENT_IME_UID:
Jiabin Huang3b98d322020-09-03 17:54:16 +00001641 case REGISTER_SOUNDTRIGGER_CAPTURE_STATE_LISTENER:
1642 case SET_DEVICES_ROLE_FOR_CAPTURE_PRESET:
1643 case ADD_DEVICES_ROLE_FOR_CAPTURE_PRESET:
1644 case REMOVE_DEVICES_ROLE_FOR_CAPTURE_PRESET:
1645 case CLEAR_DEVICES_ROLE_FOR_CAPTURE_PRESET:
1646 case GET_DEVICES_FOR_ROLE_AND_CAPTURE_PRESET: {
Andy Hung4ef19fa2018-05-15 19:35:29 -07001647 if (!isServiceUid(IPCThreadState::self()->getCallingUid())) {
Eric Laurent4980df22018-01-26 18:04:09 -08001648 ALOGW("%s: transaction %d received from PID %d unauthorized UID %d",
1649 __func__, code, IPCThreadState::self()->getCallingPid(),
1650 IPCThreadState::self()->getCallingUid());
Eric Laurentef92bff2018-04-26 10:44:50 -07001651 reply->writeInt32(static_cast<int32_t> (INVALID_OPERATION));
1652 return OK;
Eric Laurent4980df22018-01-26 18:04:09 -08001653 }
Eric Laurent96c7eed2018-03-26 17:57:01 -07001654 } break;
Eric Laurent4980df22018-01-26 18:04:09 -08001655 default:
1656 break;
1657 }
1658
Eric Laurent39b09b52018-06-29 12:24:40 -07001659 std::string tag("IAudioPolicyService command " + std::to_string(code));
1660 TimeCheck check(tag.c_str());
Eric Laurent3528c932018-02-23 17:17:22 -08001661
Glenn Kastene53b9ea2012-03-12 16:29:55 -07001662 switch (code) {
Eric Laurentc2f1f072009-07-17 12:17:14 -07001663 case SET_DEVICE_CONNECTION_STATE: {
1664 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001665 audio_devices_t device =
1666 static_cast <audio_devices_t>(data.readInt32());
1667 audio_policy_dev_state_t state =
1668 static_cast <audio_policy_dev_state_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -07001669 const char *device_address = data.readCString();
Paul McLeane743a472015-01-28 11:07:31 -08001670 const char *device_name = data.readCString();
Aniket Kumar Lata4e464702019-01-10 23:38:46 -08001671 audio_format_t codecFormat = static_cast <audio_format_t>(data.readInt32());
Pavlin Radoslavovc694ff42017-01-09 23:27:29 -08001672 if (device_address == nullptr || device_name == nullptr) {
1673 ALOGE("Bad Binder transaction: SET_DEVICE_CONNECTION_STATE for device %u", device);
1674 reply->writeInt32(static_cast<int32_t> (BAD_VALUE));
1675 } else {
1676 reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device,
1677 state,
1678 device_address,
Aniket Kumar Lata4e464702019-01-10 23:38:46 -08001679 device_name,
1680 codecFormat)));
Pavlin Radoslavovc694ff42017-01-09 23:27:29 -08001681 }
Eric Laurentc2f1f072009-07-17 12:17:14 -07001682 return NO_ERROR;
1683 } break;
1684
1685 case GET_DEVICE_CONNECTION_STATE: {
1686 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001687 audio_devices_t device =
1688 static_cast<audio_devices_t> (data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -07001689 const char *device_address = data.readCString();
Pavlin Radoslavovc694ff42017-01-09 23:27:29 -08001690 if (device_address == nullptr) {
1691 ALOGE("Bad Binder transaction: GET_DEVICE_CONNECTION_STATE for device %u", device);
1692 reply->writeInt32(static_cast<int32_t> (AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE));
1693 } else {
1694 reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device,
1695 device_address)));
1696 }
Eric Laurentc2f1f072009-07-17 12:17:14 -07001697 return NO_ERROR;
1698 } break;
1699
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -08001700 case HANDLE_DEVICE_CONFIG_CHANGE: {
1701 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1702 audio_devices_t device =
1703 static_cast <audio_devices_t>(data.readInt32());
1704 const char *device_address = data.readCString();
1705 const char *device_name = data.readCString();
Aniket Kumar Lata4e464702019-01-10 23:38:46 -08001706 audio_format_t codecFormat =
1707 static_cast <audio_format_t>(data.readInt32());
Pavlin Radoslavovc694ff42017-01-09 23:27:29 -08001708 if (device_address == nullptr || device_name == nullptr) {
1709 ALOGE("Bad Binder transaction: HANDLE_DEVICE_CONFIG_CHANGE for device %u", device);
1710 reply->writeInt32(static_cast<int32_t> (BAD_VALUE));
1711 } else {
1712 reply->writeInt32(static_cast<uint32_t> (handleDeviceConfigChange(device,
1713 device_address,
Aniket Kumar Lata4e464702019-01-10 23:38:46 -08001714 device_name,
1715 codecFormat)));
Pavlin Radoslavovc694ff42017-01-09 23:27:29 -08001716 }
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -08001717 return NO_ERROR;
1718 } break;
1719
Eric Laurentc2f1f072009-07-17 12:17:14 -07001720 case SET_PHONE_STATE: {
1721 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kasten85ab62c2012-11-01 11:11:38 -07001722 reply->writeInt32(static_cast <uint32_t>(setPhoneState(
Eric Laurent00dba062020-02-11 15:52:09 -08001723 (audio_mode_t) data.readInt32(),
1724 (uid_t) data.readInt32())));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001725 return NO_ERROR;
1726 } break;
1727
Eric Laurentc2f1f072009-07-17 12:17:14 -07001728 case SET_FORCE_USE: {
1729 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kasten85ab62c2012-11-01 11:11:38 -07001730 audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
1731 data.readInt32());
Dima Zavinfce7a472011-04-19 22:30:36 -07001732 audio_policy_forced_cfg_t config =
1733 static_cast <audio_policy_forced_cfg_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -07001734 reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config)));
1735 return NO_ERROR;
1736 } break;
1737
1738 case GET_FORCE_USE: {
1739 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kasten85ab62c2012-11-01 11:11:38 -07001740 audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
1741 data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -07001742 reply->writeInt32(static_cast <uint32_t>(getForceUse(usage)));
1743 return NO_ERROR;
1744 } break;
1745
1746 case GET_OUTPUT: {
1747 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001748 audio_stream_type_t stream =
1749 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentf4e63452017-11-06 19:31:46 +00001750 audio_io_handle_t output = getOutput(stream);
Eric Laurentfa2877b2009-07-28 08:44:33 -07001751 reply->writeInt32(static_cast <int>(output));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001752 return NO_ERROR;
1753 } break;
1754
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -07001755 case GET_OUTPUT_FOR_ATTR: {
1756 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurent42984412019-05-09 17:57:03 -07001757 audio_attributes_t attr = AUDIO_ATTRIBUTES_INITIALIZER;
1758 status_t status = data.read(&attr, sizeof(audio_attributes_t));
1759 if (status != NO_ERROR) {
1760 return status;
Eric Laurente83b55d2014-11-14 10:06:21 -08001761 }
Eric Laurent42984412019-05-09 17:57:03 -07001762 sanetizeAudioAttributes(&attr);
Eric Laurente83b55d2014-11-14 10:06:21 -08001763 audio_session_t session = (audio_session_t)data.readInt32();
1764 audio_stream_type_t stream = AUDIO_STREAM_DEFAULT;
1765 bool hasStream = data.readInt32() != 0;
1766 if (hasStream) {
1767 stream = (audio_stream_type_t)data.readInt32();
1768 }
Nadav Bar766fb022018-01-07 12:18:03 +02001769 pid_t pid = (pid_t)data.readInt32();
Eric Laurent8c7e6da2015-04-21 17:37:00 -07001770 uid_t uid = (uid_t)data.readInt32();
Eric Laurent20b9ef02016-12-05 11:03:16 -08001771 audio_config_t config;
1772 memset(&config, 0, sizeof(audio_config_t));
1773 data.read(&config, sizeof(audio_config_t));
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -07001774 audio_output_flags_t flags =
1775 static_cast <audio_output_flags_t>(data.readInt32());
Paul McLeanaa981192015-03-21 09:55:15 -07001776 audio_port_handle_t selectedDeviceId = data.readInt32();
Eric Laurent20b9ef02016-12-05 11:03:16 -08001777 audio_port_handle_t portId = (audio_port_handle_t)data.readInt32();
Robert Shiha946d842015-09-02 16:46:59 -07001778 audio_io_handle_t output = 0;
Kevin Rocard153f92d2018-12-18 18:33:28 -08001779 std::vector<audio_io_handle_t> secondaryOutputs;
Eric Laurent42984412019-05-09 17:57:03 -07001780 status = getOutputForAttr(&attr,
Nadav Bar766fb022018-01-07 12:18:03 +02001781 &output, session, &stream, pid, uid,
Ricardo Correa57a37692020-03-23 17:27:25 -07001782 &config,
Kevin Rocard153f92d2018-12-18 18:33:28 -08001783 flags, &selectedDeviceId, &portId, &secondaryOutputs);
Eric Laurente83b55d2014-11-14 10:06:21 -08001784 reply->writeInt32(status);
Eric Laurent42984412019-05-09 17:57:03 -07001785 status = reply->write(&attr, sizeof(audio_attributes_t));
1786 if (status != NO_ERROR) {
1787 return status;
1788 }
Eric Laurente83b55d2014-11-14 10:06:21 -08001789 reply->writeInt32(output);
1790 reply->writeInt32(stream);
Eric Laurent9ae8c592017-06-22 17:17:09 -07001791 reply->writeInt32(selectedDeviceId);
Eric Laurent20b9ef02016-12-05 11:03:16 -08001792 reply->writeInt32(portId);
Kevin Rocard153f92d2018-12-18 18:33:28 -08001793 reply->writeInt32(secondaryOutputs.size());
1794 return reply->write(secondaryOutputs.data(),
1795 secondaryOutputs.size() * sizeof(audio_io_handle_t));
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -07001796 } break;
1797
Eric Laurentc2f1f072009-07-17 12:17:14 -07001798 case START_OUTPUT: {
1799 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentd7fe0862018-07-14 16:48:01 -07001800 const audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
1801 reply->writeInt32(static_cast <uint32_t>(startOutput(portId)));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001802 return NO_ERROR;
1803 } break;
1804
1805 case STOP_OUTPUT: {
1806 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentd7fe0862018-07-14 16:48:01 -07001807 const audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
1808 reply->writeInt32(static_cast <uint32_t>(stopOutput(portId)));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001809 return NO_ERROR;
1810 } break;
1811
1812 case RELEASE_OUTPUT: {
1813 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentd7fe0862018-07-14 16:48:01 -07001814 const audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
1815 releaseOutput(portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -07001816 return NO_ERROR;
1817 } break;
1818
Eric Laurentcaf7f482014-11-25 17:50:47 -08001819 case GET_INPUT_FOR_ATTR: {
Eric Laurentc2f1f072009-07-17 12:17:14 -07001820 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07001821 audio_attributes_t attr = {};
Eric Laurentcaf7f482014-11-25 17:50:47 -08001822 data.read(&attr, sizeof(audio_attributes_t));
Kevin Rocard39fdbd02017-11-13 11:15:27 -08001823 sanetizeAudioAttributes(&attr);
Eric Laurenta54f1282017-07-01 19:39:32 -07001824 audio_io_handle_t input = (audio_io_handle_t)data.readInt32();
Mikhail Naganov2996f672019-04-18 12:29:59 -07001825 audio_unique_id_t riid = (audio_unique_id_t)data.readInt32();
Eric Laurentcaf7f482014-11-25 17:50:47 -08001826 audio_session_t session = (audio_session_t)data.readInt32();
Eric Laurentb2379ba2016-05-23 17:42:12 -07001827 pid_t pid = (pid_t)data.readInt32();
Eric Laurent8c7e6da2015-04-21 17:37:00 -07001828 uid_t uid = (uid_t)data.readInt32();
Eric Laurentfee19762018-01-29 18:44:13 -08001829 const String16 opPackageName = data.readString16();
Eric Laurent20b9ef02016-12-05 11:03:16 -08001830 audio_config_base_t config;
1831 memset(&config, 0, sizeof(audio_config_base_t));
1832 data.read(&config, sizeof(audio_config_base_t));
Glenn Kastenb3b16602014-07-16 08:36:31 -07001833 audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
Paul McLean466dc8e2015-04-17 13:15:36 -06001834 audio_port_handle_t selectedDeviceId = (audio_port_handle_t) data.readInt32();
Eric Laurent20b9ef02016-12-05 11:03:16 -08001835 audio_port_handle_t portId = (audio_port_handle_t)data.readInt32();
Mikhail Naganov2996f672019-04-18 12:29:59 -07001836 status_t status = getInputForAttr(&attr, &input, riid, session, pid, uid,
Eric Laurentfee19762018-01-29 18:44:13 -08001837 opPackageName, &config,
Eric Laurent9ae8c592017-06-22 17:17:09 -07001838 flags, &selectedDeviceId, &portId);
Eric Laurentcaf7f482014-11-25 17:50:47 -08001839 reply->writeInt32(status);
1840 if (status == NO_ERROR) {
1841 reply->writeInt32(input);
Eric Laurent9ae8c592017-06-22 17:17:09 -07001842 reply->writeInt32(selectedDeviceId);
Eric Laurent20b9ef02016-12-05 11:03:16 -08001843 reply->writeInt32(portId);
Eric Laurentcaf7f482014-11-25 17:50:47 -08001844 }
Eric Laurentc2f1f072009-07-17 12:17:14 -07001845 return NO_ERROR;
1846 } break;
1847
1848 case START_INPUT: {
1849 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfee19762018-01-29 18:44:13 -08001850 audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
Eric Laurent4eb58f12018-12-07 16:41:02 -08001851 status_t status = startInput(portId);
Svet Ganovf4ddfef2018-01-16 07:37:58 -08001852 reply->writeInt32(static_cast <uint32_t>(status));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001853 return NO_ERROR;
1854 } break;
1855
1856 case STOP_INPUT: {
1857 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfee19762018-01-29 18:44:13 -08001858 audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
1859 reply->writeInt32(static_cast <uint32_t>(stopInput(portId)));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001860 return NO_ERROR;
1861 } break;
1862
1863 case RELEASE_INPUT: {
1864 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfee19762018-01-29 18:44:13 -08001865 audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
1866 releaseInput(portId);
Eric Laurentc2f1f072009-07-17 12:17:14 -07001867 return NO_ERROR;
1868 } break;
1869
1870 case INIT_STREAM_VOLUME: {
1871 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001872 audio_stream_type_t stream =
1873 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -07001874 int indexMin = data.readInt32();
1875 int indexMax = data.readInt32();
1876 reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax)));
1877 return NO_ERROR;
1878 } break;
1879
1880 case SET_STREAM_VOLUME: {
1881 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001882 audio_stream_type_t stream =
1883 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -07001884 int index = data.readInt32();
Eric Laurent83844cc2011-11-18 16:43:31 -08001885 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
1886 reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream,
1887 index,
1888 device)));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001889 return NO_ERROR;
1890 } break;
1891
1892 case GET_STREAM_VOLUME: {
1893 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001894 audio_stream_type_t stream =
1895 static_cast <audio_stream_type_t>(data.readInt32());
Eric Laurent83844cc2011-11-18 16:43:31 -08001896 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
Robert Shih89235432015-09-02 16:46:59 -07001897 int index = 0;
Eric Laurent83844cc2011-11-18 16:43:31 -08001898 status_t status = getStreamVolumeIndex(stream, &index, device);
Eric Laurentc2f1f072009-07-17 12:17:14 -07001899 reply->writeInt32(index);
1900 reply->writeInt32(static_cast <uint32_t>(status));
1901 return NO_ERROR;
1902 } break;
1903
Eric Laurentde070132010-07-13 04:45:46 -07001904 case GET_STRATEGY_FOR_STREAM: {
1905 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001906 audio_stream_type_t stream =
1907 static_cast <audio_stream_type_t>(data.readInt32());
François Gaffiec005e562018-11-06 15:04:49 +01001908 reply->writeUint32(getStrategyForStream(stream));
Eric Laurentde070132010-07-13 04:45:46 -07001909 return NO_ERROR;
1910 } break;
1911
François Gaffiecfe17322018-11-07 13:41:29 +01001912 case SET_VOLUME_ATTRIBUTES: {
1913 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1914 audio_attributes_t attributes = {};
1915 status_t status = data.read(&attributes, sizeof(audio_attributes_t));
1916 if (status != NO_ERROR) {
1917 return status;
1918 }
1919 int index = data.readInt32();
1920 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
1921
1922 reply->writeInt32(static_cast <uint32_t>(setVolumeIndexForAttributes(attributes,
1923 index, device)));
1924 return NO_ERROR;
1925 } break;
1926
1927 case GET_VOLUME_ATTRIBUTES: {
1928 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1929 audio_attributes_t attributes = {};
1930 status_t status = data.read(&attributes, sizeof(audio_attributes_t));
1931 if (status != NO_ERROR) {
1932 return status;
1933 }
1934 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
1935
1936 int index = 0;
1937 status = getVolumeIndexForAttributes(attributes, index, device);
1938 reply->writeInt32(static_cast <uint32_t>(status));
1939 if (status == NO_ERROR) {
1940 reply->writeInt32(index);
1941 }
1942 return NO_ERROR;
1943 } break;
1944
1945 case GET_MIN_VOLUME_FOR_ATTRIBUTES: {
1946 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1947 audio_attributes_t attributes = {};
1948 status_t status = data.read(&attributes, sizeof(audio_attributes_t));
1949 if (status != NO_ERROR) {
1950 return status;
1951 }
1952
1953 int index = 0;
1954 status = getMinVolumeIndexForAttributes(attributes, index);
1955 reply->writeInt32(static_cast <uint32_t>(status));
1956 if (status == NO_ERROR) {
1957 reply->writeInt32(index);
1958 }
1959 return NO_ERROR;
1960 } break;
1961
1962 case GET_MAX_VOLUME_FOR_ATTRIBUTES: {
1963 CHECK_INTERFACE(IAudioPolicyService, data, reply);
1964 audio_attributes_t attributes = {};
1965 status_t status = data.read(&attributes, sizeof(audio_attributes_t));
1966 if (status != NO_ERROR) {
1967 return status;
1968 }
1969
1970 int index = 0;
1971 status = getMaxVolumeIndexForAttributes(attributes, index);
1972 reply->writeInt32(static_cast <uint32_t>(status));
1973 if (status == NO_ERROR) {
1974 reply->writeInt32(index);
1975 }
1976 return NO_ERROR;
1977 } break;
1978
Glenn Kasten6b2718c2011-02-04 13:54:26 -08001979 case GET_DEVICES_FOR_STREAM: {
1980 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Dima Zavinfce7a472011-04-19 22:30:36 -07001981 audio_stream_type_t stream =
1982 static_cast <audio_stream_type_t>(data.readInt32());
Glenn Kasten6b2718c2011-02-04 13:54:26 -08001983 reply->writeInt32(static_cast <int>(getDevicesForStream(stream)));
1984 return NO_ERROR;
1985 } break;
1986
Eric Laurentde070132010-07-13 04:45:46 -07001987 case GET_OUTPUT_FOR_EFFECT: {
1988 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07001989 effect_descriptor_t desc = {};
1990 if (data.read(&desc, sizeof(desc)) != NO_ERROR) {
1991 android_errorWriteLog(0x534e4554, "73126106");
1992 }
1993 (void)sanitizeEffectDescriptor(&desc);
Eric Laurentde070132010-07-13 04:45:46 -07001994 audio_io_handle_t output = getOutputForEffect(&desc);
1995 reply->writeInt32(static_cast <int>(output));
1996 return NO_ERROR;
1997 } break;
1998
1999 case REGISTER_EFFECT: {
2000 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07002001 effect_descriptor_t desc = {};
2002 if (data.read(&desc, sizeof(desc)) != NO_ERROR) {
2003 android_errorWriteLog(0x534e4554, "73126106");
2004 }
2005 (void)sanitizeEffectDescriptor(&desc);
Eric Laurent7c7f10b2011-06-17 21:29:58 -07002006 audio_io_handle_t io = data.readInt32();
Eric Laurentde070132010-07-13 04:45:46 -07002007 uint32_t strategy = data.readInt32();
Glenn Kastend848eb42016-03-08 13:42:11 -08002008 audio_session_t session = (audio_session_t) data.readInt32();
Eric Laurentde070132010-07-13 04:45:46 -07002009 int id = data.readInt32();
2010 reply->writeInt32(static_cast <int32_t>(registerEffect(&desc,
Eric Laurent7c7f10b2011-06-17 21:29:58 -07002011 io,
Eric Laurentde070132010-07-13 04:45:46 -07002012 strategy,
2013 session,
2014 id)));
2015 return NO_ERROR;
2016 } break;
2017
2018 case UNREGISTER_EFFECT: {
2019 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2020 int id = data.readInt32();
2021 reply->writeInt32(static_cast <int32_t>(unregisterEffect(id)));
2022 return NO_ERROR;
2023 } break;
2024
Eric Laurentdb7c0792011-08-10 10:37:50 -07002025 case SET_EFFECT_ENABLED: {
2026 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2027 int id = data.readInt32();
2028 bool enabled = static_cast <bool>(data.readInt32());
2029 reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled)));
2030 return NO_ERROR;
2031 } break;
2032
Eric Laurent6c796322019-04-09 14:13:17 -07002033 case MOVE_EFFECTS_TO_IO: {
2034 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2035 std::vector<int> ids;
2036 int32_t size;
2037 status_t status = data.readInt32(&size);
2038 if (status != NO_ERROR) {
2039 return status;
2040 }
2041 if (size > MAX_ITEMS_PER_LIST) {
2042 return BAD_VALUE;
2043 }
2044 for (int32_t i = 0; i < size; i++) {
2045 int id;
2046 status = data.readInt32(&id);
2047 if (status != NO_ERROR) {
2048 return status;
2049 }
2050 ids.push_back(id);
2051 }
2052
2053 audio_io_handle_t io = data.readInt32();
2054 reply->writeInt32(static_cast <int32_t>(moveEffectsToIo(ids, io)));
2055 return NO_ERROR;
2056 } break;
2057
Eric Laurenteda6c362011-02-02 09:33:30 -08002058 case IS_STREAM_ACTIVE: {
2059 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kastenfff6d712012-01-12 16:38:12 -08002060 audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
Eric Laurenteda6c362011-02-02 09:33:30 -08002061 uint32_t inPastMs = (uint32_t)data.readInt32();
Eric Laurentebcb2542014-03-05 18:30:08 -08002062 reply->writeInt32( isStreamActive(stream, inPastMs) );
Eric Laurenteda6c362011-02-02 09:33:30 -08002063 return NO_ERROR;
2064 } break;
2065
Jean-Michel Trivi272ab542013-02-04 16:26:02 -08002066 case IS_STREAM_ACTIVE_REMOTELY: {
2067 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2068 audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
2069 uint32_t inPastMs = (uint32_t)data.readInt32();
Eric Laurentebcb2542014-03-05 18:30:08 -08002070 reply->writeInt32( isStreamActiveRemotely(stream, inPastMs) );
Jean-Michel Trivi272ab542013-02-04 16:26:02 -08002071 return NO_ERROR;
2072 } break;
2073
Jean-Michel Trivid7086032012-10-10 12:11:16 -07002074 case IS_SOURCE_ACTIVE: {
2075 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2076 audio_source_t source = (audio_source_t) data.readInt32();
2077 reply->writeInt32( isSourceActive(source));
2078 return NO_ERROR;
2079 }
2080
Eric Laurent57dae992011-07-24 13:36:09 -07002081 case QUERY_DEFAULT_PRE_PROCESSING: {
2082 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kastend848eb42016-03-08 13:42:11 -08002083 audio_session_t audioSession = (audio_session_t) data.readInt32();
Eric Laurent57dae992011-07-24 13:36:09 -07002084 uint32_t count = data.readInt32();
Eric Laurent74adca92014-11-05 12:15:36 -08002085 if (count > AudioEffect::kMaxPreProcessing) {
2086 count = AudioEffect::kMaxPreProcessing;
2087 }
Eric Laurent57dae992011-07-24 13:36:09 -07002088 uint32_t retCount = count;
Andy Hungb0272092018-04-12 11:06:56 -07002089 effect_descriptor_t *descriptors = new effect_descriptor_t[count]{};
Eric Laurent57dae992011-07-24 13:36:09 -07002090 status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount);
2091 reply->writeInt32(status);
2092 if (status != NO_ERROR && status != NO_MEMORY) {
2093 retCount = 0;
2094 }
2095 reply->writeInt32(retCount);
Eric Laurent74adca92014-11-05 12:15:36 -08002096 if (retCount != 0) {
Eric Laurent57dae992011-07-24 13:36:09 -07002097 if (retCount < count) {
2098 count = retCount;
2099 }
2100 reply->write(descriptors, sizeof(effect_descriptor_t) * count);
2101 }
2102 delete[] descriptors;
2103 return status;
2104 }
2105
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +01002106 case IS_OFFLOAD_SUPPORTED: {
2107 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07002108 audio_offload_info_t info = {};
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +01002109 data.read(&info, sizeof(audio_offload_info_t));
2110 bool isSupported = isOffloadSupported(info);
2111 reply->writeInt32(isSupported);
2112 return NO_ERROR;
2113 }
2114
Michael Chana94fbb22018-04-24 14:31:19 +10002115 case IS_DIRECT_OUTPUT_SUPPORTED: {
2116 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2117 audio_config_base_t config = {};
2118 audio_attributes_t attributes = {};
2119 status_t status = data.read(&config, sizeof(audio_config_base_t));
2120 if (status != NO_ERROR) return status;
2121 status = data.read(&attributes, sizeof(audio_attributes_t));
2122 if (status != NO_ERROR) return status;
2123 reply->writeInt32(isDirectOutputSupported(config, attributes));
2124 return NO_ERROR;
2125 }
2126
Eric Laurent203b1a12014-04-01 10:34:16 -07002127 case LIST_AUDIO_PORTS: {
2128 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2129 audio_port_role_t role = (audio_port_role_t)data.readInt32();
2130 audio_port_type_t type = (audio_port_type_t)data.readInt32();
2131 unsigned int numPortsReq = data.readInt32();
Eric Laurent1d670b12015-02-06 10:44:24 -08002132 if (numPortsReq > MAX_ITEMS_PER_LIST) {
2133 numPortsReq = MAX_ITEMS_PER_LIST;
2134 }
Eric Laurent203b1a12014-04-01 10:34:16 -07002135 unsigned int numPorts = numPortsReq;
Eric Laurent203b1a12014-04-01 10:34:16 -07002136 struct audio_port *ports =
2137 (struct audio_port *)calloc(numPortsReq, sizeof(struct audio_port));
Eric Laurent1d670b12015-02-06 10:44:24 -08002138 if (ports == NULL) {
2139 reply->writeInt32(NO_MEMORY);
2140 reply->writeInt32(0);
2141 return NO_ERROR;
2142 }
2143 unsigned int generation;
Eric Laurent203b1a12014-04-01 10:34:16 -07002144 status_t status = listAudioPorts(role, type, &numPorts, ports, &generation);
2145 reply->writeInt32(status);
2146 reply->writeInt32(numPorts);
Eric Laurent203b1a12014-04-01 10:34:16 -07002147
2148 if (status == NO_ERROR) {
2149 if (numPortsReq > numPorts) {
2150 numPortsReq = numPorts;
2151 }
2152 reply->write(ports, numPortsReq * sizeof(struct audio_port));
2153 reply->writeInt32(generation);
2154 }
2155 free(ports);
2156 return NO_ERROR;
2157 }
2158
2159 case GET_AUDIO_PORT: {
2160 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Wei Jiae995e472015-09-09 09:48:34 -07002161 struct audio_port port = {};
2162 if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) {
2163 ALOGE("b/23912202");
2164 }
Eric Laurent203b1a12014-04-01 10:34:16 -07002165 status_t status = getAudioPort(&port);
2166 reply->writeInt32(status);
2167 if (status == NO_ERROR) {
2168 reply->write(&port, sizeof(struct audio_port));
2169 }
2170 return NO_ERROR;
2171 }
2172
2173 case CREATE_AUDIO_PATCH: {
2174 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07002175 struct audio_patch patch = {};
Eric Laurent203b1a12014-04-01 10:34:16 -07002176 data.read(&patch, sizeof(struct audio_patch));
Glenn Kastena13cde92016-03-28 15:26:02 -07002177 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
Wei Jiae995e472015-09-09 09:48:34 -07002178 if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) {
2179 ALOGE("b/23912202");
2180 }
Eric Laurent203b1a12014-04-01 10:34:16 -07002181 status_t status = createAudioPatch(&patch, &handle);
2182 reply->writeInt32(status);
2183 if (status == NO_ERROR) {
2184 reply->write(&handle, sizeof(audio_patch_handle_t));
2185 }
2186 return NO_ERROR;
2187 }
2188
2189 case RELEASE_AUDIO_PATCH: {
2190 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07002191 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
Eric Laurent203b1a12014-04-01 10:34:16 -07002192 data.read(&handle, sizeof(audio_patch_handle_t));
2193 status_t status = releaseAudioPatch(handle);
2194 reply->writeInt32(status);
2195 return NO_ERROR;
2196 }
2197
2198 case LIST_AUDIO_PATCHES: {
2199 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2200 unsigned int numPatchesReq = data.readInt32();
Eric Laurent1d670b12015-02-06 10:44:24 -08002201 if (numPatchesReq > MAX_ITEMS_PER_LIST) {
2202 numPatchesReq = MAX_ITEMS_PER_LIST;
2203 }
Eric Laurent203b1a12014-04-01 10:34:16 -07002204 unsigned int numPatches = numPatchesReq;
Eric Laurent203b1a12014-04-01 10:34:16 -07002205 struct audio_patch *patches =
2206 (struct audio_patch *)calloc(numPatchesReq,
2207 sizeof(struct audio_patch));
Eric Laurent1d670b12015-02-06 10:44:24 -08002208 if (patches == NULL) {
2209 reply->writeInt32(NO_MEMORY);
2210 reply->writeInt32(0);
2211 return NO_ERROR;
2212 }
2213 unsigned int generation;
Eric Laurent203b1a12014-04-01 10:34:16 -07002214 status_t status = listAudioPatches(&numPatches, patches, &generation);
2215 reply->writeInt32(status);
2216 reply->writeInt32(numPatches);
2217 if (status == NO_ERROR) {
2218 if (numPatchesReq > numPatches) {
2219 numPatchesReq = numPatches;
2220 }
2221 reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
2222 reply->writeInt32(generation);
2223 }
2224 free(patches);
2225 return NO_ERROR;
2226 }
2227
2228 case SET_AUDIO_PORT_CONFIG: {
2229 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07002230 struct audio_port_config config = {};
Eric Laurent203b1a12014-04-01 10:34:16 -07002231 data.read(&config, sizeof(struct audio_port_config));
Andy Hungb0272092018-04-12 11:06:56 -07002232 (void)sanitizeAudioPortConfig(&config);
Eric Laurent203b1a12014-04-01 10:34:16 -07002233 status_t status = setAudioPortConfig(&config);
2234 reply->writeInt32(status);
2235 return NO_ERROR;
2236 }
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07002237
Eric Laurentb52c1522014-05-20 11:27:36 -07002238 case REGISTER_CLIENT: {
2239 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2240 sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
2241 data.readStrongBinder());
2242 registerClient(client);
2243 return NO_ERROR;
2244 } break;
Eric Laurent203b1a12014-04-01 10:34:16 -07002245
Eric Laurente8726fe2015-06-26 09:39:24 -07002246 case SET_AUDIO_PORT_CALLBACK_ENABLED: {
2247 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2248 setAudioPortCallbacksEnabled(data.readInt32() == 1);
2249 return NO_ERROR;
2250 } break;
2251
François Gaffiecfe17322018-11-07 13:41:29 +01002252 case SET_AUDIO_VOLUME_GROUP_CALLBACK_ENABLED: {
2253 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2254 setAudioVolumeGroupCallbacksEnabled(data.readInt32() == 1);
2255 return NO_ERROR;
2256 } break;
2257
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07002258 case ACQUIRE_SOUNDTRIGGER_SESSION: {
2259 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Glenn Kastena13cde92016-03-28 15:26:02 -07002260 audio_session_t session = AUDIO_SESSION_NONE;
2261 audio_io_handle_t ioHandle = AUDIO_IO_HANDLE_NONE;
2262 audio_devices_t device = AUDIO_DEVICE_NONE;
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07002263 status_t status = acquireSoundTriggerSession(&session, &ioHandle, &device);
2264 reply->writeInt32(status);
2265 if (status == NO_ERROR) {
2266 reply->writeInt32(session);
2267 reply->writeInt32(ioHandle);
2268 reply->writeInt32(device);
2269 }
2270 return NO_ERROR;
2271 } break;
2272
2273 case RELEASE_SOUNDTRIGGER_SESSION: {
2274 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07002275 audio_session_t session = (audio_session_t)data.readInt32();
2276 status_t status = releaseSoundTriggerSession(session);
2277 reply->writeInt32(status);
2278 return NO_ERROR;
2279 } break;
2280
Eric Laurentbb6c9a02014-09-25 14:11:47 -07002281 case GET_PHONE_STATE: {
2282 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2283 reply->writeInt32((int32_t)getPhoneState());
2284 return NO_ERROR;
2285 } break;
2286
Eric Laurentbaac1832014-12-01 17:52:59 -08002287 case REGISTER_POLICY_MIXES: {
2288 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2289 bool registration = data.readInt32() == 1;
2290 Vector<AudioMix> mixes;
2291 size_t size = (size_t)data.readInt32();
2292 if (size > MAX_MIXES_PER_POLICY) {
2293 size = MAX_MIXES_PER_POLICY;
2294 }
2295 for (size_t i = 0; i < size; i++) {
2296 AudioMix mix;
2297 if (mix.readFromParcel((Parcel*)&data) == NO_ERROR) {
2298 mixes.add(mix);
2299 }
2300 }
2301 status_t status = registerPolicyMixes(mixes, registration);
2302 reply->writeInt32(status);
2303 return NO_ERROR;
2304 } break;
2305
Eric Laurent554a2772015-04-10 11:29:24 -07002306 case START_AUDIO_SOURCE: {
2307 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Andy Hungb0272092018-04-12 11:06:56 -07002308 struct audio_port_config source = {};
Eric Laurent554a2772015-04-10 11:29:24 -07002309 data.read(&source, sizeof(struct audio_port_config));
Andy Hungb0272092018-04-12 11:06:56 -07002310 (void)sanitizeAudioPortConfig(&source);
2311 audio_attributes_t attributes = {};
Eric Laurent554a2772015-04-10 11:29:24 -07002312 data.read(&attributes, sizeof(audio_attributes_t));
Kevin Rocard39fdbd02017-11-13 11:15:27 -08002313 sanetizeAudioAttributes(&attributes);
Eric Laurent3e6c7e12018-07-27 17:09:23 -07002314 audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
2315 status_t status = startAudioSource(&source, &attributes, &portId);
Eric Laurent554a2772015-04-10 11:29:24 -07002316 reply->writeInt32(status);
Eric Laurent3e6c7e12018-07-27 17:09:23 -07002317 reply->writeInt32(portId);
Eric Laurent554a2772015-04-10 11:29:24 -07002318 return NO_ERROR;
2319 } break;
2320
2321 case STOP_AUDIO_SOURCE: {
2322 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurent3e6c7e12018-07-27 17:09:23 -07002323 audio_port_handle_t portId = (audio_port_handle_t) data.readInt32();
2324 status_t status = stopAudioSource(portId);
Eric Laurent554a2772015-04-10 11:29:24 -07002325 reply->writeInt32(status);
2326 return NO_ERROR;
2327 } break;
2328
Andy Hung2ddee192015-12-18 17:34:44 -08002329 case SET_MASTER_MONO: {
2330 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2331 bool mono = static_cast<bool>(data.readInt32());
2332 status_t status = setMasterMono(mono);
2333 reply->writeInt32(status);
2334 return NO_ERROR;
2335 } break;
2336
2337 case GET_MASTER_MONO: {
2338 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2339 bool mono;
2340 status_t status = getMasterMono(&mono);
2341 reply->writeInt32(status);
2342 if (status == NO_ERROR) {
2343 reply->writeInt32(static_cast<int32_t>(mono));
2344 }
2345 return NO_ERROR;
2346 } break;
2347
Eric Laurentac9cef52017-06-09 15:46:26 -07002348 case GET_STREAM_VOLUME_DB: {
2349 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2350 audio_stream_type_t stream =
2351 static_cast <audio_stream_type_t>(data.readInt32());
2352 int index = static_cast <int>(data.readInt32());
2353 audio_devices_t device =
2354 static_cast <audio_devices_t>(data.readUint32());
2355 reply->writeFloat(getStreamVolumeDB(stream, index, device));
2356 return NO_ERROR;
2357 }
2358
jiabin81772902018-04-02 17:52:27 -07002359 case GET_SURROUND_FORMATS: {
2360 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2361 unsigned int numSurroundFormatsReq = data.readUint32();
2362 if (numSurroundFormatsReq > MAX_ITEMS_PER_LIST) {
2363 numSurroundFormatsReq = MAX_ITEMS_PER_LIST;
2364 }
2365 bool reported = data.readBool();
2366 unsigned int numSurroundFormats = numSurroundFormatsReq;
2367 audio_format_t *surroundFormats = (audio_format_t *)calloc(
2368 numSurroundFormats, sizeof(audio_format_t));
2369 bool *surroundFormatsEnabled = (bool *)calloc(numSurroundFormats, sizeof(bool));
2370 if (numSurroundFormatsReq > 0 &&
2371 (surroundFormats == NULL || surroundFormatsEnabled == NULL)) {
2372 free(surroundFormats);
2373 free(surroundFormatsEnabled);
2374 reply->writeInt32(NO_MEMORY);
2375 return NO_ERROR;
2376 }
2377 status_t status = getSurroundFormats(
2378 &numSurroundFormats, surroundFormats, surroundFormatsEnabled, reported);
2379 reply->writeInt32(status);
2380
2381 if (status == NO_ERROR) {
2382 reply->writeUint32(numSurroundFormats);
2383 if (numSurroundFormatsReq > numSurroundFormats) {
2384 numSurroundFormatsReq = numSurroundFormats;
2385 }
2386 reply->write(surroundFormats, numSurroundFormatsReq * sizeof(audio_format_t));
2387 reply->write(surroundFormatsEnabled, numSurroundFormatsReq * sizeof(bool));
2388 }
2389 free(surroundFormats);
2390 free(surroundFormatsEnabled);
2391 return NO_ERROR;
2392 }
2393
2394 case SET_SURROUND_FORMAT_ENABLED: {
2395 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2396 audio_format_t audioFormat = (audio_format_t) data.readInt32();
2397 bool enabled = data.readBool();
2398 status_t status = setSurroundFormatEnabled(audioFormat, enabled);
2399 reply->writeInt32(status);
2400 return NO_ERROR;
2401 }
2402
Arun Mirpuri11029ad2018-12-19 20:45:19 -08002403 case GET_OFFLOAD_FORMATS_A2DP: {
2404 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2405 std::vector<audio_format_t> encodingFormats;
2406 status_t status = getHwOffloadEncodingFormatsSupportedForA2DP(&encodingFormats);
2407 reply->writeInt32(status);
2408 if (status != NO_ERROR) {
2409 return NO_ERROR;
2410 }
2411 reply->writeUint32(static_cast<uint32_t>(encodingFormats.size()));
2412 for (size_t i = 0; i < encodingFormats.size(); i++)
2413 reply->writeInt32(static_cast<int32_t>(encodingFormats[i]));
2414 return NO_ERROR;
2415 }
2416
2417
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07002418 case ADD_STREAM_DEFAULT_EFFECT: {
2419 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2420 effect_uuid_t type;
2421 status_t status = data.read(&type, sizeof(effect_uuid_t));
2422 if (status != NO_ERROR) {
2423 return status;
2424 }
2425 String16 opPackageName;
2426 status = data.readString16(&opPackageName);
2427 if (status != NO_ERROR) {
2428 return status;
2429 }
2430 effect_uuid_t uuid;
2431 status = data.read(&uuid, sizeof(effect_uuid_t));
2432 if (status != NO_ERROR) {
2433 return status;
2434 }
2435 int32_t priority = data.readInt32();
2436 audio_usage_t usage = (audio_usage_t) data.readInt32();
2437 audio_unique_id_t id = 0;
2438 reply->writeInt32(static_cast <int32_t>(addStreamDefaultEffect(&type,
2439 opPackageName,
2440 &uuid,
2441 priority,
2442 usage,
2443 &id)));
2444 reply->writeInt32(id);
2445 return NO_ERROR;
2446 }
2447
2448 case REMOVE_STREAM_DEFAULT_EFFECT: {
2449 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2450 audio_unique_id_t id = static_cast<audio_unique_id_t>(data.readInt32());
2451 reply->writeInt32(static_cast <int32_t>(removeStreamDefaultEffect(id)));
2452 return NO_ERROR;
2453 }
2454
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07002455 case ADD_SOURCE_DEFAULT_EFFECT: {
2456 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2457 effect_uuid_t type;
2458 status_t status = data.read(&type, sizeof(effect_uuid_t));
2459 if (status != NO_ERROR) {
2460 return status;
2461 }
2462 String16 opPackageName;
2463 status = data.readString16(&opPackageName);
2464 if (status != NO_ERROR) {
2465 return status;
2466 }
2467 effect_uuid_t uuid;
2468 status = data.read(&uuid, sizeof(effect_uuid_t));
2469 if (status != NO_ERROR) {
2470 return status;
2471 }
2472 int32_t priority = data.readInt32();
2473 audio_source_t source = (audio_source_t) data.readInt32();
2474 audio_unique_id_t id = 0;
2475 reply->writeInt32(static_cast <int32_t>(addSourceDefaultEffect(&type,
2476 opPackageName,
2477 &uuid,
2478 priority,
2479 source,
2480 &id)));
2481 reply->writeInt32(id);
2482 return NO_ERROR;
2483 }
2484
2485 case REMOVE_SOURCE_DEFAULT_EFFECT: {
2486 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2487 audio_unique_id_t id = static_cast<audio_unique_id_t>(data.readInt32());
2488 reply->writeInt32(static_cast <int32_t>(removeSourceDefaultEffect(id)));
2489 return NO_ERROR;
2490 }
2491
Eric Laurentb78763e2018-10-17 10:08:02 -07002492 case SET_ASSISTANT_UID: {
2493 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2494 int32_t uid;
2495 status_t status = data.readInt32(&uid);
2496 if (status != NO_ERROR) {
2497 return status;
2498 }
2499 status = setAssistantUid(uid);
2500 reply->writeInt32(static_cast <int32_t>(status));
2501 return NO_ERROR;
2502 }
2503
2504 case SET_A11Y_SERVICES_UIDS: {
2505 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2506 std::vector<uid_t> uids;
2507 int32_t size;
2508 status_t status = data.readInt32(&size);
2509 if (status != NO_ERROR) {
2510 return status;
2511 }
2512 if (size > MAX_ITEMS_PER_LIST) {
2513 size = MAX_ITEMS_PER_LIST;
2514 }
2515 for (int32_t i = 0; i < size; i++) {
2516 int32_t uid;
2517 status = data.readInt32(&uid);
2518 if (status != NO_ERROR) {
2519 return status;
2520 }
2521 uids.push_back(uid);
2522 }
2523 status = setA11yServicesUids(uids);
2524 reply->writeInt32(static_cast <int32_t>(status));
2525 return NO_ERROR;
2526 }
2527
jiabin6012f912018-11-02 17:06:30 -07002528 case IS_HAPTIC_PLAYBACK_SUPPORTED: {
2529 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2530 bool isSupported = isHapticPlaybackSupported();
2531 reply->writeBool(isSupported);
Kevin Rocardb99cc752019-03-21 20:52:24 -07002532 return NO_ERROR;
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002533 }
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002534 case SET_UID_DEVICE_AFFINITY: {
2535 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2536 const uid_t uid = (uid_t) data.readInt32();
jiabin6a02d532020-08-07 11:56:38 -07002537 AudioDeviceTypeAddrVector devices;
2538 status_t status = data.readParcelableVector(&devices);
2539 if (status != NO_ERROR) {
2540 return status;
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002541 }
jiabin6a02d532020-08-07 11:56:38 -07002542 status = setUidDeviceAffinities(uid, devices);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002543 reply->writeInt32(status);
2544 return NO_ERROR;
2545 }
2546
2547 case REMOVE_UID_DEVICE_AFFINITY: {
2548 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2549 const uid_t uid = (uid_t) data.readInt32();
2550 status_t status = removeUidDeviceAffinities(uid);
2551 reply->writeInt32(status);
jiabin6012f912018-11-02 17:06:30 -07002552 return NO_ERROR;
2553 }
2554
Oscar Azucena90e77632019-11-27 17:12:28 -08002555 case SET_USERID_DEVICE_AFFINITY: {
2556 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2557 const int userId = (int) data.readInt32();
jiabin6a02d532020-08-07 11:56:38 -07002558 AudioDeviceTypeAddrVector devices;
2559 status_t status = data.readParcelableVector(&devices);
2560 if (status != NO_ERROR) {
2561 return status;
Oscar Azucena90e77632019-11-27 17:12:28 -08002562 }
jiabin6a02d532020-08-07 11:56:38 -07002563 status = setUserIdDeviceAffinities(userId, devices);
Oscar Azucena90e77632019-11-27 17:12:28 -08002564 reply->writeInt32(status);
2565 return NO_ERROR;
2566 }
2567
2568 case REMOVE_USERID_DEVICE_AFFINITY: {
2569 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2570 const int userId = (int) data.readInt32();
2571 status_t status = removeUserIdDeviceAffinities(userId);
2572 reply->writeInt32(status);
2573 return NO_ERROR;
2574 }
2575
François Gaffied0ba9ed2018-11-05 11:50:42 +01002576 case LIST_AUDIO_PRODUCT_STRATEGIES: {
2577 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2578 AudioProductStrategyVector strategies;
2579 status_t status = listAudioProductStrategies(strategies);
2580 reply->writeInt32(status);
2581 if (status != NO_ERROR) {
François Gaffie4b2018b2018-11-07 11:18:59 +01002582 return NO_ERROR;
François Gaffied0ba9ed2018-11-05 11:50:42 +01002583 }
2584 size_t size = strategies.size();
2585 size_t sizePosition = reply->dataPosition();
2586 reply->writeInt32(size);
2587 size_t finalSize = size;
2588 for (size_t i = 0; i < size; i++) {
2589 size_t position = reply->dataPosition();
2590 if (strategies[i].writeToParcel(reply) != NO_ERROR) {
2591 reply->setDataPosition(position);
2592 finalSize--;
2593 }
2594 }
2595 if (size != finalSize) {
2596 size_t position = reply->dataPosition();
2597 reply->setDataPosition(sizePosition);
2598 reply->writeInt32(finalSize);
2599 reply->setDataPosition(position);
2600 }
2601 return NO_ERROR;
2602 }
2603
2604 case GET_STRATEGY_FOR_ATTRIBUTES: {
2605 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2606 AudioAttributes attributes;
2607 status_t status = attributes.readFromParcel(&data);
2608 if (status != NO_ERROR) {
2609 return status;
2610 }
François Gaffie4b2018b2018-11-07 11:18:59 +01002611 product_strategy_t strategy;
2612 status = getProductStrategyFromAudioAttributes(attributes, strategy);
2613 reply->writeInt32(status);
2614 if (status != NO_ERROR) {
2615 return NO_ERROR;
2616 }
François Gaffied0ba9ed2018-11-05 11:50:42 +01002617 reply->writeUint32(static_cast<int>(strategy));
2618 return NO_ERROR;
2619 }
2620
François Gaffie4b2018b2018-11-07 11:18:59 +01002621 case LIST_AUDIO_VOLUME_GROUPS: {
2622 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2623 AudioVolumeGroupVector groups;
2624 status_t status = listAudioVolumeGroups(groups);
2625 reply->writeInt32(status);
2626 if (status != NO_ERROR) {
2627 return NO_ERROR;
2628 }
2629 size_t size = groups.size();
2630 size_t sizePosition = reply->dataPosition();
2631 reply->writeInt32(size);
2632 size_t finalSize = size;
2633 for (size_t i = 0; i < size; i++) {
2634 size_t position = reply->dataPosition();
2635 if (groups[i].writeToParcel(reply) != NO_ERROR) {
2636 reply->setDataPosition(position);
2637 finalSize--;
2638 }
2639 }
2640 if (size != finalSize) {
2641 size_t position = reply->dataPosition();
2642 reply->setDataPosition(sizePosition);
2643 reply->writeInt32(finalSize);
2644 reply->setDataPosition(position);
2645 }
2646 return NO_ERROR;
2647 }
2648
2649 case GET_VOLUME_GROUP_FOR_ATTRIBUTES: {
2650 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2651 AudioAttributes attributes;
2652 status_t status = attributes.readFromParcel(&data);
2653 if (status != NO_ERROR) {
2654 return status;
2655 }
Hayden Gomes524159d2019-12-23 14:41:47 -08002656
François Gaffie4b2018b2018-11-07 11:18:59 +01002657 volume_group_t group;
2658 status = getVolumeGroupFromAudioAttributes(attributes, group);
François Gaffie4b2018b2018-11-07 11:18:59 +01002659 if (status != NO_ERROR) {
2660 return NO_ERROR;
2661 }
Hayden Gomes524159d2019-12-23 14:41:47 -08002662
2663 reply->writeInt32(status);
François Gaffie4b2018b2018-11-07 11:18:59 +01002664 reply->writeUint32(static_cast<int>(group));
2665 return NO_ERROR;
2666 }
2667
Hayden Gomes524159d2019-12-23 14:41:47 -08002668 case SET_SUPPORTED_SYSTEM_USAGES: {
2669 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2670 std::vector<audio_usage_t> systemUsages;
2671
2672 int32_t size;
2673 status_t status = data.readInt32(&size);
2674 if (status != NO_ERROR) {
2675 return status;
2676 }
2677 if (size > MAX_ITEMS_PER_LIST) {
2678 size = MAX_ITEMS_PER_LIST;
2679 }
2680
2681 for (int32_t i = 0; i < size; i++) {
2682 int32_t systemUsageInt;
2683 status = data.readInt32(&systemUsageInt);
2684 if (status != NO_ERROR) {
2685 return status;
2686 }
2687
2688 audio_usage_t systemUsage = static_cast<audio_usage_t>(systemUsageInt);
2689 systemUsages.push_back(systemUsage);
2690 }
2691 status = setSupportedSystemUsages(systemUsages);
2692 reply->writeInt32(static_cast <int32_t>(status));
2693 return NO_ERROR;
2694 }
2695
Kevin Rocardb99cc752019-03-21 20:52:24 -07002696 case SET_ALLOWED_CAPTURE_POLICY: {
2697 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2698 uid_t uid = data.readInt32();
2699 audio_flags_mask_t flags = data.readInt32();
2700 status_t status = setAllowedCapturePolicy(uid, flags);
2701 reply->writeInt32(status);
2702 return NO_ERROR;
2703 }
2704
Eric Laurent6ede98f2019-06-11 14:50:30 -07002705 case SET_RTT_ENABLED: {
2706 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2707 bool enabled = static_cast<bool>(data.readInt32());
2708 status_t status = setRttEnabled(enabled);
2709 reply->writeInt32(status);
2710 return NO_ERROR;
2711 }
2712
Eric Laurent8340e672019-11-06 11:01:08 -08002713 case IS_CALL_SCREEN_MODE_SUPPORTED: {
2714 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2715 bool isAvailable = isCallScreenModeSupported();
2716 reply->writeBool(isAvailable);
2717 return NO_ERROR;
2718 }
2719
jiabin0a488932020-08-07 17:32:40 -07002720 case SET_DEVICES_ROLE_FOR_PRODUCT_STRATEGY: {
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002721 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2722 product_strategy_t strategy = (product_strategy_t) data.readUint32();
jiabin0a488932020-08-07 17:32:40 -07002723 device_role_t role = (device_role_t) data.readUint32();
2724 AudioDeviceTypeAddrVector devices;
2725 status_t status = data.readParcelableVector(&devices);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002726 if (status != NO_ERROR) {
2727 return status;
2728 }
jiabin0a488932020-08-07 17:32:40 -07002729 status = setDevicesRoleForStrategy(strategy, role, devices);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002730 reply->writeInt32(status);
2731 return NO_ERROR;
2732 }
2733
jiabin0a488932020-08-07 17:32:40 -07002734 case REMOVE_DEVICES_ROLE_FOR_PRODUCT_STRATEGY: {
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002735 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2736 product_strategy_t strategy = (product_strategy_t) data.readUint32();
jiabin0a488932020-08-07 17:32:40 -07002737 device_role_t role = (device_role_t) data.readUint32();
2738 status_t status = removeDevicesRoleForStrategy(strategy, role);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002739 reply->writeInt32(status);
2740 return NO_ERROR;
2741 }
2742
jiabin0a488932020-08-07 17:32:40 -07002743 case GET_DEVICES_FOR_ROLE_AND_PRODUCT_STRATEGY: {
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002744 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2745 product_strategy_t strategy = (product_strategy_t) data.readUint32();
jiabin0a488932020-08-07 17:32:40 -07002746 device_role_t role = (device_role_t) data.readUint32();
2747 AudioDeviceTypeAddrVector devices;
2748 status_t status = getDevicesForRoleAndStrategy(strategy, role, devices);
2749 status_t marshall_status = reply->writeParcelableVector(devices);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002750 if (marshall_status != NO_ERROR) {
2751 return marshall_status;
2752 }
2753 reply->writeInt32(status);
2754 return NO_ERROR;
2755 }
2756
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08002757 case GET_DEVICES_FOR_ATTRIBUTES: {
2758 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2759 AudioAttributes attributes;
2760 status_t status = attributes.readFromParcel(&data);
2761 if (status != NO_ERROR) {
2762 return status;
2763 }
2764 AudioDeviceTypeAddrVector devices;
2765 status = getDevicesForAttributes(attributes.getAttributes(), &devices);
2766 // reply data formatted as:
2767 // - (int32) method call result from APM
2768 // - (int32) number of devices (n) if method call returned NO_ERROR
2769 // - n AudioDeviceTypeAddr if method call returned NO_ERROR
2770 reply->writeInt32(status);
2771 if (status != NO_ERROR) {
2772 return NO_ERROR;
2773 }
2774 status = reply->writeInt32(devices.size());
2775 if (status != NO_ERROR) {
2776 return status;
2777 }
2778 for (const auto& device : devices) {
2779 status = device.writeToParcel(reply);
2780 if (status != NO_ERROR) {
2781 return status;
2782 }
2783 }
2784
2785 return NO_ERROR;
2786 }
2787
Mikhail Naganov88b30d22020-03-09 19:43:13 +00002788 case AUDIO_MODULES_UPDATED: {
2789 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2790 onNewAudioModulesAvailable();
2791 return NO_ERROR;
2792 } break;
2793
Kohsuke Yatoha623a132020-03-24 20:10:26 -07002794 case SET_CURRENT_IME_UID: {
2795 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2796 int32_t uid;
2797 status_t status = data.readInt32(&uid);
2798 if (status != NO_ERROR) {
2799 return status;
2800 }
2801 status = setCurrentImeUid(uid);
2802 reply->writeInt32(static_cast <int32_t>(status));
2803 return NO_ERROR;
2804 }
2805
Ytai Ben-Tsvi1ef846b2020-03-26 09:41:15 -07002806 case REGISTER_SOUNDTRIGGER_CAPTURE_STATE_LISTENER: {
2807 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2808 sp<IBinder> binder = data.readStrongBinder();
2809 if (binder == nullptr) {
2810 return BAD_VALUE;
2811 }
2812 sp<ICaptureStateListener>
2813 listener = interface_cast<ICaptureStateListener>(
2814 binder);
2815 if (listener == nullptr) {
2816 return BAD_VALUE;
2817 }
2818 bool ret;
2819 status_t status =
2820 registerSoundTriggerCaptureStateListener(listener, &ret);
2821 LOG_ALWAYS_FATAL_IF(status != NO_ERROR,
2822 "Server returned unexpected status code: %d",
2823 status);
2824 status = reply->writeBool(ret);
2825 if (status != NO_ERROR) {
2826 return status;
2827 }
2828 return NO_ERROR;
2829 } break;
2830
Jiabin Huang3b98d322020-09-03 17:54:16 +00002831 case SET_DEVICES_ROLE_FOR_CAPTURE_PRESET: {
2832 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2833 audio_source_t audioSource = (audio_source_t) data.readUint32();
2834 device_role_t role = (device_role_t) data.readUint32();
2835 AudioDeviceTypeAddrVector devices;
2836 status_t status = data.readParcelableVector(&devices);
2837 if (status != NO_ERROR) {
2838 return status;
2839 }
2840 status = setDevicesRoleForCapturePreset(audioSource, role, devices);
2841 reply->writeInt32(status);
2842 return NO_ERROR;
2843 }
2844
2845 case ADD_DEVICES_ROLE_FOR_CAPTURE_PRESET: {
2846 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2847 audio_source_t audioSource = (audio_source_t) data.readUint32();
2848 device_role_t role = (device_role_t) data.readUint32();
2849 AudioDeviceTypeAddrVector devices;
2850 status_t status = data.readParcelableVector(&devices);
2851 if (status != NO_ERROR) {
2852 return status;
2853 }
2854 status = addDevicesRoleForCapturePreset(audioSource, role, devices);
2855 reply->writeInt32(status);
2856 return NO_ERROR;
2857 }
2858
2859 case REMOVE_DEVICES_ROLE_FOR_CAPTURE_PRESET: {
2860 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2861 audio_source_t audioSource = (audio_source_t) data.readUint32();
2862 device_role_t role = (device_role_t) data.readUint32();
2863 AudioDeviceTypeAddrVector devices;
2864 status_t status = data.readParcelableVector(&devices);
2865 if (status != NO_ERROR) {
2866 return status;
2867 }
2868 status = removeDevicesRoleForCapturePreset(audioSource, role, devices);
2869 reply->writeInt32(status);
2870 return NO_ERROR;
2871 }
2872
2873 case CLEAR_DEVICES_ROLE_FOR_CAPTURE_PRESET: {
2874 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2875 audio_source_t audioSource = (audio_source_t) data.readUint32();
2876 device_role_t role = (device_role_t) data.readUint32();
2877 status_t status = clearDevicesRoleForCapturePreset(audioSource, role);
2878 reply->writeInt32(status);
2879 return NO_ERROR;
2880 }
2881
2882 case GET_DEVICES_FOR_ROLE_AND_CAPTURE_PRESET: {
2883 CHECK_INTERFACE(IAudioPolicyService, data, reply);
2884 audio_source_t audioSource = (audio_source_t) data.readUint32();
2885 device_role_t role = (device_role_t) data.readUint32();
2886 AudioDeviceTypeAddrVector devices;
2887 status_t status = getDevicesForRoleAndCapturePreset(audioSource, role, devices);
2888 status_t marshall_status = reply->writeParcelableVector(devices);
2889 if (marshall_status != NO_ERROR) {
2890 return marshall_status;
2891 }
2892 reply->writeInt32(status);
2893 return NO_ERROR;
2894 }
2895
Eric Laurentc2f1f072009-07-17 12:17:14 -07002896 default:
2897 return BBinder::onTransact(code, data, reply, flags);
2898 }
2899}
2900
Andy Hungb0272092018-04-12 11:06:56 -07002901/** returns true if string overflow was prevented by zero termination */
2902template <size_t size>
2903static bool preventStringOverflow(char (&s)[size]) {
2904 if (strnlen(s, size) < size) return false;
2905 s[size - 1] = '\0';
2906 return true;
2907}
2908
Kevin Rocard39fdbd02017-11-13 11:15:27 -08002909void BnAudioPolicyService::sanetizeAudioAttributes(audio_attributes_t* attr)
2910{
2911 const size_t tagsMaxSize = AUDIO_ATTRIBUTES_TAGS_MAX_SIZE;
2912 if (strnlen(attr->tags, tagsMaxSize) >= tagsMaxSize) {
2913 android_errorWriteLog(0x534e4554, "68953950"); // SafetyNet logging
2914 }
2915 attr->tags[tagsMaxSize - 1] = '\0';
2916}
2917
Andy Hungb0272092018-04-12 11:06:56 -07002918/** returns BAD_VALUE if sanitization was required. */
2919status_t BnAudioPolicyService::sanitizeEffectDescriptor(effect_descriptor_t* desc)
2920{
2921 if (preventStringOverflow(desc->name)
2922 | /* always */ preventStringOverflow(desc->implementor)) {
2923 android_errorWriteLog(0x534e4554, "73126106"); // SafetyNet logging
2924 return BAD_VALUE;
2925 }
2926 return NO_ERROR;
2927}
2928
2929/** returns BAD_VALUE if sanitization was required. */
2930status_t BnAudioPolicyService::sanitizeAudioPortConfig(struct audio_port_config* config)
2931{
2932 if (config->type == AUDIO_PORT_TYPE_DEVICE &&
2933 preventStringOverflow(config->ext.device.address)) {
2934 return BAD_VALUE;
2935 }
2936 return NO_ERROR;
2937}
2938
Eric Laurentc2f1f072009-07-17 12:17:14 -07002939// ----------------------------------------------------------------------------
2940
Glenn Kasten40bc9062015-03-20 09:09:33 -07002941} // namespace android