blob: 8d75327c5690dab6a629b34dc34b87e5739f2215 [file] [log] [blame]
Eric Laurent2d388ec2014-03-07 13:25:54 -08001/*
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
Eric Laurentdce54a12014-03-10 12:19:46 -070017#define LOG_TAG "AudioPolicyIntefaceImpl"
Eric Laurent2d388ec2014-03-07 13:25:54 -080018//#define LOG_NDEBUG 0
19
20#include <utils/Log.h>
21#include "AudioPolicyService.h"
22#include "ServiceUtilities.h"
23
Eric Laurent2d388ec2014-03-07 13:25:54 -080024namespace android {
25
26
27// ----------------------------------------------------------------------------
28
29status_t AudioPolicyService::setDeviceConnectionState(audio_devices_t device,
30 audio_policy_dev_state_t state,
Paul McLeane743a472015-01-28 11:07:31 -080031 const char *device_address,
32 const char *device_name)
Eric Laurent2d388ec2014-03-07 13:25:54 -080033{
Eric Laurentdce54a12014-03-10 12:19:46 -070034 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -080035 return NO_INIT;
36 }
37 if (!settingsAllowed()) {
38 return PERMISSION_DENIED;
39 }
40 if (!audio_is_output_device(device) && !audio_is_input_device(device)) {
41 return BAD_VALUE;
42 }
43 if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE &&
44 state != AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) {
45 return BAD_VALUE;
46 }
47
48 ALOGV("setDeviceConnectionState()");
49 Mutex::Autolock _l(mLock);
Paul McLeane743a472015-01-28 11:07:31 -080050 return mAudioPolicyManager->setDeviceConnectionState(device, state,
51 device_address, device_name);
Eric Laurent2d388ec2014-03-07 13:25:54 -080052}
53
54audio_policy_dev_state_t AudioPolicyService::getDeviceConnectionState(
55 audio_devices_t device,
56 const char *device_address)
57{
Eric Laurentdce54a12014-03-10 12:19:46 -070058 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -080059 return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
60 }
Eric Laurentdce54a12014-03-10 12:19:46 -070061 return mAudioPolicyManager->getDeviceConnectionState(device,
Eric Laurent2d388ec2014-03-07 13:25:54 -080062 device_address);
63}
64
65status_t AudioPolicyService::setPhoneState(audio_mode_t state)
66{
Eric Laurentdce54a12014-03-10 12:19:46 -070067 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -080068 return NO_INIT;
69 }
70 if (!settingsAllowed()) {
71 return PERMISSION_DENIED;
72 }
73 if (uint32_t(state) >= AUDIO_MODE_CNT) {
74 return BAD_VALUE;
75 }
76
77 ALOGV("setPhoneState()");
78
Zach Jang3994ffd2015-10-27 01:29:45 +000079 // acquire lock before calling setMode() so that setMode() + setPhoneState() are an atomic
80 // operation from policy manager standpoint (no other operation (e.g track start or stop)
81 // can be interleaved).
82 Mutex::Autolock _l(mLock);
83
Eric Laurent2d388ec2014-03-07 13:25:54 -080084 // TODO: check if it is more appropriate to do it in platform specific policy manager
85 AudioSystem::setMode(state);
86
Eric Laurentdce54a12014-03-10 12:19:46 -070087 mAudioPolicyManager->setPhoneState(state);
Eric Laurentbb6c9a02014-09-25 14:11:47 -070088 mPhoneState = state;
Eric Laurent2d388ec2014-03-07 13:25:54 -080089 return NO_ERROR;
90}
91
Eric Laurentbb6c9a02014-09-25 14:11:47 -070092audio_mode_t AudioPolicyService::getPhoneState()
93{
94 Mutex::Autolock _l(mLock);
95 return mPhoneState;
96}
97
Eric Laurent2d388ec2014-03-07 13:25:54 -080098status_t AudioPolicyService::setForceUse(audio_policy_force_use_t usage,
99 audio_policy_forced_cfg_t config)
100{
Eric Laurentdce54a12014-03-10 12:19:46 -0700101 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800102 return NO_INIT;
103 }
104 if (!settingsAllowed()) {
105 return PERMISSION_DENIED;
106 }
107 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
108 return BAD_VALUE;
109 }
110 if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) {
111 return BAD_VALUE;
112 }
113 ALOGV("setForceUse()");
114 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700115 mAudioPolicyManager->setForceUse(usage, config);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800116 return NO_ERROR;
117}
118
119audio_policy_forced_cfg_t AudioPolicyService::getForceUse(audio_policy_force_use_t usage)
120{
Eric Laurentdce54a12014-03-10 12:19:46 -0700121 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800122 return AUDIO_POLICY_FORCE_NONE;
123 }
124 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
125 return AUDIO_POLICY_FORCE_NONE;
126 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700127 return mAudioPolicyManager->getForceUse(usage);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800128}
129
130audio_io_handle_t AudioPolicyService::getOutput(audio_stream_type_t stream,
131 uint32_t samplingRate,
132 audio_format_t format,
133 audio_channel_mask_t channelMask,
134 audio_output_flags_t flags,
135 const audio_offload_info_t *offloadInfo)
136{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800137 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700138 return AUDIO_IO_HANDLE_NONE;
Eric Laurentdea15412014-10-28 15:46:45 -0700139 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700140 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700141 return AUDIO_IO_HANDLE_NONE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800142 }
143 ALOGV("getOutput()");
144 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700145 return mAudioPolicyManager->getOutput(stream, samplingRate,
Eric Laurent2d388ec2014-03-07 13:25:54 -0800146 format, channelMask, flags, offloadInfo);
147}
148
Eric Laurente83b55d2014-11-14 10:06:21 -0800149status_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr,
150 audio_io_handle_t *output,
151 audio_session_t session,
152 audio_stream_type_t *stream,
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700153 uid_t uid,
Eric Laurente83b55d2014-11-14 10:06:21 -0800154 uint32_t samplingRate,
155 audio_format_t format,
156 audio_channel_mask_t channelMask,
157 audio_output_flags_t flags,
Paul McLean466dc8e2015-04-17 13:15:36 -0600158 audio_port_handle_t selectedDeviceId,
Eric Laurente83b55d2014-11-14 10:06:21 -0800159 const audio_offload_info_t *offloadInfo)
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700160{
161 if (mAudioPolicyManager == NULL) {
Eric Laurente83b55d2014-11-14 10:06:21 -0800162 return NO_INIT;
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700163 }
164 ALOGV("getOutput()");
165 Mutex::Autolock _l(mLock);
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700166
167 // if the caller is us, trust the specified uid
168 if (IPCThreadState::self()->getCallingPid() != getpid_cached || uid == (uid_t)-1) {
169 uid_t newclientUid = IPCThreadState::self()->getCallingUid();
170 if (uid != (uid_t)-1 && uid != newclientUid) {
171 ALOGW("%s uid %d tried to pass itself off as %d", __FUNCTION__, newclientUid, uid);
172 }
173 uid = newclientUid;
174 }
175 return mAudioPolicyManager->getOutputForAttr(attr, output, session, stream, uid, samplingRate,
Paul McLean466dc8e2015-04-17 13:15:36 -0600176 format, channelMask, flags, selectedDeviceId, offloadInfo);
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700177}
178
Eric Laurent2d388ec2014-03-07 13:25:54 -0800179status_t AudioPolicyService::startOutput(audio_io_handle_t output,
180 audio_stream_type_t stream,
Eric Laurente83b55d2014-11-14 10:06:21 -0800181 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800182{
Eric Laurentdea15412014-10-28 15:46:45 -0700183 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
184 return BAD_VALUE;
185 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700186 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800187 return NO_INIT;
188 }
189 ALOGV("startOutput()");
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700190 sp<AudioPolicyEffects>audioPolicyEffects;
191 {
192 Mutex::Autolock _l(mLock);
193 audioPolicyEffects = mAudioPolicyEffects;
bryant_liuba2b4392014-06-11 16:49:30 +0800194 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700195 if (audioPolicyEffects != 0) {
196 // create audio processors according to stream
197 status_t status = audioPolicyEffects->addOutputSessionEffects(output, stream, session);
198 if (status != NO_ERROR && status != ALREADY_EXISTS) {
199 ALOGW("Failed to add effects on session %d", session);
200 }
201 }
202 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700203 return mAudioPolicyManager->startOutput(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800204}
205
206status_t AudioPolicyService::stopOutput(audio_io_handle_t output,
207 audio_stream_type_t stream,
Eric Laurente83b55d2014-11-14 10:06:21 -0800208 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800209{
Eric Laurentdea15412014-10-28 15:46:45 -0700210 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
211 return BAD_VALUE;
212 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700213 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800214 return NO_INIT;
215 }
216 ALOGV("stopOutput()");
217 mOutputCommandThread->stopOutputCommand(output, stream, session);
218 return NO_ERROR;
219}
220
221status_t AudioPolicyService::doStopOutput(audio_io_handle_t output,
222 audio_stream_type_t stream,
Eric Laurente83b55d2014-11-14 10:06:21 -0800223 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800224{
225 ALOGV("doStopOutput from tid %d", gettid());
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700226 sp<AudioPolicyEffects>audioPolicyEffects;
227 {
228 Mutex::Autolock _l(mLock);
229 audioPolicyEffects = mAudioPolicyEffects;
bryant_liuba2b4392014-06-11 16:49:30 +0800230 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700231 if (audioPolicyEffects != 0) {
232 // release audio processors from the stream
233 status_t status = audioPolicyEffects->releaseOutputSessionEffects(output, stream, session);
234 if (status != NO_ERROR && status != ALREADY_EXISTS) {
235 ALOGW("Failed to release effects on session %d", session);
236 }
237 }
238 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700239 return mAudioPolicyManager->stopOutput(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800240}
241
Eric Laurente83b55d2014-11-14 10:06:21 -0800242void AudioPolicyService::releaseOutput(audio_io_handle_t output,
243 audio_stream_type_t stream,
244 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800245{
Eric Laurentdce54a12014-03-10 12:19:46 -0700246 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800247 return;
248 }
249 ALOGV("releaseOutput()");
Eric Laurente83b55d2014-11-14 10:06:21 -0800250 mOutputCommandThread->releaseOutputCommand(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800251}
252
Eric Laurente83b55d2014-11-14 10:06:21 -0800253void AudioPolicyService::doReleaseOutput(audio_io_handle_t output,
254 audio_stream_type_t stream,
255 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800256{
257 ALOGV("doReleaseOutput from tid %d", gettid());
258 Mutex::Autolock _l(mLock);
Eric Laurente83b55d2014-11-14 10:06:21 -0800259 mAudioPolicyManager->releaseOutput(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800260}
261
Eric Laurentcaf7f482014-11-25 17:50:47 -0800262status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr,
263 audio_io_handle_t *input,
264 audio_session_t session,
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700265 uid_t uid,
Eric Laurentcaf7f482014-11-25 17:50:47 -0800266 uint32_t samplingRate,
267 audio_format_t format,
268 audio_channel_mask_t channelMask,
Paul McLean466dc8e2015-04-17 13:15:36 -0600269 audio_input_flags_t flags,
270 audio_port_handle_t selectedDeviceId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800271{
Eric Laurentdce54a12014-03-10 12:19:46 -0700272 if (mAudioPolicyManager == NULL) {
Eric Laurentcaf7f482014-11-25 17:50:47 -0800273 return NO_INIT;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800274 }
275 // already checked by client, but double-check in case the client wrapper is bypassed
Eric Laurentcaf7f482014-11-25 17:50:47 -0800276 if (attr->source >= AUDIO_SOURCE_CNT && attr->source != AUDIO_SOURCE_HOTWORD &&
277 attr->source != AUDIO_SOURCE_FM_TUNER) {
278 return BAD_VALUE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800279 }
280
Eric Laurentab300c82015-04-13 13:47:33 -0700281 if ((attr->source == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed()) {
Eric Laurentcaf7f482014-11-25 17:50:47 -0800282 return BAD_VALUE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800283 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700284 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentcaf7f482014-11-25 17:50:47 -0800285 status_t status;
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800286 AudioPolicyInterface::input_type_t inputType;
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700287 // if the caller is us, trust the specified uid
288 if (IPCThreadState::self()->getCallingPid() != getpid_cached || uid == (uid_t)-1) {
289 uid_t newclientUid = IPCThreadState::self()->getCallingUid();
290 if (uid != (uid_t)-1 && uid != newclientUid) {
291 ALOGW("%s uid %d tried to pass itself off as %d", __FUNCTION__, newclientUid, uid);
292 }
293 uid = newclientUid;
294 }
295
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700296 {
297 Mutex::Autolock _l(mLock);
298 // the audio_in_acoustics_t parameter is ignored by get_input()
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700299 status = mAudioPolicyManager->getInputForAttr(attr, input, session, uid,
Eric Laurentcaf7f482014-11-25 17:50:47 -0800300 samplingRate, format, channelMask,
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700301 flags, selectedDeviceId,
302 &inputType);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700303 audioPolicyEffects = mAudioPolicyEffects;
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800304
305 if (status == NO_ERROR) {
306 // enforce permission (if any) required for each type of input
307 switch (inputType) {
308 case AudioPolicyInterface::API_INPUT_LEGACY:
309 break;
Eric Laurent82db2692015-08-07 13:59:42 -0700310 case AudioPolicyInterface::API_INPUT_TELEPHONY_RX:
311 // FIXME: use the same permission as for remote submix for now.
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800312 case AudioPolicyInterface::API_INPUT_MIX_CAPTURE:
313 if (!captureAudioOutputAllowed()) {
314 ALOGE("getInputForAttr() permission denied: capture not allowed");
315 status = PERMISSION_DENIED;
316 }
317 break;
318 case AudioPolicyInterface::API_INPUT_MIX_EXT_POLICY_REROUTE:
319 if (!modifyAudioRoutingAllowed()) {
320 ALOGE("getInputForAttr() permission denied: modify audio routing not allowed");
321 status = PERMISSION_DENIED;
322 }
323 break;
324 case AudioPolicyInterface::API_INPUT_INVALID:
325 default:
326 LOG_ALWAYS_FATAL("getInputForAttr() encountered an invalid input type %d",
327 (int)inputType);
328 }
329 }
330
331 if (status != NO_ERROR) {
332 if (status == PERMISSION_DENIED) {
333 mAudioPolicyManager->releaseInput(*input, session);
334 }
335 return status;
336 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700337 }
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800338
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700339 if (audioPolicyEffects != 0) {
340 // create audio pre processors according to input source
Eric Laurentcaf7f482014-11-25 17:50:47 -0800341 status_t status = audioPolicyEffects->addInputEffects(*input, attr->source, session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700342 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Eric Laurentcaf7f482014-11-25 17:50:47 -0800343 ALOGW("Failed to add effects on input %d", *input);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700344 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800345 }
Eric Laurentcaf7f482014-11-25 17:50:47 -0800346 return NO_ERROR;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800347}
348
Eric Laurent4dc68062014-07-28 17:26:49 -0700349status_t AudioPolicyService::startInput(audio_io_handle_t input,
350 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800351{
Eric Laurentdce54a12014-03-10 12:19:46 -0700352 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800353 return NO_INIT;
354 }
355 Mutex::Autolock _l(mLock);
356
Eric Laurent4dc68062014-07-28 17:26:49 -0700357 return mAudioPolicyManager->startInput(input, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800358}
359
Eric Laurent4dc68062014-07-28 17:26:49 -0700360status_t AudioPolicyService::stopInput(audio_io_handle_t input,
361 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800362{
Eric Laurentdce54a12014-03-10 12:19:46 -0700363 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800364 return NO_INIT;
365 }
366 Mutex::Autolock _l(mLock);
367
Eric Laurent4dc68062014-07-28 17:26:49 -0700368 return mAudioPolicyManager->stopInput(input, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800369}
370
Eric Laurent4dc68062014-07-28 17:26:49 -0700371void AudioPolicyService::releaseInput(audio_io_handle_t input,
372 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800373{
Eric Laurentdce54a12014-03-10 12:19:46 -0700374 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800375 return;
376 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700377 sp<AudioPolicyEffects>audioPolicyEffects;
378 {
379 Mutex::Autolock _l(mLock);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700380 audioPolicyEffects = mAudioPolicyEffects;
381 }
382 if (audioPolicyEffects != 0) {
383 // release audio processors from the input
384 status_t status = audioPolicyEffects->releaseInputEffects(input);
385 if(status != NO_ERROR) {
386 ALOGW("Failed to release effects on input %d", input);
387 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800388 }
Eric Laurentbc7f3472016-12-01 15:28:29 -0800389 {
390 Mutex::Autolock _l(mLock);
391 mAudioPolicyManager->releaseInput(input, session);
392 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800393}
394
395status_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream,
396 int indexMin,
397 int indexMax)
398{
Eric Laurentdce54a12014-03-10 12:19:46 -0700399 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800400 return NO_INIT;
401 }
402 if (!settingsAllowed()) {
403 return PERMISSION_DENIED;
404 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800405 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800406 return BAD_VALUE;
407 }
408 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700409 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800410 return NO_ERROR;
411}
412
413status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
414 int index,
415 audio_devices_t device)
416{
Eric Laurentdce54a12014-03-10 12:19:46 -0700417 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800418 return NO_INIT;
419 }
420 if (!settingsAllowed()) {
421 return PERMISSION_DENIED;
422 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800423 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800424 return BAD_VALUE;
425 }
426 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700427 return mAudioPolicyManager->setStreamVolumeIndex(stream,
428 index,
429 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800430}
431
432status_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream,
433 int *index,
434 audio_devices_t device)
435{
Eric Laurentdce54a12014-03-10 12:19:46 -0700436 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800437 return NO_INIT;
438 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800439 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800440 return BAD_VALUE;
441 }
442 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700443 return mAudioPolicyManager->getStreamVolumeIndex(stream,
444 index,
445 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800446}
447
448uint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream)
449{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800450 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700451 return 0;
Eric Laurentdea15412014-10-28 15:46:45 -0700452 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700453 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800454 return 0;
455 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700456 return mAudioPolicyManager->getStrategyForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800457}
458
459//audio policy: use audio_device_t appropriately
460
461audio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream)
462{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800463 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700464 return AUDIO_DEVICE_NONE;
Eric Laurentdea15412014-10-28 15:46:45 -0700465 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700466 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700467 return AUDIO_DEVICE_NONE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800468 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700469 return mAudioPolicyManager->getDevicesForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800470}
471
472audio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc)
473{
474 // FIXME change return type to status_t, and return NO_INIT here
Eric Laurentdce54a12014-03-10 12:19:46 -0700475 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800476 return 0;
477 }
478 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700479 return mAudioPolicyManager->getOutputForEffect(desc);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800480}
481
482status_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc,
483 audio_io_handle_t io,
484 uint32_t strategy,
485 int session,
486 int id)
487{
Eric Laurentdce54a12014-03-10 12:19:46 -0700488 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800489 return NO_INIT;
490 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700491 return mAudioPolicyManager->registerEffect(desc, io, strategy, session, id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800492}
493
494status_t AudioPolicyService::unregisterEffect(int id)
495{
Eric Laurentdce54a12014-03-10 12:19:46 -0700496 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800497 return NO_INIT;
498 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700499 return mAudioPolicyManager->unregisterEffect(id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800500}
501
502status_t AudioPolicyService::setEffectEnabled(int id, bool enabled)
503{
Eric Laurentdce54a12014-03-10 12:19:46 -0700504 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800505 return NO_INIT;
506 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700507 return mAudioPolicyManager->setEffectEnabled(id, enabled);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800508}
509
510bool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
511{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800512 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700513 return false;
Eric Laurentdea15412014-10-28 15:46:45 -0700514 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700515 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700516 return false;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800517 }
518 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700519 return mAudioPolicyManager->isStreamActive(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800520}
521
522bool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
523{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800524 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700525 return false;
Eric Laurentdea15412014-10-28 15:46:45 -0700526 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700527 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700528 return false;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800529 }
530 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700531 return mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800532}
533
534bool AudioPolicyService::isSourceActive(audio_source_t source) const
535{
Eric Laurentdce54a12014-03-10 12:19:46 -0700536 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800537 return false;
538 }
539 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700540 return mAudioPolicyManager->isSourceActive(source);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800541}
542
543status_t AudioPolicyService::queryDefaultPreProcessing(int audioSession,
544 effect_descriptor_t *descriptors,
545 uint32_t *count)
546{
Eric Laurentdce54a12014-03-10 12:19:46 -0700547 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800548 *count = 0;
549 return NO_INIT;
550 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700551 sp<AudioPolicyEffects>audioPolicyEffects;
552 {
553 Mutex::Autolock _l(mLock);
554 audioPolicyEffects = mAudioPolicyEffects;
555 }
556 if (audioPolicyEffects == 0) {
557 *count = 0;
558 return NO_INIT;
559 }
560 return audioPolicyEffects->queryDefaultInputEffects(audioSession, descriptors, count);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800561}
562
563bool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info)
564{
Eric Laurentdce54a12014-03-10 12:19:46 -0700565 if (mAudioPolicyManager == NULL) {
566 ALOGV("mAudioPolicyManager == NULL");
Eric Laurent2d388ec2014-03-07 13:25:54 -0800567 return false;
568 }
569
Eric Laurentdce54a12014-03-10 12:19:46 -0700570 return mAudioPolicyManager->isOffloadSupported(info);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800571}
572
Eric Laurent6a94d692014-05-20 11:18:06 -0700573status_t AudioPolicyService::listAudioPorts(audio_port_role_t role,
574 audio_port_type_t type,
Eric Laurent203b1a12014-04-01 10:34:16 -0700575 unsigned int *num_ports,
Eric Laurent6a94d692014-05-20 11:18:06 -0700576 struct audio_port *ports,
577 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -0700578{
Eric Laurent6a94d692014-05-20 11:18:06 -0700579 Mutex::Autolock _l(mLock);
580 if (mAudioPolicyManager == NULL) {
581 return NO_INIT;
582 }
583
584 return mAudioPolicyManager->listAudioPorts(role, type, num_ports, ports, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -0700585}
586
Eric Laurent6a94d692014-05-20 11:18:06 -0700587status_t AudioPolicyService::getAudioPort(struct audio_port *port)
Eric Laurent203b1a12014-04-01 10:34:16 -0700588{
Eric Laurent6a94d692014-05-20 11:18:06 -0700589 Mutex::Autolock _l(mLock);
590 if (mAudioPolicyManager == NULL) {
591 return NO_INIT;
592 }
593
594 return mAudioPolicyManager->getAudioPort(port);
Eric Laurent203b1a12014-04-01 10:34:16 -0700595}
596
Eric Laurent6a94d692014-05-20 11:18:06 -0700597status_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch,
598 audio_patch_handle_t *handle)
Eric Laurent203b1a12014-04-01 10:34:16 -0700599{
Eric Laurent6a94d692014-05-20 11:18:06 -0700600 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700601 if(!modifyAudioRoutingAllowed()) {
602 return PERMISSION_DENIED;
603 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700604 if (mAudioPolicyManager == NULL) {
605 return NO_INIT;
606 }
607 return mAudioPolicyManager->createAudioPatch(patch, handle,
608 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -0700609}
610
Eric Laurent6a94d692014-05-20 11:18:06 -0700611status_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle)
Eric Laurent203b1a12014-04-01 10:34:16 -0700612{
Eric Laurent6a94d692014-05-20 11:18:06 -0700613 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700614 if(!modifyAudioRoutingAllowed()) {
615 return PERMISSION_DENIED;
616 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700617 if (mAudioPolicyManager == NULL) {
618 return NO_INIT;
619 }
620
621 return mAudioPolicyManager->releaseAudioPatch(handle,
622 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -0700623}
624
625status_t AudioPolicyService::listAudioPatches(unsigned int *num_patches,
Eric Laurent6a94d692014-05-20 11:18:06 -0700626 struct audio_patch *patches,
627 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -0700628{
Eric Laurent6a94d692014-05-20 11:18:06 -0700629 Mutex::Autolock _l(mLock);
630 if (mAudioPolicyManager == NULL) {
631 return NO_INIT;
632 }
633
634 return mAudioPolicyManager->listAudioPatches(num_patches, patches, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -0700635}
636
Eric Laurent6a94d692014-05-20 11:18:06 -0700637status_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config)
Eric Laurent203b1a12014-04-01 10:34:16 -0700638{
Eric Laurent6a94d692014-05-20 11:18:06 -0700639 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700640 if(!modifyAudioRoutingAllowed()) {
641 return PERMISSION_DENIED;
642 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700643 if (mAudioPolicyManager == NULL) {
644 return NO_INIT;
645 }
646
647 return mAudioPolicyManager->setAudioPortConfig(config);
Eric Laurent203b1a12014-04-01 10:34:16 -0700648}
Eric Laurent2d388ec2014-03-07 13:25:54 -0800649
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700650status_t AudioPolicyService::acquireSoundTriggerSession(audio_session_t *session,
651 audio_io_handle_t *ioHandle,
652 audio_devices_t *device)
653{
Andy Hungf759b8c2017-08-15 12:48:54 -0700654 Mutex::Autolock _l(mLock);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700655 if (mAudioPolicyManager == NULL) {
656 return NO_INIT;
657 }
658
659 return mAudioPolicyManager->acquireSoundTriggerSession(session, ioHandle, device);
660}
661
662status_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session)
663{
Andy Hungf759b8c2017-08-15 12:48:54 -0700664 Mutex::Autolock _l(mLock);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700665 if (mAudioPolicyManager == NULL) {
666 return NO_INIT;
667 }
668
669 return mAudioPolicyManager->releaseSoundTriggerSession(session);
670}
671
Eric Laurentbaac1832014-12-01 17:52:59 -0800672status_t AudioPolicyService::registerPolicyMixes(Vector<AudioMix> mixes, bool registration)
673{
674 Mutex::Autolock _l(mLock);
675 if(!modifyAudioRoutingAllowed()) {
676 return PERMISSION_DENIED;
677 }
678 if (mAudioPolicyManager == NULL) {
679 return NO_INIT;
680 }
681 if (registration) {
682 return mAudioPolicyManager->registerPolicyMixes(mixes);
683 } else {
684 return mAudioPolicyManager->unregisterPolicyMixes(mixes);
685 }
686}
687
Eric Laurent554a2772015-04-10 11:29:24 -0700688status_t AudioPolicyService::startAudioSource(const struct audio_port_config *source,
689 const audio_attributes_t *attributes,
690 audio_io_handle_t *handle)
691{
692 Mutex::Autolock _l(mLock);
693 if (mAudioPolicyManager == NULL) {
694 return NO_INIT;
695 }
696
697 return mAudioPolicyManager->startAudioSource(source, attributes, handle);
698}
699
700status_t AudioPolicyService::stopAudioSource(audio_io_handle_t handle)
701{
702 Mutex::Autolock _l(mLock);
703 if (mAudioPolicyManager == NULL) {
704 return NO_INIT;
705 }
706
707 return mAudioPolicyManager->stopAudioSource(handle);
708}
709
Eric Laurent2d388ec2014-03-07 13:25:54 -0800710}; // namespace android