blob: 4a55bec824ccfb23b2196d6871d3cbb8fec9e6d5 [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,
Glenn Kasten6a8ab052014-07-24 14:08:35 -0700218 audio_input_flags_t flags)
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,
Glenn Kasten6a8ab052014-07-24 14:08:35 -0700235 format, channelMask, (audio_in_acoustics_t) 0,
236 flags);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800237
238 if (input == 0) {
239 return input;
240 }
bryant_liuba2b4392014-06-11 16:49:30 +0800241
Eric Laurent2d388ec2014-03-07 13:25:54 -0800242 // create audio pre processors according to input source
bryant_liuba2b4392014-06-11 16:49:30 +0800243 status_t status = mAudioPolicyEffects->addInputEffects(input, inputSource, audioSession);
244 if (status != NO_ERROR && status != ALREADY_EXISTS) {
245 ALOGW("Failed to add effects on input %d", input);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800246 }
247
Eric Laurent2d388ec2014-03-07 13:25:54 -0800248 return input;
249}
250
251status_t AudioPolicyService::startInput(audio_io_handle_t input)
252{
Eric Laurentdce54a12014-03-10 12:19:46 -0700253 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800254 return NO_INIT;
255 }
256 Mutex::Autolock _l(mLock);
257
Eric Laurentdce54a12014-03-10 12:19:46 -0700258 return mAudioPolicyManager->startInput(input);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800259}
260
261status_t AudioPolicyService::stopInput(audio_io_handle_t input)
262{
Eric Laurentdce54a12014-03-10 12:19:46 -0700263 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800264 return NO_INIT;
265 }
266 Mutex::Autolock _l(mLock);
267
Eric Laurentdce54a12014-03-10 12:19:46 -0700268 return mAudioPolicyManager->stopInput(input);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800269}
270
271void AudioPolicyService::releaseInput(audio_io_handle_t input)
272{
Eric Laurentdce54a12014-03-10 12:19:46 -0700273 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800274 return;
275 }
276 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700277 mAudioPolicyManager->releaseInput(input);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800278
bryant_liuba2b4392014-06-11 16:49:30 +0800279 // release audio processors from the input
280 status_t status = mAudioPolicyEffects->releaseInputEffects(input);
281 if(status != NO_ERROR) {
282 ALOGW("Failed to release effects on input %d", input);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800283 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800284}
285
286status_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream,
287 int indexMin,
288 int indexMax)
289{
Eric Laurentdce54a12014-03-10 12:19:46 -0700290 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800291 return NO_INIT;
292 }
293 if (!settingsAllowed()) {
294 return PERMISSION_DENIED;
295 }
296 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
297 return BAD_VALUE;
298 }
299 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700300 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800301 return NO_ERROR;
302}
303
304status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
305 int index,
306 audio_devices_t device)
307{
Eric Laurentdce54a12014-03-10 12:19:46 -0700308 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800309 return NO_INIT;
310 }
311 if (!settingsAllowed()) {
312 return PERMISSION_DENIED;
313 }
314 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
315 return BAD_VALUE;
316 }
317 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700318 return mAudioPolicyManager->setStreamVolumeIndex(stream,
319 index,
320 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800321}
322
323status_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream,
324 int *index,
325 audio_devices_t device)
326{
Eric Laurentdce54a12014-03-10 12:19:46 -0700327 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800328 return NO_INIT;
329 }
330 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
331 return BAD_VALUE;
332 }
333 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700334 return mAudioPolicyManager->getStreamVolumeIndex(stream,
335 index,
336 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800337}
338
339uint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream)
340{
Eric Laurentdce54a12014-03-10 12:19:46 -0700341 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800342 return 0;
343 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700344 return mAudioPolicyManager->getStrategyForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800345}
346
347//audio policy: use audio_device_t appropriately
348
349audio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream)
350{
Eric Laurentdce54a12014-03-10 12:19:46 -0700351 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800352 return (audio_devices_t)0;
353 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700354 return mAudioPolicyManager->getDevicesForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800355}
356
357audio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc)
358{
359 // FIXME change return type to status_t, and return NO_INIT here
Eric Laurentdce54a12014-03-10 12:19:46 -0700360 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800361 return 0;
362 }
363 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700364 return mAudioPolicyManager->getOutputForEffect(desc);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800365}
366
367status_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc,
368 audio_io_handle_t io,
369 uint32_t strategy,
370 int session,
371 int id)
372{
Eric Laurentdce54a12014-03-10 12:19:46 -0700373 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800374 return NO_INIT;
375 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700376 return mAudioPolicyManager->registerEffect(desc, io, strategy, session, id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800377}
378
379status_t AudioPolicyService::unregisterEffect(int id)
380{
Eric Laurentdce54a12014-03-10 12:19:46 -0700381 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800382 return NO_INIT;
383 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700384 return mAudioPolicyManager->unregisterEffect(id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800385}
386
387status_t AudioPolicyService::setEffectEnabled(int id, bool enabled)
388{
Eric Laurentdce54a12014-03-10 12:19:46 -0700389 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800390 return NO_INIT;
391 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700392 return mAudioPolicyManager->setEffectEnabled(id, enabled);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800393}
394
395bool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
396{
Eric Laurentdce54a12014-03-10 12:19:46 -0700397 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800398 return 0;
399 }
400 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700401 return mAudioPolicyManager->isStreamActive(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800402}
403
404bool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
405{
Eric Laurentdce54a12014-03-10 12:19:46 -0700406 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800407 return 0;
408 }
409 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700410 return mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800411}
412
413bool AudioPolicyService::isSourceActive(audio_source_t source) const
414{
Eric Laurentdce54a12014-03-10 12:19:46 -0700415 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800416 return false;
417 }
418 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700419 return mAudioPolicyManager->isSourceActive(source);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800420}
421
422status_t AudioPolicyService::queryDefaultPreProcessing(int audioSession,
423 effect_descriptor_t *descriptors,
424 uint32_t *count)
425{
Eric Laurentdce54a12014-03-10 12:19:46 -0700426 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800427 *count = 0;
428 return NO_INIT;
429 }
430 Mutex::Autolock _l(mLock);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800431
bryant_liuba2b4392014-06-11 16:49:30 +0800432 return mAudioPolicyEffects->queryDefaultInputEffects(audioSession, descriptors, count);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800433}
434
435bool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info)
436{
Eric Laurentdce54a12014-03-10 12:19:46 -0700437 if (mAudioPolicyManager == NULL) {
438 ALOGV("mAudioPolicyManager == NULL");
Eric Laurent2d388ec2014-03-07 13:25:54 -0800439 return false;
440 }
441
Eric Laurentdce54a12014-03-10 12:19:46 -0700442 return mAudioPolicyManager->isOffloadSupported(info);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800443}
444
Eric Laurent6a94d692014-05-20 11:18:06 -0700445status_t AudioPolicyService::listAudioPorts(audio_port_role_t role,
446 audio_port_type_t type,
Eric Laurent203b1a12014-04-01 10:34:16 -0700447 unsigned int *num_ports,
Eric Laurent6a94d692014-05-20 11:18:06 -0700448 struct audio_port *ports,
449 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -0700450{
Eric Laurent6a94d692014-05-20 11:18:06 -0700451 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700452 if(!modifyAudioRoutingAllowed()) {
453 return PERMISSION_DENIED;
454 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700455 if (mAudioPolicyManager == NULL) {
456 return NO_INIT;
457 }
458
459 return mAudioPolicyManager->listAudioPorts(role, type, num_ports, ports, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -0700460}
461
Eric Laurent6a94d692014-05-20 11:18:06 -0700462status_t AudioPolicyService::getAudioPort(struct audio_port *port)
Eric Laurent203b1a12014-04-01 10:34:16 -0700463{
Eric Laurent6a94d692014-05-20 11:18:06 -0700464 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700465 if(!modifyAudioRoutingAllowed()) {
466 return PERMISSION_DENIED;
467 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700468 if (mAudioPolicyManager == NULL) {
469 return NO_INIT;
470 }
471
472 return mAudioPolicyManager->getAudioPort(port);
Eric Laurent203b1a12014-04-01 10:34:16 -0700473}
474
Eric Laurent6a94d692014-05-20 11:18:06 -0700475status_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch,
476 audio_patch_handle_t *handle)
Eric Laurent203b1a12014-04-01 10:34:16 -0700477{
Eric Laurent6a94d692014-05-20 11:18:06 -0700478 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700479 if(!modifyAudioRoutingAllowed()) {
480 return PERMISSION_DENIED;
481 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700482 if (mAudioPolicyManager == NULL) {
483 return NO_INIT;
484 }
485 return mAudioPolicyManager->createAudioPatch(patch, handle,
486 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -0700487}
488
Eric Laurent6a94d692014-05-20 11:18:06 -0700489status_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle)
Eric Laurent203b1a12014-04-01 10:34:16 -0700490{
Eric Laurent6a94d692014-05-20 11:18:06 -0700491 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700492 if(!modifyAudioRoutingAllowed()) {
493 return PERMISSION_DENIED;
494 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700495 if (mAudioPolicyManager == NULL) {
496 return NO_INIT;
497 }
498
499 return mAudioPolicyManager->releaseAudioPatch(handle,
500 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -0700501}
502
503status_t AudioPolicyService::listAudioPatches(unsigned int *num_patches,
Eric Laurent6a94d692014-05-20 11:18:06 -0700504 struct audio_patch *patches,
505 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -0700506{
Eric Laurent6a94d692014-05-20 11:18:06 -0700507 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700508 if(!modifyAudioRoutingAllowed()) {
509 return PERMISSION_DENIED;
510 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700511 if (mAudioPolicyManager == NULL) {
512 return NO_INIT;
513 }
514
515 return mAudioPolicyManager->listAudioPatches(num_patches, patches, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -0700516}
517
Eric Laurent6a94d692014-05-20 11:18:06 -0700518status_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config)
Eric Laurent203b1a12014-04-01 10:34:16 -0700519{
Eric Laurent6a94d692014-05-20 11:18:06 -0700520 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700521 if(!modifyAudioRoutingAllowed()) {
522 return PERMISSION_DENIED;
523 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700524 if (mAudioPolicyManager == NULL) {
525 return NO_INIT;
526 }
527
528 return mAudioPolicyManager->setAudioPortConfig(config);
Eric Laurent203b1a12014-04-01 10:34:16 -0700529}
Eric Laurent2d388ec2014-03-07 13:25:54 -0800530
531}; // namespace android