1 /*
2 * Copyright (C) 2006-2007 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
17 #define LOG_TAG "AudioSystem"
18 //#define LOG_NDEBUG 0
19
20 #include <utils/Log.h>
21
22 #include <android/media/BnCaptureStateListener.h>
23 #include <binder/IServiceManager.h>
24 #include <binder/ProcessState.h>
25 #include <binder/IPCThreadState.h>
26 #include <media/AudioResamplerPublic.h>
27 #include <media/AudioSystem.h>
28 #include <media/IAudioFlinger.h>
29 #include <media/IAudioPolicyService.h>
30 #include <media/TypeConverter.h>
31 #include <math.h>
32
33 #include <system/audio.h>
34
35 // ----------------------------------------------------------------------------
36
37 namespace android {
38
39 // client singleton for AudioFlinger binder interface
40 Mutex AudioSystem::gLock;
41 Mutex AudioSystem::gLockErrorCallbacks;
42 Mutex AudioSystem::gLockAPS;
43 sp<IAudioFlinger> AudioSystem::gAudioFlinger;
44 sp<AudioSystem::AudioFlingerClient> AudioSystem::gAudioFlingerClient;
45 std::set<audio_error_callback> AudioSystem::gAudioErrorCallbacks;
46 dynamic_policy_callback AudioSystem::gDynPolicyCallback = NULL;
47 record_config_callback AudioSystem::gRecordConfigCallback = NULL;
48
49 // Required to be held while calling into gSoundTriggerCaptureStateListener.
50 class CaptureStateListenerImpl;
51 Mutex gSoundTriggerCaptureStateListenerLock;
52 sp<CaptureStateListenerImpl> gSoundTriggerCaptureStateListener = nullptr;
53
54 // establish binder interface to AudioFlinger service
get_audio_flinger()55 const sp<IAudioFlinger> AudioSystem::get_audio_flinger()
56 {
57 sp<IAudioFlinger> af;
58 sp<AudioFlingerClient> afc;
59 bool reportNoError = false;
60 {
61 Mutex::Autolock _l(gLock);
62 if (gAudioFlinger == 0) {
63 sp<IServiceManager> sm = defaultServiceManager();
64 sp<IBinder> binder;
65 do {
66 binder = sm->getService(String16("media.audio_flinger"));
67 if (binder != 0)
68 break;
69 ALOGW("AudioFlinger not published, waiting...");
70 usleep(500000); // 0.5 s
71 } while (true);
72 if (gAudioFlingerClient == NULL) {
73 gAudioFlingerClient = new AudioFlingerClient();
74 } else {
75 reportNoError = true;
76 }
77 binder->linkToDeath(gAudioFlingerClient);
78 gAudioFlinger = interface_cast<IAudioFlinger>(binder);
79 LOG_ALWAYS_FATAL_IF(gAudioFlinger == 0);
80 afc = gAudioFlingerClient;
81 // Make sure callbacks can be received by gAudioFlingerClient
82 ProcessState::self()->startThreadPool();
83 }
84 af = gAudioFlinger;
85 }
86 if (afc != 0) {
87 int64_t token = IPCThreadState::self()->clearCallingIdentity();
88 af->registerClient(afc);
89 IPCThreadState::self()->restoreCallingIdentity(token);
90 }
91 if (reportNoError) reportError(NO_ERROR);
92 return af;
93 }
94
getAudioFlingerClient()95 const sp<AudioSystem::AudioFlingerClient> AudioSystem::getAudioFlingerClient()
96 {
97 // calling get_audio_flinger() will initialize gAudioFlingerClient if needed
98 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
99 if (af == 0) return 0;
100 Mutex::Autolock _l(gLock);
101 return gAudioFlingerClient;
102 }
103
getIoDescriptor(audio_io_handle_t ioHandle)104 sp<AudioIoDescriptor> AudioSystem::getIoDescriptor(audio_io_handle_t ioHandle)
105 {
106 sp<AudioIoDescriptor> desc;
107 const sp<AudioFlingerClient> afc = getAudioFlingerClient();
108 if (afc != 0) {
109 desc = afc->getIoDescriptor(ioHandle);
110 }
111 return desc;
112 }
113
checkAudioFlinger()114 /* static */ status_t AudioSystem::checkAudioFlinger()
115 {
116 if (defaultServiceManager()->checkService(String16("media.audio_flinger")) != 0) {
117 return NO_ERROR;
118 }
119 return DEAD_OBJECT;
120 }
121
122 // FIXME Declare in binder opcode order, similarly to IAudioFlinger.h and IAudioFlinger.cpp
123
muteMicrophone(bool state)124 status_t AudioSystem::muteMicrophone(bool state)
125 {
126 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
127 if (af == 0) return PERMISSION_DENIED;
128 return af->setMicMute(state);
129 }
130
isMicrophoneMuted(bool * state)131 status_t AudioSystem::isMicrophoneMuted(bool* state)
132 {
133 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
134 if (af == 0) return PERMISSION_DENIED;
135 *state = af->getMicMute();
136 return NO_ERROR;
137 }
138
setMasterVolume(float value)139 status_t AudioSystem::setMasterVolume(float value)
140 {
141 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
142 if (af == 0) return PERMISSION_DENIED;
143 af->setMasterVolume(value);
144 return NO_ERROR;
145 }
146
setMasterMute(bool mute)147 status_t AudioSystem::setMasterMute(bool mute)
148 {
149 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
150 if (af == 0) return PERMISSION_DENIED;
151 af->setMasterMute(mute);
152 return NO_ERROR;
153 }
154
getMasterVolume(float * volume)155 status_t AudioSystem::getMasterVolume(float* volume)
156 {
157 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
158 if (af == 0) return PERMISSION_DENIED;
159 *volume = af->masterVolume();
160 return NO_ERROR;
161 }
162
getMasterMute(bool * mute)163 status_t AudioSystem::getMasterMute(bool* mute)
164 {
165 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
166 if (af == 0) return PERMISSION_DENIED;
167 *mute = af->masterMute();
168 return NO_ERROR;
169 }
170
setStreamVolume(audio_stream_type_t stream,float value,audio_io_handle_t output)171 status_t AudioSystem::setStreamVolume(audio_stream_type_t stream, float value,
172 audio_io_handle_t output)
173 {
174 if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE;
175 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
176 if (af == 0) return PERMISSION_DENIED;
177 af->setStreamVolume(stream, value, output);
178 return NO_ERROR;
179 }
180
setStreamMute(audio_stream_type_t stream,bool mute)181 status_t AudioSystem::setStreamMute(audio_stream_type_t stream, bool mute)
182 {
183 if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE;
184 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
185 if (af == 0) return PERMISSION_DENIED;
186 af->setStreamMute(stream, mute);
187 return NO_ERROR;
188 }
189
getStreamVolume(audio_stream_type_t stream,float * volume,audio_io_handle_t output)190 status_t AudioSystem::getStreamVolume(audio_stream_type_t stream, float* volume,
191 audio_io_handle_t output)
192 {
193 if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE;
194 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
195 if (af == 0) return PERMISSION_DENIED;
196 *volume = af->streamVolume(stream, output);
197 return NO_ERROR;
198 }
199
getStreamMute(audio_stream_type_t stream,bool * mute)200 status_t AudioSystem::getStreamMute(audio_stream_type_t stream, bool* mute)
201 {
202 if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE;
203 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
204 if (af == 0) return PERMISSION_DENIED;
205 *mute = af->streamMute(stream);
206 return NO_ERROR;
207 }
208
setMode(audio_mode_t mode)209 status_t AudioSystem::setMode(audio_mode_t mode)
210 {
211 if (uint32_t(mode) >= AUDIO_MODE_CNT) return BAD_VALUE;
212 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
213 if (af == 0) return PERMISSION_DENIED;
214 return af->setMode(mode);
215 }
216
setParameters(audio_io_handle_t ioHandle,const String8 & keyValuePairs)217 status_t AudioSystem::setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
218 {
219 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
220 if (af == 0) return PERMISSION_DENIED;
221 return af->setParameters(ioHandle, keyValuePairs);
222 }
223
getParameters(audio_io_handle_t ioHandle,const String8 & keys)224 String8 AudioSystem::getParameters(audio_io_handle_t ioHandle, const String8& keys)
225 {
226 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
227 String8 result = String8("");
228 if (af == 0) return result;
229
230 result = af->getParameters(ioHandle, keys);
231 return result;
232 }
233
setParameters(const String8 & keyValuePairs)234 status_t AudioSystem::setParameters(const String8& keyValuePairs)
235 {
236 return setParameters(AUDIO_IO_HANDLE_NONE, keyValuePairs);
237 }
238
getParameters(const String8 & keys)239 String8 AudioSystem::getParameters(const String8& keys)
240 {
241 return getParameters(AUDIO_IO_HANDLE_NONE, keys);
242 }
243
244 // convert volume steps to natural log scale
245
246 // change this value to change volume scaling
247 static const float dBPerStep = 0.5f;
248 // shouldn't need to touch these
249 static const float dBConvert = -dBPerStep * 2.302585093f / 20.0f;
250 static const float dBConvertInverse = 1.0f / dBConvert;
251
linearToLog(int volume)252 float AudioSystem::linearToLog(int volume)
253 {
254 // float v = volume ? exp(float(100 - volume) * dBConvert) : 0;
255 // ALOGD("linearToLog(%d)=%f", volume, v);
256 // return v;
257 return volume ? exp(float(100 - volume) * dBConvert) : 0;
258 }
259
logToLinear(float volume)260 int AudioSystem::logToLinear(float volume)
261 {
262 // int v = volume ? 100 - int(dBConvertInverse * log(volume) + 0.5) : 0;
263 // ALOGD("logTolinear(%d)=%f", v, volume);
264 // return v;
265 return volume ? 100 - int(dBConvertInverse * log(volume) + 0.5) : 0;
266 }
267
calculateMinFrameCount(uint32_t afLatencyMs,uint32_t afFrameCount,uint32_t afSampleRate,uint32_t sampleRate,float speed)268 /* static */ size_t AudioSystem::calculateMinFrameCount(
269 uint32_t afLatencyMs, uint32_t afFrameCount, uint32_t afSampleRate,
270 uint32_t sampleRate, float speed /*, uint32_t notificationsPerBufferReq*/)
271 {
272 // Ensure that buffer depth covers at least audio hardware latency
273 uint32_t minBufCount = afLatencyMs / ((1000 * afFrameCount) / afSampleRate);
274 if (minBufCount < 2) {
275 minBufCount = 2;
276 }
277 #if 0
278 // The notificationsPerBufferReq parameter is not yet used for non-fast tracks,
279 // but keeping the code here to make it easier to add later.
280 if (minBufCount < notificationsPerBufferReq) {
281 minBufCount = notificationsPerBufferReq;
282 }
283 #endif
284 ALOGV("calculateMinFrameCount afLatency %u afFrameCount %u afSampleRate %u "
285 "sampleRate %u speed %f minBufCount: %u" /*" notificationsPerBufferReq %u"*/,
286 afLatencyMs, afFrameCount, afSampleRate, sampleRate, speed, minBufCount
287 /*, notificationsPerBufferReq*/);
288 return minBufCount * sourceFramesNeededWithTimestretch(
289 sampleRate, afFrameCount, afSampleRate, speed);
290 }
291
292
getOutputSamplingRate(uint32_t * samplingRate,audio_stream_type_t streamType)293 status_t AudioSystem::getOutputSamplingRate(uint32_t* samplingRate, audio_stream_type_t streamType)
294 {
295 audio_io_handle_t output;
296
297 if (streamType == AUDIO_STREAM_DEFAULT) {
298 streamType = AUDIO_STREAM_MUSIC;
299 }
300
301 output = getOutput(streamType);
302 if (output == 0) {
303 return PERMISSION_DENIED;
304 }
305
306 return getSamplingRate(output, samplingRate);
307 }
308
getSamplingRate(audio_io_handle_t ioHandle,uint32_t * samplingRate)309 status_t AudioSystem::getSamplingRate(audio_io_handle_t ioHandle,
310 uint32_t* samplingRate)
311 {
312 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
313 if (af == 0) return PERMISSION_DENIED;
314 sp<AudioIoDescriptor> desc = getIoDescriptor(ioHandle);
315 if (desc == 0) {
316 *samplingRate = af->sampleRate(ioHandle);
317 } else {
318 *samplingRate = desc->mSamplingRate;
319 }
320 if (*samplingRate == 0) {
321 ALOGE("AudioSystem::getSamplingRate failed for ioHandle %d", ioHandle);
322 return BAD_VALUE;
323 }
324
325 ALOGV("getSamplingRate() ioHandle %d, sampling rate %u", ioHandle, *samplingRate);
326
327 return NO_ERROR;
328 }
329
getOutputFrameCount(size_t * frameCount,audio_stream_type_t streamType)330 status_t AudioSystem::getOutputFrameCount(size_t* frameCount, audio_stream_type_t streamType)
331 {
332 audio_io_handle_t output;
333
334 if (streamType == AUDIO_STREAM_DEFAULT) {
335 streamType = AUDIO_STREAM_MUSIC;
336 }
337
338 output = getOutput(streamType);
339 if (output == AUDIO_IO_HANDLE_NONE) {
340 return PERMISSION_DENIED;
341 }
342
343 return getFrameCount(output, frameCount);
344 }
345
getFrameCount(audio_io_handle_t ioHandle,size_t * frameCount)346 status_t AudioSystem::getFrameCount(audio_io_handle_t ioHandle,
347 size_t* frameCount)
348 {
349 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
350 if (af == 0) return PERMISSION_DENIED;
351 sp<AudioIoDescriptor> desc = getIoDescriptor(ioHandle);
352 if (desc == 0) {
353 *frameCount = af->frameCount(ioHandle);
354 } else {
355 *frameCount = desc->mFrameCount;
356 }
357 if (*frameCount == 0) {
358 ALOGE("AudioSystem::getFrameCount failed for ioHandle %d", ioHandle);
359 return BAD_VALUE;
360 }
361
362 ALOGV("getFrameCount() ioHandle %d, frameCount %zu", ioHandle, *frameCount);
363
364 return NO_ERROR;
365 }
366
getOutputLatency(uint32_t * latency,audio_stream_type_t streamType)367 status_t AudioSystem::getOutputLatency(uint32_t* latency, audio_stream_type_t streamType)
368 {
369 audio_io_handle_t output;
370
371 if (streamType == AUDIO_STREAM_DEFAULT) {
372 streamType = AUDIO_STREAM_MUSIC;
373 }
374
375 output = getOutput(streamType);
376 if (output == AUDIO_IO_HANDLE_NONE) {
377 return PERMISSION_DENIED;
378 }
379
380 return getLatency(output, latency);
381 }
382
getLatency(audio_io_handle_t output,uint32_t * latency)383 status_t AudioSystem::getLatency(audio_io_handle_t output,
384 uint32_t* latency)
385 {
386 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
387 if (af == 0) return PERMISSION_DENIED;
388 sp<AudioIoDescriptor> outputDesc = getIoDescriptor(output);
389 if (outputDesc == 0) {
390 *latency = af->latency(output);
391 } else {
392 *latency = outputDesc->mLatency;
393 }
394
395 ALOGV("getLatency() output %d, latency %d", output, *latency);
396
397 return NO_ERROR;
398 }
399
getInputBufferSize(uint32_t sampleRate,audio_format_t format,audio_channel_mask_t channelMask,size_t * buffSize)400 status_t AudioSystem::getInputBufferSize(uint32_t sampleRate, audio_format_t format,
401 audio_channel_mask_t channelMask, size_t* buffSize)
402 {
403 const sp<AudioFlingerClient> afc = getAudioFlingerClient();
404 if (afc == 0) {
405 return NO_INIT;
406 }
407 return afc->getInputBufferSize(sampleRate, format, channelMask, buffSize);
408 }
409
setVoiceVolume(float value)410 status_t AudioSystem::setVoiceVolume(float value)
411 {
412 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
413 if (af == 0) return PERMISSION_DENIED;
414 return af->setVoiceVolume(value);
415 }
416
getRenderPosition(audio_io_handle_t output,uint32_t * halFrames,uint32_t * dspFrames)417 status_t AudioSystem::getRenderPosition(audio_io_handle_t output, uint32_t *halFrames,
418 uint32_t *dspFrames)
419 {
420 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
421 if (af == 0) return PERMISSION_DENIED;
422
423 return af->getRenderPosition(halFrames, dspFrames, output);
424 }
425
getInputFramesLost(audio_io_handle_t ioHandle)426 uint32_t AudioSystem::getInputFramesLost(audio_io_handle_t ioHandle)
427 {
428 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
429 uint32_t result = 0;
430 if (af == 0) return result;
431 if (ioHandle == AUDIO_IO_HANDLE_NONE) return result;
432
433 result = af->getInputFramesLost(ioHandle);
434 return result;
435 }
436
newAudioUniqueId(audio_unique_id_use_t use)437 audio_unique_id_t AudioSystem::newAudioUniqueId(audio_unique_id_use_t use)
438 {
439 // Must not use AF as IDs will re-roll on audioserver restart, b/130369529.
440 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
441 if (af == 0) return AUDIO_UNIQUE_ID_ALLOCATE;
442 return af->newAudioUniqueId(use);
443 }
444
acquireAudioSessionId(audio_session_t audioSession,pid_t pid,uid_t uid)445 void AudioSystem::acquireAudioSessionId(audio_session_t audioSession, pid_t pid, uid_t uid)
446 {
447 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
448 if (af != 0) {
449 af->acquireAudioSessionId(audioSession, pid, uid);
450 }
451 }
452
releaseAudioSessionId(audio_session_t audioSession,pid_t pid)453 void AudioSystem::releaseAudioSessionId(audio_session_t audioSession, pid_t pid)
454 {
455 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
456 if (af != 0) {
457 af->releaseAudioSessionId(audioSession, pid);
458 }
459 }
460
getAudioHwSyncForSession(audio_session_t sessionId)461 audio_hw_sync_t AudioSystem::getAudioHwSyncForSession(audio_session_t sessionId)
462 {
463 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
464 if (af == 0) return AUDIO_HW_SYNC_INVALID;
465 return af->getAudioHwSyncForSession(sessionId);
466 }
467
systemReady()468 status_t AudioSystem::systemReady()
469 {
470 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
471 if (af == 0) return NO_INIT;
472 return af->systemReady();
473 }
474
getFrameCountHAL(audio_io_handle_t ioHandle,size_t * frameCount)475 status_t AudioSystem::getFrameCountHAL(audio_io_handle_t ioHandle,
476 size_t* frameCount)
477 {
478 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
479 if (af == 0) return PERMISSION_DENIED;
480 sp<AudioIoDescriptor> desc = getIoDescriptor(ioHandle);
481 if (desc == 0) {
482 *frameCount = af->frameCountHAL(ioHandle);
483 } else {
484 *frameCount = desc->mFrameCountHAL;
485 }
486 if (*frameCount == 0) {
487 ALOGE("AudioSystem::getFrameCountHAL failed for ioHandle %d", ioHandle);
488 return BAD_VALUE;
489 }
490
491 ALOGV("getFrameCountHAL() ioHandle %d, frameCount %zu", ioHandle, *frameCount);
492
493 return NO_ERROR;
494 }
495
496 // ---------------------------------------------------------------------------
497
498
clearIoCache()499 void AudioSystem::AudioFlingerClient::clearIoCache()
500 {
501 Mutex::Autolock _l(mLock);
502 mIoDescriptors.clear();
503 mInBuffSize = 0;
504 mInSamplingRate = 0;
505 mInFormat = AUDIO_FORMAT_DEFAULT;
506 mInChannelMask = AUDIO_CHANNEL_NONE;
507 }
508
binderDied(const wp<IBinder> & who __unused)509 void AudioSystem::AudioFlingerClient::binderDied(const wp<IBinder>& who __unused)
510 {
511 {
512 Mutex::Autolock _l(AudioSystem::gLock);
513 AudioSystem::gAudioFlinger.clear();
514 }
515
516 // clear output handles and stream to output map caches
517 clearIoCache();
518
519 reportError(DEAD_OBJECT);
520
521 ALOGW("AudioFlinger server died!");
522 }
523
ioConfigChanged(audio_io_config_event event,const sp<AudioIoDescriptor> & ioDesc)524 void AudioSystem::AudioFlingerClient::ioConfigChanged(audio_io_config_event event,
525 const sp<AudioIoDescriptor>& ioDesc) {
526 ALOGV("ioConfigChanged() event %d", event);
527
528 if (ioDesc == 0 || ioDesc->mIoHandle == AUDIO_IO_HANDLE_NONE) return;
529
530 audio_port_handle_t deviceId = AUDIO_PORT_HANDLE_NONE;
531 std::vector<sp<AudioDeviceCallback>> callbacksToCall;
532 {
533 Mutex::Autolock _l(mLock);
534 auto callbacks = std::map<audio_port_handle_t, wp<AudioDeviceCallback>>();
535
536 switch (event) {
537 case AUDIO_OUTPUT_OPENED:
538 case AUDIO_OUTPUT_REGISTERED:
539 case AUDIO_INPUT_OPENED:
540 case AUDIO_INPUT_REGISTERED: {
541 sp<AudioIoDescriptor> oldDesc = getIoDescriptor_l(ioDesc->mIoHandle);
542 if (oldDesc == 0) {
543 mIoDescriptors.add(ioDesc->mIoHandle, ioDesc);
544 } else {
545 deviceId = oldDesc->getDeviceId();
546 mIoDescriptors.replaceValueFor(ioDesc->mIoHandle, ioDesc);
547 }
548
549 if (ioDesc->getDeviceId() != AUDIO_PORT_HANDLE_NONE) {
550 deviceId = ioDesc->getDeviceId();
551 if (event == AUDIO_OUTPUT_OPENED || event == AUDIO_INPUT_OPENED) {
552 auto it = mAudioDeviceCallbacks.find(ioDesc->mIoHandle);
553 if (it != mAudioDeviceCallbacks.end()) {
554 callbacks = it->second;
555 }
556 }
557 }
558 ALOGV("ioConfigChanged() new %s %s %d samplingRate %u, format %#x channel mask %#x "
559 "frameCount %zu deviceId %d",
560 event == AUDIO_OUTPUT_OPENED || event == AUDIO_OUTPUT_REGISTERED ?
561 "output" : "input",
562 event == AUDIO_OUTPUT_OPENED || event == AUDIO_INPUT_OPENED ?
563 "opened" : "registered",
564 ioDesc->mIoHandle, ioDesc->mSamplingRate, ioDesc->mFormat, ioDesc->mChannelMask,
565 ioDesc->mFrameCount, ioDesc->getDeviceId());
566 } break;
567 case AUDIO_OUTPUT_CLOSED:
568 case AUDIO_INPUT_CLOSED: {
569 if (getIoDescriptor_l(ioDesc->mIoHandle) == 0) {
570 ALOGW("ioConfigChanged() closing unknown %s %d",
571 event == AUDIO_OUTPUT_CLOSED ? "output" : "input", ioDesc->mIoHandle);
572 break;
573 }
574 ALOGV("ioConfigChanged() %s %d closed",
575 event == AUDIO_OUTPUT_CLOSED ? "output" : "input", ioDesc->mIoHandle);
576
577 mIoDescriptors.removeItem(ioDesc->mIoHandle);
578 mAudioDeviceCallbacks.erase(ioDesc->mIoHandle);
579 } break;
580
581 case AUDIO_OUTPUT_CONFIG_CHANGED:
582 case AUDIO_INPUT_CONFIG_CHANGED: {
583 sp<AudioIoDescriptor> oldDesc = getIoDescriptor_l(ioDesc->mIoHandle);
584 if (oldDesc == 0) {
585 ALOGW("ioConfigChanged() modifying unknown output! %d", ioDesc->mIoHandle);
586 break;
587 }
588
589 deviceId = oldDesc->getDeviceId();
590 mIoDescriptors.replaceValueFor(ioDesc->mIoHandle, ioDesc);
591
592 if (deviceId != ioDesc->getDeviceId()) {
593 deviceId = ioDesc->getDeviceId();
594 auto it = mAudioDeviceCallbacks.find(ioDesc->mIoHandle);
595 if (it != mAudioDeviceCallbacks.end()) {
596 callbacks = it->second;
597 }
598 }
599 ALOGV("ioConfigChanged() new config for %s %d samplingRate %u, format %#x "
600 "channel mask %#x frameCount %zu frameCountHAL %zu deviceId %d",
601 event == AUDIO_OUTPUT_CONFIG_CHANGED ? "output" : "input",
602 ioDesc->mIoHandle, ioDesc->mSamplingRate, ioDesc->mFormat,
603 ioDesc->mChannelMask, ioDesc->mFrameCount, ioDesc->mFrameCountHAL,
604 ioDesc->getDeviceId());
605
606 } break;
607 case AUDIO_CLIENT_STARTED: {
608 sp<AudioIoDescriptor> oldDesc = getIoDescriptor_l(ioDesc->mIoHandle);
609 if (oldDesc == 0) {
610 ALOGW("ioConfigChanged() start client on unknown io! %d", ioDesc->mIoHandle);
611 break;
612 }
613 ALOGV("ioConfigChanged() AUDIO_CLIENT_STARTED io %d port %d num callbacks %zu",
614 ioDesc->mIoHandle, ioDesc->mPortId, mAudioDeviceCallbacks.size());
615 oldDesc->mPatch = ioDesc->mPatch;
616 auto it = mAudioDeviceCallbacks.find(ioDesc->mIoHandle);
617 if (it != mAudioDeviceCallbacks.end()) {
618 auto cbks = it->second;
619 auto it2 = cbks.find(ioDesc->mPortId);
620 if (it2 != cbks.end()) {
621 callbacks.emplace(ioDesc->mPortId, it2->second);
622 deviceId = oldDesc->getDeviceId();
623 }
624 }
625 } break;
626 }
627
628 for (auto wpCbk : callbacks) {
629 sp<AudioDeviceCallback> spCbk = wpCbk.second.promote();
630 if (spCbk != nullptr) {
631 callbacksToCall.push_back(spCbk);
632 }
633 }
634 }
635
636 // Callbacks must be called without mLock held. May lead to dead lock if calling for
637 // example getRoutedDevice that updates the device and tries to acquire mLock.
638 for (auto cb : callbacksToCall) {
639 // If callbacksToCall is not empty, it implies ioDesc->mIoHandle and deviceId are valid
640 cb->onAudioDeviceUpdate(ioDesc->mIoHandle, deviceId);
641 }
642 }
643
getInputBufferSize(uint32_t sampleRate,audio_format_t format,audio_channel_mask_t channelMask,size_t * buffSize)644 status_t AudioSystem::AudioFlingerClient::getInputBufferSize(
645 uint32_t sampleRate, audio_format_t format,
646 audio_channel_mask_t channelMask, size_t* buffSize)
647 {
648 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
649 if (af == 0) {
650 return PERMISSION_DENIED;
651 }
652 Mutex::Autolock _l(mLock);
653 // Do we have a stale mInBuffSize or are we requesting the input buffer size for new values
654 if ((mInBuffSize == 0) || (sampleRate != mInSamplingRate) || (format != mInFormat)
655 || (channelMask != mInChannelMask)) {
656 size_t inBuffSize = af->getInputBufferSize(sampleRate, format, channelMask);
657 if (inBuffSize == 0) {
658 ALOGE("AudioSystem::getInputBufferSize failed sampleRate %d format %#x channelMask %#x",
659 sampleRate, format, channelMask);
660 return BAD_VALUE;
661 }
662 // A benign race is possible here: we could overwrite a fresher cache entry
663 // save the request params
664 mInSamplingRate = sampleRate;
665 mInFormat = format;
666 mInChannelMask = channelMask;
667
668 mInBuffSize = inBuffSize;
669 }
670
671 *buffSize = mInBuffSize;
672
673 return NO_ERROR;
674 }
675
getIoDescriptor_l(audio_io_handle_t ioHandle)676 sp<AudioIoDescriptor> AudioSystem::AudioFlingerClient::getIoDescriptor_l(audio_io_handle_t ioHandle)
677 {
678 sp<AudioIoDescriptor> desc;
679 ssize_t index = mIoDescriptors.indexOfKey(ioHandle);
680 if (index >= 0) {
681 desc = mIoDescriptors.valueAt(index);
682 }
683 return desc;
684 }
685
getIoDescriptor(audio_io_handle_t ioHandle)686 sp<AudioIoDescriptor> AudioSystem::AudioFlingerClient::getIoDescriptor(audio_io_handle_t ioHandle)
687 {
688 Mutex::Autolock _l(mLock);
689 return getIoDescriptor_l(ioHandle);
690 }
691
addAudioDeviceCallback(const wp<AudioDeviceCallback> & callback,audio_io_handle_t audioIo,audio_port_handle_t portId)692 status_t AudioSystem::AudioFlingerClient::addAudioDeviceCallback(
693 const wp<AudioDeviceCallback>& callback, audio_io_handle_t audioIo,
694 audio_port_handle_t portId)
695 {
696 ALOGV("%s audioIo %d portId %d", __func__, audioIo, portId);
697 Mutex::Autolock _l(mLock);
698 auto& callbacks = mAudioDeviceCallbacks.emplace(audioIo, std::map<audio_port_handle_t, wp<AudioDeviceCallback>>()).first->second;
699 auto result = callbacks.try_emplace(portId, callback);
700 if (!result.second) {
701 return INVALID_OPERATION;
702 }
703 return NO_ERROR;
704 }
705
removeAudioDeviceCallback(const wp<AudioDeviceCallback> & callback __unused,audio_io_handle_t audioIo,audio_port_handle_t portId)706 status_t AudioSystem::AudioFlingerClient::removeAudioDeviceCallback(
707 const wp<AudioDeviceCallback>& callback __unused, audio_io_handle_t audioIo,
708 audio_port_handle_t portId)
709 {
710 ALOGV("%s audioIo %d portId %d", __func__, audioIo, portId);
711 Mutex::Autolock _l(mLock);
712 auto it = mAudioDeviceCallbacks.find(audioIo);
713 if (it == mAudioDeviceCallbacks.end()) {
714 return INVALID_OPERATION;
715 }
716 if (it->second.erase(portId) == 0) {
717 return INVALID_OPERATION;
718 }
719 if (it->second.size() == 0) {
720 mAudioDeviceCallbacks.erase(audioIo);
721 }
722 return NO_ERROR;
723 }
724
addErrorCallback(audio_error_callback cb)725 /* static */ uintptr_t AudioSystem::addErrorCallback(audio_error_callback cb)
726 {
727 Mutex::Autolock _l(gLockErrorCallbacks);
728 gAudioErrorCallbacks.insert(cb);
729 return reinterpret_cast<uintptr_t>(cb);
730 }
731
removeErrorCallback(uintptr_t cb)732 /* static */ void AudioSystem::removeErrorCallback(uintptr_t cb) {
733 Mutex::Autolock _l(gLockErrorCallbacks);
734 gAudioErrorCallbacks.erase(reinterpret_cast<audio_error_callback>(cb));
735 }
736
reportError(status_t err)737 /* static */ void AudioSystem::reportError(status_t err) {
738 Mutex::Autolock _l(gLockErrorCallbacks);
739 for (auto callback : gAudioErrorCallbacks) {
740 callback(err);
741 }
742 }
743
setDynPolicyCallback(dynamic_policy_callback cb)744 /*static*/ void AudioSystem::setDynPolicyCallback(dynamic_policy_callback cb)
745 {
746 Mutex::Autolock _l(gLock);
747 gDynPolicyCallback = cb;
748 }
749
setRecordConfigCallback(record_config_callback cb)750 /*static*/ void AudioSystem::setRecordConfigCallback(record_config_callback cb)
751 {
752 Mutex::Autolock _l(gLock);
753 gRecordConfigCallback = cb;
754 }
755
756 // client singleton for AudioPolicyService binder interface
757 // protected by gLockAPS
758 sp<IAudioPolicyService> AudioSystem::gAudioPolicyService;
759 sp<AudioSystem::AudioPolicyServiceClient> AudioSystem::gAudioPolicyServiceClient;
760
761
762 // establish binder interface to AudioPolicy service
get_audio_policy_service()763 const sp<IAudioPolicyService> AudioSystem::get_audio_policy_service()
764 {
765 sp<IAudioPolicyService> ap;
766 sp<AudioPolicyServiceClient> apc;
767 {
768 Mutex::Autolock _l(gLockAPS);
769 if (gAudioPolicyService == 0) {
770 sp<IServiceManager> sm = defaultServiceManager();
771 sp<IBinder> binder;
772 do {
773 binder = sm->getService(String16("media.audio_policy"));
774 if (binder != 0)
775 break;
776 ALOGW("AudioPolicyService not published, waiting...");
777 usleep(500000); // 0.5 s
778 } while (true);
779 if (gAudioPolicyServiceClient == NULL) {
780 gAudioPolicyServiceClient = new AudioPolicyServiceClient();
781 }
782 binder->linkToDeath(gAudioPolicyServiceClient);
783 gAudioPolicyService = interface_cast<IAudioPolicyService>(binder);
784 LOG_ALWAYS_FATAL_IF(gAudioPolicyService == 0);
785 apc = gAudioPolicyServiceClient;
786 // Make sure callbacks can be received by gAudioPolicyServiceClient
787 ProcessState::self()->startThreadPool();
788 }
789 ap = gAudioPolicyService;
790 }
791 if (apc != 0) {
792 int64_t token = IPCThreadState::self()->clearCallingIdentity();
793 ap->registerClient(apc);
794 ap->setAudioPortCallbacksEnabled(apc->isAudioPortCbEnabled());
795 ap->setAudioVolumeGroupCallbacksEnabled(apc->isAudioVolumeGroupCbEnabled());
796 IPCThreadState::self()->restoreCallingIdentity(token);
797 }
798
799 return ap;
800 }
801
802 // ---------------------------------------------------------------------------
803
onNewAudioModulesAvailable()804 void AudioSystem::onNewAudioModulesAvailable()
805 {
806 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
807 if (aps == 0) return;
808 aps->onNewAudioModulesAvailable();
809 }
810
setDeviceConnectionState(audio_devices_t device,audio_policy_dev_state_t state,const char * device_address,const char * device_name,audio_format_t encodedFormat)811 status_t AudioSystem::setDeviceConnectionState(audio_devices_t device,
812 audio_policy_dev_state_t state,
813 const char *device_address,
814 const char *device_name,
815 audio_format_t encodedFormat)
816 {
817 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
818 const char *address = "";
819 const char *name = "";
820
821 if (aps == 0) return PERMISSION_DENIED;
822
823 if (device_address != NULL) {
824 address = device_address;
825 }
826 if (device_name != NULL) {
827 name = device_name;
828 }
829 return aps->setDeviceConnectionState(device, state, address, name, encodedFormat);
830 }
831
getDeviceConnectionState(audio_devices_t device,const char * device_address)832 audio_policy_dev_state_t AudioSystem::getDeviceConnectionState(audio_devices_t device,
833 const char *device_address)
834 {
835 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
836 if (aps == 0) return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
837
838 return aps->getDeviceConnectionState(device, device_address);
839 }
840
handleDeviceConfigChange(audio_devices_t device,const char * device_address,const char * device_name,audio_format_t encodedFormat)841 status_t AudioSystem::handleDeviceConfigChange(audio_devices_t device,
842 const char *device_address,
843 const char *device_name,
844 audio_format_t encodedFormat)
845 {
846 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
847 const char *address = "";
848 const char *name = "";
849
850 if (aps == 0) return PERMISSION_DENIED;
851
852 if (device_address != NULL) {
853 address = device_address;
854 }
855 if (device_name != NULL) {
856 name = device_name;
857 }
858 return aps->handleDeviceConfigChange(device, address, name, encodedFormat);
859 }
860
setPhoneState(audio_mode_t state,uid_t uid)861 status_t AudioSystem::setPhoneState(audio_mode_t state, uid_t uid)
862 {
863 if (uint32_t(state) >= AUDIO_MODE_CNT) return BAD_VALUE;
864 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
865 if (aps == 0) return PERMISSION_DENIED;
866
867 return aps->setPhoneState(state, uid);
868 }
869
setForceUse(audio_policy_force_use_t usage,audio_policy_forced_cfg_t config)870 status_t AudioSystem::setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config)
871 {
872 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
873 if (aps == 0) return PERMISSION_DENIED;
874 return aps->setForceUse(usage, config);
875 }
876
getForceUse(audio_policy_force_use_t usage)877 audio_policy_forced_cfg_t AudioSystem::getForceUse(audio_policy_force_use_t usage)
878 {
879 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
880 if (aps == 0) return AUDIO_POLICY_FORCE_NONE;
881 return aps->getForceUse(usage);
882 }
883
884
getOutput(audio_stream_type_t stream)885 audio_io_handle_t AudioSystem::getOutput(audio_stream_type_t stream)
886 {
887 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
888 if (aps == 0) return 0;
889 return aps->getOutput(stream);
890 }
891
getOutputForAttr(audio_attributes_t * attr,audio_io_handle_t * output,audio_session_t session,audio_stream_type_t * stream,pid_t pid,uid_t uid,const audio_config_t * config,audio_output_flags_t flags,audio_port_handle_t * selectedDeviceId,audio_port_handle_t * portId,std::vector<audio_io_handle_t> * secondaryOutputs)892 status_t AudioSystem::getOutputForAttr(audio_attributes_t *attr,
893 audio_io_handle_t *output,
894 audio_session_t session,
895 audio_stream_type_t *stream,
896 pid_t pid,
897 uid_t uid,
898 const audio_config_t *config,
899 audio_output_flags_t flags,
900 audio_port_handle_t *selectedDeviceId,
901 audio_port_handle_t *portId,
902 std::vector<audio_io_handle_t> *secondaryOutputs)
903 {
904 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
905 if (aps == 0) return NO_INIT;
906 return aps->getOutputForAttr(attr, output, session, stream, pid, uid,
907 config,
908 flags, selectedDeviceId, portId, secondaryOutputs);
909 }
910
startOutput(audio_port_handle_t portId)911 status_t AudioSystem::startOutput(audio_port_handle_t portId)
912 {
913 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
914 if (aps == 0) return PERMISSION_DENIED;
915 return aps->startOutput(portId);
916 }
917
stopOutput(audio_port_handle_t portId)918 status_t AudioSystem::stopOutput(audio_port_handle_t portId)
919 {
920 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
921 if (aps == 0) return PERMISSION_DENIED;
922 return aps->stopOutput(portId);
923 }
924
releaseOutput(audio_port_handle_t portId)925 void AudioSystem::releaseOutput(audio_port_handle_t portId)
926 {
927 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
928 if (aps == 0) return;
929 aps->releaseOutput(portId);
930 }
931
getInputForAttr(const audio_attributes_t * attr,audio_io_handle_t * input,audio_unique_id_t riid,audio_session_t session,pid_t pid,uid_t uid,const String16 & opPackageName,const audio_config_base_t * config,audio_input_flags_t flags,audio_port_handle_t * selectedDeviceId,audio_port_handle_t * portId)932 status_t AudioSystem::getInputForAttr(const audio_attributes_t *attr,
933 audio_io_handle_t *input,
934 audio_unique_id_t riid,
935 audio_session_t session,
936 pid_t pid,
937 uid_t uid,
938 const String16& opPackageName,
939 const audio_config_base_t *config,
940 audio_input_flags_t flags,
941 audio_port_handle_t *selectedDeviceId,
942 audio_port_handle_t *portId)
943 {
944 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
945 if (aps == 0) return NO_INIT;
946 return aps->getInputForAttr(
947 attr, input, riid, session, pid, uid, opPackageName,
948 config, flags, selectedDeviceId, portId);
949 }
950
startInput(audio_port_handle_t portId)951 status_t AudioSystem::startInput(audio_port_handle_t portId)
952 {
953 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
954 if (aps == 0) return PERMISSION_DENIED;
955 return aps->startInput(portId);
956 }
957
stopInput(audio_port_handle_t portId)958 status_t AudioSystem::stopInput(audio_port_handle_t portId)
959 {
960 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
961 if (aps == 0) return PERMISSION_DENIED;
962 return aps->stopInput(portId);
963 }
964
releaseInput(audio_port_handle_t portId)965 void AudioSystem::releaseInput(audio_port_handle_t portId)
966 {
967 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
968 if (aps == 0) return;
969 aps->releaseInput(portId);
970 }
971
initStreamVolume(audio_stream_type_t stream,int indexMin,int indexMax)972 status_t AudioSystem::initStreamVolume(audio_stream_type_t stream,
973 int indexMin,
974 int indexMax)
975 {
976 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
977 if (aps == 0) return PERMISSION_DENIED;
978 return aps->initStreamVolume(stream, indexMin, indexMax);
979 }
980
setStreamVolumeIndex(audio_stream_type_t stream,int index,audio_devices_t device)981 status_t AudioSystem::setStreamVolumeIndex(audio_stream_type_t stream,
982 int index,
983 audio_devices_t device)
984 {
985 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
986 if (aps == 0) return PERMISSION_DENIED;
987 return aps->setStreamVolumeIndex(stream, index, device);
988 }
989
getStreamVolumeIndex(audio_stream_type_t stream,int * index,audio_devices_t device)990 status_t AudioSystem::getStreamVolumeIndex(audio_stream_type_t stream,
991 int *index,
992 audio_devices_t device)
993 {
994 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
995 if (aps == 0) return PERMISSION_DENIED;
996 return aps->getStreamVolumeIndex(stream, index, device);
997 }
998
setVolumeIndexForAttributes(const audio_attributes_t & attr,int index,audio_devices_t device)999 status_t AudioSystem::setVolumeIndexForAttributes(const audio_attributes_t &attr,
1000 int index,
1001 audio_devices_t device)
1002 {
1003 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1004 if (aps == 0) return PERMISSION_DENIED;
1005 return aps->setVolumeIndexForAttributes(attr, index, device);
1006 }
1007
getVolumeIndexForAttributes(const audio_attributes_t & attr,int & index,audio_devices_t device)1008 status_t AudioSystem::getVolumeIndexForAttributes(const audio_attributes_t &attr,
1009 int &index,
1010 audio_devices_t device)
1011 {
1012 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1013 if (aps == 0) return PERMISSION_DENIED;
1014 return aps->getVolumeIndexForAttributes(attr, index, device);
1015 }
1016
getMaxVolumeIndexForAttributes(const audio_attributes_t & attr,int & index)1017 status_t AudioSystem::getMaxVolumeIndexForAttributes(const audio_attributes_t &attr, int &index)
1018 {
1019 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1020 if (aps == 0) return PERMISSION_DENIED;
1021 return aps->getMaxVolumeIndexForAttributes(attr, index);
1022 }
1023
getMinVolumeIndexForAttributes(const audio_attributes_t & attr,int & index)1024 status_t AudioSystem::getMinVolumeIndexForAttributes(const audio_attributes_t &attr, int &index)
1025 {
1026 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1027 if (aps == 0) return PERMISSION_DENIED;
1028 return aps->getMinVolumeIndexForAttributes(attr, index);
1029 }
1030
getStrategyForStream(audio_stream_type_t stream)1031 uint32_t AudioSystem::getStrategyForStream(audio_stream_type_t stream)
1032 {
1033 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1034 if (aps == 0) return PRODUCT_STRATEGY_NONE;
1035 return aps->getStrategyForStream(stream);
1036 }
1037
getDevicesForStream(audio_stream_type_t stream)1038 audio_devices_t AudioSystem::getDevicesForStream(audio_stream_type_t stream)
1039 {
1040 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1041 if (aps == 0) return AUDIO_DEVICE_NONE;
1042 return aps->getDevicesForStream(stream);
1043 }
1044
getDevicesForAttributes(const AudioAttributes & aa,AudioDeviceTypeAddrVector * devices)1045 status_t AudioSystem::getDevicesForAttributes(const AudioAttributes &aa,
1046 AudioDeviceTypeAddrVector *devices) {
1047 if (devices == nullptr) {
1048 return BAD_VALUE;
1049 }
1050 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1051 if (aps == 0) return PERMISSION_DENIED;
1052 return aps->getDevicesForAttributes(aa, devices);
1053 }
1054
getOutputForEffect(const effect_descriptor_t * desc)1055 audio_io_handle_t AudioSystem::getOutputForEffect(const effect_descriptor_t *desc)
1056 {
1057 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1058 // FIXME change return type to status_t, and return PERMISSION_DENIED here
1059 if (aps == 0) return AUDIO_IO_HANDLE_NONE;
1060 return aps->getOutputForEffect(desc);
1061 }
1062
registerEffect(const effect_descriptor_t * desc,audio_io_handle_t io,uint32_t strategy,audio_session_t session,int id)1063 status_t AudioSystem::registerEffect(const effect_descriptor_t *desc,
1064 audio_io_handle_t io,
1065 uint32_t strategy,
1066 audio_session_t session,
1067 int id)
1068 {
1069 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1070 if (aps == 0) return PERMISSION_DENIED;
1071 return aps->registerEffect(desc, io, strategy, session, id);
1072 }
1073
unregisterEffect(int id)1074 status_t AudioSystem::unregisterEffect(int id)
1075 {
1076 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1077 if (aps == 0) return PERMISSION_DENIED;
1078 return aps->unregisterEffect(id);
1079 }
1080
setEffectEnabled(int id,bool enabled)1081 status_t AudioSystem::setEffectEnabled(int id, bool enabled)
1082 {
1083 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1084 if (aps == 0) return PERMISSION_DENIED;
1085 return aps->setEffectEnabled(id, enabled);
1086 }
1087
moveEffectsToIo(const std::vector<int> & ids,audio_io_handle_t io)1088 status_t AudioSystem::moveEffectsToIo(const std::vector<int>& ids, audio_io_handle_t io)
1089 {
1090 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1091 if (aps == 0) return PERMISSION_DENIED;
1092 return aps->moveEffectsToIo(ids, io);
1093 }
1094
isStreamActive(audio_stream_type_t stream,bool * state,uint32_t inPastMs)1095 status_t AudioSystem::isStreamActive(audio_stream_type_t stream, bool* state, uint32_t inPastMs)
1096 {
1097 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1098 if (aps == 0) return PERMISSION_DENIED;
1099 if (state == NULL) return BAD_VALUE;
1100 *state = aps->isStreamActive(stream, inPastMs);
1101 return NO_ERROR;
1102 }
1103
isStreamActiveRemotely(audio_stream_type_t stream,bool * state,uint32_t inPastMs)1104 status_t AudioSystem::isStreamActiveRemotely(audio_stream_type_t stream, bool* state,
1105 uint32_t inPastMs)
1106 {
1107 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1108 if (aps == 0) return PERMISSION_DENIED;
1109 if (state == NULL) return BAD_VALUE;
1110 *state = aps->isStreamActiveRemotely(stream, inPastMs);
1111 return NO_ERROR;
1112 }
1113
isSourceActive(audio_source_t stream,bool * state)1114 status_t AudioSystem::isSourceActive(audio_source_t stream, bool* state)
1115 {
1116 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1117 if (aps == 0) return PERMISSION_DENIED;
1118 if (state == NULL) return BAD_VALUE;
1119 *state = aps->isSourceActive(stream);
1120 return NO_ERROR;
1121 }
1122
getPrimaryOutputSamplingRate()1123 uint32_t AudioSystem::getPrimaryOutputSamplingRate()
1124 {
1125 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
1126 if (af == 0) return 0;
1127 return af->getPrimaryOutputSamplingRate();
1128 }
1129
getPrimaryOutputFrameCount()1130 size_t AudioSystem::getPrimaryOutputFrameCount()
1131 {
1132 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
1133 if (af == 0) return 0;
1134 return af->getPrimaryOutputFrameCount();
1135 }
1136
setLowRamDevice(bool isLowRamDevice,int64_t totalMemory)1137 status_t AudioSystem::setLowRamDevice(bool isLowRamDevice, int64_t totalMemory)
1138 {
1139 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
1140 if (af == 0) return PERMISSION_DENIED;
1141 return af->setLowRamDevice(isLowRamDevice, totalMemory);
1142 }
1143
clearAudioConfigCache()1144 void AudioSystem::clearAudioConfigCache()
1145 {
1146 // called by restoreTrack_l(), which needs new IAudioFlinger and IAudioPolicyService instances
1147 ALOGV("clearAudioConfigCache()");
1148 {
1149 Mutex::Autolock _l(gLock);
1150 if (gAudioFlingerClient != 0) {
1151 gAudioFlingerClient->clearIoCache();
1152 }
1153 gAudioFlinger.clear();
1154 }
1155 {
1156 Mutex::Autolock _l(gLockAPS);
1157 gAudioPolicyService.clear();
1158 }
1159 }
1160
setSupportedSystemUsages(const std::vector<audio_usage_t> & systemUsages)1161 status_t AudioSystem::setSupportedSystemUsages(const std::vector<audio_usage_t>& systemUsages) {
1162 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1163 if (aps == nullptr) return PERMISSION_DENIED;
1164 return aps->setSupportedSystemUsages(systemUsages);
1165 }
1166
setAllowedCapturePolicy(uid_t uid,audio_flags_mask_t flags)1167 status_t AudioSystem::setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t flags) {
1168 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1169 if (aps == nullptr) return PERMISSION_DENIED;
1170 return aps->setAllowedCapturePolicy(uid, flags);
1171 }
1172
isOffloadSupported(const audio_offload_info_t & info)1173 bool AudioSystem::isOffloadSupported(const audio_offload_info_t& info)
1174 {
1175 ALOGV("isOffloadSupported()");
1176 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1177 if (aps == 0) return false;
1178 return aps->isOffloadSupported(info);
1179 }
1180
listAudioPorts(audio_port_role_t role,audio_port_type_t type,unsigned int * num_ports,struct audio_port * ports,unsigned int * generation)1181 status_t AudioSystem::listAudioPorts(audio_port_role_t role,
1182 audio_port_type_t type,
1183 unsigned int *num_ports,
1184 struct audio_port *ports,
1185 unsigned int *generation)
1186 {
1187 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1188 if (aps == 0) return PERMISSION_DENIED;
1189 return aps->listAudioPorts(role, type, num_ports, ports, generation);
1190 }
1191
getAudioPort(struct audio_port * port)1192 status_t AudioSystem::getAudioPort(struct audio_port *port)
1193 {
1194 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1195 if (aps == 0) return PERMISSION_DENIED;
1196 return aps->getAudioPort(port);
1197 }
1198
createAudioPatch(const struct audio_patch * patch,audio_patch_handle_t * handle)1199 status_t AudioSystem::createAudioPatch(const struct audio_patch *patch,
1200 audio_patch_handle_t *handle)
1201 {
1202 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1203 if (aps == 0) return PERMISSION_DENIED;
1204 return aps->createAudioPatch(patch, handle);
1205 }
1206
releaseAudioPatch(audio_patch_handle_t handle)1207 status_t AudioSystem::releaseAudioPatch(audio_patch_handle_t handle)
1208 {
1209 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1210 if (aps == 0) return PERMISSION_DENIED;
1211 return aps->releaseAudioPatch(handle);
1212 }
1213
listAudioPatches(unsigned int * num_patches,struct audio_patch * patches,unsigned int * generation)1214 status_t AudioSystem::listAudioPatches(unsigned int *num_patches,
1215 struct audio_patch *patches,
1216 unsigned int *generation)
1217 {
1218 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1219 if (aps == 0) return PERMISSION_DENIED;
1220 return aps->listAudioPatches(num_patches, patches, generation);
1221 }
1222
setAudioPortConfig(const struct audio_port_config * config)1223 status_t AudioSystem::setAudioPortConfig(const struct audio_port_config *config)
1224 {
1225 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1226 if (aps == 0) return PERMISSION_DENIED;
1227 return aps->setAudioPortConfig(config);
1228 }
1229
addAudioPortCallback(const sp<AudioPortCallback> & callback)1230 status_t AudioSystem::addAudioPortCallback(const sp<AudioPortCallback>& callback)
1231 {
1232 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1233 if (aps == 0) return PERMISSION_DENIED;
1234
1235 Mutex::Autolock _l(gLockAPS);
1236 if (gAudioPolicyServiceClient == 0) {
1237 return NO_INIT;
1238 }
1239 int ret = gAudioPolicyServiceClient->addAudioPortCallback(callback);
1240 if (ret == 1) {
1241 aps->setAudioPortCallbacksEnabled(true);
1242 }
1243 return (ret < 0) ? INVALID_OPERATION : NO_ERROR;
1244 }
1245
1246 /*static*/
removeAudioPortCallback(const sp<AudioPortCallback> & callback)1247 status_t AudioSystem::removeAudioPortCallback(const sp<AudioPortCallback>& callback)
1248 {
1249 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1250 if (aps == 0) return PERMISSION_DENIED;
1251
1252 Mutex::Autolock _l(gLockAPS);
1253 if (gAudioPolicyServiceClient == 0) {
1254 return NO_INIT;
1255 }
1256 int ret = gAudioPolicyServiceClient->removeAudioPortCallback(callback);
1257 if (ret == 0) {
1258 aps->setAudioPortCallbacksEnabled(false);
1259 }
1260 return (ret < 0) ? INVALID_OPERATION : NO_ERROR;
1261 }
1262
addAudioVolumeGroupCallback(const sp<AudioVolumeGroupCallback> & callback)1263 status_t AudioSystem::addAudioVolumeGroupCallback(const sp<AudioVolumeGroupCallback>& callback)
1264 {
1265 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1266 if (aps == 0) return PERMISSION_DENIED;
1267
1268 Mutex::Autolock _l(gLockAPS);
1269 if (gAudioPolicyServiceClient == 0) {
1270 return NO_INIT;
1271 }
1272 int ret = gAudioPolicyServiceClient->addAudioVolumeGroupCallback(callback);
1273 if (ret == 1) {
1274 aps->setAudioVolumeGroupCallbacksEnabled(true);
1275 }
1276 return (ret < 0) ? INVALID_OPERATION : NO_ERROR;
1277 }
1278
removeAudioVolumeGroupCallback(const sp<AudioVolumeGroupCallback> & callback)1279 status_t AudioSystem::removeAudioVolumeGroupCallback(const sp<AudioVolumeGroupCallback>& callback)
1280 {
1281 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1282 if (aps == 0) return PERMISSION_DENIED;
1283
1284 Mutex::Autolock _l(gLockAPS);
1285 if (gAudioPolicyServiceClient == 0) {
1286 return NO_INIT;
1287 }
1288 int ret = gAudioPolicyServiceClient->removeAudioVolumeGroupCallback(callback);
1289 if (ret == 0) {
1290 aps->setAudioVolumeGroupCallbacksEnabled(false);
1291 }
1292 return (ret < 0) ? INVALID_OPERATION : NO_ERROR;
1293 }
1294
addAudioDeviceCallback(const wp<AudioDeviceCallback> & callback,audio_io_handle_t audioIo,audio_port_handle_t portId)1295 status_t AudioSystem::addAudioDeviceCallback(
1296 const wp<AudioDeviceCallback>& callback, audio_io_handle_t audioIo,
1297 audio_port_handle_t portId)
1298 {
1299 const sp<AudioFlingerClient> afc = getAudioFlingerClient();
1300 if (afc == 0) {
1301 return NO_INIT;
1302 }
1303 status_t status = afc->addAudioDeviceCallback(callback, audioIo, portId);
1304 if (status == NO_ERROR) {
1305 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
1306 if (af != 0) {
1307 af->registerClient(afc);
1308 }
1309 }
1310 return status;
1311 }
1312
removeAudioDeviceCallback(const wp<AudioDeviceCallback> & callback,audio_io_handle_t audioIo,audio_port_handle_t portId)1313 status_t AudioSystem::removeAudioDeviceCallback(
1314 const wp<AudioDeviceCallback>& callback, audio_io_handle_t audioIo,
1315 audio_port_handle_t portId)
1316 {
1317 const sp<AudioFlingerClient> afc = getAudioFlingerClient();
1318 if (afc == 0) {
1319 return NO_INIT;
1320 }
1321 return afc->removeAudioDeviceCallback(callback, audioIo, portId);
1322 }
1323
getDeviceIdForIo(audio_io_handle_t audioIo)1324 audio_port_handle_t AudioSystem::getDeviceIdForIo(audio_io_handle_t audioIo)
1325 {
1326 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
1327 if (af == 0) return PERMISSION_DENIED;
1328 const sp<AudioIoDescriptor> desc = getIoDescriptor(audioIo);
1329 if (desc == 0) {
1330 return AUDIO_PORT_HANDLE_NONE;
1331 }
1332 return desc->getDeviceId();
1333 }
1334
acquireSoundTriggerSession(audio_session_t * session,audio_io_handle_t * ioHandle,audio_devices_t * device)1335 status_t AudioSystem::acquireSoundTriggerSession(audio_session_t *session,
1336 audio_io_handle_t *ioHandle,
1337 audio_devices_t *device)
1338 {
1339 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1340 if (aps == 0) return PERMISSION_DENIED;
1341 return aps->acquireSoundTriggerSession(session, ioHandle, device);
1342 }
1343
releaseSoundTriggerSession(audio_session_t session)1344 status_t AudioSystem::releaseSoundTriggerSession(audio_session_t session)
1345 {
1346 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1347 if (aps == 0) return PERMISSION_DENIED;
1348 return aps->releaseSoundTriggerSession(session);
1349 }
1350
getPhoneState()1351 audio_mode_t AudioSystem::getPhoneState()
1352 {
1353 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1354 if (aps == 0) return AUDIO_MODE_INVALID;
1355 return aps->getPhoneState();
1356 }
1357
registerPolicyMixes(const Vector<AudioMix> & mixes,bool registration)1358 status_t AudioSystem::registerPolicyMixes(const Vector<AudioMix>& mixes, bool registration)
1359 {
1360 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1361 if (aps == 0) return PERMISSION_DENIED;
1362 return aps->registerPolicyMixes(mixes, registration);
1363 }
1364
setUidDeviceAffinities(uid_t uid,const Vector<AudioDeviceTypeAddr> & devices)1365 status_t AudioSystem::setUidDeviceAffinities(uid_t uid, const Vector<AudioDeviceTypeAddr>& devices)
1366 {
1367 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1368 if (aps == 0) return PERMISSION_DENIED;
1369 return aps->setUidDeviceAffinities(uid, devices);
1370 }
1371
removeUidDeviceAffinities(uid_t uid)1372 status_t AudioSystem::removeUidDeviceAffinities(uid_t uid) {
1373 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1374 if (aps == 0) return PERMISSION_DENIED;
1375 return aps->removeUidDeviceAffinities(uid);
1376 }
1377
setUserIdDeviceAffinities(int userId,const Vector<AudioDeviceTypeAddr> & devices)1378 status_t AudioSystem::setUserIdDeviceAffinities(int userId,
1379 const Vector<AudioDeviceTypeAddr>& devices)
1380 {
1381 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1382 if (aps == 0) return PERMISSION_DENIED;
1383 return aps->setUserIdDeviceAffinities(userId, devices);
1384 }
1385
removeUserIdDeviceAffinities(int userId)1386 status_t AudioSystem::removeUserIdDeviceAffinities(int userId)
1387 {
1388 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1389 if (aps == 0) return PERMISSION_DENIED;
1390 return aps->removeUserIdDeviceAffinities(userId);
1391 }
1392
startAudioSource(const struct audio_port_config * source,const audio_attributes_t * attributes,audio_port_handle_t * portId)1393 status_t AudioSystem::startAudioSource(const struct audio_port_config *source,
1394 const audio_attributes_t *attributes,
1395 audio_port_handle_t *portId)
1396 {
1397 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1398 if (aps == 0) return PERMISSION_DENIED;
1399 return aps->startAudioSource(source, attributes, portId);
1400 }
1401
stopAudioSource(audio_port_handle_t portId)1402 status_t AudioSystem::stopAudioSource(audio_port_handle_t portId)
1403 {
1404 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1405 if (aps == 0) return PERMISSION_DENIED;
1406 return aps->stopAudioSource(portId);
1407 }
1408
setMasterMono(bool mono)1409 status_t AudioSystem::setMasterMono(bool mono)
1410 {
1411 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1412 if (aps == 0) return PERMISSION_DENIED;
1413 return aps->setMasterMono(mono);
1414 }
1415
getMasterMono(bool * mono)1416 status_t AudioSystem::getMasterMono(bool *mono)
1417 {
1418 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1419 if (aps == 0) return PERMISSION_DENIED;
1420 return aps->getMasterMono(mono);
1421 }
1422
setMasterBalance(float balance)1423 status_t AudioSystem::setMasterBalance(float balance)
1424 {
1425 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
1426 if (af == 0) return PERMISSION_DENIED;
1427 return af->setMasterBalance(balance);
1428 }
1429
getMasterBalance(float * balance)1430 status_t AudioSystem::getMasterBalance(float *balance)
1431 {
1432 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
1433 if (af == 0) return PERMISSION_DENIED;
1434 return af->getMasterBalance(balance);
1435 }
1436
getStreamVolumeDB(audio_stream_type_t stream,int index,audio_devices_t device)1437 float AudioSystem::getStreamVolumeDB(audio_stream_type_t stream, int index, audio_devices_t device)
1438 {
1439 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1440 if (aps == 0) return NAN;
1441 return aps->getStreamVolumeDB(stream, index, device);
1442 }
1443
getMicrophones(std::vector<media::MicrophoneInfo> * microphones)1444 status_t AudioSystem::getMicrophones(std::vector<media::MicrophoneInfo> *microphones)
1445 {
1446 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
1447 if (af == 0) return PERMISSION_DENIED;
1448 return af->getMicrophones(microphones);
1449 }
1450
setAudioHalPids(const std::vector<pid_t> & pids)1451 status_t AudioSystem::setAudioHalPids(const std::vector<pid_t>& pids) {
1452 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
1453 if (af == nullptr) return PERMISSION_DENIED;
1454 return af->setAudioHalPids(pids);
1455 }
1456
getSurroundFormats(unsigned int * numSurroundFormats,audio_format_t * surroundFormats,bool * surroundFormatsEnabled,bool reported)1457 status_t AudioSystem::getSurroundFormats(unsigned int *numSurroundFormats,
1458 audio_format_t *surroundFormats,
1459 bool *surroundFormatsEnabled,
1460 bool reported)
1461 {
1462 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1463 if (aps == 0) return PERMISSION_DENIED;
1464 return aps->getSurroundFormats(
1465 numSurroundFormats, surroundFormats, surroundFormatsEnabled, reported);
1466 }
1467
setSurroundFormatEnabled(audio_format_t audioFormat,bool enabled)1468 status_t AudioSystem::setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled)
1469 {
1470 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1471 if (aps == 0) return PERMISSION_DENIED;
1472 return aps->setSurroundFormatEnabled(audioFormat, enabled);
1473 }
1474
setAssistantUid(uid_t uid)1475 status_t AudioSystem::setAssistantUid(uid_t uid)
1476 {
1477 const sp <IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1478 if (aps == 0) return PERMISSION_DENIED;
1479
1480 return aps->setAssistantUid(uid);
1481 }
1482
setA11yServicesUids(const std::vector<uid_t> & uids)1483 status_t AudioSystem::setA11yServicesUids(const std::vector<uid_t>& uids)
1484 {
1485 const sp <IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1486 if (aps == 0) return PERMISSION_DENIED;
1487
1488 return aps->setA11yServicesUids(uids);
1489 }
1490
setCurrentImeUid(uid_t uid)1491 status_t AudioSystem::setCurrentImeUid(uid_t uid)
1492 {
1493 const sp <IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1494 if (aps == 0) return PERMISSION_DENIED;
1495
1496 return aps->setCurrentImeUid(uid);
1497 }
1498
isHapticPlaybackSupported()1499 bool AudioSystem::isHapticPlaybackSupported()
1500 {
1501 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1502 if (aps == 0) return false;
1503 return aps->isHapticPlaybackSupported();
1504 }
1505
getHwOffloadEncodingFormatsSupportedForA2DP(std::vector<audio_format_t> * formats)1506 status_t AudioSystem::getHwOffloadEncodingFormatsSupportedForA2DP(
1507 std::vector<audio_format_t> *formats) {
1508 const sp <IAudioPolicyService>
1509 & aps = AudioSystem::get_audio_policy_service();
1510 if (aps == 0) return PERMISSION_DENIED;
1511 return aps->getHwOffloadEncodingFormatsSupportedForA2DP(formats);
1512 }
1513
listAudioProductStrategies(AudioProductStrategyVector & strategies)1514 status_t AudioSystem::listAudioProductStrategies(AudioProductStrategyVector &strategies)
1515 {
1516 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1517 if (aps == 0) return PERMISSION_DENIED;
1518 return aps->listAudioProductStrategies(strategies);
1519 }
1520
streamTypeToAttributes(audio_stream_type_t stream)1521 audio_attributes_t AudioSystem::streamTypeToAttributes(audio_stream_type_t stream)
1522 {
1523 AudioProductStrategyVector strategies;
1524 listAudioProductStrategies(strategies);
1525 for (const auto &strategy : strategies) {
1526 auto attrVect = strategy.getAudioAttributes();
1527 auto iter = std::find_if(begin(attrVect), end(attrVect), [&stream](const auto &attributes) {
1528 return attributes.getStreamType() == stream; });
1529 if (iter != end(attrVect)) {
1530 return iter->getAttributes();
1531 }
1532 }
1533 ALOGE("invalid stream type %s when converting to attributes", toString(stream).c_str());
1534 return AUDIO_ATTRIBUTES_INITIALIZER;
1535 }
1536
attributesToStreamType(const audio_attributes_t & attr)1537 audio_stream_type_t AudioSystem::attributesToStreamType(const audio_attributes_t &attr)
1538 {
1539 product_strategy_t psId;
1540 status_t ret = AudioSystem::getProductStrategyFromAudioAttributes(AudioAttributes(attr), psId);
1541 if (ret != NO_ERROR) {
1542 ALOGE("no strategy found for attributes %s", toString(attr).c_str());
1543 return AUDIO_STREAM_MUSIC;
1544 }
1545 AudioProductStrategyVector strategies;
1546 listAudioProductStrategies(strategies);
1547 for (const auto &strategy : strategies) {
1548 if (strategy.getId() == psId) {
1549 auto attrVect = strategy.getAudioAttributes();
1550 auto iter = std::find_if(begin(attrVect), end(attrVect), [&attr](const auto &refAttr) {
1551 return AudioProductStrategy::attributesMatches(
1552 refAttr.getAttributes(), attr); });
1553 if (iter != end(attrVect)) {
1554 return iter->getStreamType();
1555 }
1556 }
1557 }
1558 switch (attr.usage) {
1559 case AUDIO_USAGE_VIRTUAL_SOURCE:
1560 // virtual source is not expected to have an associated product strategy
1561 break;
1562 default:
1563 ALOGE("invalid attributes %s when converting to stream", toString(attr).c_str());
1564 break;
1565 }
1566 return AUDIO_STREAM_MUSIC;
1567 }
1568
getProductStrategyFromAudioAttributes(const AudioAttributes & aa,product_strategy_t & productStrategy)1569 status_t AudioSystem::getProductStrategyFromAudioAttributes(const AudioAttributes &aa,
1570 product_strategy_t &productStrategy)
1571 {
1572 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1573 if (aps == 0) return PERMISSION_DENIED;
1574 return aps->getProductStrategyFromAudioAttributes(aa,productStrategy);
1575 }
1576
listAudioVolumeGroups(AudioVolumeGroupVector & groups)1577 status_t AudioSystem::listAudioVolumeGroups(AudioVolumeGroupVector &groups)
1578 {
1579 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1580 if (aps == 0) return PERMISSION_DENIED;
1581 return aps->listAudioVolumeGroups(groups);
1582 }
1583
getVolumeGroupFromAudioAttributes(const AudioAttributes & aa,volume_group_t & volumeGroup)1584 status_t AudioSystem::getVolumeGroupFromAudioAttributes(const AudioAttributes &aa,
1585 volume_group_t &volumeGroup)
1586 {
1587 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1588 if (aps == 0) return PERMISSION_DENIED;
1589 return aps->getVolumeGroupFromAudioAttributes(aa, volumeGroup);
1590 }
1591
setRttEnabled(bool enabled)1592 status_t AudioSystem::setRttEnabled(bool enabled)
1593 {
1594 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1595 if (aps == 0) return PERMISSION_DENIED;
1596 return aps->setRttEnabled(enabled);
1597 }
1598
isCallScreenModeSupported()1599 bool AudioSystem::isCallScreenModeSupported()
1600 {
1601 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1602 if (aps == 0) return false;
1603 return aps->isCallScreenModeSupported();
1604 }
1605
setPreferredDeviceForStrategy(product_strategy_t strategy,const AudioDeviceTypeAddr & device)1606 status_t AudioSystem::setPreferredDeviceForStrategy(product_strategy_t strategy,
1607 const AudioDeviceTypeAddr &device)
1608 {
1609 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1610 if (aps == 0) {
1611 return PERMISSION_DENIED;
1612 }
1613 return aps->setPreferredDeviceForStrategy(strategy, device);
1614 }
1615
removePreferredDeviceForStrategy(product_strategy_t strategy)1616 status_t AudioSystem::removePreferredDeviceForStrategy(product_strategy_t strategy)
1617 {
1618 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1619 if (aps == 0) {
1620 return PERMISSION_DENIED;
1621 }
1622 return aps->removePreferredDeviceForStrategy(strategy);
1623 }
1624
getPreferredDeviceForStrategy(product_strategy_t strategy,AudioDeviceTypeAddr & device)1625 status_t AudioSystem::getPreferredDeviceForStrategy(product_strategy_t strategy,
1626 AudioDeviceTypeAddr &device)
1627 {
1628 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1629 if (aps == 0) {
1630 return PERMISSION_DENIED;
1631 }
1632 return aps->getPreferredDeviceForStrategy(strategy, device);
1633 }
1634
1635 class CaptureStateListenerImpl : public media::BnCaptureStateListener,
1636 public IBinder::DeathRecipient {
1637 public:
CaptureStateListenerImpl(const sp<IAudioPolicyService> & aps,const sp<AudioSystem::CaptureStateListener> & listener)1638 CaptureStateListenerImpl(
1639 const sp<IAudioPolicyService>& aps,
1640 const sp<AudioSystem::CaptureStateListener>& listener)
1641 : mAps(aps), mListener(listener) {}
1642
init()1643 void init() {
1644 bool active;
1645 status_t status = mAps->registerSoundTriggerCaptureStateListener(this, &active);
1646 if (status != NO_ERROR) {
1647 mListener->onServiceDied();
1648 return;
1649 }
1650 mListener->onStateChanged(active);
1651 IInterface::asBinder(mAps)->linkToDeath(this);
1652 }
1653
setCaptureState(bool active)1654 binder::Status setCaptureState(bool active) override {
1655 Mutex::Autolock _l(gSoundTriggerCaptureStateListenerLock);
1656 mListener->onStateChanged(active);
1657 return binder::Status::ok();
1658 }
1659
binderDied(const wp<IBinder> &)1660 void binderDied(const wp<IBinder>&) override {
1661 Mutex::Autolock _l(gSoundTriggerCaptureStateListenerLock);
1662 mListener->onServiceDied();
1663 gSoundTriggerCaptureStateListener = nullptr;
1664 }
1665
1666 private:
1667 // Need this in order to keep the death receipent alive.
1668 sp<IAudioPolicyService> mAps;
1669 sp<AudioSystem::CaptureStateListener> mListener;
1670 };
1671
registerSoundTriggerCaptureStateListener(const sp<CaptureStateListener> & listener)1672 status_t AudioSystem::registerSoundTriggerCaptureStateListener(
1673 const sp<CaptureStateListener>& listener) {
1674 LOG_ALWAYS_FATAL_IF(listener == nullptr);
1675
1676 const sp<IAudioPolicyService>& aps =
1677 AudioSystem::get_audio_policy_service();
1678 if (aps == 0) {
1679 return PERMISSION_DENIED;
1680 }
1681
1682 Mutex::Autolock _l(gSoundTriggerCaptureStateListenerLock);
1683 gSoundTriggerCaptureStateListener = new CaptureStateListenerImpl(aps, listener);
1684 gSoundTriggerCaptureStateListener->init();
1685
1686 return NO_ERROR;
1687 }
1688
1689 // ---------------------------------------------------------------------------
1690
addAudioPortCallback(const sp<AudioPortCallback> & callback)1691 int AudioSystem::AudioPolicyServiceClient::addAudioPortCallback(
1692 const sp<AudioPortCallback>& callback)
1693 {
1694 Mutex::Autolock _l(mLock);
1695 for (size_t i = 0; i < mAudioPortCallbacks.size(); i++) {
1696 if (mAudioPortCallbacks[i] == callback) {
1697 return -1;
1698 }
1699 }
1700 mAudioPortCallbacks.add(callback);
1701 return mAudioPortCallbacks.size();
1702 }
1703
removeAudioPortCallback(const sp<AudioPortCallback> & callback)1704 int AudioSystem::AudioPolicyServiceClient::removeAudioPortCallback(
1705 const sp<AudioPortCallback>& callback)
1706 {
1707 Mutex::Autolock _l(mLock);
1708 size_t i;
1709 for (i = 0; i < mAudioPortCallbacks.size(); i++) {
1710 if (mAudioPortCallbacks[i] == callback) {
1711 break;
1712 }
1713 }
1714 if (i == mAudioPortCallbacks.size()) {
1715 return -1;
1716 }
1717 mAudioPortCallbacks.removeAt(i);
1718 return mAudioPortCallbacks.size();
1719 }
1720
1721
onAudioPortListUpdate()1722 void AudioSystem::AudioPolicyServiceClient::onAudioPortListUpdate()
1723 {
1724 Mutex::Autolock _l(mLock);
1725 for (size_t i = 0; i < mAudioPortCallbacks.size(); i++) {
1726 mAudioPortCallbacks[i]->onAudioPortListUpdate();
1727 }
1728 }
1729
onAudioPatchListUpdate()1730 void AudioSystem::AudioPolicyServiceClient::onAudioPatchListUpdate()
1731 {
1732 Mutex::Autolock _l(mLock);
1733 for (size_t i = 0; i < mAudioPortCallbacks.size(); i++) {
1734 mAudioPortCallbacks[i]->onAudioPatchListUpdate();
1735 }
1736 }
1737
1738 // ----------------------------------------------------------------------------
addAudioVolumeGroupCallback(const sp<AudioVolumeGroupCallback> & callback)1739 int AudioSystem::AudioPolicyServiceClient::addAudioVolumeGroupCallback(
1740 const sp<AudioVolumeGroupCallback>& callback)
1741 {
1742 Mutex::Autolock _l(mLock);
1743 for (size_t i = 0; i < mAudioVolumeGroupCallback.size(); i++) {
1744 if (mAudioVolumeGroupCallback[i] == callback) {
1745 return -1;
1746 }
1747 }
1748 mAudioVolumeGroupCallback.add(callback);
1749 return mAudioVolumeGroupCallback.size();
1750 }
1751
removeAudioVolumeGroupCallback(const sp<AudioVolumeGroupCallback> & callback)1752 int AudioSystem::AudioPolicyServiceClient::removeAudioVolumeGroupCallback(
1753 const sp<AudioVolumeGroupCallback>& callback)
1754 {
1755 Mutex::Autolock _l(mLock);
1756 size_t i;
1757 for (i = 0; i < mAudioVolumeGroupCallback.size(); i++) {
1758 if (mAudioVolumeGroupCallback[i] == callback) {
1759 break;
1760 }
1761 }
1762 if (i == mAudioVolumeGroupCallback.size()) {
1763 return -1;
1764 }
1765 mAudioVolumeGroupCallback.removeAt(i);
1766 return mAudioVolumeGroupCallback.size();
1767 }
1768
onAudioVolumeGroupChanged(volume_group_t group,int flags)1769 void AudioSystem::AudioPolicyServiceClient::onAudioVolumeGroupChanged(volume_group_t group,
1770 int flags)
1771 {
1772 Mutex::Autolock _l(mLock);
1773 for (size_t i = 0; i < mAudioVolumeGroupCallback.size(); i++) {
1774 mAudioVolumeGroupCallback[i]->onAudioVolumeGroupChanged(group, flags);
1775 }
1776 }
1777 // ----------------------------------------------------------------------------
1778
onDynamicPolicyMixStateUpdate(String8 regId,int32_t state)1779 void AudioSystem::AudioPolicyServiceClient::onDynamicPolicyMixStateUpdate(
1780 String8 regId, int32_t state)
1781 {
1782 ALOGV("AudioPolicyServiceClient::onDynamicPolicyMixStateUpdate(%s, %d)", regId.string(), state);
1783 dynamic_policy_callback cb = NULL;
1784 {
1785 Mutex::Autolock _l(AudioSystem::gLock);
1786 cb = gDynPolicyCallback;
1787 }
1788
1789 if (cb != NULL) {
1790 cb(DYNAMIC_POLICY_EVENT_MIX_STATE_UPDATE, regId, state);
1791 }
1792 }
1793
onRecordingConfigurationUpdate(int event,const record_client_info_t * clientInfo,const audio_config_base_t * clientConfig,std::vector<effect_descriptor_t> clientEffects,const audio_config_base_t * deviceConfig,std::vector<effect_descriptor_t> effects,audio_patch_handle_t patchHandle,audio_source_t source)1794 void AudioSystem::AudioPolicyServiceClient::onRecordingConfigurationUpdate(
1795 int event,
1796 const record_client_info_t *clientInfo,
1797 const audio_config_base_t *clientConfig,
1798 std::vector<effect_descriptor_t> clientEffects,
1799 const audio_config_base_t *deviceConfig,
1800 std::vector<effect_descriptor_t> effects,
1801 audio_patch_handle_t patchHandle,
1802 audio_source_t source) {
1803 record_config_callback cb = NULL;
1804 {
1805 Mutex::Autolock _l(AudioSystem::gLock);
1806 cb = gRecordConfigCallback;
1807 }
1808
1809 if (cb != NULL) {
1810 cb(event, clientInfo, clientConfig, clientEffects,
1811 deviceConfig, effects, patchHandle, source);
1812 }
1813 }
1814
binderDied(const wp<IBinder> & who __unused)1815 void AudioSystem::AudioPolicyServiceClient::binderDied(const wp<IBinder>& who __unused)
1816 {
1817 {
1818 Mutex::Autolock _l(mLock);
1819 for (size_t i = 0; i < mAudioPortCallbacks.size(); i++) {
1820 mAudioPortCallbacks[i]->onServiceDied();
1821 }
1822 for (size_t i = 0; i < mAudioVolumeGroupCallback.size(); i++) {
1823 mAudioVolumeGroupCallback[i]->onServiceDied();
1824 }
1825 }
1826 {
1827 Mutex::Autolock _l(gLockAPS);
1828 AudioSystem::gAudioPolicyService.clear();
1829 }
1830
1831 ALOGW("AudioPolicyService server died!");
1832 }
1833
1834 } // namespace android
1835