blob: a41721f04049aa87adf037b1fb9c842bf0c48738 [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,
31 const char *device_address)
32{
Eric Laurentdce54a12014-03-10 12:19:46 -070033 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -080034 return NO_INIT;
35 }
36 if (!settingsAllowed()) {
37 return PERMISSION_DENIED;
38 }
39 if (!audio_is_output_device(device) && !audio_is_input_device(device)) {
40 return BAD_VALUE;
41 }
42 if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE &&
43 state != AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) {
44 return BAD_VALUE;
45 }
46
47 ALOGV("setDeviceConnectionState()");
48 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -070049 return mAudioPolicyManager->setDeviceConnectionState(device,
Eric Laurent2d388ec2014-03-07 13:25:54 -080050 state, device_address);
51}
52
53audio_policy_dev_state_t AudioPolicyService::getDeviceConnectionState(
54 audio_devices_t device,
55 const char *device_address)
56{
Eric Laurentdce54a12014-03-10 12:19:46 -070057 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -080058 return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
59 }
Eric Laurentdce54a12014-03-10 12:19:46 -070060 return mAudioPolicyManager->getDeviceConnectionState(device,
Eric Laurent2d388ec2014-03-07 13:25:54 -080061 device_address);
62}
63
64status_t AudioPolicyService::setPhoneState(audio_mode_t state)
65{
Eric Laurentdce54a12014-03-10 12:19:46 -070066 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -080067 return NO_INIT;
68 }
69 if (!settingsAllowed()) {
70 return PERMISSION_DENIED;
71 }
72 if (uint32_t(state) >= AUDIO_MODE_CNT) {
73 return BAD_VALUE;
74 }
75
76 ALOGV("setPhoneState()");
77
78 // TODO: check if it is more appropriate to do it in platform specific policy manager
79 AudioSystem::setMode(state);
80
81 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -070082 mAudioPolicyManager->setPhoneState(state);
Eric Laurent2d388ec2014-03-07 13:25:54 -080083 return NO_ERROR;
84}
85
86status_t AudioPolicyService::setForceUse(audio_policy_force_use_t usage,
87 audio_policy_forced_cfg_t config)
88{
Eric Laurentdce54a12014-03-10 12:19:46 -070089 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -080090 return NO_INIT;
91 }
92 if (!settingsAllowed()) {
93 return PERMISSION_DENIED;
94 }
95 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
96 return BAD_VALUE;
97 }
98 if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) {
99 return BAD_VALUE;
100 }
101 ALOGV("setForceUse()");
102 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700103 mAudioPolicyManager->setForceUse(usage, config);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800104 return NO_ERROR;
105}
106
107audio_policy_forced_cfg_t AudioPolicyService::getForceUse(audio_policy_force_use_t usage)
108{
Eric Laurentdce54a12014-03-10 12:19:46 -0700109 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800110 return AUDIO_POLICY_FORCE_NONE;
111 }
112 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
113 return AUDIO_POLICY_FORCE_NONE;
114 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700115 return mAudioPolicyManager->getForceUse(usage);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800116}
117
118audio_io_handle_t AudioPolicyService::getOutput(audio_stream_type_t stream,
119 uint32_t samplingRate,
120 audio_format_t format,
121 audio_channel_mask_t channelMask,
122 audio_output_flags_t flags,
123 const audio_offload_info_t *offloadInfo)
124{
Eric Laurentdce54a12014-03-10 12:19:46 -0700125 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800126 return 0;
127 }
128 ALOGV("getOutput()");
129 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700130 return mAudioPolicyManager->getOutput(stream, samplingRate,
Eric Laurent2d388ec2014-03-07 13:25:54 -0800131 format, channelMask, flags, offloadInfo);
132}
133
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700134audio_io_handle_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr,
135 uint32_t samplingRate,
136 audio_format_t format,
137 audio_channel_mask_t channelMask,
138 audio_output_flags_t flags,
139 const audio_offload_info_t *offloadInfo)
140{
141 if (mAudioPolicyManager == NULL) {
142 return 0;
143 }
144 ALOGV("getOutput()");
145 Mutex::Autolock _l(mLock);
146 return mAudioPolicyManager->getOutputForAttr(attr, samplingRate,
147 format, channelMask, flags, offloadInfo);
148}
149
Eric Laurent2d388ec2014-03-07 13:25:54 -0800150status_t AudioPolicyService::startOutput(audio_io_handle_t output,
151 audio_stream_type_t stream,
152 int session)
153{
Eric Laurentdce54a12014-03-10 12:19:46 -0700154 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800155 return NO_INIT;
156 }
157 ALOGV("startOutput()");
158 Mutex::Autolock _l(mLock);
bryant_liuba2b4392014-06-11 16:49:30 +0800159
160 // create audio processors according to stream
161 status_t status = mAudioPolicyEffects->addOutputSessionEffects(output, stream, session);
162 if (status != NO_ERROR && status != ALREADY_EXISTS) {
163 ALOGW("Failed to add effects on session %d", session);
164 }
165
Eric Laurentdce54a12014-03-10 12:19:46 -0700166 return mAudioPolicyManager->startOutput(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800167}
168
169status_t AudioPolicyService::stopOutput(audio_io_handle_t output,
170 audio_stream_type_t stream,
171 int session)
172{
Eric Laurentdce54a12014-03-10 12:19:46 -0700173 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800174 return NO_INIT;
175 }
176 ALOGV("stopOutput()");
177 mOutputCommandThread->stopOutputCommand(output, stream, session);
178 return NO_ERROR;
179}
180
181status_t AudioPolicyService::doStopOutput(audio_io_handle_t output,
182 audio_stream_type_t stream,
183 int session)
184{
185 ALOGV("doStopOutput from tid %d", gettid());
186 Mutex::Autolock _l(mLock);
bryant_liuba2b4392014-06-11 16:49:30 +0800187
188 // release audio processors from the stream
189 status_t status = mAudioPolicyEffects->releaseOutputSessionEffects(output, stream, session);
190 if (status != NO_ERROR && status != ALREADY_EXISTS) {
191 ALOGW("Failed to release effects on session %d", session);
192 }
193
Eric Laurentdce54a12014-03-10 12:19:46 -0700194 return mAudioPolicyManager->stopOutput(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800195}
196
197void AudioPolicyService::releaseOutput(audio_io_handle_t output)
198{
Eric Laurentdce54a12014-03-10 12:19:46 -0700199 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800200 return;
201 }
202 ALOGV("releaseOutput()");
203 mOutputCommandThread->releaseOutputCommand(output);
204}
205
206void AudioPolicyService::doReleaseOutput(audio_io_handle_t output)
207{
208 ALOGV("doReleaseOutput from tid %d", gettid());
209 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700210 mAudioPolicyManager->releaseOutput(output);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800211}
212
213audio_io_handle_t AudioPolicyService::getInput(audio_source_t inputSource,
214 uint32_t samplingRate,
215 audio_format_t format,
216 audio_channel_mask_t channelMask,
Glenn Kastenb3b16602014-07-16 08:36:31 -0700217 int audioSession,
218 audio_input_flags_t flags __unused)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800219{
Eric Laurentdce54a12014-03-10 12:19:46 -0700220 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800221 return 0;
222 }
223 // already checked by client, but double-check in case the client wrapper is bypassed
224 if (inputSource >= AUDIO_SOURCE_CNT && inputSource != AUDIO_SOURCE_HOTWORD) {
225 return 0;
226 }
227
228 if ((inputSource == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed()) {
229 return 0;
230 }
231
232 Mutex::Autolock _l(mLock);
233 // the audio_in_acoustics_t parameter is ignored by get_input()
Eric Laurentdce54a12014-03-10 12:19:46 -0700234 audio_io_handle_t input = mAudioPolicyManager->getInput(inputSource, samplingRate,
Eric Laurent2d388ec2014-03-07 13:25:54 -0800235 format, channelMask, (audio_in_acoustics_t) 0);
236
237 if (input == 0) {
238 return input;
239 }
bryant_liuba2b4392014-06-11 16:49:30 +0800240
Eric Laurent2d388ec2014-03-07 13:25:54 -0800241 // create audio pre processors according to input source
bryant_liuba2b4392014-06-11 16:49:30 +0800242 status_t status = mAudioPolicyEffects->addInputEffects(input, inputSource, audioSession);
243 if (status != NO_ERROR && status != ALREADY_EXISTS) {
244 ALOGW("Failed to add effects on input %d", input);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800245 }
246
Eric Laurent2d388ec2014-03-07 13:25:54 -0800247 return input;
248}
249
250status_t AudioPolicyService::startInput(audio_io_handle_t input)
251{
Eric Laurentdce54a12014-03-10 12:19:46 -0700252 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800253 return NO_INIT;
254 }
255 Mutex::Autolock _l(mLock);
256
Eric Laurentdce54a12014-03-10 12:19:46 -0700257 return mAudioPolicyManager->startInput(input);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800258}
259
260status_t AudioPolicyService::stopInput(audio_io_handle_t input)
261{
Eric Laurentdce54a12014-03-10 12:19:46 -0700262 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800263 return NO_INIT;
264 }
265 Mutex::Autolock _l(mLock);
266
Eric Laurentdce54a12014-03-10 12:19:46 -0700267 return mAudioPolicyManager->stopInput(input);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800268}
269
270void AudioPolicyService::releaseInput(audio_io_handle_t input)
271{
Eric Laurentdce54a12014-03-10 12:19:46 -0700272 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800273 return;
274 }
275 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700276 mAudioPolicyManager->releaseInput(input);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800277
bryant_liuba2b4392014-06-11 16:49:30 +0800278 // release audio processors from the input
279 status_t status = mAudioPolicyEffects->releaseInputEffects(input);
280 if(status != NO_ERROR) {
281 ALOGW("Failed to release effects on input %d", input);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800282 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800283}
284
285status_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream,
286 int indexMin,
287 int indexMax)
288{
Eric Laurentdce54a12014-03-10 12:19:46 -0700289 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800290 return NO_INIT;
291 }
292 if (!settingsAllowed()) {
293 return PERMISSION_DENIED;
294 }
295 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
296 return BAD_VALUE;
297 }
298 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700299 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800300 return NO_ERROR;
301}
302
303status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
304 int index,
305 audio_devices_t device)
306{
Eric Laurentdce54a12014-03-10 12:19:46 -0700307 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800308 return NO_INIT;
309 }
310 if (!settingsAllowed()) {
311 return PERMISSION_DENIED;
312 }
313 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
314 return BAD_VALUE;
315 }
316 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700317 return mAudioPolicyManager->setStreamVolumeIndex(stream,
318 index,
319 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800320}
321
322status_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream,
323 int *index,
324 audio_devices_t device)
325{
Eric Laurentdce54a12014-03-10 12:19:46 -0700326 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800327 return NO_INIT;
328 }
329 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
330 return BAD_VALUE;
331 }
332 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700333 return mAudioPolicyManager->getStreamVolumeIndex(stream,
334 index,
335 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800336}
337
338uint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream)
339{
Eric Laurentdce54a12014-03-10 12:19:46 -0700340 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800341 return 0;
342 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700343 return mAudioPolicyManager->getStrategyForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800344}
345
346//audio policy: use audio_device_t appropriately
347
348audio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream)
349{
Eric Laurentdce54a12014-03-10 12:19:46 -0700350 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800351 return (audio_devices_t)0;
352 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700353 return mAudioPolicyManager->getDevicesForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800354}
355
356audio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc)
357{
358 // FIXME change return type to status_t, and return NO_INIT here
Eric Laurentdce54a12014-03-10 12:19:46 -0700359 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800360 return 0;
361 }
362 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700363 return mAudioPolicyManager->getOutputForEffect(desc);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800364}
365
366status_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc,
367 audio_io_handle_t io,
368 uint32_t strategy,
369 int session,
370 int id)
371{
Eric Laurentdce54a12014-03-10 12:19:46 -0700372 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800373 return NO_INIT;
374 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700375 return mAudioPolicyManager->registerEffect(desc, io, strategy, session, id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800376}
377
378status_t AudioPolicyService::unregisterEffect(int id)
379{
Eric Laurentdce54a12014-03-10 12:19:46 -0700380 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800381 return NO_INIT;
382 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700383 return mAudioPolicyManager->unregisterEffect(id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800384}
385
386status_t AudioPolicyService::setEffectEnabled(int id, bool enabled)
387{
Eric Laurentdce54a12014-03-10 12:19:46 -0700388 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800389 return NO_INIT;
390 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700391 return mAudioPolicyManager->setEffectEnabled(id, enabled);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800392}
393
394bool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
395{
Eric Laurentdce54a12014-03-10 12:19:46 -0700396 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800397 return 0;
398 }
399 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700400 return mAudioPolicyManager->isStreamActive(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800401}
402
403bool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
404{
Eric Laurentdce54a12014-03-10 12:19:46 -0700405 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800406 return 0;
407 }
408 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700409 return mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800410}
411
412bool AudioPolicyService::isSourceActive(audio_source_t source) const
413{
Eric Laurentdce54a12014-03-10 12:19:46 -0700414 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800415 return false;
416 }
417 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700418 return mAudioPolicyManager->isSourceActive(source);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800419}
420
421status_t AudioPolicyService::queryDefaultPreProcessing(int audioSession,
422 effect_descriptor_t *descriptors,
423 uint32_t *count)
424{
Eric Laurentdce54a12014-03-10 12:19:46 -0700425 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800426 *count = 0;
427 return NO_INIT;
428 }
429 Mutex::Autolock _l(mLock);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800430
bryant_liuba2b4392014-06-11 16:49:30 +0800431 return mAudioPolicyEffects->queryDefaultInputEffects(audioSession, descriptors, count);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800432}
433
434bool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info)
435{
Eric Laurentdce54a12014-03-10 12:19:46 -0700436 if (mAudioPolicyManager == NULL) {
437 ALOGV("mAudioPolicyManager == NULL");
Eric Laurent2d388ec2014-03-07 13:25:54 -0800438 return false;
439 }
440
Eric Laurentdce54a12014-03-10 12:19:46 -0700441 return mAudioPolicyManager->isOffloadSupported(info);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800442}
443
Eric Laurent6a94d692014-05-20 11:18:06 -0700444status_t AudioPolicyService::listAudioPorts(audio_port_role_t role,
445 audio_port_type_t type,
Eric Laurent203b1a12014-04-01 10:34:16 -0700446 unsigned int *num_ports,
Eric Laurent6a94d692014-05-20 11:18:06 -0700447 struct audio_port *ports,
448 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -0700449{
Eric Laurent6a94d692014-05-20 11:18:06 -0700450 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700451 if(!modifyAudioRoutingAllowed()) {
452 return PERMISSION_DENIED;
453 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700454 if (mAudioPolicyManager == NULL) {
455 return NO_INIT;
456 }
457
458 return mAudioPolicyManager->listAudioPorts(role, type, num_ports, ports, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -0700459}
460
Eric Laurent6a94d692014-05-20 11:18:06 -0700461status_t AudioPolicyService::getAudioPort(struct audio_port *port)
Eric Laurent203b1a12014-04-01 10:34:16 -0700462{
Eric Laurent6a94d692014-05-20 11:18:06 -0700463 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700464 if(!modifyAudioRoutingAllowed()) {
465 return PERMISSION_DENIED;
466 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700467 if (mAudioPolicyManager == NULL) {
468 return NO_INIT;
469 }
470
471 return mAudioPolicyManager->getAudioPort(port);
Eric Laurent203b1a12014-04-01 10:34:16 -0700472}
473
Eric Laurent6a94d692014-05-20 11:18:06 -0700474status_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch,
475 audio_patch_handle_t *handle)
Eric Laurent203b1a12014-04-01 10:34:16 -0700476{
Eric Laurent6a94d692014-05-20 11:18:06 -0700477 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700478 if(!modifyAudioRoutingAllowed()) {
479 return PERMISSION_DENIED;
480 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700481 if (mAudioPolicyManager == NULL) {
482 return NO_INIT;
483 }
484 return mAudioPolicyManager->createAudioPatch(patch, handle,
485 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -0700486}
487
Eric Laurent6a94d692014-05-20 11:18:06 -0700488status_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle)
Eric Laurent203b1a12014-04-01 10:34:16 -0700489{
Eric Laurent6a94d692014-05-20 11:18:06 -0700490 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700491 if(!modifyAudioRoutingAllowed()) {
492 return PERMISSION_DENIED;
493 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700494 if (mAudioPolicyManager == NULL) {
495 return NO_INIT;
496 }
497
498 return mAudioPolicyManager->releaseAudioPatch(handle,
499 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -0700500}
501
502status_t AudioPolicyService::listAudioPatches(unsigned int *num_patches,
Eric Laurent6a94d692014-05-20 11:18:06 -0700503 struct audio_patch *patches,
504 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -0700505{
Eric Laurent6a94d692014-05-20 11:18:06 -0700506 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700507 if(!modifyAudioRoutingAllowed()) {
508 return PERMISSION_DENIED;
509 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700510 if (mAudioPolicyManager == NULL) {
511 return NO_INIT;
512 }
513
514 return mAudioPolicyManager->listAudioPatches(num_patches, patches, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -0700515}
516
Eric Laurent6a94d692014-05-20 11:18:06 -0700517status_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config)
Eric Laurent203b1a12014-04-01 10:34:16 -0700518{
Eric Laurent6a94d692014-05-20 11:18:06 -0700519 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700520 if(!modifyAudioRoutingAllowed()) {
521 return PERMISSION_DENIED;
522 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700523 if (mAudioPolicyManager == NULL) {
524 return NO_INIT;
525 }
526
527 return mAudioPolicyManager->setAudioPortConfig(config);
Eric Laurent203b1a12014-04-01 10:34:16 -0700528}
Eric Laurent2d388ec2014-03-07 13:25:54 -0800529
530}; // namespace android