1 /*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #define LOG_TAG "AudioPolicyIntefaceImpl"
18 //#define LOG_NDEBUG 0
19
20 #include "AudioPolicyService.h"
21 #include "TypeConverter.h"
22 #include <media/MediaMetricsItem.h>
23 #include <media/AudioPolicy.h>
24 #include <utils/Log.h>
25
26 namespace android {
27
28 const std::vector<audio_usage_t>& SYSTEM_USAGES = {
29 AUDIO_USAGE_CALL_ASSISTANT,
30 AUDIO_USAGE_EMERGENCY,
31 AUDIO_USAGE_SAFETY,
32 AUDIO_USAGE_VEHICLE_STATUS,
33 AUDIO_USAGE_ANNOUNCEMENT
34 };
35
isSystemUsage(audio_usage_t usage)36 bool isSystemUsage(audio_usage_t usage) {
37 return std::find(std::begin(SYSTEM_USAGES), std::end(SYSTEM_USAGES), usage)
38 != std::end(SYSTEM_USAGES);
39 }
40
isSupportedSystemUsage(audio_usage_t usage)41 bool AudioPolicyService::isSupportedSystemUsage(audio_usage_t usage) {
42 return std::find(std::begin(mSupportedSystemUsages), std::end(mSupportedSystemUsages), usage)
43 != std::end(mSupportedSystemUsages);
44 }
45
validateUsage(audio_usage_t usage)46 status_t AudioPolicyService::validateUsage(audio_usage_t usage) {
47 return validateUsage(usage, IPCThreadState::self()->getCallingPid(),
48 IPCThreadState::self()->getCallingUid());
49 }
50
validateUsage(audio_usage_t usage,pid_t pid,uid_t uid)51 status_t AudioPolicyService::validateUsage(audio_usage_t usage, pid_t pid, uid_t uid) {
52 if (isSystemUsage(usage)) {
53 if (isSupportedSystemUsage(usage)) {
54 if (!modifyAudioRoutingAllowed(pid, uid)) {
55 ALOGE("permission denied: modify audio routing not allowed for uid %d", uid);
56 return PERMISSION_DENIED;
57 }
58 } else {
59 return BAD_VALUE;
60 }
61 }
62 return NO_ERROR;
63 }
64
65
66
67 // ----------------------------------------------------------------------------
68
doOnNewAudioModulesAvailable()69 void AudioPolicyService::doOnNewAudioModulesAvailable()
70 {
71 if (mAudioPolicyManager == NULL) return;
72 Mutex::Autolock _l(mLock);
73 AutoCallerClear acc;
74 mAudioPolicyManager->onNewAudioModulesAvailable();
75 }
76
setDeviceConnectionState(audio_devices_t device,audio_policy_dev_state_t state,const char * device_address,const char * device_name,audio_format_t encodedFormat)77 status_t AudioPolicyService::setDeviceConnectionState(audio_devices_t device,
78 audio_policy_dev_state_t state,
79 const char *device_address,
80 const char *device_name,
81 audio_format_t encodedFormat)
82 {
83 if (mAudioPolicyManager == NULL) {
84 return NO_INIT;
85 }
86 if (!settingsAllowed()) {
87 return PERMISSION_DENIED;
88 }
89 if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE &&
90 state != AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) {
91 return BAD_VALUE;
92 }
93
94 ALOGV("setDeviceConnectionState()");
95 Mutex::Autolock _l(mLock);
96 AutoCallerClear acc;
97 return mAudioPolicyManager->setDeviceConnectionState(device, state,
98 device_address, device_name, encodedFormat);
99 }
100
getDeviceConnectionState(audio_devices_t device,const char * device_address)101 audio_policy_dev_state_t AudioPolicyService::getDeviceConnectionState(
102 audio_devices_t device,
103 const char *device_address)
104 {
105 if (mAudioPolicyManager == NULL) {
106 return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
107 }
108 AutoCallerClear acc;
109 return mAudioPolicyManager->getDeviceConnectionState(device,
110 device_address);
111 }
112
handleDeviceConfigChange(audio_devices_t device,const char * device_address,const char * device_name,audio_format_t encodedFormat)113 status_t AudioPolicyService::handleDeviceConfigChange(audio_devices_t device,
114 const char *device_address,
115 const char *device_name,
116 audio_format_t encodedFormat)
117 {
118 if (mAudioPolicyManager == NULL) {
119 return NO_INIT;
120 }
121 if (!settingsAllowed()) {
122 return PERMISSION_DENIED;
123 }
124
125 ALOGV("handleDeviceConfigChange()");
126 Mutex::Autolock _l(mLock);
127 AutoCallerClear acc;
128 return mAudioPolicyManager->handleDeviceConfigChange(device, device_address,
129 device_name, encodedFormat);
130 }
131
setPhoneState(audio_mode_t state,uid_t uid)132 status_t AudioPolicyService::setPhoneState(audio_mode_t state, uid_t uid)
133 {
134 if (mAudioPolicyManager == NULL) {
135 return NO_INIT;
136 }
137 if (!settingsAllowed()) {
138 return PERMISSION_DENIED;
139 }
140 if (uint32_t(state) >= AUDIO_MODE_CNT) {
141 return BAD_VALUE;
142 }
143
144 ALOGV("setPhoneState()");
145
146 // acquire lock before calling setMode() so that setMode() + setPhoneState() are an atomic
147 // operation from policy manager standpoint (no other operation (e.g track start or stop)
148 // can be interleaved).
149 Mutex::Autolock _l(mLock);
150 // TODO: check if it is more appropriate to do it in platform specific policy manager
151 AudioSystem::setMode(state);
152
153 AutoCallerClear acc;
154 mAudioPolicyManager->setPhoneState(state);
155 mPhoneState = state;
156 mPhoneStateOwnerUid = uid;
157 return NO_ERROR;
158 }
159
getPhoneState()160 audio_mode_t AudioPolicyService::getPhoneState()
161 {
162 Mutex::Autolock _l(mLock);
163 return mPhoneState;
164 }
165
setForceUse(audio_policy_force_use_t usage,audio_policy_forced_cfg_t config)166 status_t AudioPolicyService::setForceUse(audio_policy_force_use_t usage,
167 audio_policy_forced_cfg_t config)
168 {
169 if (mAudioPolicyManager == NULL) {
170 return NO_INIT;
171 }
172
173 if (!modifyAudioRoutingAllowed()) {
174 return PERMISSION_DENIED;
175 }
176
177 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
178 return BAD_VALUE;
179 }
180 if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) {
181 return BAD_VALUE;
182 }
183 ALOGV("setForceUse()");
184 Mutex::Autolock _l(mLock);
185 AutoCallerClear acc;
186 mAudioPolicyManager->setForceUse(usage, config);
187 return NO_ERROR;
188 }
189
getForceUse(audio_policy_force_use_t usage)190 audio_policy_forced_cfg_t AudioPolicyService::getForceUse(audio_policy_force_use_t usage)
191 {
192 if (mAudioPolicyManager == NULL) {
193 return AUDIO_POLICY_FORCE_NONE;
194 }
195 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
196 return AUDIO_POLICY_FORCE_NONE;
197 }
198 AutoCallerClear acc;
199 return mAudioPolicyManager->getForceUse(usage);
200 }
201
getOutput(audio_stream_type_t stream)202 audio_io_handle_t AudioPolicyService::getOutput(audio_stream_type_t stream)
203 {
204 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
205 return AUDIO_IO_HANDLE_NONE;
206 }
207 if (mAudioPolicyManager == NULL) {
208 return AUDIO_IO_HANDLE_NONE;
209 }
210 ALOGV("getOutput()");
211 Mutex::Autolock _l(mLock);
212 AutoCallerClear acc;
213 return mAudioPolicyManager->getOutput(stream);
214 }
215
getOutputForAttr(audio_attributes_t * attr,audio_io_handle_t * output,audio_session_t session,audio_stream_type_t * stream,pid_t pid,uid_t uid,const audio_config_t * config,audio_output_flags_t flags,audio_port_handle_t * selectedDeviceId,audio_port_handle_t * portId,std::vector<audio_io_handle_t> * secondaryOutputs)216 status_t AudioPolicyService::getOutputForAttr(audio_attributes_t *attr,
217 audio_io_handle_t *output,
218 audio_session_t session,
219 audio_stream_type_t *stream,
220 pid_t pid,
221 uid_t uid,
222 const audio_config_t *config,
223 audio_output_flags_t flags,
224 audio_port_handle_t *selectedDeviceId,
225 audio_port_handle_t *portId,
226 std::vector<audio_io_handle_t> *secondaryOutputs)
227 {
228 if (mAudioPolicyManager == NULL) {
229 return NO_INIT;
230 }
231
232 status_t result = validateUsage(attr->usage, pid, uid);
233 if (result != NO_ERROR) {
234 return result;
235 }
236
237 ALOGV("%s()", __func__);
238 Mutex::Autolock _l(mLock);
239
240 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
241 if (!isAudioServerOrMediaServerUid(callingUid) || uid == (uid_t)-1) {
242 ALOGW_IF(uid != (uid_t)-1 && uid != callingUid,
243 "%s uid %d tried to pass itself off as %d", __func__, callingUid, uid);
244 uid = callingUid;
245 }
246 if (!mPackageManager.allowPlaybackCapture(uid)) {
247 attr->flags |= AUDIO_FLAG_NO_MEDIA_PROJECTION;
248 }
249 if (((attr->flags & (AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE)) != 0)
250 && !bypassInterruptionPolicyAllowed(pid, uid)) {
251 attr->flags &= ~(AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE);
252 }
253 AutoCallerClear acc;
254 AudioPolicyInterface::output_type_t outputType;
255 result = mAudioPolicyManager->getOutputForAttr(attr, output, session, stream, uid,
256 config,
257 &flags, selectedDeviceId, portId,
258 secondaryOutputs,
259 &outputType);
260
261 // FIXME: Introduce a way to check for the the telephony device before opening the output
262 if (result == NO_ERROR) {
263 // enforce permission (if any) required for each type of input
264 switch (outputType) {
265 case AudioPolicyInterface::API_OUTPUT_LEGACY:
266 break;
267 case AudioPolicyInterface::API_OUTPUT_TELEPHONY_TX:
268 if (!modifyPhoneStateAllowed(pid, uid)) {
269 ALOGE("%s() permission denied: modify phone state not allowed for uid %d",
270 __func__, uid);
271 result = PERMISSION_DENIED;
272 }
273 break;
274 case AudioPolicyInterface::API_OUT_MIX_PLAYBACK:
275 if (!modifyAudioRoutingAllowed(pid, uid)) {
276 ALOGE("%s() permission denied: modify audio routing not allowed for uid %d",
277 __func__, uid);
278 result = PERMISSION_DENIED;
279 }
280 break;
281 case AudioPolicyInterface::API_OUTPUT_INVALID:
282 default:
283 LOG_ALWAYS_FATAL("%s() encountered an invalid output type %d",
284 __func__, (int)outputType);
285 }
286 }
287
288 if (result == NO_ERROR) {
289 sp <AudioPlaybackClient> client =
290 new AudioPlaybackClient(*attr, *output, uid, pid, session, *portId, *selectedDeviceId, *stream);
291 mAudioPlaybackClients.add(*portId, client);
292 }
293 return result;
294 }
295
getPlaybackClientAndEffects(audio_port_handle_t portId,sp<AudioPlaybackClient> & client,sp<AudioPolicyEffects> & effects,const char * context)296 void AudioPolicyService::getPlaybackClientAndEffects(audio_port_handle_t portId,
297 sp<AudioPlaybackClient>& client,
298 sp<AudioPolicyEffects>& effects,
299 const char *context)
300 {
301 Mutex::Autolock _l(mLock);
302 const ssize_t index = mAudioPlaybackClients.indexOfKey(portId);
303 if (index < 0) {
304 ALOGE("%s AudioTrack client not found for portId %d", context, portId);
305 return;
306 }
307 client = mAudioPlaybackClients.valueAt(index);
308 effects = mAudioPolicyEffects;
309 }
310
startOutput(audio_port_handle_t portId)311 status_t AudioPolicyService::startOutput(audio_port_handle_t portId)
312 {
313 if (mAudioPolicyManager == NULL) {
314 return NO_INIT;
315 }
316 ALOGV("startOutput()");
317 sp<AudioPlaybackClient> client;
318 sp<AudioPolicyEffects>audioPolicyEffects;
319
320 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
321
322 if (audioPolicyEffects != 0) {
323 // create audio processors according to stream
324 status_t status = audioPolicyEffects->addOutputSessionEffects(
325 client->io, client->stream, client->session);
326 if (status != NO_ERROR && status != ALREADY_EXISTS) {
327 ALOGW("Failed to add effects on session %d", client->session);
328 }
329 }
330 Mutex::Autolock _l(mLock);
331 AutoCallerClear acc;
332 status_t status = mAudioPolicyManager->startOutput(portId);
333 if (status == NO_ERROR) {
334 client->active = true;
335 }
336 return status;
337 }
338
stopOutput(audio_port_handle_t portId)339 status_t AudioPolicyService::stopOutput(audio_port_handle_t portId)
340 {
341 if (mAudioPolicyManager == NULL) {
342 return NO_INIT;
343 }
344 ALOGV("stopOutput()");
345 mOutputCommandThread->stopOutputCommand(portId);
346 return NO_ERROR;
347 }
348
doStopOutput(audio_port_handle_t portId)349 status_t AudioPolicyService::doStopOutput(audio_port_handle_t portId)
350 {
351 ALOGV("doStopOutput");
352 sp<AudioPlaybackClient> client;
353 sp<AudioPolicyEffects>audioPolicyEffects;
354
355 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
356
357 if (audioPolicyEffects != 0) {
358 // release audio processors from the stream
359 status_t status = audioPolicyEffects->releaseOutputSessionEffects(
360 client->io, client->stream, client->session);
361 if (status != NO_ERROR && status != ALREADY_EXISTS) {
362 ALOGW("Failed to release effects on session %d", client->session);
363 }
364 }
365 Mutex::Autolock _l(mLock);
366 AutoCallerClear acc;
367 status_t status = mAudioPolicyManager->stopOutput(portId);
368 if (status == NO_ERROR) {
369 client->active = false;
370 }
371 return status;
372 }
373
releaseOutput(audio_port_handle_t portId)374 void AudioPolicyService::releaseOutput(audio_port_handle_t portId)
375 {
376 if (mAudioPolicyManager == NULL) {
377 return;
378 }
379 ALOGV("releaseOutput()");
380 mOutputCommandThread->releaseOutputCommand(portId);
381 }
382
doReleaseOutput(audio_port_handle_t portId)383 void AudioPolicyService::doReleaseOutput(audio_port_handle_t portId)
384 {
385 ALOGV("doReleaseOutput from tid %d", gettid());
386 sp<AudioPlaybackClient> client;
387 sp<AudioPolicyEffects> audioPolicyEffects;
388
389 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
390
391 if (audioPolicyEffects != 0 && client->active) {
392 // clean up effects if output was not stopped before being released
393 audioPolicyEffects->releaseOutputSessionEffects(
394 client->io, client->stream, client->session);
395 }
396 Mutex::Autolock _l(mLock);
397 mAudioPlaybackClients.removeItem(portId);
398
399 // called from internal thread: no need to clear caller identity
400 mAudioPolicyManager->releaseOutput(portId);
401 }
402
getInputForAttr(const audio_attributes_t * attr,audio_io_handle_t * input,audio_unique_id_t riid,audio_session_t session,pid_t pid,uid_t uid,const String16 & opPackageName,const audio_config_base_t * config,audio_input_flags_t flags,audio_port_handle_t * selectedDeviceId,audio_port_handle_t * portId)403 status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr,
404 audio_io_handle_t *input,
405 audio_unique_id_t riid,
406 audio_session_t session,
407 pid_t pid,
408 uid_t uid,
409 const String16& opPackageName,
410 const audio_config_base_t *config,
411 audio_input_flags_t flags,
412 audio_port_handle_t *selectedDeviceId,
413 audio_port_handle_t *portId)
414 {
415 if (mAudioPolicyManager == NULL) {
416 return NO_INIT;
417 }
418
419 status_t result = validateUsage(attr->usage, pid, uid);
420 if (result != NO_ERROR) {
421 return result;
422 }
423
424 audio_source_t inputSource = attr->source;
425 if (inputSource == AUDIO_SOURCE_DEFAULT) {
426 inputSource = AUDIO_SOURCE_MIC;
427 }
428
429 // already checked by client, but double-check in case the client wrapper is bypassed
430 if ((inputSource < AUDIO_SOURCE_DEFAULT)
431 || (inputSource >= AUDIO_SOURCE_CNT
432 && inputSource != AUDIO_SOURCE_HOTWORD
433 && inputSource != AUDIO_SOURCE_FM_TUNER
434 && inputSource != AUDIO_SOURCE_ECHO_REFERENCE)) {
435 return BAD_VALUE;
436 }
437
438 bool updatePid = (pid == -1);
439 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
440 if (!isAudioServerOrMediaServerUid(callingUid)) {
441 ALOGW_IF(uid != (uid_t)-1 && uid != callingUid,
442 "%s uid %d tried to pass itself off as %d", __FUNCTION__, callingUid, uid);
443 uid = callingUid;
444 updatePid = true;
445 }
446
447 if (updatePid) {
448 const pid_t callingPid = IPCThreadState::self()->getCallingPid();
449 ALOGW_IF(pid != (pid_t)-1 && pid != callingPid,
450 "%s uid %d pid %d tried to pass itself off as pid %d",
451 __func__, callingUid, callingPid, pid);
452 pid = callingPid;
453 }
454
455 // check calling permissions.
456 // Capturing from FM_TUNER source is controlled by captureAudioOutputAllowed() only as this
457 // does not affect users privacy as does capturing from an actual microphone.
458 if (!(recordingAllowed(opPackageName, pid, uid) || attr->source == AUDIO_SOURCE_FM_TUNER)) {
459 ALOGE("%s permission denied: recording not allowed for uid %d pid %d",
460 __func__, uid, pid);
461 return PERMISSION_DENIED;
462 }
463
464 bool canCaptureOutput = captureAudioOutputAllowed(pid, uid);
465 if ((inputSource == AUDIO_SOURCE_VOICE_UPLINK ||
466 inputSource == AUDIO_SOURCE_VOICE_DOWNLINK ||
467 inputSource == AUDIO_SOURCE_VOICE_CALL ||
468 inputSource == AUDIO_SOURCE_ECHO_REFERENCE||
469 inputSource == AUDIO_SOURCE_FM_TUNER) &&
470 !canCaptureOutput) {
471 return PERMISSION_DENIED;
472 }
473
474 bool canCaptureHotword = captureHotwordAllowed(opPackageName, pid, uid);
475 if ((inputSource == AUDIO_SOURCE_HOTWORD) && !canCaptureHotword) {
476 return BAD_VALUE;
477 }
478
479 sp<AudioPolicyEffects>audioPolicyEffects;
480 {
481 status_t status;
482 AudioPolicyInterface::input_type_t inputType;
483
484 Mutex::Autolock _l(mLock);
485 {
486 AutoCallerClear acc;
487 // the audio_in_acoustics_t parameter is ignored by get_input()
488 status = mAudioPolicyManager->getInputForAttr(attr, input, riid, session, uid,
489 config,
490 flags, selectedDeviceId,
491 &inputType, portId);
492 }
493 audioPolicyEffects = mAudioPolicyEffects;
494
495 if (status == NO_ERROR) {
496 // enforce permission (if any) required for each type of input
497 switch (inputType) {
498 case AudioPolicyInterface::API_INPUT_MIX_PUBLIC_CAPTURE_PLAYBACK:
499 // this use case has been validated in audio service with a MediaProjection token,
500 // and doesn't rely on regular permissions
501 case AudioPolicyInterface::API_INPUT_LEGACY:
502 break;
503 case AudioPolicyInterface::API_INPUT_TELEPHONY_RX:
504 // FIXME: use the same permission as for remote submix for now.
505 case AudioPolicyInterface::API_INPUT_MIX_CAPTURE:
506 if (!canCaptureOutput) {
507 ALOGE("getInputForAttr() permission denied: capture not allowed");
508 status = PERMISSION_DENIED;
509 }
510 break;
511 case AudioPolicyInterface::API_INPUT_MIX_EXT_POLICY_REROUTE:
512 if (!modifyAudioRoutingAllowed(pid, uid)) {
513 ALOGE("getInputForAttr() permission denied: modify audio routing not allowed");
514 status = PERMISSION_DENIED;
515 }
516 break;
517 case AudioPolicyInterface::API_INPUT_INVALID:
518 default:
519 LOG_ALWAYS_FATAL("getInputForAttr() encountered an invalid input type %d",
520 (int)inputType);
521 }
522 }
523
524 if (status != NO_ERROR) {
525 if (status == PERMISSION_DENIED) {
526 AutoCallerClear acc;
527 mAudioPolicyManager->releaseInput(*portId);
528 }
529 return status;
530 }
531
532 sp<AudioRecordClient> client = new AudioRecordClient(*attr, *input, uid, pid, session, *portId,
533 *selectedDeviceId, opPackageName,
534 canCaptureOutput, canCaptureHotword);
535 mAudioRecordClients.add(*portId, client);
536 }
537
538 if (audioPolicyEffects != 0) {
539 // create audio pre processors according to input source
540 status_t status = audioPolicyEffects->addInputEffects(*input, inputSource, session);
541 if (status != NO_ERROR && status != ALREADY_EXISTS) {
542 ALOGW("Failed to add effects on input %d", *input);
543 }
544 }
545 return NO_ERROR;
546 }
547
getDeviceTypeStrForPortId(audio_port_handle_t portId)548 std::string AudioPolicyService::getDeviceTypeStrForPortId(audio_port_handle_t portId) {
549 struct audio_port port = {};
550 port.id = portId;
551 status_t status = mAudioPolicyManager->getAudioPort(&port);
552 if (status == NO_ERROR && port.type == AUDIO_PORT_TYPE_DEVICE) {
553 return toString(port.ext.device.type);
554 }
555 return {};
556 }
557
startInput(audio_port_handle_t portId)558 status_t AudioPolicyService::startInput(audio_port_handle_t portId)
559 {
560 if (mAudioPolicyManager == NULL) {
561 return NO_INIT;
562 }
563 sp<AudioRecordClient> client;
564 {
565 Mutex::Autolock _l(mLock);
566
567 ssize_t index = mAudioRecordClients.indexOfKey(portId);
568 if (index < 0) {
569 return INVALID_OPERATION;
570 }
571 client = mAudioRecordClients.valueAt(index);
572 }
573
574 // check calling permissions
575 if (!(startRecording(client->opPackageName, client->pid, client->uid,
576 client->attributes.source == AUDIO_SOURCE_HOTWORD)
577 || client->attributes.source == AUDIO_SOURCE_FM_TUNER)) {
578 ALOGE("%s permission denied: recording not allowed for uid %d pid %d",
579 __func__, client->uid, client->pid);
580 return PERMISSION_DENIED;
581 }
582
583 Mutex::Autolock _l(mLock);
584
585 client->active = true;
586 client->startTimeNs = systemTime();
587 updateUidStates_l();
588
589 status_t status;
590 {
591 AutoCallerClear acc;
592 status = mAudioPolicyManager->startInput(portId);
593
594 }
595
596 // including successes gets very verbose
597 // but once we cut over to statsd, log them all.
598 if (status != NO_ERROR) {
599
600 static constexpr char kAudioPolicy[] = "audiopolicy";
601
602 static constexpr char kAudioPolicyStatus[] = "android.media.audiopolicy.status";
603 static constexpr char kAudioPolicyRqstSrc[] = "android.media.audiopolicy.rqst.src";
604 static constexpr char kAudioPolicyRqstPkg[] = "android.media.audiopolicy.rqst.pkg";
605 static constexpr char kAudioPolicyRqstSession[] = "android.media.audiopolicy.rqst.session";
606 static constexpr char kAudioPolicyRqstDevice[] =
607 "android.media.audiopolicy.rqst.device";
608 static constexpr char kAudioPolicyActiveSrc[] = "android.media.audiopolicy.active.src";
609 static constexpr char kAudioPolicyActivePkg[] = "android.media.audiopolicy.active.pkg";
610 static constexpr char kAudioPolicyActiveSession[] =
611 "android.media.audiopolicy.active.session";
612 static constexpr char kAudioPolicyActiveDevice[] =
613 "android.media.audiopolicy.active.device";
614
615 mediametrics::Item *item = mediametrics::Item::create(kAudioPolicy);
616 if (item != NULL) {
617
618 item->setInt32(kAudioPolicyStatus, status);
619
620 item->setCString(kAudioPolicyRqstSrc,
621 toString(client->attributes.source).c_str());
622 item->setInt32(kAudioPolicyRqstSession, client->session);
623 if (client->opPackageName.size() != 0) {
624 item->setCString(kAudioPolicyRqstPkg,
625 std::string(String8(client->opPackageName).string()).c_str());
626 } else {
627 item->setCString(kAudioPolicyRqstPkg, std::to_string(client->uid).c_str());
628 }
629 item->setCString(
630 kAudioPolicyRqstDevice, getDeviceTypeStrForPortId(client->deviceId).c_str());
631
632 int count = mAudioRecordClients.size();
633 for (int i = 0; i < count ; i++) {
634 if (portId == mAudioRecordClients.keyAt(i)) {
635 continue;
636 }
637 sp<AudioRecordClient> other = mAudioRecordClients.valueAt(i);
638 if (other->active) {
639 // keeps the last of the clients marked active
640 item->setCString(kAudioPolicyActiveSrc,
641 toString(other->attributes.source).c_str());
642 item->setInt32(kAudioPolicyActiveSession, other->session);
643 if (other->opPackageName.size() != 0) {
644 item->setCString(kAudioPolicyActivePkg,
645 std::string(String8(other->opPackageName).string()).c_str());
646 } else {
647 item->setCString(kAudioPolicyRqstPkg,
648 std::to_string(other->uid).c_str());
649 }
650 item->setCString(kAudioPolicyActiveDevice,
651 getDeviceTypeStrForPortId(other->deviceId).c_str());
652 }
653 }
654 item->selfrecord();
655 delete item;
656 item = NULL;
657 }
658 }
659
660 if (status != NO_ERROR) {
661 client->active = false;
662 client->startTimeNs = 0;
663 updateUidStates_l();
664 finishRecording(client->opPackageName, client->uid,
665 client->attributes.source == AUDIO_SOURCE_HOTWORD);
666 }
667
668 return status;
669 }
670
stopInput(audio_port_handle_t portId)671 status_t AudioPolicyService::stopInput(audio_port_handle_t portId)
672 {
673 if (mAudioPolicyManager == NULL) {
674 return NO_INIT;
675 }
676
677 Mutex::Autolock _l(mLock);
678
679 ssize_t index = mAudioRecordClients.indexOfKey(portId);
680 if (index < 0) {
681 return INVALID_OPERATION;
682 }
683 sp<AudioRecordClient> client = mAudioRecordClients.valueAt(index);
684
685 client->active = false;
686 client->startTimeNs = 0;
687
688 updateUidStates_l();
689
690 // finish the recording app op
691 finishRecording(client->opPackageName, client->uid,
692 client->attributes.source == AUDIO_SOURCE_HOTWORD);
693 AutoCallerClear acc;
694 return mAudioPolicyManager->stopInput(portId);
695 }
696
releaseInput(audio_port_handle_t portId)697 void AudioPolicyService::releaseInput(audio_port_handle_t portId)
698 {
699 if (mAudioPolicyManager == NULL) {
700 return;
701 }
702 sp<AudioPolicyEffects>audioPolicyEffects;
703 sp<AudioRecordClient> client;
704 {
705 Mutex::Autolock _l(mLock);
706 audioPolicyEffects = mAudioPolicyEffects;
707 ssize_t index = mAudioRecordClients.indexOfKey(portId);
708 if (index < 0) {
709 return;
710 }
711 client = mAudioRecordClients.valueAt(index);
712
713 if (client->active) {
714 ALOGW("%s releasing active client portId %d", __FUNCTION__, portId);
715 client->active = false;
716 client->startTimeNs = 0;
717 updateUidStates_l();
718 }
719
720 mAudioRecordClients.removeItem(portId);
721 }
722 if (client == 0) {
723 return;
724 }
725 if (audioPolicyEffects != 0) {
726 // release audio processors from the input
727 status_t status = audioPolicyEffects->releaseInputEffects(client->io, client->session);
728 if(status != NO_ERROR) {
729 ALOGW("Failed to release effects on input %d", client->io);
730 }
731 }
732 {
733 Mutex::Autolock _l(mLock);
734 AutoCallerClear acc;
735 mAudioPolicyManager->releaseInput(portId);
736 }
737 }
738
initStreamVolume(audio_stream_type_t stream,int indexMin,int indexMax)739 status_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream,
740 int indexMin,
741 int indexMax)
742 {
743 if (mAudioPolicyManager == NULL) {
744 return NO_INIT;
745 }
746 if (!settingsAllowed()) {
747 return PERMISSION_DENIED;
748 }
749 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
750 return BAD_VALUE;
751 }
752 Mutex::Autolock _l(mLock);
753 AutoCallerClear acc;
754 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
755 return NO_ERROR;
756 }
757
setStreamVolumeIndex(audio_stream_type_t stream,int index,audio_devices_t device)758 status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
759 int index,
760 audio_devices_t device)
761 {
762 if (mAudioPolicyManager == NULL) {
763 return NO_INIT;
764 }
765 if (!settingsAllowed()) {
766 return PERMISSION_DENIED;
767 }
768 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
769 return BAD_VALUE;
770 }
771 Mutex::Autolock _l(mLock);
772 AutoCallerClear acc;
773 return mAudioPolicyManager->setStreamVolumeIndex(stream,
774 index,
775 device);
776 }
777
getStreamVolumeIndex(audio_stream_type_t stream,int * index,audio_devices_t device)778 status_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream,
779 int *index,
780 audio_devices_t device)
781 {
782 if (mAudioPolicyManager == NULL) {
783 return NO_INIT;
784 }
785 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
786 return BAD_VALUE;
787 }
788 Mutex::Autolock _l(mLock);
789 AutoCallerClear acc;
790 return mAudioPolicyManager->getStreamVolumeIndex(stream,
791 index,
792 device);
793 }
794
setVolumeIndexForAttributes(const audio_attributes_t & attributes,int index,audio_devices_t device)795 status_t AudioPolicyService::setVolumeIndexForAttributes(const audio_attributes_t &attributes,
796 int index, audio_devices_t device)
797 {
798 if (mAudioPolicyManager == NULL) {
799 return NO_INIT;
800 }
801 if (!settingsAllowed()) {
802 return PERMISSION_DENIED;
803 }
804 Mutex::Autolock _l(mLock);
805 AutoCallerClear acc;
806 return mAudioPolicyManager->setVolumeIndexForAttributes(attributes, index, device);
807 }
808
getVolumeIndexForAttributes(const audio_attributes_t & attributes,int & index,audio_devices_t device)809 status_t AudioPolicyService::getVolumeIndexForAttributes(const audio_attributes_t &attributes,
810 int &index, audio_devices_t device)
811 {
812 if (mAudioPolicyManager == NULL) {
813 return NO_INIT;
814 }
815 Mutex::Autolock _l(mLock);
816 AutoCallerClear acc;
817 return mAudioPolicyManager->getVolumeIndexForAttributes(attributes, index, device);
818 }
819
getMinVolumeIndexForAttributes(const audio_attributes_t & attributes,int & index)820 status_t AudioPolicyService::getMinVolumeIndexForAttributes(const audio_attributes_t &attributes,
821 int &index)
822 {
823 if (mAudioPolicyManager == NULL) {
824 return NO_INIT;
825 }
826 Mutex::Autolock _l(mLock);
827 AutoCallerClear acc;
828 return mAudioPolicyManager->getMinVolumeIndexForAttributes(attributes, index);
829 }
830
getMaxVolumeIndexForAttributes(const audio_attributes_t & attributes,int & index)831 status_t AudioPolicyService::getMaxVolumeIndexForAttributes(const audio_attributes_t &attributes,
832 int &index)
833 {
834 if (mAudioPolicyManager == NULL) {
835 return NO_INIT;
836 }
837 Mutex::Autolock _l(mLock);
838 AutoCallerClear acc;
839 return mAudioPolicyManager->getMaxVolumeIndexForAttributes(attributes, index);
840 }
841
getStrategyForStream(audio_stream_type_t stream)842 uint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream)
843 {
844 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
845 return PRODUCT_STRATEGY_NONE;
846 }
847 if (mAudioPolicyManager == NULL) {
848 return PRODUCT_STRATEGY_NONE;
849 }
850 // DO NOT LOCK, may be called from AudioFlinger with lock held, reaching deadlock
851 AutoCallerClear acc;
852 return mAudioPolicyManager->getStrategyForStream(stream);
853 }
854
855 //audio policy: use audio_device_t appropriately
856
getDevicesForStream(audio_stream_type_t stream)857 audio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream)
858 {
859 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
860 return AUDIO_DEVICE_NONE;
861 }
862 if (mAudioPolicyManager == NULL) {
863 return AUDIO_DEVICE_NONE;
864 }
865 Mutex::Autolock _l(mLock);
866 AutoCallerClear acc;
867 return mAudioPolicyManager->getDevicesForStream(stream);
868 }
869
getDevicesForAttributes(const AudioAttributes & aa,AudioDeviceTypeAddrVector * devices) const870 status_t AudioPolicyService::getDevicesForAttributes(const AudioAttributes &aa,
871 AudioDeviceTypeAddrVector *devices) const
872 {
873 if (mAudioPolicyManager == NULL) {
874 return NO_INIT;
875 }
876 Mutex::Autolock _l(mLock);
877 AutoCallerClear acc;
878 return mAudioPolicyManager->getDevicesForAttributes(aa.getAttributes(), devices);
879 }
880
getOutputForEffect(const effect_descriptor_t * desc)881 audio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc)
882 {
883 // FIXME change return type to status_t, and return NO_INIT here
884 if (mAudioPolicyManager == NULL) {
885 return 0;
886 }
887 Mutex::Autolock _l(mLock);
888 AutoCallerClear acc;
889 return mAudioPolicyManager->getOutputForEffect(desc);
890 }
891
registerEffect(const effect_descriptor_t * desc,audio_io_handle_t io,uint32_t strategy,audio_session_t session,int id)892 status_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc,
893 audio_io_handle_t io,
894 uint32_t strategy,
895 audio_session_t session,
896 int id)
897 {
898 if (mAudioPolicyManager == NULL) {
899 return NO_INIT;
900 }
901 Mutex::Autolock _l(mLock);
902 AutoCallerClear acc;
903 return mAudioPolicyManager->registerEffect(desc, io, strategy, session, id);
904 }
905
unregisterEffect(int id)906 status_t AudioPolicyService::unregisterEffect(int id)
907 {
908 if (mAudioPolicyManager == NULL) {
909 return NO_INIT;
910 }
911 Mutex::Autolock _l(mLock);
912 AutoCallerClear acc;
913 return mAudioPolicyManager->unregisterEffect(id);
914 }
915
setEffectEnabled(int id,bool enabled)916 status_t AudioPolicyService::setEffectEnabled(int id, bool enabled)
917 {
918 if (mAudioPolicyManager == NULL) {
919 return NO_INIT;
920 }
921 Mutex::Autolock _l(mLock);
922 AutoCallerClear acc;
923 return mAudioPolicyManager->setEffectEnabled(id, enabled);
924 }
925
moveEffectsToIo(const std::vector<int> & ids,audio_io_handle_t io)926 status_t AudioPolicyService::moveEffectsToIo(const std::vector<int>& ids, audio_io_handle_t io)
927 {
928 if (mAudioPolicyManager == NULL) {
929 return NO_INIT;
930 }
931 Mutex::Autolock _l(mLock);
932 AutoCallerClear acc;
933 return mAudioPolicyManager->moveEffectsToIo(ids, io);
934 }
935
isStreamActive(audio_stream_type_t stream,uint32_t inPastMs) const936 bool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
937 {
938 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
939 return false;
940 }
941 if (mAudioPolicyManager == NULL) {
942 return false;
943 }
944 Mutex::Autolock _l(mLock);
945 AutoCallerClear acc;
946 return mAudioPolicyManager->isStreamActive(stream, inPastMs);
947 }
948
isStreamActiveRemotely(audio_stream_type_t stream,uint32_t inPastMs) const949 bool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
950 {
951 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
952 return false;
953 }
954 if (mAudioPolicyManager == NULL) {
955 return false;
956 }
957 Mutex::Autolock _l(mLock);
958 AutoCallerClear acc;
959 return mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
960 }
961
isSourceActive(audio_source_t source) const962 bool AudioPolicyService::isSourceActive(audio_source_t source) const
963 {
964 if (mAudioPolicyManager == NULL) {
965 return false;
966 }
967 Mutex::Autolock _l(mLock);
968 AutoCallerClear acc;
969 return mAudioPolicyManager->isSourceActive(source);
970 }
971
getAudioPolicyEffects(sp<AudioPolicyEffects> & audioPolicyEffects)972 status_t AudioPolicyService::getAudioPolicyEffects(sp<AudioPolicyEffects>& audioPolicyEffects)
973 {
974 if (mAudioPolicyManager == NULL) {
975 return NO_INIT;
976 }
977 {
978 Mutex::Autolock _l(mLock);
979 audioPolicyEffects = mAudioPolicyEffects;
980 }
981 if (audioPolicyEffects == 0) {
982 return NO_INIT;
983 }
984
985 return OK;
986 }
987
queryDefaultPreProcessing(audio_session_t audioSession,effect_descriptor_t * descriptors,uint32_t * count)988 status_t AudioPolicyService::queryDefaultPreProcessing(audio_session_t audioSession,
989 effect_descriptor_t *descriptors,
990 uint32_t *count)
991 {
992 sp<AudioPolicyEffects>audioPolicyEffects;
993 status_t status = getAudioPolicyEffects(audioPolicyEffects);
994 if (status != OK) {
995 *count = 0;
996 return status;
997 }
998 return audioPolicyEffects->queryDefaultInputEffects(
999 (audio_session_t)audioSession, descriptors, count);
1000 }
1001
addSourceDefaultEffect(const effect_uuid_t * type,const String16 & opPackageName,const effect_uuid_t * uuid,int32_t priority,audio_source_t source,audio_unique_id_t * id)1002 status_t AudioPolicyService::addSourceDefaultEffect(const effect_uuid_t *type,
1003 const String16& opPackageName,
1004 const effect_uuid_t *uuid,
1005 int32_t priority,
1006 audio_source_t source,
1007 audio_unique_id_t* id)
1008 {
1009 sp<AudioPolicyEffects>audioPolicyEffects;
1010 status_t status = getAudioPolicyEffects(audioPolicyEffects);
1011 if (status != OK) {
1012 return status;
1013 }
1014 if (!modifyDefaultAudioEffectsAllowed()) {
1015 return PERMISSION_DENIED;
1016 }
1017 return audioPolicyEffects->addSourceDefaultEffect(
1018 type, opPackageName, uuid, priority, source, id);
1019 }
1020
addStreamDefaultEffect(const effect_uuid_t * type,const String16 & opPackageName,const effect_uuid_t * uuid,int32_t priority,audio_usage_t usage,audio_unique_id_t * id)1021 status_t AudioPolicyService::addStreamDefaultEffect(const effect_uuid_t *type,
1022 const String16& opPackageName,
1023 const effect_uuid_t *uuid,
1024 int32_t priority,
1025 audio_usage_t usage,
1026 audio_unique_id_t* id)
1027 {
1028 sp<AudioPolicyEffects>audioPolicyEffects;
1029 status_t status = getAudioPolicyEffects(audioPolicyEffects);
1030 if (status != OK) {
1031 return status;
1032 }
1033 if (!modifyDefaultAudioEffectsAllowed()) {
1034 return PERMISSION_DENIED;
1035 }
1036 return audioPolicyEffects->addStreamDefaultEffect(
1037 type, opPackageName, uuid, priority, usage, id);
1038 }
1039
removeSourceDefaultEffect(audio_unique_id_t id)1040 status_t AudioPolicyService::removeSourceDefaultEffect(audio_unique_id_t id)
1041 {
1042 sp<AudioPolicyEffects>audioPolicyEffects;
1043 status_t status = getAudioPolicyEffects(audioPolicyEffects);
1044 if (status != OK) {
1045 return status;
1046 }
1047 if (!modifyDefaultAudioEffectsAllowed()) {
1048 return PERMISSION_DENIED;
1049 }
1050 return audioPolicyEffects->removeSourceDefaultEffect(id);
1051 }
1052
removeStreamDefaultEffect(audio_unique_id_t id)1053 status_t AudioPolicyService::removeStreamDefaultEffect(audio_unique_id_t id)
1054 {
1055 sp<AudioPolicyEffects>audioPolicyEffects;
1056 status_t status = getAudioPolicyEffects(audioPolicyEffects);
1057 if (status != OK) {
1058 return status;
1059 }
1060 if (!modifyDefaultAudioEffectsAllowed()) {
1061 return PERMISSION_DENIED;
1062 }
1063 return audioPolicyEffects->removeStreamDefaultEffect(id);
1064 }
1065
setSupportedSystemUsages(const std::vector<audio_usage_t> & systemUsages)1066 status_t AudioPolicyService::setSupportedSystemUsages(const std::vector<audio_usage_t>& systemUsages) {
1067 Mutex::Autolock _l(mLock);
1068 if(!modifyAudioRoutingAllowed()) {
1069 return PERMISSION_DENIED;
1070 }
1071
1072 bool areAllSystemUsages = std::all_of(begin(systemUsages), end(systemUsages),
1073 [](audio_usage_t usage) { return isSystemUsage(usage); });
1074 if (!areAllSystemUsages) {
1075 return BAD_VALUE;
1076 }
1077
1078 mSupportedSystemUsages = systemUsages;
1079 return NO_ERROR;
1080 }
1081
setAllowedCapturePolicy(uid_t uid,audio_flags_mask_t capturePolicy)1082 status_t AudioPolicyService::setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t capturePolicy) {
1083 Mutex::Autolock _l(mLock);
1084 if (mAudioPolicyManager == NULL) {
1085 ALOGV("%s() mAudioPolicyManager == NULL", __func__);
1086 return NO_INIT;
1087 }
1088 return mAudioPolicyManager->setAllowedCapturePolicy(uid, capturePolicy);
1089 }
1090
isOffloadSupported(const audio_offload_info_t & info)1091 bool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info)
1092 {
1093 if (mAudioPolicyManager == NULL) {
1094 ALOGV("mAudioPolicyManager == NULL");
1095 return false;
1096 }
1097 Mutex::Autolock _l(mLock);
1098 AutoCallerClear acc;
1099 return mAudioPolicyManager->isOffloadSupported(info);
1100 }
1101
isDirectOutputSupported(const audio_config_base_t & config,const audio_attributes_t & attributes)1102 bool AudioPolicyService::isDirectOutputSupported(const audio_config_base_t& config,
1103 const audio_attributes_t& attributes) {
1104 if (mAudioPolicyManager == NULL) {
1105 ALOGV("mAudioPolicyManager == NULL");
1106 return false;
1107 }
1108
1109 status_t result = validateUsage(attributes.usage);
1110 if (result != NO_ERROR) {
1111 return result;
1112 }
1113
1114 Mutex::Autolock _l(mLock);
1115 return mAudioPolicyManager->isDirectOutputSupported(config, attributes);
1116 }
1117
1118
listAudioPorts(audio_port_role_t role,audio_port_type_t type,unsigned int * num_ports,struct audio_port * ports,unsigned int * generation)1119 status_t AudioPolicyService::listAudioPorts(audio_port_role_t role,
1120 audio_port_type_t type,
1121 unsigned int *num_ports,
1122 struct audio_port *ports,
1123 unsigned int *generation)
1124 {
1125 Mutex::Autolock _l(mLock);
1126 if (mAudioPolicyManager == NULL) {
1127 return NO_INIT;
1128 }
1129 AutoCallerClear acc;
1130 return mAudioPolicyManager->listAudioPorts(role, type, num_ports, ports, generation);
1131 }
1132
getAudioPort(struct audio_port * port)1133 status_t AudioPolicyService::getAudioPort(struct audio_port *port)
1134 {
1135 Mutex::Autolock _l(mLock);
1136 if (mAudioPolicyManager == NULL) {
1137 return NO_INIT;
1138 }
1139 AutoCallerClear acc;
1140 return mAudioPolicyManager->getAudioPort(port);
1141 }
1142
createAudioPatch(const struct audio_patch * patch,audio_patch_handle_t * handle)1143 status_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch,
1144 audio_patch_handle_t *handle)
1145 {
1146 Mutex::Autolock _l(mLock);
1147 if(!modifyAudioRoutingAllowed()) {
1148 return PERMISSION_DENIED;
1149 }
1150 if (mAudioPolicyManager == NULL) {
1151 return NO_INIT;
1152 }
1153 AutoCallerClear acc;
1154 return mAudioPolicyManager->createAudioPatch(patch, handle,
1155 IPCThreadState::self()->getCallingUid());
1156 }
1157
releaseAudioPatch(audio_patch_handle_t handle)1158 status_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle)
1159 {
1160 Mutex::Autolock _l(mLock);
1161 if(!modifyAudioRoutingAllowed()) {
1162 return PERMISSION_DENIED;
1163 }
1164 if (mAudioPolicyManager == NULL) {
1165 return NO_INIT;
1166 }
1167 AutoCallerClear acc;
1168 return mAudioPolicyManager->releaseAudioPatch(handle,
1169 IPCThreadState::self()->getCallingUid());
1170 }
1171
listAudioPatches(unsigned int * num_patches,struct audio_patch * patches,unsigned int * generation)1172 status_t AudioPolicyService::listAudioPatches(unsigned int *num_patches,
1173 struct audio_patch *patches,
1174 unsigned int *generation)
1175 {
1176 Mutex::Autolock _l(mLock);
1177 if (mAudioPolicyManager == NULL) {
1178 return NO_INIT;
1179 }
1180 AutoCallerClear acc;
1181 return mAudioPolicyManager->listAudioPatches(num_patches, patches, generation);
1182 }
1183
setAudioPortConfig(const struct audio_port_config * config)1184 status_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config)
1185 {
1186 Mutex::Autolock _l(mLock);
1187 if(!modifyAudioRoutingAllowed()) {
1188 return PERMISSION_DENIED;
1189 }
1190 if (mAudioPolicyManager == NULL) {
1191 return NO_INIT;
1192 }
1193 AutoCallerClear acc;
1194 return mAudioPolicyManager->setAudioPortConfig(config);
1195 }
1196
acquireSoundTriggerSession(audio_session_t * session,audio_io_handle_t * ioHandle,audio_devices_t * device)1197 status_t AudioPolicyService::acquireSoundTriggerSession(audio_session_t *session,
1198 audio_io_handle_t *ioHandle,
1199 audio_devices_t *device)
1200 {
1201 Mutex::Autolock _l(mLock);
1202 if (mAudioPolicyManager == NULL) {
1203 return NO_INIT;
1204 }
1205 AutoCallerClear acc;
1206 return mAudioPolicyManager->acquireSoundTriggerSession(session, ioHandle, device);
1207 }
1208
releaseSoundTriggerSession(audio_session_t session)1209 status_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session)
1210 {
1211 Mutex::Autolock _l(mLock);
1212 if (mAudioPolicyManager == NULL) {
1213 return NO_INIT;
1214 }
1215 AutoCallerClear acc;
1216 return mAudioPolicyManager->releaseSoundTriggerSession(session);
1217 }
1218
registerPolicyMixes(const Vector<AudioMix> & mixes,bool registration)1219 status_t AudioPolicyService::registerPolicyMixes(const Vector<AudioMix>& mixes, bool registration)
1220 {
1221 Mutex::Autolock _l(mLock);
1222
1223 // loopback|render only need a MediaProjection (checked in caller AudioService.java)
1224 bool needModifyAudioRouting = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
1225 return !is_mix_loopback_render(mix.mRouteFlags); });
1226 if (needModifyAudioRouting && !modifyAudioRoutingAllowed()) {
1227 return PERMISSION_DENIED;
1228 }
1229
1230 // If one of the mixes has needCaptureVoiceCommunicationOutput set to true, then we
1231 // need to verify that the caller still has CAPTURE_VOICE_COMMUNICATION_OUTPUT
1232 bool needCaptureVoiceCommunicationOutput =
1233 std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
1234 return mix.mVoiceCommunicationCaptureAllowed; });
1235
1236 bool needCaptureMediaOutput = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
1237 return mix.mAllowPrivilegedPlaybackCapture; });
1238
1239 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
1240 const pid_t callingPid = IPCThreadState::self()->getCallingPid();
1241
1242 if (needCaptureMediaOutput && !captureMediaOutputAllowed(callingPid, callingUid)) {
1243 return PERMISSION_DENIED;
1244 }
1245
1246 if (needCaptureVoiceCommunicationOutput &&
1247 !captureVoiceCommunicationOutputAllowed(callingPid, callingUid)) {
1248 return PERMISSION_DENIED;
1249 }
1250
1251 if (mAudioPolicyManager == NULL) {
1252 return NO_INIT;
1253 }
1254 AutoCallerClear acc;
1255 if (registration) {
1256 return mAudioPolicyManager->registerPolicyMixes(mixes);
1257 } else {
1258 return mAudioPolicyManager->unregisterPolicyMixes(mixes);
1259 }
1260 }
1261
setUidDeviceAffinities(uid_t uid,const Vector<AudioDeviceTypeAddr> & devices)1262 status_t AudioPolicyService::setUidDeviceAffinities(uid_t uid,
1263 const Vector<AudioDeviceTypeAddr>& devices) {
1264 Mutex::Autolock _l(mLock);
1265 if(!modifyAudioRoutingAllowed()) {
1266 return PERMISSION_DENIED;
1267 }
1268 if (mAudioPolicyManager == NULL) {
1269 return NO_INIT;
1270 }
1271 AutoCallerClear acc;
1272 return mAudioPolicyManager->setUidDeviceAffinities(uid, devices);
1273 }
1274
removeUidDeviceAffinities(uid_t uid)1275 status_t AudioPolicyService::removeUidDeviceAffinities(uid_t uid) {
1276 Mutex::Autolock _l(mLock);
1277 if(!modifyAudioRoutingAllowed()) {
1278 return PERMISSION_DENIED;
1279 }
1280 if (mAudioPolicyManager == NULL) {
1281 return NO_INIT;
1282 }
1283 AutoCallerClear acc;
1284 return mAudioPolicyManager->removeUidDeviceAffinities(uid);
1285 }
1286
setUserIdDeviceAffinities(int userId,const Vector<AudioDeviceTypeAddr> & devices)1287 status_t AudioPolicyService::setUserIdDeviceAffinities(int userId,
1288 const Vector<AudioDeviceTypeAddr>& devices) {
1289 Mutex::Autolock _l(mLock);
1290 if(!modifyAudioRoutingAllowed()) {
1291 return PERMISSION_DENIED;
1292 }
1293 if (mAudioPolicyManager == NULL) {
1294 return NO_INIT;
1295 }
1296 AutoCallerClear acc;
1297 return mAudioPolicyManager->setUserIdDeviceAffinities(userId, devices);
1298 }
1299
removeUserIdDeviceAffinities(int userId)1300 status_t AudioPolicyService::removeUserIdDeviceAffinities(int userId) {
1301 Mutex::Autolock _l(mLock);
1302 if(!modifyAudioRoutingAllowed()) {
1303 return PERMISSION_DENIED;
1304 }
1305 if (mAudioPolicyManager == NULL) {
1306 return NO_INIT;
1307 }
1308 AutoCallerClear acc;
1309 return mAudioPolicyManager->removeUserIdDeviceAffinities(userId);
1310 }
1311
startAudioSource(const struct audio_port_config * source,const audio_attributes_t * attributes,audio_port_handle_t * portId)1312 status_t AudioPolicyService::startAudioSource(const struct audio_port_config *source,
1313 const audio_attributes_t *attributes,
1314 audio_port_handle_t *portId)
1315 {
1316 Mutex::Autolock _l(mLock);
1317 if (mAudioPolicyManager == NULL) {
1318 return NO_INIT;
1319 }
1320
1321 status_t result = validateUsage(attributes->usage);
1322 if (result != NO_ERROR) {
1323 return result;
1324 }
1325
1326 // startAudioSource should be created as the calling uid
1327 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
1328 AutoCallerClear acc;
1329 return mAudioPolicyManager->startAudioSource(source, attributes, portId, callingUid);
1330 }
1331
stopAudioSource(audio_port_handle_t portId)1332 status_t AudioPolicyService::stopAudioSource(audio_port_handle_t portId)
1333 {
1334 Mutex::Autolock _l(mLock);
1335 if (mAudioPolicyManager == NULL) {
1336 return NO_INIT;
1337 }
1338 AutoCallerClear acc;
1339 return mAudioPolicyManager->stopAudioSource(portId);
1340 }
1341
setMasterMono(bool mono)1342 status_t AudioPolicyService::setMasterMono(bool mono)
1343 {
1344 if (mAudioPolicyManager == NULL) {
1345 return NO_INIT;
1346 }
1347 if (!settingsAllowed()) {
1348 return PERMISSION_DENIED;
1349 }
1350 Mutex::Autolock _l(mLock);
1351 AutoCallerClear acc;
1352 return mAudioPolicyManager->setMasterMono(mono);
1353 }
1354
getMasterMono(bool * mono)1355 status_t AudioPolicyService::getMasterMono(bool *mono)
1356 {
1357 if (mAudioPolicyManager == NULL) {
1358 return NO_INIT;
1359 }
1360 Mutex::Autolock _l(mLock);
1361 AutoCallerClear acc;
1362 return mAudioPolicyManager->getMasterMono(mono);
1363 }
1364
1365
getStreamVolumeDB(audio_stream_type_t stream,int index,audio_devices_t device)1366 float AudioPolicyService::getStreamVolumeDB(
1367 audio_stream_type_t stream, int index, audio_devices_t device)
1368 {
1369 if (mAudioPolicyManager == NULL) {
1370 return NAN;
1371 }
1372 Mutex::Autolock _l(mLock);
1373 AutoCallerClear acc;
1374 return mAudioPolicyManager->getStreamVolumeDB(stream, index, device);
1375 }
1376
getSurroundFormats(unsigned int * numSurroundFormats,audio_format_t * surroundFormats,bool * surroundFormatsEnabled,bool reported)1377 status_t AudioPolicyService::getSurroundFormats(unsigned int *numSurroundFormats,
1378 audio_format_t *surroundFormats,
1379 bool *surroundFormatsEnabled,
1380 bool reported)
1381 {
1382 if (mAudioPolicyManager == NULL) {
1383 return NO_INIT;
1384 }
1385 Mutex::Autolock _l(mLock);
1386 AutoCallerClear acc;
1387 return mAudioPolicyManager->getSurroundFormats(numSurroundFormats, surroundFormats,
1388 surroundFormatsEnabled, reported);
1389 }
1390
getHwOffloadEncodingFormatsSupportedForA2DP(std::vector<audio_format_t> * formats)1391 status_t AudioPolicyService::getHwOffloadEncodingFormatsSupportedForA2DP(
1392 std::vector<audio_format_t> *formats)
1393 {
1394 if (mAudioPolicyManager == NULL) {
1395 return NO_INIT;
1396 }
1397 Mutex::Autolock _l(mLock);
1398 AutoCallerClear acc;
1399 return mAudioPolicyManager->getHwOffloadEncodingFormatsSupportedForA2DP(formats);
1400 }
1401
setSurroundFormatEnabled(audio_format_t audioFormat,bool enabled)1402 status_t AudioPolicyService::setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled)
1403 {
1404 if (mAudioPolicyManager == NULL) {
1405 return NO_INIT;
1406 }
1407 Mutex::Autolock _l(mLock);
1408 AutoCallerClear acc;
1409 return mAudioPolicyManager->setSurroundFormatEnabled(audioFormat, enabled);
1410 }
1411
setAssistantUid(uid_t uid)1412 status_t AudioPolicyService::setAssistantUid(uid_t uid)
1413 {
1414 Mutex::Autolock _l(mLock);
1415 mUidPolicy->setAssistantUid(uid);
1416 return NO_ERROR;
1417 }
1418
setA11yServicesUids(const std::vector<uid_t> & uids)1419 status_t AudioPolicyService::setA11yServicesUids(const std::vector<uid_t>& uids)
1420 {
1421 Mutex::Autolock _l(mLock);
1422 mUidPolicy->setA11yUids(uids);
1423 return NO_ERROR;
1424 }
1425
setCurrentImeUid(uid_t uid)1426 status_t AudioPolicyService::setCurrentImeUid(uid_t uid)
1427 {
1428 Mutex::Autolock _l(mLock);
1429 mUidPolicy->setCurrentImeUid(uid);
1430 return NO_ERROR;
1431 }
1432
isHapticPlaybackSupported()1433 bool AudioPolicyService::isHapticPlaybackSupported()
1434 {
1435 if (mAudioPolicyManager == NULL) {
1436 ALOGW("%s, mAudioPolicyManager == NULL", __func__);
1437 return false;
1438 }
1439 Mutex::Autolock _l(mLock);
1440 AutoCallerClear acc;
1441 return mAudioPolicyManager->isHapticPlaybackSupported();
1442 }
1443
listAudioProductStrategies(AudioProductStrategyVector & strategies)1444 status_t AudioPolicyService::listAudioProductStrategies(AudioProductStrategyVector &strategies)
1445 {
1446 if (mAudioPolicyManager == NULL) {
1447 return NO_INIT;
1448 }
1449 Mutex::Autolock _l(mLock);
1450 return mAudioPolicyManager->listAudioProductStrategies(strategies);
1451 }
1452
getProductStrategyFromAudioAttributes(const AudioAttributes & aa,product_strategy_t & productStrategy)1453 status_t AudioPolicyService::getProductStrategyFromAudioAttributes(
1454 const AudioAttributes &aa, product_strategy_t &productStrategy)
1455 {
1456 if (mAudioPolicyManager == NULL) {
1457 return NO_INIT;
1458 }
1459 Mutex::Autolock _l(mLock);
1460 return mAudioPolicyManager->getProductStrategyFromAudioAttributes(aa, productStrategy);
1461 }
1462
listAudioVolumeGroups(AudioVolumeGroupVector & groups)1463 status_t AudioPolicyService::listAudioVolumeGroups(AudioVolumeGroupVector &groups)
1464 {
1465 if (mAudioPolicyManager == NULL) {
1466 return NO_INIT;
1467 }
1468 Mutex::Autolock _l(mLock);
1469 return mAudioPolicyManager->listAudioVolumeGroups(groups);
1470 }
1471
getVolumeGroupFromAudioAttributes(const AudioAttributes & aa,volume_group_t & volumeGroup)1472 status_t AudioPolicyService::getVolumeGroupFromAudioAttributes(const AudioAttributes &aa,
1473 volume_group_t &volumeGroup)
1474 {
1475 if (mAudioPolicyManager == NULL) {
1476 return NO_INIT;
1477 }
1478 Mutex::Autolock _l(mLock);
1479 return mAudioPolicyManager->getVolumeGroupFromAudioAttributes(aa, volumeGroup);
1480 }
1481
setRttEnabled(bool enabled)1482 status_t AudioPolicyService::setRttEnabled(bool enabled)
1483 {
1484 Mutex::Autolock _l(mLock);
1485 mUidPolicy->setRttEnabled(enabled);
1486 return NO_ERROR;
1487 }
1488
isCallScreenModeSupported()1489 bool AudioPolicyService::isCallScreenModeSupported()
1490 {
1491 if (mAudioPolicyManager == NULL) {
1492 ALOGW("%s, mAudioPolicyManager == NULL", __func__);
1493 return false;
1494 }
1495 Mutex::Autolock _l(mLock);
1496 AutoCallerClear acc;
1497 return mAudioPolicyManager->isCallScreenModeSupported();
1498 }
1499
setPreferredDeviceForStrategy(product_strategy_t strategy,const AudioDeviceTypeAddr & device)1500 status_t AudioPolicyService::setPreferredDeviceForStrategy(product_strategy_t strategy,
1501 const AudioDeviceTypeAddr &device)
1502 {
1503 if (mAudioPolicyManager == NULL) {
1504 return NO_INIT;
1505 }
1506 Mutex::Autolock _l(mLock);
1507 return mAudioPolicyManager->setPreferredDeviceForStrategy(strategy, device);
1508 }
1509
removePreferredDeviceForStrategy(product_strategy_t strategy)1510 status_t AudioPolicyService::removePreferredDeviceForStrategy(product_strategy_t strategy)
1511 {
1512 if (mAudioPolicyManager == NULL) {
1513 return NO_INIT;
1514 }
1515 Mutex::Autolock _l(mLock);
1516 return mAudioPolicyManager->removePreferredDeviceForStrategy(strategy);
1517 }
1518
getPreferredDeviceForStrategy(product_strategy_t strategy,AudioDeviceTypeAddr & device)1519 status_t AudioPolicyService::getPreferredDeviceForStrategy(product_strategy_t strategy,
1520 AudioDeviceTypeAddr &device)
1521 {
1522 if (mAudioPolicyManager == NULL) {
1523 return NO_INIT;
1524 }
1525 Mutex::Autolock _l(mLock);
1526 return mAudioPolicyManager->getPreferredDeviceForStrategy(strategy, device);
1527 }
1528
registerSoundTriggerCaptureStateListener(const sp<media::ICaptureStateListener> & listener,bool * result)1529 status_t AudioPolicyService::registerSoundTriggerCaptureStateListener(
1530 const sp<media::ICaptureStateListener>& listener,
1531 bool* result)
1532 {
1533 *result = mCaptureStateNotifier.RegisterListener(listener);
1534 return NO_ERROR;
1535 }
1536
1537 } // namespace android
1538