blob: 5a13ac287113142432b356d2846d8c94df135a88 [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,
217 int audioSession)
218{
Eric Laurentdce54a12014-03-10 12:19:46 -0700219 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800220 return 0;
221 }
222 // already checked by client, but double-check in case the client wrapper is bypassed
223 if (inputSource >= AUDIO_SOURCE_CNT && inputSource != AUDIO_SOURCE_HOTWORD) {
224 return 0;
225 }
226
227 if ((inputSource == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed()) {
228 return 0;
229 }
230
231 Mutex::Autolock _l(mLock);
232 // the audio_in_acoustics_t parameter is ignored by get_input()
Eric Laurentdce54a12014-03-10 12:19:46 -0700233 audio_io_handle_t input = mAudioPolicyManager->getInput(inputSource, samplingRate,
Eric Laurent2d388ec2014-03-07 13:25:54 -0800234 format, channelMask, (audio_in_acoustics_t) 0);
235
236 if (input == 0) {
237 return input;
238 }
bryant_liuba2b4392014-06-11 16:49:30 +0800239
Eric Laurent2d388ec2014-03-07 13:25:54 -0800240 // create audio pre processors according to input source
bryant_liuba2b4392014-06-11 16:49:30 +0800241 status_t status = mAudioPolicyEffects->addInputEffects(input, inputSource, audioSession);
242 if (status != NO_ERROR && status != ALREADY_EXISTS) {
243 ALOGW("Failed to add effects on input %d", input);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800244 }
245
Eric Laurent2d388ec2014-03-07 13:25:54 -0800246 return input;
247}
248
249status_t AudioPolicyService::startInput(audio_io_handle_t input)
250{
Eric Laurentdce54a12014-03-10 12:19:46 -0700251 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800252 return NO_INIT;
253 }
254 Mutex::Autolock _l(mLock);
255
Eric Laurentdce54a12014-03-10 12:19:46 -0700256 return mAudioPolicyManager->startInput(input);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800257}
258
259status_t AudioPolicyService::stopInput(audio_io_handle_t input)
260{
Eric Laurentdce54a12014-03-10 12:19:46 -0700261 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800262 return NO_INIT;
263 }
264 Mutex::Autolock _l(mLock);
265
Eric Laurentdce54a12014-03-10 12:19:46 -0700266 return mAudioPolicyManager->stopInput(input);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800267}
268
269void AudioPolicyService::releaseInput(audio_io_handle_t input)
270{
Eric Laurentdce54a12014-03-10 12:19:46 -0700271 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800272 return;
273 }
274 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700275 mAudioPolicyManager->releaseInput(input);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800276
bryant_liuba2b4392014-06-11 16:49:30 +0800277 // release audio processors from the input
278 status_t status = mAudioPolicyEffects->releaseInputEffects(input);
279 if(status != NO_ERROR) {
280 ALOGW("Failed to release effects on input %d", input);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800281 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800282}
283
284status_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream,
285 int indexMin,
286 int indexMax)
287{
Eric Laurentdce54a12014-03-10 12:19:46 -0700288 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800289 return NO_INIT;
290 }
291 if (!settingsAllowed()) {
292 return PERMISSION_DENIED;
293 }
294 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
295 return BAD_VALUE;
296 }
297 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700298 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800299 return NO_ERROR;
300}
301
302status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
303 int index,
304 audio_devices_t device)
305{
Eric Laurentdce54a12014-03-10 12:19:46 -0700306 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800307 return NO_INIT;
308 }
309 if (!settingsAllowed()) {
310 return PERMISSION_DENIED;
311 }
312 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
313 return BAD_VALUE;
314 }
315 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700316 return mAudioPolicyManager->setStreamVolumeIndex(stream,
317 index,
318 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800319}
320
321status_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream,
322 int *index,
323 audio_devices_t device)
324{
Eric Laurentdce54a12014-03-10 12:19:46 -0700325 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800326 return NO_INIT;
327 }
328 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
329 return BAD_VALUE;
330 }
331 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700332 return mAudioPolicyManager->getStreamVolumeIndex(stream,
333 index,
334 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800335}
336
337uint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream)
338{
Eric Laurentdce54a12014-03-10 12:19:46 -0700339 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800340 return 0;
341 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700342 return mAudioPolicyManager->getStrategyForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800343}
344
345//audio policy: use audio_device_t appropriately
346
347audio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream)
348{
Eric Laurentdce54a12014-03-10 12:19:46 -0700349 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800350 return (audio_devices_t)0;
351 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700352 return mAudioPolicyManager->getDevicesForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800353}
354
355audio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc)
356{
357 // FIXME change return type to status_t, and return NO_INIT here
Eric Laurentdce54a12014-03-10 12:19:46 -0700358 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800359 return 0;
360 }
361 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700362 return mAudioPolicyManager->getOutputForEffect(desc);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800363}
364
365status_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc,
366 audio_io_handle_t io,
367 uint32_t strategy,
368 int session,
369 int id)
370{
Eric Laurentdce54a12014-03-10 12:19:46 -0700371 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800372 return NO_INIT;
373 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700374 return mAudioPolicyManager->registerEffect(desc, io, strategy, session, id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800375}
376
377status_t AudioPolicyService::unregisterEffect(int id)
378{
Eric Laurentdce54a12014-03-10 12:19:46 -0700379 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800380 return NO_INIT;
381 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700382 return mAudioPolicyManager->unregisterEffect(id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800383}
384
385status_t AudioPolicyService::setEffectEnabled(int id, bool enabled)
386{
Eric Laurentdce54a12014-03-10 12:19:46 -0700387 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800388 return NO_INIT;
389 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700390 return mAudioPolicyManager->setEffectEnabled(id, enabled);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800391}
392
393bool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
394{
Eric Laurentdce54a12014-03-10 12:19:46 -0700395 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800396 return 0;
397 }
398 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700399 return mAudioPolicyManager->isStreamActive(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800400}
401
402bool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
403{
Eric Laurentdce54a12014-03-10 12:19:46 -0700404 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800405 return 0;
406 }
407 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700408 return mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800409}
410
411bool AudioPolicyService::isSourceActive(audio_source_t source) const
412{
Eric Laurentdce54a12014-03-10 12:19:46 -0700413 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800414 return false;
415 }
416 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700417 return mAudioPolicyManager->isSourceActive(source);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800418}
419
420status_t AudioPolicyService::queryDefaultPreProcessing(int audioSession,
421 effect_descriptor_t *descriptors,
422 uint32_t *count)
423{
Eric Laurentdce54a12014-03-10 12:19:46 -0700424 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800425 *count = 0;
426 return NO_INIT;
427 }
428 Mutex::Autolock _l(mLock);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800429
bryant_liuba2b4392014-06-11 16:49:30 +0800430 return mAudioPolicyEffects->queryDefaultInputEffects(audioSession, descriptors, count);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800431}
432
433bool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info)
434{
Eric Laurentdce54a12014-03-10 12:19:46 -0700435 if (mAudioPolicyManager == NULL) {
436 ALOGV("mAudioPolicyManager == NULL");
Eric Laurent2d388ec2014-03-07 13:25:54 -0800437 return false;
438 }
439
Eric Laurentdce54a12014-03-10 12:19:46 -0700440 return mAudioPolicyManager->isOffloadSupported(info);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800441}
442
Eric Laurent6a94d692014-05-20 11:18:06 -0700443status_t AudioPolicyService::listAudioPorts(audio_port_role_t role,
444 audio_port_type_t type,
Eric Laurent203b1a12014-04-01 10:34:16 -0700445 unsigned int *num_ports,
Eric Laurent6a94d692014-05-20 11:18:06 -0700446 struct audio_port *ports,
447 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -0700448{
Eric Laurent6a94d692014-05-20 11:18:06 -0700449 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700450 if(!modifyAudioRoutingAllowed()) {
451 return PERMISSION_DENIED;
452 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700453 if (mAudioPolicyManager == NULL) {
454 return NO_INIT;
455 }
456
457 return mAudioPolicyManager->listAudioPorts(role, type, num_ports, ports, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -0700458}
459
Eric Laurent6a94d692014-05-20 11:18:06 -0700460status_t AudioPolicyService::getAudioPort(struct audio_port *port)
Eric Laurent203b1a12014-04-01 10:34:16 -0700461{
Eric Laurent6a94d692014-05-20 11:18:06 -0700462 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700463 if(!modifyAudioRoutingAllowed()) {
464 return PERMISSION_DENIED;
465 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700466 if (mAudioPolicyManager == NULL) {
467 return NO_INIT;
468 }
469
470 return mAudioPolicyManager->getAudioPort(port);
Eric Laurent203b1a12014-04-01 10:34:16 -0700471}
472
Eric Laurent6a94d692014-05-20 11:18:06 -0700473status_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch,
474 audio_patch_handle_t *handle)
Eric Laurent203b1a12014-04-01 10:34:16 -0700475{
Eric Laurent6a94d692014-05-20 11:18:06 -0700476 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700477 if(!modifyAudioRoutingAllowed()) {
478 return PERMISSION_DENIED;
479 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700480 if (mAudioPolicyManager == NULL) {
481 return NO_INIT;
482 }
483 return mAudioPolicyManager->createAudioPatch(patch, handle,
484 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -0700485}
486
Eric Laurent6a94d692014-05-20 11:18:06 -0700487status_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle)
Eric Laurent203b1a12014-04-01 10:34:16 -0700488{
Eric Laurent6a94d692014-05-20 11:18:06 -0700489 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700490 if(!modifyAudioRoutingAllowed()) {
491 return PERMISSION_DENIED;
492 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700493 if (mAudioPolicyManager == NULL) {
494 return NO_INIT;
495 }
496
497 return mAudioPolicyManager->releaseAudioPatch(handle,
498 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -0700499}
500
501status_t AudioPolicyService::listAudioPatches(unsigned int *num_patches,
Eric Laurent6a94d692014-05-20 11:18:06 -0700502 struct audio_patch *patches,
503 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -0700504{
Eric Laurent6a94d692014-05-20 11:18:06 -0700505 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700506 if(!modifyAudioRoutingAllowed()) {
507 return PERMISSION_DENIED;
508 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700509 if (mAudioPolicyManager == NULL) {
510 return NO_INIT;
511 }
512
513 return mAudioPolicyManager->listAudioPatches(num_patches, patches, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -0700514}
515
Eric Laurent6a94d692014-05-20 11:18:06 -0700516status_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config)
Eric Laurent203b1a12014-04-01 10:34:16 -0700517{
Eric Laurent6a94d692014-05-20 11:18:06 -0700518 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700519 if(!modifyAudioRoutingAllowed()) {
520 return PERMISSION_DENIED;
521 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700522 if (mAudioPolicyManager == NULL) {
523 return NO_INIT;
524 }
525
526 return mAudioPolicyManager->setAudioPortConfig(config);
Eric Laurent203b1a12014-04-01 10:34:16 -0700527}
Eric Laurent2d388ec2014-03-07 13:25:54 -0800528
529}; // namespace android