blob: 2c51e25b34508f8b33db3b2375dbb878f30bbf2e [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,
Eric Laurent4dc68062014-07-28 17:26:49 -0700235 format, channelMask,
236 (audio_session_t)audioSession, 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
Eric Laurent4dc68062014-07-28 17:26:49 -0700251status_t AudioPolicyService::startInput(audio_io_handle_t input,
252 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800253{
Eric Laurentdce54a12014-03-10 12:19:46 -0700254 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800255 return NO_INIT;
256 }
257 Mutex::Autolock _l(mLock);
258
Eric Laurent4dc68062014-07-28 17:26:49 -0700259 return mAudioPolicyManager->startInput(input, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800260}
261
Eric Laurent4dc68062014-07-28 17:26:49 -0700262status_t AudioPolicyService::stopInput(audio_io_handle_t input,
263 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800264{
Eric Laurentdce54a12014-03-10 12:19:46 -0700265 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800266 return NO_INIT;
267 }
268 Mutex::Autolock _l(mLock);
269
Eric Laurent4dc68062014-07-28 17:26:49 -0700270 return mAudioPolicyManager->stopInput(input, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800271}
272
Eric Laurent4dc68062014-07-28 17:26:49 -0700273void AudioPolicyService::releaseInput(audio_io_handle_t input,
274 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800275{
Eric Laurentdce54a12014-03-10 12:19:46 -0700276 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800277 return;
278 }
279 Mutex::Autolock _l(mLock);
Eric Laurent4dc68062014-07-28 17:26:49 -0700280 mAudioPolicyManager->releaseInput(input, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800281
bryant_liuba2b4392014-06-11 16:49:30 +0800282 // release audio processors from the input
283 status_t status = mAudioPolicyEffects->releaseInputEffects(input);
284 if(status != NO_ERROR) {
285 ALOGW("Failed to release effects on input %d", input);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800286 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800287}
288
289status_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream,
290 int indexMin,
291 int indexMax)
292{
Eric Laurentdce54a12014-03-10 12:19:46 -0700293 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800294 return NO_INIT;
295 }
296 if (!settingsAllowed()) {
297 return PERMISSION_DENIED;
298 }
299 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
300 return BAD_VALUE;
301 }
302 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700303 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800304 return NO_ERROR;
305}
306
307status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
308 int index,
309 audio_devices_t device)
310{
Eric Laurentdce54a12014-03-10 12:19:46 -0700311 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800312 return NO_INIT;
313 }
314 if (!settingsAllowed()) {
315 return PERMISSION_DENIED;
316 }
317 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
318 return BAD_VALUE;
319 }
320 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700321 return mAudioPolicyManager->setStreamVolumeIndex(stream,
322 index,
323 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800324}
325
326status_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream,
327 int *index,
328 audio_devices_t device)
329{
Eric Laurentdce54a12014-03-10 12:19:46 -0700330 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800331 return NO_INIT;
332 }
333 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
334 return BAD_VALUE;
335 }
336 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700337 return mAudioPolicyManager->getStreamVolumeIndex(stream,
338 index,
339 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800340}
341
342uint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream)
343{
Eric Laurentdce54a12014-03-10 12:19:46 -0700344 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800345 return 0;
346 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700347 return mAudioPolicyManager->getStrategyForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800348}
349
350//audio policy: use audio_device_t appropriately
351
352audio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream)
353{
Eric Laurentdce54a12014-03-10 12:19:46 -0700354 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800355 return (audio_devices_t)0;
356 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700357 return mAudioPolicyManager->getDevicesForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800358}
359
360audio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc)
361{
362 // FIXME change return type to status_t, and return NO_INIT here
Eric Laurentdce54a12014-03-10 12:19:46 -0700363 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800364 return 0;
365 }
366 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700367 return mAudioPolicyManager->getOutputForEffect(desc);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800368}
369
370status_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc,
371 audio_io_handle_t io,
372 uint32_t strategy,
373 int session,
374 int id)
375{
Eric Laurentdce54a12014-03-10 12:19:46 -0700376 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800377 return NO_INIT;
378 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700379 return mAudioPolicyManager->registerEffect(desc, io, strategy, session, id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800380}
381
382status_t AudioPolicyService::unregisterEffect(int id)
383{
Eric Laurentdce54a12014-03-10 12:19:46 -0700384 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800385 return NO_INIT;
386 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700387 return mAudioPolicyManager->unregisterEffect(id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800388}
389
390status_t AudioPolicyService::setEffectEnabled(int id, bool enabled)
391{
Eric Laurentdce54a12014-03-10 12:19:46 -0700392 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800393 return NO_INIT;
394 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700395 return mAudioPolicyManager->setEffectEnabled(id, enabled);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800396}
397
398bool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
399{
Eric Laurentdce54a12014-03-10 12:19:46 -0700400 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800401 return 0;
402 }
403 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700404 return mAudioPolicyManager->isStreamActive(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800405}
406
407bool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
408{
Eric Laurentdce54a12014-03-10 12:19:46 -0700409 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800410 return 0;
411 }
412 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700413 return mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800414}
415
416bool AudioPolicyService::isSourceActive(audio_source_t source) const
417{
Eric Laurentdce54a12014-03-10 12:19:46 -0700418 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800419 return false;
420 }
421 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700422 return mAudioPolicyManager->isSourceActive(source);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800423}
424
425status_t AudioPolicyService::queryDefaultPreProcessing(int audioSession,
426 effect_descriptor_t *descriptors,
427 uint32_t *count)
428{
Eric Laurentdce54a12014-03-10 12:19:46 -0700429 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800430 *count = 0;
431 return NO_INIT;
432 }
433 Mutex::Autolock _l(mLock);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800434
bryant_liuba2b4392014-06-11 16:49:30 +0800435 return mAudioPolicyEffects->queryDefaultInputEffects(audioSession, descriptors, count);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800436}
437
438bool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info)
439{
Eric Laurentdce54a12014-03-10 12:19:46 -0700440 if (mAudioPolicyManager == NULL) {
441 ALOGV("mAudioPolicyManager == NULL");
Eric Laurent2d388ec2014-03-07 13:25:54 -0800442 return false;
443 }
444
Eric Laurentdce54a12014-03-10 12:19:46 -0700445 return mAudioPolicyManager->isOffloadSupported(info);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800446}
447
Eric Laurent6a94d692014-05-20 11:18:06 -0700448status_t AudioPolicyService::listAudioPorts(audio_port_role_t role,
449 audio_port_type_t type,
Eric Laurent203b1a12014-04-01 10:34:16 -0700450 unsigned int *num_ports,
Eric Laurent6a94d692014-05-20 11:18:06 -0700451 struct audio_port *ports,
452 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -0700453{
Eric Laurent6a94d692014-05-20 11:18:06 -0700454 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700455 if(!modifyAudioRoutingAllowed()) {
456 return PERMISSION_DENIED;
457 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700458 if (mAudioPolicyManager == NULL) {
459 return NO_INIT;
460 }
461
462 return mAudioPolicyManager->listAudioPorts(role, type, num_ports, ports, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -0700463}
464
Eric Laurent6a94d692014-05-20 11:18:06 -0700465status_t AudioPolicyService::getAudioPort(struct audio_port *port)
Eric Laurent203b1a12014-04-01 10:34:16 -0700466{
Eric Laurent6a94d692014-05-20 11:18:06 -0700467 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700468 if(!modifyAudioRoutingAllowed()) {
469 return PERMISSION_DENIED;
470 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700471 if (mAudioPolicyManager == NULL) {
472 return NO_INIT;
473 }
474
475 return mAudioPolicyManager->getAudioPort(port);
Eric Laurent203b1a12014-04-01 10:34:16 -0700476}
477
Eric Laurent6a94d692014-05-20 11:18:06 -0700478status_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch,
479 audio_patch_handle_t *handle)
Eric Laurent203b1a12014-04-01 10:34:16 -0700480{
Eric Laurent6a94d692014-05-20 11:18:06 -0700481 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700482 if(!modifyAudioRoutingAllowed()) {
483 return PERMISSION_DENIED;
484 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700485 if (mAudioPolicyManager == NULL) {
486 return NO_INIT;
487 }
488 return mAudioPolicyManager->createAudioPatch(patch, handle,
489 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -0700490}
491
Eric Laurent6a94d692014-05-20 11:18:06 -0700492status_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle)
Eric Laurent203b1a12014-04-01 10:34:16 -0700493{
Eric Laurent6a94d692014-05-20 11:18:06 -0700494 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700495 if(!modifyAudioRoutingAllowed()) {
496 return PERMISSION_DENIED;
497 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700498 if (mAudioPolicyManager == NULL) {
499 return NO_INIT;
500 }
501
502 return mAudioPolicyManager->releaseAudioPatch(handle,
503 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -0700504}
505
506status_t AudioPolicyService::listAudioPatches(unsigned int *num_patches,
Eric Laurent6a94d692014-05-20 11:18:06 -0700507 struct audio_patch *patches,
508 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -0700509{
Eric Laurent6a94d692014-05-20 11:18:06 -0700510 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700511 if(!modifyAudioRoutingAllowed()) {
512 return PERMISSION_DENIED;
513 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700514 if (mAudioPolicyManager == NULL) {
515 return NO_INIT;
516 }
517
518 return mAudioPolicyManager->listAudioPatches(num_patches, patches, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -0700519}
520
Eric Laurent6a94d692014-05-20 11:18:06 -0700521status_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config)
Eric Laurent203b1a12014-04-01 10:34:16 -0700522{
Eric Laurent6a94d692014-05-20 11:18:06 -0700523 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700524 if(!modifyAudioRoutingAllowed()) {
525 return PERMISSION_DENIED;
526 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700527 if (mAudioPolicyManager == NULL) {
528 return NO_INIT;
529 }
530
531 return mAudioPolicyManager->setAudioPortConfig(config);
Eric Laurent203b1a12014-04-01 10:34:16 -0700532}
Eric Laurent2d388ec2014-03-07 13:25:54 -0800533
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700534status_t AudioPolicyService::acquireSoundTriggerSession(audio_session_t *session,
535 audio_io_handle_t *ioHandle,
536 audio_devices_t *device)
537{
538 if (mAudioPolicyManager == NULL) {
539 return NO_INIT;
540 }
541
542 return mAudioPolicyManager->acquireSoundTriggerSession(session, ioHandle, device);
543}
544
545status_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session)
546{
547 if (mAudioPolicyManager == NULL) {
548 return NO_INIT;
549 }
550
551 return mAudioPolicyManager->releaseSoundTriggerSession(session);
552}
553
Eric Laurent2d388ec2014-03-07 13:25:54 -0800554}; // namespace android