blob: 6342d8f2aeb2c579f0fa989981e753cb93df310a [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);
Eric Laurentdce54a12014-03-10 12:19:46 -0700159 return mAudioPolicyManager->startOutput(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800160}
161
162status_t AudioPolicyService::stopOutput(audio_io_handle_t output,
163 audio_stream_type_t stream,
164 int session)
165{
Eric Laurentdce54a12014-03-10 12:19:46 -0700166 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800167 return NO_INIT;
168 }
169 ALOGV("stopOutput()");
170 mOutputCommandThread->stopOutputCommand(output, stream, session);
171 return NO_ERROR;
172}
173
174status_t AudioPolicyService::doStopOutput(audio_io_handle_t output,
175 audio_stream_type_t stream,
176 int session)
177{
178 ALOGV("doStopOutput from tid %d", gettid());
179 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700180 return mAudioPolicyManager->stopOutput(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800181}
182
183void AudioPolicyService::releaseOutput(audio_io_handle_t output)
184{
Eric Laurentdce54a12014-03-10 12:19:46 -0700185 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800186 return;
187 }
188 ALOGV("releaseOutput()");
189 mOutputCommandThread->releaseOutputCommand(output);
190}
191
192void AudioPolicyService::doReleaseOutput(audio_io_handle_t output)
193{
194 ALOGV("doReleaseOutput from tid %d", gettid());
195 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700196 mAudioPolicyManager->releaseOutput(output);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800197}
198
199audio_io_handle_t AudioPolicyService::getInput(audio_source_t inputSource,
200 uint32_t samplingRate,
201 audio_format_t format,
202 audio_channel_mask_t channelMask,
203 int audioSession)
204{
Eric Laurentdce54a12014-03-10 12:19:46 -0700205 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800206 return 0;
207 }
208 // already checked by client, but double-check in case the client wrapper is bypassed
209 if (inputSource >= AUDIO_SOURCE_CNT && inputSource != AUDIO_SOURCE_HOTWORD) {
210 return 0;
211 }
212
213 if ((inputSource == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed()) {
214 return 0;
215 }
216
217 Mutex::Autolock _l(mLock);
218 // the audio_in_acoustics_t parameter is ignored by get_input()
Eric Laurentdce54a12014-03-10 12:19:46 -0700219 audio_io_handle_t input = mAudioPolicyManager->getInput(inputSource, samplingRate,
Eric Laurent2d388ec2014-03-07 13:25:54 -0800220 format, channelMask, (audio_in_acoustics_t) 0);
221
222 if (input == 0) {
223 return input;
224 }
225 // create audio pre processors according to input source
226 audio_source_t aliasSource = (inputSource == AUDIO_SOURCE_HOTWORD) ?
227 AUDIO_SOURCE_VOICE_RECOGNITION : inputSource;
228
229 ssize_t index = mInputSources.indexOfKey(aliasSource);
230 if (index < 0) {
231 return input;
232 }
233 ssize_t idx = mInputs.indexOfKey(input);
234 InputDesc *inputDesc;
235 if (idx < 0) {
236 inputDesc = new InputDesc(audioSession);
237 mInputs.add(input, inputDesc);
238 } else {
239 inputDesc = mInputs.valueAt(idx);
240 }
241
242 Vector <EffectDesc *> effects = mInputSources.valueAt(index)->mEffects;
243 for (size_t i = 0; i < effects.size(); i++) {
244 EffectDesc *effect = effects[i];
245 sp<AudioEffect> fx = new AudioEffect(NULL, &effect->mUuid, -1, 0, 0, audioSession, input);
246 status_t status = fx->initCheck();
247 if (status != NO_ERROR && status != ALREADY_EXISTS) {
248 ALOGW("Failed to create Fx %s on input %d", effect->mName, input);
249 // fx goes out of scope and strong ref on AudioEffect is released
250 continue;
251 }
252 for (size_t j = 0; j < effect->mParams.size(); j++) {
253 fx->setParameter(effect->mParams[j]);
254 }
255 inputDesc->mEffects.add(fx);
256 }
257 setPreProcessorEnabled(inputDesc, true);
258 return input;
259}
260
261status_t AudioPolicyService::startInput(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->startInput(input);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800269}
270
271status_t AudioPolicyService::stopInput(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 NO_INIT;
275 }
276 Mutex::Autolock _l(mLock);
277
Eric Laurentdce54a12014-03-10 12:19:46 -0700278 return mAudioPolicyManager->stopInput(input);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800279}
280
281void AudioPolicyService::releaseInput(audio_io_handle_t input)
282{
Eric Laurentdce54a12014-03-10 12:19:46 -0700283 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800284 return;
285 }
286 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700287 mAudioPolicyManager->releaseInput(input);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800288
289 ssize_t index = mInputs.indexOfKey(input);
290 if (index < 0) {
291 return;
292 }
293 InputDesc *inputDesc = mInputs.valueAt(index);
294 setPreProcessorEnabled(inputDesc, false);
295 delete inputDesc;
296 mInputs.removeItemsAt(index);
297}
298
299status_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream,
300 int indexMin,
301 int indexMax)
302{
Eric Laurentdce54a12014-03-10 12:19:46 -0700303 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800304 return NO_INIT;
305 }
306 if (!settingsAllowed()) {
307 return PERMISSION_DENIED;
308 }
309 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
310 return BAD_VALUE;
311 }
312 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700313 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800314 return NO_ERROR;
315}
316
317status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
318 int index,
319 audio_devices_t device)
320{
Eric Laurentdce54a12014-03-10 12:19:46 -0700321 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800322 return NO_INIT;
323 }
324 if (!settingsAllowed()) {
325 return PERMISSION_DENIED;
326 }
327 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
328 return BAD_VALUE;
329 }
330 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700331 return mAudioPolicyManager->setStreamVolumeIndex(stream,
332 index,
333 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800334}
335
336status_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream,
337 int *index,
338 audio_devices_t device)
339{
Eric Laurentdce54a12014-03-10 12:19:46 -0700340 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800341 return NO_INIT;
342 }
343 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
344 return BAD_VALUE;
345 }
346 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700347 return mAudioPolicyManager->getStreamVolumeIndex(stream,
348 index,
349 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800350}
351
352uint32_t AudioPolicyService::getStrategyForStream(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 0;
356 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700357 return mAudioPolicyManager->getStrategyForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800358}
359
360//audio policy: use audio_device_t appropriately
361
362audio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream)
363{
Eric Laurentdce54a12014-03-10 12:19:46 -0700364 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800365 return (audio_devices_t)0;
366 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700367 return mAudioPolicyManager->getDevicesForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800368}
369
370audio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc)
371{
372 // FIXME change return type to status_t, and return NO_INIT here
Eric Laurentdce54a12014-03-10 12:19:46 -0700373 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800374 return 0;
375 }
376 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700377 return mAudioPolicyManager->getOutputForEffect(desc);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800378}
379
380status_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc,
381 audio_io_handle_t io,
382 uint32_t strategy,
383 int session,
384 int id)
385{
Eric Laurentdce54a12014-03-10 12:19:46 -0700386 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800387 return NO_INIT;
388 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700389 return mAudioPolicyManager->registerEffect(desc, io, strategy, session, id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800390}
391
392status_t AudioPolicyService::unregisterEffect(int id)
393{
Eric Laurentdce54a12014-03-10 12:19:46 -0700394 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800395 return NO_INIT;
396 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700397 return mAudioPolicyManager->unregisterEffect(id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800398}
399
400status_t AudioPolicyService::setEffectEnabled(int id, bool enabled)
401{
Eric Laurentdce54a12014-03-10 12:19:46 -0700402 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800403 return NO_INIT;
404 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700405 return mAudioPolicyManager->setEffectEnabled(id, enabled);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800406}
407
408bool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
409{
Eric Laurentdce54a12014-03-10 12:19:46 -0700410 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800411 return 0;
412 }
413 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700414 return mAudioPolicyManager->isStreamActive(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800415}
416
417bool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
418{
Eric Laurentdce54a12014-03-10 12:19:46 -0700419 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800420 return 0;
421 }
422 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700423 return mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800424}
425
426bool AudioPolicyService::isSourceActive(audio_source_t source) const
427{
Eric Laurentdce54a12014-03-10 12:19:46 -0700428 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800429 return false;
430 }
431 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700432 return mAudioPolicyManager->isSourceActive(source);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800433}
434
435status_t AudioPolicyService::queryDefaultPreProcessing(int audioSession,
436 effect_descriptor_t *descriptors,
437 uint32_t *count)
438{
439
Eric Laurentdce54a12014-03-10 12:19:46 -0700440 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800441 *count = 0;
442 return NO_INIT;
443 }
444 Mutex::Autolock _l(mLock);
445 status_t status = NO_ERROR;
446
447 size_t index;
448 for (index = 0; index < mInputs.size(); index++) {
449 if (mInputs.valueAt(index)->mSessionId == audioSession) {
450 break;
451 }
452 }
453 if (index == mInputs.size()) {
454 *count = 0;
455 return BAD_VALUE;
456 }
457 Vector< sp<AudioEffect> > effects = mInputs.valueAt(index)->mEffects;
458
459 for (size_t i = 0; i < effects.size(); i++) {
460 effect_descriptor_t desc = effects[i]->descriptor();
461 if (i < *count) {
462 descriptors[i] = desc;
463 }
464 }
465 if (effects.size() > *count) {
466 status = NO_MEMORY;
467 }
468 *count = effects.size();
469 return status;
470}
471
472bool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info)
473{
Eric Laurentdce54a12014-03-10 12:19:46 -0700474 if (mAudioPolicyManager == NULL) {
475 ALOGV("mAudioPolicyManager == NULL");
Eric Laurent2d388ec2014-03-07 13:25:54 -0800476 return false;
477 }
478
Eric Laurentdce54a12014-03-10 12:19:46 -0700479 return mAudioPolicyManager->isOffloadSupported(info);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800480}
481
Eric Laurent6a94d692014-05-20 11:18:06 -0700482status_t AudioPolicyService::listAudioPorts(audio_port_role_t role,
483 audio_port_type_t type,
Eric Laurent203b1a12014-04-01 10:34:16 -0700484 unsigned int *num_ports,
Eric Laurent6a94d692014-05-20 11:18:06 -0700485 struct audio_port *ports,
486 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -0700487{
Eric Laurent6a94d692014-05-20 11:18:06 -0700488 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700489 if(!modifyAudioRoutingAllowed()) {
490 return PERMISSION_DENIED;
491 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700492 if (mAudioPolicyManager == NULL) {
493 return NO_INIT;
494 }
495
496 return mAudioPolicyManager->listAudioPorts(role, type, num_ports, ports, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -0700497}
498
Eric Laurent6a94d692014-05-20 11:18:06 -0700499status_t AudioPolicyService::getAudioPort(struct audio_port *port)
Eric Laurent203b1a12014-04-01 10:34:16 -0700500{
Eric Laurent6a94d692014-05-20 11:18:06 -0700501 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700502 if(!modifyAudioRoutingAllowed()) {
503 return PERMISSION_DENIED;
504 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700505 if (mAudioPolicyManager == NULL) {
506 return NO_INIT;
507 }
508
509 return mAudioPolicyManager->getAudioPort(port);
Eric Laurent203b1a12014-04-01 10:34:16 -0700510}
511
Eric Laurent6a94d692014-05-20 11:18:06 -0700512status_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch,
513 audio_patch_handle_t *handle)
Eric Laurent203b1a12014-04-01 10:34:16 -0700514{
Eric Laurent6a94d692014-05-20 11:18:06 -0700515 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700516 if(!modifyAudioRoutingAllowed()) {
517 return PERMISSION_DENIED;
518 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700519 if (mAudioPolicyManager == NULL) {
520 return NO_INIT;
521 }
522 return mAudioPolicyManager->createAudioPatch(patch, handle,
523 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -0700524}
525
Eric Laurent6a94d692014-05-20 11:18:06 -0700526status_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle)
Eric Laurent203b1a12014-04-01 10:34:16 -0700527{
Eric Laurent6a94d692014-05-20 11:18:06 -0700528 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700529 if(!modifyAudioRoutingAllowed()) {
530 return PERMISSION_DENIED;
531 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700532 if (mAudioPolicyManager == NULL) {
533 return NO_INIT;
534 }
535
536 return mAudioPolicyManager->releaseAudioPatch(handle,
537 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -0700538}
539
540status_t AudioPolicyService::listAudioPatches(unsigned int *num_patches,
Eric Laurent6a94d692014-05-20 11:18:06 -0700541 struct audio_patch *patches,
542 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -0700543{
Eric Laurent6a94d692014-05-20 11:18:06 -0700544 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700545 if(!modifyAudioRoutingAllowed()) {
546 return PERMISSION_DENIED;
547 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700548 if (mAudioPolicyManager == NULL) {
549 return NO_INIT;
550 }
551
552 return mAudioPolicyManager->listAudioPatches(num_patches, patches, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -0700553}
554
Eric Laurent6a94d692014-05-20 11:18:06 -0700555status_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config)
Eric Laurent203b1a12014-04-01 10:34:16 -0700556{
Eric Laurent6a94d692014-05-20 11:18:06 -0700557 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700558 if(!modifyAudioRoutingAllowed()) {
559 return PERMISSION_DENIED;
560 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700561 if (mAudioPolicyManager == NULL) {
562 return NO_INIT;
563 }
564
565 return mAudioPolicyManager->setAudioPortConfig(config);
Eric Laurent203b1a12014-04-01 10:34:16 -0700566}
Eric Laurent2d388ec2014-03-07 13:25:54 -0800567
568}; // namespace android