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/IAudioPolicyService.h>
23 #include <android/media/BnCaptureStateListener.h>
24 #include <binder/IServiceManager.h>
25 #include <binder/ProcessState.h>
26 #include <binder/IPCThreadState.h>
27 #include <media/AidlConversion.h>
28 #include <media/AudioResamplerPublic.h>
29 #include <media/AudioSystem.h>
30 #include <media/IAudioFlinger.h>
31 #include <media/PolicyAidlConversion.h>
32 #include <media/TypeConverter.h>
33 #include <math.h>
34
35 #include <system/audio.h>
36 #include <android/media/GetInputForAttrResponse.h>
37
38 #define VALUE_OR_RETURN_BINDER_STATUS(x) \
39 ({ auto _tmp = (x); \
40 if (!_tmp.ok()) return aidl_utils::binderStatusFromStatusT(_tmp.error()); \
41 std::move(_tmp.value()); })
42
43 #define RETURN_STATUS_IF_ERROR(x) \
44 { \
45 auto _tmp = (x); \
46 if (_tmp != OK) return _tmp; \
47 }
48
49 // ----------------------------------------------------------------------------
50
51 namespace android {
52 using aidl_utils::statusTFromBinderStatus;
53 using binder::Status;
54 using media::IAudioPolicyService;
55 using android::content::AttributionSourceState;
56
57 // client singleton for AudioFlinger binder interface
58 Mutex AudioSystem::gLock;
59 Mutex AudioSystem::gLockErrorCallbacks;
60 Mutex AudioSystem::gLockAPS;
61 sp<IAudioFlinger> AudioSystem::gAudioFlinger;
62 sp<AudioSystem::AudioFlingerClient> AudioSystem::gAudioFlingerClient;
63 std::set<audio_error_callback> AudioSystem::gAudioErrorCallbacks;
64 dynamic_policy_callback AudioSystem::gDynPolicyCallback = NULL;
65 record_config_callback AudioSystem::gRecordConfigCallback = NULL;
66 routing_callback AudioSystem::gRoutingCallback = NULL;
67
68 // Required to be held while calling into gSoundTriggerCaptureStateListener.
69 class CaptureStateListenerImpl;
70
71 Mutex gSoundTriggerCaptureStateListenerLock;
72 sp<CaptureStateListenerImpl> gSoundTriggerCaptureStateListener = nullptr;
73
74 // Binder for the AudioFlinger service that's passed to this client process from the system server.
75 // This allows specific isolated processes to access the audio system. Currently used only for the
76 // HotwordDetectionService.
77 sp<IBinder> gAudioFlingerBinder = nullptr;
78
setAudioFlingerBinder(const sp<IBinder> & audioFlinger)79 void AudioSystem::setAudioFlingerBinder(const sp<IBinder>& audioFlinger) {
80 if (audioFlinger->getInterfaceDescriptor() != media::IAudioFlingerService::descriptor) {
81 ALOGE("setAudioFlingerBinder: received a binder of type %s",
82 String8(audioFlinger->getInterfaceDescriptor()).string());
83 return;
84 }
85 Mutex::Autolock _l(gLock);
86 if (gAudioFlinger != nullptr) {
87 ALOGW("setAudioFlingerBinder: ignoring; AudioFlinger connection already established.");
88 return;
89 }
90 gAudioFlingerBinder = audioFlinger;
91 }
92
93 // establish binder interface to AudioFlinger service
get_audio_flinger()94 const sp<IAudioFlinger> AudioSystem::get_audio_flinger() {
95 sp<IAudioFlinger> af;
96 sp<AudioFlingerClient> afc;
97 bool reportNoError = false;
98 {
99 Mutex::Autolock _l(gLock);
100 if (gAudioFlinger == 0) {
101 sp<IBinder> binder;
102 if (gAudioFlingerBinder != nullptr) {
103 binder = gAudioFlingerBinder;
104 } else {
105 sp<IServiceManager> sm = defaultServiceManager();
106 do {
107 binder = sm->getService(String16(IAudioFlinger::DEFAULT_SERVICE_NAME));
108 if (binder != 0)
109 break;
110 ALOGW("AudioFlinger not published, waiting...");
111 usleep(500000); // 0.5 s
112 } while (true);
113 }
114 if (gAudioFlingerClient == NULL) {
115 gAudioFlingerClient = new AudioFlingerClient();
116 } else {
117 reportNoError = true;
118 }
119 binder->linkToDeath(gAudioFlingerClient);
120 gAudioFlinger = new AudioFlingerClientAdapter(
121 interface_cast<media::IAudioFlingerService>(binder));
122 LOG_ALWAYS_FATAL_IF(gAudioFlinger == 0);
123 afc = gAudioFlingerClient;
124 // Make sure callbacks can be received by gAudioFlingerClient
125 ProcessState::self()->startThreadPool();
126 }
127 af = gAudioFlinger;
128 }
129 if (afc != 0) {
130 int64_t token = IPCThreadState::self()->clearCallingIdentity();
131 af->registerClient(afc);
132 IPCThreadState::self()->restoreCallingIdentity(token);
133 }
134 if (reportNoError) reportError(NO_ERROR);
135 return af;
136 }
137
getAudioFlingerClient()138 const sp<AudioSystem::AudioFlingerClient> AudioSystem::getAudioFlingerClient() {
139 // calling get_audio_flinger() will initialize gAudioFlingerClient if needed
140 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
141 if (af == 0) return 0;
142 Mutex::Autolock _l(gLock);
143 return gAudioFlingerClient;
144 }
145
getIoDescriptor(audio_io_handle_t ioHandle)146 sp<AudioIoDescriptor> AudioSystem::getIoDescriptor(audio_io_handle_t ioHandle) {
147 sp<AudioIoDescriptor> desc;
148 const sp<AudioFlingerClient> afc = getAudioFlingerClient();
149 if (afc != 0) {
150 desc = afc->getIoDescriptor(ioHandle);
151 }
152 return desc;
153 }
154
checkAudioFlinger()155 /* static */ status_t AudioSystem::checkAudioFlinger() {
156 if (defaultServiceManager()->checkService(String16("media.audio_flinger")) != 0) {
157 return NO_ERROR;
158 }
159 return DEAD_OBJECT;
160 }
161
162 // FIXME Declare in binder opcode order, similarly to IAudioFlinger.h and IAudioFlinger.cpp
163
muteMicrophone(bool state)164 status_t AudioSystem::muteMicrophone(bool state) {
165 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
166 if (af == 0) return PERMISSION_DENIED;
167 return af->setMicMute(state);
168 }
169
isMicrophoneMuted(bool * state)170 status_t AudioSystem::isMicrophoneMuted(bool* state) {
171 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
172 if (af == 0) return PERMISSION_DENIED;
173 *state = af->getMicMute();
174 return NO_ERROR;
175 }
176
setMasterVolume(float value)177 status_t AudioSystem::setMasterVolume(float value) {
178 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
179 if (af == 0) return PERMISSION_DENIED;
180 af->setMasterVolume(value);
181 return NO_ERROR;
182 }
183
setMasterMute(bool mute)184 status_t AudioSystem::setMasterMute(bool mute) {
185 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
186 if (af == 0) return PERMISSION_DENIED;
187 af->setMasterMute(mute);
188 return NO_ERROR;
189 }
190
getMasterVolume(float * volume)191 status_t AudioSystem::getMasterVolume(float* volume) {
192 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
193 if (af == 0) return PERMISSION_DENIED;
194 *volume = af->masterVolume();
195 return NO_ERROR;
196 }
197
getMasterMute(bool * mute)198 status_t AudioSystem::getMasterMute(bool* mute) {
199 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
200 if (af == 0) return PERMISSION_DENIED;
201 *mute = af->masterMute();
202 return NO_ERROR;
203 }
204
setStreamVolume(audio_stream_type_t stream,float value,audio_io_handle_t output)205 status_t AudioSystem::setStreamVolume(audio_stream_type_t stream, float value,
206 audio_io_handle_t output) {
207 if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE;
208 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
209 if (af == 0) return PERMISSION_DENIED;
210 af->setStreamVolume(stream, value, output);
211 return NO_ERROR;
212 }
213
setStreamMute(audio_stream_type_t stream,bool mute)214 status_t AudioSystem::setStreamMute(audio_stream_type_t stream, bool mute) {
215 if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE;
216 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
217 if (af == 0) return PERMISSION_DENIED;
218 af->setStreamMute(stream, mute);
219 return NO_ERROR;
220 }
221
getStreamVolume(audio_stream_type_t stream,float * volume,audio_io_handle_t output)222 status_t AudioSystem::getStreamVolume(audio_stream_type_t stream, float* volume,
223 audio_io_handle_t output) {
224 if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE;
225 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
226 if (af == 0) return PERMISSION_DENIED;
227 *volume = af->streamVolume(stream, output);
228 return NO_ERROR;
229 }
230
getStreamMute(audio_stream_type_t stream,bool * mute)231 status_t AudioSystem::getStreamMute(audio_stream_type_t stream, bool* mute) {
232 if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE;
233 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
234 if (af == 0) return PERMISSION_DENIED;
235 *mute = af->streamMute(stream);
236 return NO_ERROR;
237 }
238
setMode(audio_mode_t mode)239 status_t AudioSystem::setMode(audio_mode_t mode) {
240 if (uint32_t(mode) >= AUDIO_MODE_CNT) return BAD_VALUE;
241 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
242 if (af == 0) return PERMISSION_DENIED;
243 return af->setMode(mode);
244 }
245
setParameters(audio_io_handle_t ioHandle,const String8 & keyValuePairs)246 status_t AudioSystem::setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) {
247 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
248 if (af == 0) return PERMISSION_DENIED;
249 return af->setParameters(ioHandle, keyValuePairs);
250 }
251
getParameters(audio_io_handle_t ioHandle,const String8 & keys)252 String8 AudioSystem::getParameters(audio_io_handle_t ioHandle, const String8& keys) {
253 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
254 String8 result = String8("");
255 if (af == 0) return result;
256
257 result = af->getParameters(ioHandle, keys);
258 return result;
259 }
260
setParameters(const String8 & keyValuePairs)261 status_t AudioSystem::setParameters(const String8& keyValuePairs) {
262 return setParameters(AUDIO_IO_HANDLE_NONE, keyValuePairs);
263 }
264
getParameters(const String8 & keys)265 String8 AudioSystem::getParameters(const String8& keys) {
266 return getParameters(AUDIO_IO_HANDLE_NONE, keys);
267 }
268
269 // convert volume steps to natural log scale
270
271 // change this value to change volume scaling
272 static const float dBPerStep = 0.5f;
273 // shouldn't need to touch these
274 static const float dBConvert = -dBPerStep * 2.302585093f / 20.0f;
275 static const float dBConvertInverse = 1.0f / dBConvert;
276
linearToLog(int volume)277 float AudioSystem::linearToLog(int volume) {
278 // float v = volume ? exp(float(100 - volume) * dBConvert) : 0;
279 // ALOGD("linearToLog(%d)=%f", volume, v);
280 // return v;
281 return volume ? exp(float(100 - volume) * dBConvert) : 0;
282 }
283
logToLinear(float volume)284 int AudioSystem::logToLinear(float volume) {
285 // int v = volume ? 100 - int(dBConvertInverse * log(volume) + 0.5) : 0;
286 // ALOGD("logTolinear(%d)=%f", v, volume);
287 // return v;
288 return volume ? 100 - int(dBConvertInverse * log(volume) + 0.5) : 0;
289 }
290
calculateMinFrameCount(uint32_t afLatencyMs,uint32_t afFrameCount,uint32_t afSampleRate,uint32_t sampleRate,float speed)291 /* static */ size_t AudioSystem::calculateMinFrameCount(
292 uint32_t afLatencyMs, uint32_t afFrameCount, uint32_t afSampleRate,
293 uint32_t sampleRate, float speed /*, uint32_t notificationsPerBufferReq*/) {
294 // Ensure that buffer depth covers at least audio hardware latency
295 uint32_t minBufCount = afLatencyMs / ((1000 * afFrameCount) / afSampleRate);
296 if (minBufCount < 2) {
297 minBufCount = 2;
298 }
299 #if 0
300 // The notificationsPerBufferReq parameter is not yet used for non-fast tracks,
301 // but keeping the code here to make it easier to add later.
302 if (minBufCount < notificationsPerBufferReq) {
303 minBufCount = notificationsPerBufferReq;
304 }
305 #endif
306 ALOGV("calculateMinFrameCount afLatency %u afFrameCount %u afSampleRate %u "
307 "sampleRate %u speed %f minBufCount: %u" /*" notificationsPerBufferReq %u"*/,
308 afLatencyMs, afFrameCount, afSampleRate, sampleRate, speed, minBufCount
309 /*, notificationsPerBufferReq*/);
310 return minBufCount * sourceFramesNeededWithTimestretch(
311 sampleRate, afFrameCount, afSampleRate, speed);
312 }
313
314
315 status_t
getOutputSamplingRate(uint32_t * samplingRate,audio_stream_type_t streamType)316 AudioSystem::getOutputSamplingRate(uint32_t* samplingRate, audio_stream_type_t streamType) {
317 audio_io_handle_t output;
318
319 if (streamType == AUDIO_STREAM_DEFAULT) {
320 streamType = AUDIO_STREAM_MUSIC;
321 }
322
323 output = getOutput(streamType);
324 if (output == 0) {
325 return PERMISSION_DENIED;
326 }
327
328 return getSamplingRate(output, samplingRate);
329 }
330
getSamplingRate(audio_io_handle_t ioHandle,uint32_t * samplingRate)331 status_t AudioSystem::getSamplingRate(audio_io_handle_t ioHandle,
332 uint32_t* samplingRate) {
333 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
334 if (af == 0) return PERMISSION_DENIED;
335 sp<AudioIoDescriptor> desc = getIoDescriptor(ioHandle);
336 if (desc == 0) {
337 *samplingRate = af->sampleRate(ioHandle);
338 } else {
339 *samplingRate = desc->mSamplingRate;
340 }
341 if (*samplingRate == 0) {
342 ALOGE("AudioSystem::getSamplingRate failed for ioHandle %d", ioHandle);
343 return BAD_VALUE;
344 }
345
346 ALOGV("getSamplingRate() ioHandle %d, sampling rate %u", ioHandle, *samplingRate);
347
348 return NO_ERROR;
349 }
350
getOutputFrameCount(size_t * frameCount,audio_stream_type_t streamType)351 status_t AudioSystem::getOutputFrameCount(size_t* frameCount, audio_stream_type_t streamType) {
352 audio_io_handle_t output;
353
354 if (streamType == AUDIO_STREAM_DEFAULT) {
355 streamType = AUDIO_STREAM_MUSIC;
356 }
357
358 output = getOutput(streamType);
359 if (output == AUDIO_IO_HANDLE_NONE) {
360 return PERMISSION_DENIED;
361 }
362
363 return getFrameCount(output, frameCount);
364 }
365
getFrameCount(audio_io_handle_t ioHandle,size_t * frameCount)366 status_t AudioSystem::getFrameCount(audio_io_handle_t ioHandle,
367 size_t* frameCount) {
368 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
369 if (af == 0) return PERMISSION_DENIED;
370 sp<AudioIoDescriptor> desc = getIoDescriptor(ioHandle);
371 if (desc == 0) {
372 *frameCount = af->frameCount(ioHandle);
373 } else {
374 *frameCount = desc->mFrameCount;
375 }
376 if (*frameCount == 0) {
377 ALOGE("AudioSystem::getFrameCount failed for ioHandle %d", ioHandle);
378 return BAD_VALUE;
379 }
380
381 ALOGV("getFrameCount() ioHandle %d, frameCount %zu", ioHandle, *frameCount);
382
383 return NO_ERROR;
384 }
385
getOutputLatency(uint32_t * latency,audio_stream_type_t streamType)386 status_t AudioSystem::getOutputLatency(uint32_t* latency, audio_stream_type_t streamType) {
387 audio_io_handle_t output;
388
389 if (streamType == AUDIO_STREAM_DEFAULT) {
390 streamType = AUDIO_STREAM_MUSIC;
391 }
392
393 output = getOutput(streamType);
394 if (output == AUDIO_IO_HANDLE_NONE) {
395 return PERMISSION_DENIED;
396 }
397
398 return getLatency(output, latency);
399 }
400
getLatency(audio_io_handle_t output,uint32_t * latency)401 status_t AudioSystem::getLatency(audio_io_handle_t output,
402 uint32_t* latency) {
403 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
404 if (af == 0) return PERMISSION_DENIED;
405 sp<AudioIoDescriptor> outputDesc = getIoDescriptor(output);
406 if (outputDesc == 0) {
407 *latency = af->latency(output);
408 } else {
409 *latency = outputDesc->mLatency;
410 }
411
412 ALOGV("getLatency() output %d, latency %d", output, *latency);
413
414 return NO_ERROR;
415 }
416
getInputBufferSize(uint32_t sampleRate,audio_format_t format,audio_channel_mask_t channelMask,size_t * buffSize)417 status_t AudioSystem::getInputBufferSize(uint32_t sampleRate, audio_format_t format,
418 audio_channel_mask_t channelMask, size_t* buffSize) {
419 const sp<AudioFlingerClient> afc = getAudioFlingerClient();
420 if (afc == 0) {
421 return NO_INIT;
422 }
423 return afc->getInputBufferSize(sampleRate, format, channelMask, buffSize);
424 }
425
setVoiceVolume(float value)426 status_t AudioSystem::setVoiceVolume(float value) {
427 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
428 if (af == 0) return PERMISSION_DENIED;
429 return af->setVoiceVolume(value);
430 }
431
getRenderPosition(audio_io_handle_t output,uint32_t * halFrames,uint32_t * dspFrames)432 status_t AudioSystem::getRenderPosition(audio_io_handle_t output, uint32_t* halFrames,
433 uint32_t* dspFrames) {
434 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
435 if (af == 0) return PERMISSION_DENIED;
436
437 return af->getRenderPosition(halFrames, dspFrames, output);
438 }
439
getInputFramesLost(audio_io_handle_t ioHandle)440 uint32_t AudioSystem::getInputFramesLost(audio_io_handle_t ioHandle) {
441 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
442 uint32_t result = 0;
443 if (af == 0) return result;
444 if (ioHandle == AUDIO_IO_HANDLE_NONE) return result;
445
446 result = af->getInputFramesLost(ioHandle);
447 return result;
448 }
449
newAudioUniqueId(audio_unique_id_use_t use)450 audio_unique_id_t AudioSystem::newAudioUniqueId(audio_unique_id_use_t use) {
451 // Must not use AF as IDs will re-roll on audioserver restart, b/130369529.
452 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
453 if (af == 0) return AUDIO_UNIQUE_ID_ALLOCATE;
454 return af->newAudioUniqueId(use);
455 }
456
acquireAudioSessionId(audio_session_t audioSession,pid_t pid,uid_t uid)457 void AudioSystem::acquireAudioSessionId(audio_session_t audioSession, pid_t pid, uid_t uid) {
458 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
459 if (af != 0) {
460 af->acquireAudioSessionId(audioSession, pid, uid);
461 }
462 }
463
releaseAudioSessionId(audio_session_t audioSession,pid_t pid)464 void AudioSystem::releaseAudioSessionId(audio_session_t audioSession, pid_t pid) {
465 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
466 if (af != 0) {
467 af->releaseAudioSessionId(audioSession, pid);
468 }
469 }
470
getAudioHwSyncForSession(audio_session_t sessionId)471 audio_hw_sync_t AudioSystem::getAudioHwSyncForSession(audio_session_t sessionId) {
472 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
473 if (af == 0) return AUDIO_HW_SYNC_INVALID;
474 return af->getAudioHwSyncForSession(sessionId);
475 }
476
systemReady()477 status_t AudioSystem::systemReady() {
478 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
479 if (af == 0) return NO_INIT;
480 return af->systemReady();
481 }
482
audioPolicyReady()483 status_t AudioSystem::audioPolicyReady() {
484 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
485 if (af == 0) return NO_INIT;
486 return af->audioPolicyReady();
487 }
488
getFrameCountHAL(audio_io_handle_t ioHandle,size_t * frameCount)489 status_t AudioSystem::getFrameCountHAL(audio_io_handle_t ioHandle,
490 size_t* frameCount) {
491 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
492 if (af == 0) return PERMISSION_DENIED;
493 sp<AudioIoDescriptor> desc = getIoDescriptor(ioHandle);
494 if (desc == 0) {
495 *frameCount = af->frameCountHAL(ioHandle);
496 } else {
497 *frameCount = desc->mFrameCountHAL;
498 }
499 if (*frameCount == 0) {
500 ALOGE("AudioSystem::getFrameCountHAL failed for ioHandle %d", ioHandle);
501 return BAD_VALUE;
502 }
503
504 ALOGV("getFrameCountHAL() ioHandle %d, frameCount %zu", ioHandle, *frameCount);
505
506 return NO_ERROR;
507 }
508
509 // ---------------------------------------------------------------------------
510
511
clearIoCache()512 void AudioSystem::AudioFlingerClient::clearIoCache() {
513 Mutex::Autolock _l(mLock);
514 mIoDescriptors.clear();
515 mInBuffSize = 0;
516 mInSamplingRate = 0;
517 mInFormat = AUDIO_FORMAT_DEFAULT;
518 mInChannelMask = AUDIO_CHANNEL_NONE;
519 }
520
binderDied(const wp<IBinder> & who __unused)521 void AudioSystem::AudioFlingerClient::binderDied(const wp<IBinder>& who __unused) {
522 {
523 Mutex::Autolock _l(AudioSystem::gLock);
524 AudioSystem::gAudioFlinger.clear();
525 }
526
527 // clear output handles and stream to output map caches
528 clearIoCache();
529
530 reportError(DEAD_OBJECT);
531
532 ALOGW("AudioFlinger server died!");
533 }
534
ioConfigChanged(media::AudioIoConfigEvent _event,const media::AudioIoDescriptor & _ioDesc)535 Status AudioSystem::AudioFlingerClient::ioConfigChanged(
536 media::AudioIoConfigEvent _event,
537 const media::AudioIoDescriptor& _ioDesc) {
538 audio_io_config_event event = VALUE_OR_RETURN_BINDER_STATUS(
539 aidl2legacy_AudioIoConfigEvent_audio_io_config_event(_event));
540 sp<AudioIoDescriptor> ioDesc(
541 VALUE_OR_RETURN_BINDER_STATUS(
542 aidl2legacy_AudioIoDescriptor_AudioIoDescriptor(_ioDesc)));
543
544 ALOGV("ioConfigChanged() event %d", event);
545
546 if (ioDesc->mIoHandle == AUDIO_IO_HANDLE_NONE) return Status::ok();
547
548 audio_port_handle_t deviceId = AUDIO_PORT_HANDLE_NONE;
549 std::vector<sp<AudioDeviceCallback>> callbacksToCall;
550 {
551 Mutex::Autolock _l(mLock);
552 auto callbacks = std::map<audio_port_handle_t, wp<AudioDeviceCallback>>();
553
554 switch (event) {
555 case AUDIO_OUTPUT_OPENED:
556 case AUDIO_OUTPUT_REGISTERED:
557 case AUDIO_INPUT_OPENED:
558 case AUDIO_INPUT_REGISTERED: {
559 sp<AudioIoDescriptor> oldDesc = getIoDescriptor_l(ioDesc->mIoHandle);
560 if (oldDesc == 0) {
561 mIoDescriptors.add(ioDesc->mIoHandle, ioDesc);
562 } else {
563 deviceId = oldDesc->getDeviceId();
564 mIoDescriptors.replaceValueFor(ioDesc->mIoHandle, ioDesc);
565 }
566
567 if (ioDesc->getDeviceId() != AUDIO_PORT_HANDLE_NONE) {
568 deviceId = ioDesc->getDeviceId();
569 if (event == AUDIO_OUTPUT_OPENED || event == AUDIO_INPUT_OPENED) {
570 auto it = mAudioDeviceCallbacks.find(ioDesc->mIoHandle);
571 if (it != mAudioDeviceCallbacks.end()) {
572 callbacks = it->second;
573 }
574 }
575 }
576 ALOGV("ioConfigChanged() new %s %s %d samplingRate %u, format %#x channel mask %#x "
577 "frameCount %zu deviceId %d",
578 event == AUDIO_OUTPUT_OPENED || event == AUDIO_OUTPUT_REGISTERED ?
579 "output" : "input",
580 event == AUDIO_OUTPUT_OPENED || event == AUDIO_INPUT_OPENED ?
581 "opened" : "registered",
582 ioDesc->mIoHandle, ioDesc->mSamplingRate, ioDesc->mFormat,
583 ioDesc->mChannelMask,
584 ioDesc->mFrameCount, ioDesc->getDeviceId());
585 }
586 break;
587 case AUDIO_OUTPUT_CLOSED:
588 case AUDIO_INPUT_CLOSED: {
589 if (getIoDescriptor_l(ioDesc->mIoHandle) == 0) {
590 ALOGW("ioConfigChanged() closing unknown %s %d",
591 event == AUDIO_OUTPUT_CLOSED ? "output" : "input", ioDesc->mIoHandle);
592 break;
593 }
594 ALOGV("ioConfigChanged() %s %d closed",
595 event == AUDIO_OUTPUT_CLOSED ? "output" : "input", ioDesc->mIoHandle);
596
597 mIoDescriptors.removeItem(ioDesc->mIoHandle);
598 mAudioDeviceCallbacks.erase(ioDesc->mIoHandle);
599 }
600 break;
601
602 case AUDIO_OUTPUT_CONFIG_CHANGED:
603 case AUDIO_INPUT_CONFIG_CHANGED: {
604 sp<AudioIoDescriptor> oldDesc = getIoDescriptor_l(ioDesc->mIoHandle);
605 if (oldDesc == 0) {
606 ALOGW("ioConfigChanged() modifying unknown %s! %d",
607 event == AUDIO_OUTPUT_CONFIG_CHANGED ? "output" : "input",
608 ioDesc->mIoHandle);
609 break;
610 }
611
612 deviceId = oldDesc->getDeviceId();
613 mIoDescriptors.replaceValueFor(ioDesc->mIoHandle, ioDesc);
614
615 if (deviceId != ioDesc->getDeviceId()) {
616 deviceId = ioDesc->getDeviceId();
617 auto it = mAudioDeviceCallbacks.find(ioDesc->mIoHandle);
618 if (it != mAudioDeviceCallbacks.end()) {
619 callbacks = it->second;
620 }
621 }
622 ALOGV("ioConfigChanged() new config for %s %d samplingRate %u, format %#x "
623 "channel mask %#x frameCount %zu frameCountHAL %zu deviceId %d",
624 event == AUDIO_OUTPUT_CONFIG_CHANGED ? "output" : "input",
625 ioDesc->mIoHandle, ioDesc->mSamplingRate, ioDesc->mFormat,
626 ioDesc->mChannelMask, ioDesc->mFrameCount, ioDesc->mFrameCountHAL,
627 ioDesc->getDeviceId());
628
629 }
630 break;
631 case AUDIO_CLIENT_STARTED: {
632 sp<AudioIoDescriptor> oldDesc = getIoDescriptor_l(ioDesc->mIoHandle);
633 if (oldDesc == 0) {
634 ALOGW("ioConfigChanged() start client on unknown io! %d", ioDesc->mIoHandle);
635 break;
636 }
637 ALOGV("ioConfigChanged() AUDIO_CLIENT_STARTED io %d port %d num callbacks %zu",
638 ioDesc->mIoHandle, ioDesc->mPortId, mAudioDeviceCallbacks.size());
639 oldDesc->mPatch = ioDesc->mPatch;
640 auto it = mAudioDeviceCallbacks.find(ioDesc->mIoHandle);
641 if (it != mAudioDeviceCallbacks.end()) {
642 auto cbks = it->second;
643 auto it2 = cbks.find(ioDesc->mPortId);
644 if (it2 != cbks.end()) {
645 callbacks.emplace(ioDesc->mPortId, it2->second);
646 deviceId = oldDesc->getDeviceId();
647 }
648 }
649 }
650 break;
651 }
652
653 for (auto wpCbk : callbacks) {
654 sp<AudioDeviceCallback> spCbk = wpCbk.second.promote();
655 if (spCbk != nullptr) {
656 callbacksToCall.push_back(spCbk);
657 }
658 }
659 }
660
661 // Callbacks must be called without mLock held. May lead to dead lock if calling for
662 // example getRoutedDevice that updates the device and tries to acquire mLock.
663 for (auto cb : callbacksToCall) {
664 // If callbacksToCall is not empty, it implies ioDesc->mIoHandle and deviceId are valid
665 cb->onAudioDeviceUpdate(ioDesc->mIoHandle, deviceId);
666 }
667
668 return Status::ok();
669 }
670
getInputBufferSize(uint32_t sampleRate,audio_format_t format,audio_channel_mask_t channelMask,size_t * buffSize)671 status_t AudioSystem::AudioFlingerClient::getInputBufferSize(
672 uint32_t sampleRate, audio_format_t format,
673 audio_channel_mask_t channelMask, size_t* buffSize) {
674 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
675 if (af == 0) {
676 return PERMISSION_DENIED;
677 }
678 Mutex::Autolock _l(mLock);
679 // Do we have a stale mInBuffSize or are we requesting the input buffer size for new values
680 if ((mInBuffSize == 0) || (sampleRate != mInSamplingRate) || (format != mInFormat)
681 || (channelMask != mInChannelMask)) {
682 size_t inBuffSize = af->getInputBufferSize(sampleRate, format, channelMask);
683 if (inBuffSize == 0) {
684 ALOGE("AudioSystem::getInputBufferSize failed sampleRate %d format %#x channelMask %#x",
685 sampleRate, format, channelMask);
686 return BAD_VALUE;
687 }
688 // A benign race is possible here: we could overwrite a fresher cache entry
689 // save the request params
690 mInSamplingRate = sampleRate;
691 mInFormat = format;
692 mInChannelMask = channelMask;
693
694 mInBuffSize = inBuffSize;
695 }
696
697 *buffSize = mInBuffSize;
698
699 return NO_ERROR;
700 }
701
702 sp<AudioIoDescriptor>
getIoDescriptor_l(audio_io_handle_t ioHandle)703 AudioSystem::AudioFlingerClient::getIoDescriptor_l(audio_io_handle_t ioHandle) {
704 sp<AudioIoDescriptor> desc;
705 ssize_t index = mIoDescriptors.indexOfKey(ioHandle);
706 if (index >= 0) {
707 desc = mIoDescriptors.valueAt(index);
708 }
709 return desc;
710 }
711
getIoDescriptor(audio_io_handle_t ioHandle)712 sp<AudioIoDescriptor> AudioSystem::AudioFlingerClient::getIoDescriptor(audio_io_handle_t ioHandle) {
713 Mutex::Autolock _l(mLock);
714 return getIoDescriptor_l(ioHandle);
715 }
716
addAudioDeviceCallback(const wp<AudioDeviceCallback> & callback,audio_io_handle_t audioIo,audio_port_handle_t portId)717 status_t AudioSystem::AudioFlingerClient::addAudioDeviceCallback(
718 const wp<AudioDeviceCallback>& callback, audio_io_handle_t audioIo,
719 audio_port_handle_t portId) {
720 ALOGV("%s audioIo %d portId %d", __func__, audioIo, portId);
721 Mutex::Autolock _l(mLock);
722 auto& callbacks = mAudioDeviceCallbacks.emplace(
723 audioIo,
724 std::map<audio_port_handle_t, wp<AudioDeviceCallback>>()).first->second;
725 auto result = callbacks.try_emplace(portId, callback);
726 if (!result.second) {
727 return INVALID_OPERATION;
728 }
729 return NO_ERROR;
730 }
731
removeAudioDeviceCallback(const wp<AudioDeviceCallback> & callback __unused,audio_io_handle_t audioIo,audio_port_handle_t portId)732 status_t AudioSystem::AudioFlingerClient::removeAudioDeviceCallback(
733 const wp<AudioDeviceCallback>& callback __unused, audio_io_handle_t audioIo,
734 audio_port_handle_t portId) {
735 ALOGV("%s audioIo %d portId %d", __func__, audioIo, portId);
736 Mutex::Autolock _l(mLock);
737 auto it = mAudioDeviceCallbacks.find(audioIo);
738 if (it == mAudioDeviceCallbacks.end()) {
739 return INVALID_OPERATION;
740 }
741 if (it->second.erase(portId) == 0) {
742 return INVALID_OPERATION;
743 }
744 if (it->second.size() == 0) {
745 mAudioDeviceCallbacks.erase(audioIo);
746 }
747 return NO_ERROR;
748 }
749
addErrorCallback(audio_error_callback cb)750 /* static */ uintptr_t AudioSystem::addErrorCallback(audio_error_callback cb) {
751 Mutex::Autolock _l(gLockErrorCallbacks);
752 gAudioErrorCallbacks.insert(cb);
753 return reinterpret_cast<uintptr_t>(cb);
754 }
755
removeErrorCallback(uintptr_t cb)756 /* static */ void AudioSystem::removeErrorCallback(uintptr_t cb) {
757 Mutex::Autolock _l(gLockErrorCallbacks);
758 gAudioErrorCallbacks.erase(reinterpret_cast<audio_error_callback>(cb));
759 }
760
reportError(status_t err)761 /* static */ void AudioSystem::reportError(status_t err) {
762 Mutex::Autolock _l(gLockErrorCallbacks);
763 for (auto callback : gAudioErrorCallbacks) {
764 callback(err);
765 }
766 }
767
setDynPolicyCallback(dynamic_policy_callback cb)768 /*static*/ void AudioSystem::setDynPolicyCallback(dynamic_policy_callback cb) {
769 Mutex::Autolock _l(gLock);
770 gDynPolicyCallback = cb;
771 }
772
setRecordConfigCallback(record_config_callback cb)773 /*static*/ void AudioSystem::setRecordConfigCallback(record_config_callback cb) {
774 Mutex::Autolock _l(gLock);
775 gRecordConfigCallback = cb;
776 }
777
setRoutingCallback(routing_callback cb)778 /*static*/ void AudioSystem::setRoutingCallback(routing_callback cb) {
779 Mutex::Autolock _l(gLock);
780 gRoutingCallback = cb;
781 }
782
783 // client singleton for AudioPolicyService binder interface
784 // protected by gLockAPS
785 sp<IAudioPolicyService> AudioSystem::gAudioPolicyService;
786 sp<AudioSystem::AudioPolicyServiceClient> AudioSystem::gAudioPolicyServiceClient;
787
788
789 // establish binder interface to AudioPolicy service
get_audio_policy_service()790 const sp<IAudioPolicyService> AudioSystem::get_audio_policy_service() {
791 sp<IAudioPolicyService> ap;
792 sp<AudioPolicyServiceClient> apc;
793 {
794 Mutex::Autolock _l(gLockAPS);
795 if (gAudioPolicyService == 0) {
796 sp<IServiceManager> sm = defaultServiceManager();
797 sp<IBinder> binder;
798 do {
799 binder = sm->getService(String16("media.audio_policy"));
800 if (binder != 0)
801 break;
802 ALOGW("AudioPolicyService not published, waiting...");
803 usleep(500000); // 0.5 s
804 } while (true);
805 if (gAudioPolicyServiceClient == NULL) {
806 gAudioPolicyServiceClient = new AudioPolicyServiceClient();
807 }
808 binder->linkToDeath(gAudioPolicyServiceClient);
809 gAudioPolicyService = interface_cast<IAudioPolicyService>(binder);
810 LOG_ALWAYS_FATAL_IF(gAudioPolicyService == 0);
811 apc = gAudioPolicyServiceClient;
812 // Make sure callbacks can be received by gAudioPolicyServiceClient
813 ProcessState::self()->startThreadPool();
814 }
815 ap = gAudioPolicyService;
816 }
817 if (apc != 0) {
818 int64_t token = IPCThreadState::self()->clearCallingIdentity();
819 ap->registerClient(apc);
820 ap->setAudioPortCallbacksEnabled(apc->isAudioPortCbEnabled());
821 ap->setAudioVolumeGroupCallbacksEnabled(apc->isAudioVolumeGroupCbEnabled());
822 IPCThreadState::self()->restoreCallingIdentity(token);
823 }
824
825 return ap;
826 }
827
828 // ---------------------------------------------------------------------------
829
onNewAudioModulesAvailable()830 void AudioSystem::onNewAudioModulesAvailable() {
831 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
832 if (aps == 0) return;
833 aps->onNewAudioModulesAvailable();
834 }
835
setDeviceConnectionState(audio_devices_t device,audio_policy_dev_state_t state,const char * device_address,const char * device_name,audio_format_t encodedFormat)836 status_t AudioSystem::setDeviceConnectionState(audio_devices_t device,
837 audio_policy_dev_state_t state,
838 const char* device_address,
839 const char* device_name,
840 audio_format_t encodedFormat) {
841 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
842 const char* address = "";
843 const char* name = "";
844
845 if (aps == 0) return PERMISSION_DENIED;
846
847 if (device_address != NULL) {
848 address = device_address;
849 }
850 if (device_name != NULL) {
851 name = device_name;
852 }
853
854 media::AudioDevice deviceAidl;
855 deviceAidl.type = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_devices_t_int32_t(device));
856 deviceAidl.address = address;
857
858 return statusTFromBinderStatus(
859 aps->setDeviceConnectionState(
860 deviceAidl,
861 VALUE_OR_RETURN_STATUS(
862 legacy2aidl_audio_policy_dev_state_t_AudioPolicyDeviceState(state)),
863 name,
864 VALUE_OR_RETURN_STATUS(legacy2aidl_audio_format_t_AudioFormat(encodedFormat))));
865 }
866
getDeviceConnectionState(audio_devices_t device,const char * device_address)867 audio_policy_dev_state_t AudioSystem::getDeviceConnectionState(audio_devices_t device,
868 const char* device_address) {
869 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
870 if (aps == 0) return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
871
872 auto result = [&]() -> ConversionResult<audio_policy_dev_state_t> {
873 media::AudioDevice deviceAidl;
874 deviceAidl.type = VALUE_OR_RETURN(legacy2aidl_audio_devices_t_int32_t(device));
875 deviceAidl.address = device_address;
876
877 media::AudioPolicyDeviceState result;
878 RETURN_IF_ERROR(statusTFromBinderStatus(
879 aps->getDeviceConnectionState(deviceAidl, &result)));
880
881 return aidl2legacy_AudioPolicyDeviceState_audio_policy_dev_state_t(result);
882 }();
883 return result.value_or(AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE);
884 }
885
handleDeviceConfigChange(audio_devices_t device,const char * device_address,const char * device_name,audio_format_t encodedFormat)886 status_t AudioSystem::handleDeviceConfigChange(audio_devices_t device,
887 const char* device_address,
888 const char* device_name,
889 audio_format_t encodedFormat) {
890 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
891 const char* address = "";
892 const char* name = "";
893
894 if (aps == 0) return PERMISSION_DENIED;
895
896 if (device_address != NULL) {
897 address = device_address;
898 }
899 if (device_name != NULL) {
900 name = device_name;
901 }
902
903 media::AudioDevice deviceAidl;
904 deviceAidl.type = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_devices_t_int32_t(device));
905 deviceAidl.address = address;
906
907 return statusTFromBinderStatus(
908 aps->handleDeviceConfigChange(deviceAidl, name, VALUE_OR_RETURN_STATUS(
909 legacy2aidl_audio_format_t_AudioFormat(encodedFormat))));
910 }
911
setPhoneState(audio_mode_t state,uid_t uid)912 status_t AudioSystem::setPhoneState(audio_mode_t state, uid_t uid) {
913 if (uint32_t(state) >= AUDIO_MODE_CNT) return BAD_VALUE;
914 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
915 if (aps == 0) return PERMISSION_DENIED;
916
917 return statusTFromBinderStatus(aps->setPhoneState(
918 VALUE_OR_RETURN_STATUS(legacy2aidl_audio_mode_t_AudioMode(state)),
919 VALUE_OR_RETURN_STATUS(legacy2aidl_uid_t_int32_t(uid))));
920 }
921
922 status_t
setForceUse(audio_policy_force_use_t usage,audio_policy_forced_cfg_t config)923 AudioSystem::setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config) {
924 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
925 if (aps == 0) return PERMISSION_DENIED;
926
927 return statusTFromBinderStatus(
928 aps->setForceUse(
929 VALUE_OR_RETURN_STATUS(
930 legacy2aidl_audio_policy_force_use_t_AudioPolicyForceUse(usage)),
931 VALUE_OR_RETURN_STATUS(
932 legacy2aidl_audio_policy_forced_cfg_t_AudioPolicyForcedConfig(
933 config))));
934 }
935
getForceUse(audio_policy_force_use_t usage)936 audio_policy_forced_cfg_t AudioSystem::getForceUse(audio_policy_force_use_t usage) {
937 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
938 if (aps == 0) return AUDIO_POLICY_FORCE_NONE;
939
940 auto result = [&]() -> ConversionResult<audio_policy_forced_cfg_t> {
941 media::AudioPolicyForceUse usageAidl = VALUE_OR_RETURN(
942 legacy2aidl_audio_policy_force_use_t_AudioPolicyForceUse(usage));
943 media::AudioPolicyForcedConfig configAidl;
944 RETURN_IF_ERROR(statusTFromBinderStatus(
945 aps->getForceUse(usageAidl, &configAidl)));
946 return aidl2legacy_AudioPolicyForcedConfig_audio_policy_forced_cfg_t(configAidl);
947 }();
948
949 return result.value_or(AUDIO_POLICY_FORCE_NONE);
950 }
951
952
getOutput(audio_stream_type_t stream)953 audio_io_handle_t AudioSystem::getOutput(audio_stream_type_t stream) {
954 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
955 if (aps == 0) return AUDIO_IO_HANDLE_NONE;
956
957 auto result = [&]() -> ConversionResult<audio_io_handle_t> {
958 media::AudioStreamType streamAidl = VALUE_OR_RETURN(
959 legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
960 int32_t outputAidl;
961 RETURN_IF_ERROR(
962 statusTFromBinderStatus(aps->getOutput(streamAidl, &outputAidl)));
963 return aidl2legacy_int32_t_audio_io_handle_t(outputAidl);
964 }();
965
966 return result.value_or(AUDIO_IO_HANDLE_NONE);
967 }
968
getOutputForAttr(audio_attributes_t * attr,audio_io_handle_t * output,audio_session_t session,audio_stream_type_t * stream,const AttributionSourceState & attributionSource,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)969 status_t AudioSystem::getOutputForAttr(audio_attributes_t* attr,
970 audio_io_handle_t* output,
971 audio_session_t session,
972 audio_stream_type_t* stream,
973 const AttributionSourceState& attributionSource,
974 const audio_config_t* config,
975 audio_output_flags_t flags,
976 audio_port_handle_t* selectedDeviceId,
977 audio_port_handle_t* portId,
978 std::vector<audio_io_handle_t>* secondaryOutputs) {
979 if (attr == nullptr) {
980 ALOGE("%s NULL audio attributes", __func__);
981 return BAD_VALUE;
982 }
983 if (output == nullptr) {
984 ALOGE("%s NULL output - shouldn't happen", __func__);
985 return BAD_VALUE;
986 }
987 if (selectedDeviceId == nullptr) {
988 ALOGE("%s NULL selectedDeviceId - shouldn't happen", __func__);
989 return BAD_VALUE;
990 }
991 if (portId == nullptr) {
992 ALOGE("%s NULL portId - shouldn't happen", __func__);
993 return BAD_VALUE;
994 }
995 if (secondaryOutputs == nullptr) {
996 ALOGE("%s NULL secondaryOutputs - shouldn't happen", __func__);
997 return BAD_VALUE;
998 }
999
1000 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1001 if (aps == 0) return NO_INIT;
1002
1003 media::AudioAttributesInternal attrAidl = VALUE_OR_RETURN_STATUS(
1004 legacy2aidl_audio_attributes_t_AudioAttributesInternal(*attr));
1005 int32_t sessionAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_session_t_int32_t(session));
1006 media::AudioConfig configAidl = VALUE_OR_RETURN_STATUS(
1007 legacy2aidl_audio_config_t_AudioConfig(*config));
1008 int32_t flagsAidl = VALUE_OR_RETURN_STATUS(
1009 legacy2aidl_audio_output_flags_t_int32_t_mask(flags));
1010 int32_t selectedDeviceIdAidl = VALUE_OR_RETURN_STATUS(
1011 legacy2aidl_audio_port_handle_t_int32_t(*selectedDeviceId));
1012
1013 media::GetOutputForAttrResponse responseAidl;
1014
1015 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1016 aps->getOutputForAttr(attrAidl, sessionAidl, attributionSource, configAidl, flagsAidl,
1017 selectedDeviceIdAidl, &responseAidl)));
1018
1019 *output = VALUE_OR_RETURN_STATUS(
1020 aidl2legacy_int32_t_audio_io_handle_t(responseAidl.output));
1021
1022 if (stream != nullptr) {
1023 *stream = VALUE_OR_RETURN_STATUS(
1024 aidl2legacy_AudioStreamType_audio_stream_type_t(responseAidl.stream));
1025 }
1026 *selectedDeviceId = VALUE_OR_RETURN_STATUS(
1027 aidl2legacy_int32_t_audio_port_handle_t(responseAidl.selectedDeviceId));
1028 *portId = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_port_handle_t(responseAidl.portId));
1029 *secondaryOutputs = VALUE_OR_RETURN_STATUS(convertContainer<std::vector<audio_io_handle_t>>(
1030 responseAidl.secondaryOutputs, aidl2legacy_int32_t_audio_io_handle_t));
1031
1032 return OK;
1033 }
1034
startOutput(audio_port_handle_t portId)1035 status_t AudioSystem::startOutput(audio_port_handle_t portId) {
1036 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1037 if (aps == 0) return PERMISSION_DENIED;
1038
1039 int32_t portIdAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_port_handle_t_int32_t(portId));
1040 return statusTFromBinderStatus(aps->startOutput(portIdAidl));
1041 }
1042
stopOutput(audio_port_handle_t portId)1043 status_t AudioSystem::stopOutput(audio_port_handle_t portId) {
1044 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1045 if (aps == 0) return PERMISSION_DENIED;
1046
1047 int32_t portIdAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_port_handle_t_int32_t(portId));
1048 return statusTFromBinderStatus(aps->stopOutput(portIdAidl));
1049 }
1050
releaseOutput(audio_port_handle_t portId)1051 void AudioSystem::releaseOutput(audio_port_handle_t portId) {
1052 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1053 if (aps == 0) return;
1054
1055 auto status = [&]() -> status_t {
1056 int32_t portIdAidl = VALUE_OR_RETURN_STATUS(
1057 legacy2aidl_audio_port_handle_t_int32_t(portId));
1058 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(aps->releaseOutput(portIdAidl)));
1059 return OK;
1060 }();
1061
1062 // Ignore status.
1063 (void) status;
1064 }
1065
getInputForAttr(const audio_attributes_t * attr,audio_io_handle_t * input,audio_unique_id_t riid,audio_session_t session,const AttributionSourceState & attributionSource,const audio_config_base_t * config,audio_input_flags_t flags,audio_port_handle_t * selectedDeviceId,audio_port_handle_t * portId)1066 status_t AudioSystem::getInputForAttr(const audio_attributes_t* attr,
1067 audio_io_handle_t* input,
1068 audio_unique_id_t riid,
1069 audio_session_t session,
1070 const AttributionSourceState &attributionSource,
1071 const audio_config_base_t* config,
1072 audio_input_flags_t flags,
1073 audio_port_handle_t* selectedDeviceId,
1074 audio_port_handle_t* portId) {
1075 if (attr == NULL) {
1076 ALOGE("getInputForAttr NULL attr - shouldn't happen");
1077 return BAD_VALUE;
1078 }
1079 if (input == NULL) {
1080 ALOGE("getInputForAttr NULL input - shouldn't happen");
1081 return BAD_VALUE;
1082 }
1083 if (selectedDeviceId == NULL) {
1084 ALOGE("getInputForAttr NULL selectedDeviceId - shouldn't happen");
1085 return BAD_VALUE;
1086 }
1087 if (portId == NULL) {
1088 ALOGE("getInputForAttr NULL portId - shouldn't happen");
1089 return BAD_VALUE;
1090 }
1091
1092 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1093 if (aps == 0) return NO_INIT;
1094
1095 media::AudioAttributesInternal attrAidl = VALUE_OR_RETURN_STATUS(
1096 legacy2aidl_audio_attributes_t_AudioAttributesInternal(*attr));
1097 int32_t inputAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_io_handle_t_int32_t(*input));
1098 int32_t riidAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_unique_id_t_int32_t(riid));
1099 int32_t sessionAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_session_t_int32_t(session));
1100 media::AudioConfigBase configAidl = VALUE_OR_RETURN_STATUS(
1101 legacy2aidl_audio_config_base_t_AudioConfigBase(*config));
1102 int32_t flagsAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_input_flags_t_int32_t_mask(flags));
1103 int32_t selectedDeviceIdAidl = VALUE_OR_RETURN_STATUS(
1104 legacy2aidl_audio_port_handle_t_int32_t(*selectedDeviceId));
1105
1106 media::GetInputForAttrResponse response;
1107
1108 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1109 aps->getInputForAttr(attrAidl, inputAidl, riidAidl, sessionAidl, attributionSource,
1110 configAidl, flagsAidl, selectedDeviceIdAidl, &response)));
1111
1112 *input = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_io_handle_t(response.input));
1113 *selectedDeviceId = VALUE_OR_RETURN_STATUS(
1114 aidl2legacy_int32_t_audio_port_handle_t(response.selectedDeviceId));
1115 *portId = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_port_handle_t(response.portId));
1116
1117 return OK;
1118 }
1119
startInput(audio_port_handle_t portId)1120 status_t AudioSystem::startInput(audio_port_handle_t portId) {
1121 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1122 if (aps == 0) return PERMISSION_DENIED;
1123
1124 int32_t portIdAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_port_handle_t_int32_t(portId));
1125 return statusTFromBinderStatus(aps->startInput(portIdAidl));
1126 }
1127
stopInput(audio_port_handle_t portId)1128 status_t AudioSystem::stopInput(audio_port_handle_t portId) {
1129 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1130 if (aps == 0) return PERMISSION_DENIED;
1131
1132 int32_t portIdAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_port_handle_t_int32_t(portId));
1133 return statusTFromBinderStatus(aps->stopInput(portIdAidl));
1134 }
1135
releaseInput(audio_port_handle_t portId)1136 void AudioSystem::releaseInput(audio_port_handle_t portId) {
1137 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1138 if (aps == 0) return;
1139
1140 auto status = [&]() -> status_t {
1141 int32_t portIdAidl = VALUE_OR_RETURN_STATUS(
1142 legacy2aidl_audio_port_handle_t_int32_t(portId));
1143 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(aps->releaseInput(portIdAidl)));
1144 return OK;
1145 }();
1146
1147 // Ignore status.
1148 (void) status;
1149 }
1150
initStreamVolume(audio_stream_type_t stream,int indexMin,int indexMax)1151 status_t AudioSystem::initStreamVolume(audio_stream_type_t stream,
1152 int indexMin,
1153 int indexMax) {
1154 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1155 if (aps == 0) return PERMISSION_DENIED;
1156
1157 media::AudioStreamType streamAidl = VALUE_OR_RETURN_STATUS(
1158 legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
1159 int32_t indexMinAidl = VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(indexMin));
1160 int32_t indexMaxAidl = VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(indexMax));
1161 return statusTFromBinderStatus(
1162 aps->initStreamVolume(streamAidl, indexMinAidl, indexMaxAidl));
1163 }
1164
setStreamVolumeIndex(audio_stream_type_t stream,int index,audio_devices_t device)1165 status_t AudioSystem::setStreamVolumeIndex(audio_stream_type_t stream,
1166 int index,
1167 audio_devices_t device) {
1168 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1169 if (aps == 0) return PERMISSION_DENIED;
1170
1171 media::AudioStreamType streamAidl = VALUE_OR_RETURN_STATUS(
1172 legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
1173 int32_t indexAidl = VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(index));
1174 int32_t deviceAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_devices_t_int32_t(device));
1175 return statusTFromBinderStatus(
1176 aps->setStreamVolumeIndex(streamAidl, deviceAidl, indexAidl));
1177 }
1178
getStreamVolumeIndex(audio_stream_type_t stream,int * index,audio_devices_t device)1179 status_t AudioSystem::getStreamVolumeIndex(audio_stream_type_t stream,
1180 int* index,
1181 audio_devices_t device) {
1182 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1183 if (aps == 0) return PERMISSION_DENIED;
1184
1185 media::AudioStreamType streamAidl = VALUE_OR_RETURN_STATUS(
1186 legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
1187 int32_t deviceAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_devices_t_int32_t(device));
1188 int32_t indexAidl;
1189 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1190 aps->getStreamVolumeIndex(streamAidl, deviceAidl, &indexAidl)));
1191 if (index != nullptr) {
1192 *index = VALUE_OR_RETURN_STATUS(convertIntegral<int>(indexAidl));
1193 }
1194 return OK;
1195 }
1196
setVolumeIndexForAttributes(const audio_attributes_t & attr,int index,audio_devices_t device)1197 status_t AudioSystem::setVolumeIndexForAttributes(const audio_attributes_t& attr,
1198 int index,
1199 audio_devices_t device) {
1200 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1201 if (aps == 0) return PERMISSION_DENIED;
1202
1203 media::AudioAttributesInternal attrAidl = VALUE_OR_RETURN_STATUS(
1204 legacy2aidl_audio_attributes_t_AudioAttributesInternal(attr));
1205 int32_t indexAidl = VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(index));
1206 int32_t deviceAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_devices_t_int32_t(device));
1207 return statusTFromBinderStatus(
1208 aps->setVolumeIndexForAttributes(attrAidl, deviceAidl, indexAidl));
1209 }
1210
getVolumeIndexForAttributes(const audio_attributes_t & attr,int & index,audio_devices_t device)1211 status_t AudioSystem::getVolumeIndexForAttributes(const audio_attributes_t& attr,
1212 int& index,
1213 audio_devices_t device) {
1214 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1215 if (aps == 0) return PERMISSION_DENIED;
1216
1217 media::AudioAttributesInternal attrAidl = VALUE_OR_RETURN_STATUS(
1218 legacy2aidl_audio_attributes_t_AudioAttributesInternal(attr));
1219 int32_t deviceAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_devices_t_int32_t(device));
1220 int32_t indexAidl;
1221 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1222 aps->getVolumeIndexForAttributes(attrAidl, deviceAidl, &indexAidl)));
1223 index = VALUE_OR_RETURN_STATUS(convertIntegral<int>(indexAidl));
1224 return OK;
1225 }
1226
getMaxVolumeIndexForAttributes(const audio_attributes_t & attr,int & index)1227 status_t AudioSystem::getMaxVolumeIndexForAttributes(const audio_attributes_t& attr, int& index) {
1228 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1229 if (aps == 0) return PERMISSION_DENIED;
1230
1231 media::AudioAttributesInternal attrAidl = VALUE_OR_RETURN_STATUS(
1232 legacy2aidl_audio_attributes_t_AudioAttributesInternal(attr));
1233 int32_t indexAidl;
1234 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1235 aps->getMaxVolumeIndexForAttributes(attrAidl, &indexAidl)));
1236 index = VALUE_OR_RETURN_STATUS(convertIntegral<int>(indexAidl));
1237 return OK;
1238 }
1239
getMinVolumeIndexForAttributes(const audio_attributes_t & attr,int & index)1240 status_t AudioSystem::getMinVolumeIndexForAttributes(const audio_attributes_t& attr, int& index) {
1241 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1242 if (aps == 0) return PERMISSION_DENIED;
1243
1244 media::AudioAttributesInternal attrAidl = VALUE_OR_RETURN_STATUS(
1245 legacy2aidl_audio_attributes_t_AudioAttributesInternal(attr));
1246 int32_t indexAidl;
1247 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1248 aps->getMinVolumeIndexForAttributes(attrAidl, &indexAidl)));
1249 index = VALUE_OR_RETURN_STATUS(convertIntegral<int>(indexAidl));
1250 return OK;
1251 }
1252
getStrategyForStream(audio_stream_type_t stream)1253 product_strategy_t AudioSystem::getStrategyForStream(audio_stream_type_t stream) {
1254 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1255 if (aps == 0) return PRODUCT_STRATEGY_NONE;
1256
1257 auto result = [&]() -> ConversionResult<product_strategy_t> {
1258 media::AudioStreamType streamAidl = VALUE_OR_RETURN(
1259 legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
1260 int32_t resultAidl;
1261 RETURN_IF_ERROR(statusTFromBinderStatus(
1262 aps->getStrategyForStream(streamAidl, &resultAidl)));
1263 return aidl2legacy_int32_t_product_strategy_t(resultAidl);
1264 }();
1265 return result.value_or(PRODUCT_STRATEGY_NONE);
1266 }
1267
getDevicesForStream(audio_stream_type_t stream)1268 audio_devices_t AudioSystem::getDevicesForStream(audio_stream_type_t stream) {
1269 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1270 if (aps == 0) return AUDIO_DEVICE_NONE;
1271
1272 auto result = [&]() -> ConversionResult<audio_devices_t> {
1273 media::AudioStreamType streamAidl = VALUE_OR_RETURN(
1274 legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
1275 int32_t resultAidl;
1276 RETURN_IF_ERROR(statusTFromBinderStatus(
1277 aps->getDevicesForStream(streamAidl, &resultAidl)));
1278 return aidl2legacy_int32_t_audio_devices_t(resultAidl);
1279 }();
1280 return result.value_or(AUDIO_DEVICE_NONE);
1281 }
1282
getDevicesForAttributes(const AudioAttributes & aa,AudioDeviceTypeAddrVector * devices)1283 status_t AudioSystem::getDevicesForAttributes(const AudioAttributes& aa,
1284 AudioDeviceTypeAddrVector* devices) {
1285 if (devices == nullptr) {
1286 return BAD_VALUE;
1287 }
1288 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1289 if (aps == 0) return PERMISSION_DENIED;
1290
1291 media::AudioAttributesEx aaAidl = VALUE_OR_RETURN_STATUS(
1292 legacy2aidl_AudioAttributes_AudioAttributesEx(aa));
1293 std::vector<media::AudioDevice> retAidl;
1294 RETURN_STATUS_IF_ERROR(
1295 statusTFromBinderStatus(aps->getDevicesForAttributes(aaAidl, &retAidl)));
1296 *devices = VALUE_OR_RETURN_STATUS(
1297 convertContainer<AudioDeviceTypeAddrVector>(
1298 retAidl,
1299 aidl2legacy_AudioDeviceTypeAddress));
1300 return OK;
1301 }
1302
getOutputForEffect(const effect_descriptor_t * desc)1303 audio_io_handle_t AudioSystem::getOutputForEffect(const effect_descriptor_t* desc) {
1304 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1305 // FIXME change return type to status_t, and return PERMISSION_DENIED here
1306 if (aps == 0) return AUDIO_IO_HANDLE_NONE;
1307
1308 auto result = [&]() -> ConversionResult<audio_io_handle_t> {
1309 media::EffectDescriptor descAidl = VALUE_OR_RETURN(
1310 legacy2aidl_effect_descriptor_t_EffectDescriptor(*desc));
1311 int32_t retAidl;
1312 RETURN_IF_ERROR(
1313 statusTFromBinderStatus(aps->getOutputForEffect(descAidl, &retAidl)));
1314 return aidl2legacy_int32_t_audio_io_handle_t(retAidl);
1315 }();
1316
1317 return result.value_or(AUDIO_IO_HANDLE_NONE);
1318 }
1319
registerEffect(const effect_descriptor_t * desc,audio_io_handle_t io,product_strategy_t strategy,audio_session_t session,int id)1320 status_t AudioSystem::registerEffect(const effect_descriptor_t* desc,
1321 audio_io_handle_t io,
1322 product_strategy_t strategy,
1323 audio_session_t session,
1324 int id) {
1325 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1326 if (aps == 0) return PERMISSION_DENIED;
1327
1328 media::EffectDescriptor descAidl = VALUE_OR_RETURN_STATUS(
1329 legacy2aidl_effect_descriptor_t_EffectDescriptor(*desc));
1330 int32_t ioAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_io_handle_t_int32_t(io));
1331 int32_t strategyAidl = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_product_strategy_t(strategy));
1332 int32_t sessionAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_session_t_int32_t(session));
1333 int32_t idAidl = VALUE_OR_RETURN_STATUS(convertReinterpret<int32_t>(id));
1334 return statusTFromBinderStatus(
1335 aps->registerEffect(descAidl, ioAidl, strategyAidl, sessionAidl, idAidl));
1336 }
1337
unregisterEffect(int id)1338 status_t AudioSystem::unregisterEffect(int id) {
1339 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1340 if (aps == 0) return PERMISSION_DENIED;
1341
1342 int32_t idAidl = VALUE_OR_RETURN_STATUS(convertReinterpret<int32_t>(id));
1343 return statusTFromBinderStatus(
1344 aps->unregisterEffect(idAidl));
1345 }
1346
setEffectEnabled(int id,bool enabled)1347 status_t AudioSystem::setEffectEnabled(int id, bool enabled) {
1348 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1349 if (aps == 0) return PERMISSION_DENIED;
1350
1351 int32_t idAidl = VALUE_OR_RETURN_STATUS(convertReinterpret<int32_t>(id));
1352 return statusTFromBinderStatus(
1353 aps->setEffectEnabled(idAidl, enabled));
1354 }
1355
moveEffectsToIo(const std::vector<int> & ids,audio_io_handle_t io)1356 status_t AudioSystem::moveEffectsToIo(const std::vector<int>& ids, audio_io_handle_t io) {
1357 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1358 if (aps == 0) return PERMISSION_DENIED;
1359
1360 std::vector<int32_t> idsAidl = VALUE_OR_RETURN_STATUS(
1361 convertContainer<std::vector<int32_t>>(ids, convertReinterpret<int32_t, int>));
1362 int32_t ioAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_io_handle_t_int32_t(io));
1363 return statusTFromBinderStatus(aps->moveEffectsToIo(idsAidl, ioAidl));
1364 }
1365
isStreamActive(audio_stream_type_t stream,bool * state,uint32_t inPastMs)1366 status_t AudioSystem::isStreamActive(audio_stream_type_t stream, bool* state, uint32_t inPastMs) {
1367 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1368 if (aps == 0) return PERMISSION_DENIED;
1369 if (state == NULL) return BAD_VALUE;
1370
1371 media::AudioStreamType streamAidl = VALUE_OR_RETURN_STATUS(
1372 legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
1373 int32_t inPastMsAidl = VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(inPastMs));
1374 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1375 aps->isStreamActive(streamAidl, inPastMsAidl, state)));
1376 return OK;
1377 }
1378
isStreamActiveRemotely(audio_stream_type_t stream,bool * state,uint32_t inPastMs)1379 status_t AudioSystem::isStreamActiveRemotely(audio_stream_type_t stream, bool* state,
1380 uint32_t inPastMs) {
1381 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1382 if (aps == 0) return PERMISSION_DENIED;
1383 if (state == NULL) return BAD_VALUE;
1384
1385 media::AudioStreamType streamAidl = VALUE_OR_RETURN_STATUS(
1386 legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
1387 int32_t inPastMsAidl = VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(inPastMs));
1388 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1389 aps->isStreamActiveRemotely(streamAidl, inPastMsAidl, state)));
1390 return OK;
1391 }
1392
isSourceActive(audio_source_t stream,bool * state)1393 status_t AudioSystem::isSourceActive(audio_source_t stream, bool* state) {
1394 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1395 if (aps == 0) return PERMISSION_DENIED;
1396 if (state == NULL) return BAD_VALUE;
1397
1398 media::AudioSourceType streamAidl = VALUE_OR_RETURN_STATUS(
1399 legacy2aidl_audio_source_t_AudioSourceType(stream));
1400 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1401 aps->isSourceActive(streamAidl, state)));
1402 return OK;
1403 }
1404
getPrimaryOutputSamplingRate()1405 uint32_t AudioSystem::getPrimaryOutputSamplingRate() {
1406 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
1407 if (af == 0) return 0;
1408 return af->getPrimaryOutputSamplingRate();
1409 }
1410
getPrimaryOutputFrameCount()1411 size_t AudioSystem::getPrimaryOutputFrameCount() {
1412 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
1413 if (af == 0) return 0;
1414 return af->getPrimaryOutputFrameCount();
1415 }
1416
setLowRamDevice(bool isLowRamDevice,int64_t totalMemory)1417 status_t AudioSystem::setLowRamDevice(bool isLowRamDevice, int64_t totalMemory) {
1418 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
1419 if (af == 0) return PERMISSION_DENIED;
1420 return af->setLowRamDevice(isLowRamDevice, totalMemory);
1421 }
1422
clearAudioConfigCache()1423 void AudioSystem::clearAudioConfigCache() {
1424 // called by restoreTrack_l(), which needs new IAudioFlinger and IAudioPolicyService instances
1425 ALOGV("clearAudioConfigCache()");
1426 {
1427 Mutex::Autolock _l(gLock);
1428 if (gAudioFlingerClient != 0) {
1429 gAudioFlingerClient->clearIoCache();
1430 }
1431 gAudioFlinger.clear();
1432 }
1433 {
1434 Mutex::Autolock _l(gLockAPS);
1435 gAudioPolicyService.clear();
1436 }
1437 }
1438
setSupportedSystemUsages(const std::vector<audio_usage_t> & systemUsages)1439 status_t AudioSystem::setSupportedSystemUsages(const std::vector<audio_usage_t>& systemUsages) {
1440 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1441 if (aps == nullptr) return PERMISSION_DENIED;
1442
1443 std::vector<media::AudioUsage> systemUsagesAidl = VALUE_OR_RETURN_STATUS(
1444 convertContainer<std::vector<media::AudioUsage>>(systemUsages,
1445 legacy2aidl_audio_usage_t_AudioUsage));
1446 return statusTFromBinderStatus(aps->setSupportedSystemUsages(systemUsagesAidl));
1447 }
1448
setAllowedCapturePolicy(uid_t uid,audio_flags_mask_t capturePolicy)1449 status_t AudioSystem::setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t capturePolicy) {
1450 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1451 if (aps == nullptr) return PERMISSION_DENIED;
1452
1453 int32_t uidAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_uid_t_int32_t(uid));
1454 int32_t capturePolicyAidl = VALUE_OR_RETURN_STATUS(
1455 legacy2aidl_audio_flags_mask_t_int32_t_mask(capturePolicy));
1456 return statusTFromBinderStatus(aps->setAllowedCapturePolicy(uidAidl, capturePolicyAidl));
1457 }
1458
getOffloadSupport(const audio_offload_info_t & info)1459 audio_offload_mode_t AudioSystem::getOffloadSupport(const audio_offload_info_t& info) {
1460 ALOGV("%s", __func__);
1461 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1462 if (aps == 0) return AUDIO_OFFLOAD_NOT_SUPPORTED;
1463
1464 auto result = [&]() -> ConversionResult<audio_offload_mode_t> {
1465 media::AudioOffloadInfo infoAidl = VALUE_OR_RETURN(
1466 legacy2aidl_audio_offload_info_t_AudioOffloadInfo(info));
1467 media::AudioOffloadMode retAidl;
1468 RETURN_IF_ERROR(
1469 statusTFromBinderStatus(aps->getOffloadSupport(infoAidl, &retAidl)));
1470 return aidl2legacy_AudioOffloadMode_audio_offload_mode_t(retAidl);
1471 }();
1472
1473 return result.value_or(static_cast<audio_offload_mode_t>(0));
1474 }
1475
listAudioPorts(audio_port_role_t role,audio_port_type_t type,unsigned int * num_ports,struct audio_port_v7 * ports,unsigned int * generation)1476 status_t AudioSystem::listAudioPorts(audio_port_role_t role,
1477 audio_port_type_t type,
1478 unsigned int* num_ports,
1479 struct audio_port_v7* ports,
1480 unsigned int* generation) {
1481 if (num_ports == nullptr || (*num_ports != 0 && ports == nullptr) ||
1482 generation == nullptr) {
1483 return BAD_VALUE;
1484 }
1485
1486 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1487 if (aps == 0) return PERMISSION_DENIED;
1488
1489 media::AudioPortRole roleAidl = VALUE_OR_RETURN_STATUS(
1490 legacy2aidl_audio_port_role_t_AudioPortRole(role));
1491 media::AudioPortType typeAidl = VALUE_OR_RETURN_STATUS(
1492 legacy2aidl_audio_port_type_t_AudioPortType(type));
1493 media::Int numPortsAidl;
1494 numPortsAidl.value = VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(*num_ports));
1495 std::vector<media::AudioPort> portsAidl;
1496 int32_t generationAidl;
1497
1498 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1499 aps->listAudioPorts(roleAidl, typeAidl, &numPortsAidl, &portsAidl, &generationAidl)));
1500 *num_ports = VALUE_OR_RETURN_STATUS(convertIntegral<unsigned int>(numPortsAidl.value));
1501 *generation = VALUE_OR_RETURN_STATUS(convertIntegral<unsigned int>(generationAidl));
1502 RETURN_STATUS_IF_ERROR(convertRange(portsAidl.begin(), portsAidl.end(), ports,
1503 aidl2legacy_AudioPort_audio_port_v7));
1504 return OK;
1505 }
1506
getAudioPort(struct audio_port_v7 * port)1507 status_t AudioSystem::getAudioPort(struct audio_port_v7* port) {
1508 if (port == nullptr) {
1509 return BAD_VALUE;
1510 }
1511
1512 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1513 if (aps == 0) return PERMISSION_DENIED;
1514
1515 media::AudioPort portAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_port_v7_AudioPort(*port));
1516 RETURN_STATUS_IF_ERROR(
1517 statusTFromBinderStatus(aps->getAudioPort(portAidl, &portAidl)));
1518 *port = VALUE_OR_RETURN_STATUS(aidl2legacy_AudioPort_audio_port_v7(portAidl));
1519 return OK;
1520 }
1521
createAudioPatch(const struct audio_patch * patch,audio_patch_handle_t * handle)1522 status_t AudioSystem::createAudioPatch(const struct audio_patch* patch,
1523 audio_patch_handle_t* handle) {
1524 if (patch == nullptr || handle == nullptr) {
1525 return BAD_VALUE;
1526 }
1527
1528 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1529 if (aps == 0) return PERMISSION_DENIED;
1530
1531 media::AudioPatch patchAidl = VALUE_OR_RETURN_STATUS(
1532 legacy2aidl_audio_patch_AudioPatch(*patch));
1533 int32_t handleAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_patch_handle_t_int32_t(*handle));
1534 RETURN_STATUS_IF_ERROR(
1535 statusTFromBinderStatus(aps->createAudioPatch(patchAidl, handleAidl, &handleAidl)));
1536 *handle = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_patch_handle_t(handleAidl));
1537 return OK;
1538 }
1539
releaseAudioPatch(audio_patch_handle_t handle)1540 status_t AudioSystem::releaseAudioPatch(audio_patch_handle_t handle) {
1541 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1542 if (aps == 0) return PERMISSION_DENIED;
1543
1544 int32_t handleAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_patch_handle_t_int32_t(handle));
1545 return statusTFromBinderStatus(aps->releaseAudioPatch(handleAidl));
1546 }
1547
listAudioPatches(unsigned int * num_patches,struct audio_patch * patches,unsigned int * generation)1548 status_t AudioSystem::listAudioPatches(unsigned int* num_patches,
1549 struct audio_patch* patches,
1550 unsigned int* generation) {
1551 if (num_patches == nullptr || (*num_patches != 0 && patches == nullptr) ||
1552 generation == nullptr) {
1553 return BAD_VALUE;
1554 }
1555
1556 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1557 if (aps == 0) return PERMISSION_DENIED;
1558
1559
1560 media::Int numPatchesAidl;
1561 numPatchesAidl.value = VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(*num_patches));
1562 std::vector<media::AudioPatch> patchesAidl;
1563 int32_t generationAidl;
1564
1565 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1566 aps->listAudioPatches(&numPatchesAidl, &patchesAidl, &generationAidl)));
1567 *num_patches = VALUE_OR_RETURN_STATUS(convertIntegral<unsigned int>(numPatchesAidl.value));
1568 *generation = VALUE_OR_RETURN_STATUS(convertIntegral<unsigned int>(generationAidl));
1569 RETURN_STATUS_IF_ERROR(convertRange(patchesAidl.begin(), patchesAidl.end(), patches,
1570 aidl2legacy_AudioPatch_audio_patch));
1571 return OK;
1572 }
1573
setAudioPortConfig(const struct audio_port_config * config)1574 status_t AudioSystem::setAudioPortConfig(const struct audio_port_config* config) {
1575 if (config == nullptr) {
1576 return BAD_VALUE;
1577 }
1578
1579 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1580 if (aps == 0) return PERMISSION_DENIED;
1581
1582 media::AudioPortConfig configAidl = VALUE_OR_RETURN_STATUS(
1583 legacy2aidl_audio_port_config_AudioPortConfig(*config));
1584 return statusTFromBinderStatus(aps->setAudioPortConfig(configAidl));
1585 }
1586
addAudioPortCallback(const sp<AudioPortCallback> & callback)1587 status_t AudioSystem::addAudioPortCallback(const sp<AudioPortCallback>& callback) {
1588 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1589 if (aps == 0) return PERMISSION_DENIED;
1590
1591 Mutex::Autolock _l(gLockAPS);
1592 if (gAudioPolicyServiceClient == 0) {
1593 return NO_INIT;
1594 }
1595 int ret = gAudioPolicyServiceClient->addAudioPortCallback(callback);
1596 if (ret == 1) {
1597 aps->setAudioPortCallbacksEnabled(true);
1598 }
1599 return (ret < 0) ? INVALID_OPERATION : NO_ERROR;
1600 }
1601
1602 /*static*/
removeAudioPortCallback(const sp<AudioPortCallback> & callback)1603 status_t AudioSystem::removeAudioPortCallback(const sp<AudioPortCallback>& callback) {
1604 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1605 if (aps == 0) return PERMISSION_DENIED;
1606
1607 Mutex::Autolock _l(gLockAPS);
1608 if (gAudioPolicyServiceClient == 0) {
1609 return NO_INIT;
1610 }
1611 int ret = gAudioPolicyServiceClient->removeAudioPortCallback(callback);
1612 if (ret == 0) {
1613 aps->setAudioPortCallbacksEnabled(false);
1614 }
1615 return (ret < 0) ? INVALID_OPERATION : NO_ERROR;
1616 }
1617
addAudioVolumeGroupCallback(const sp<AudioVolumeGroupCallback> & callback)1618 status_t AudioSystem::addAudioVolumeGroupCallback(const sp<AudioVolumeGroupCallback>& callback) {
1619 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1620 if (aps == 0) return PERMISSION_DENIED;
1621
1622 Mutex::Autolock _l(gLockAPS);
1623 if (gAudioPolicyServiceClient == 0) {
1624 return NO_INIT;
1625 }
1626 int ret = gAudioPolicyServiceClient->addAudioVolumeGroupCallback(callback);
1627 if (ret == 1) {
1628 aps->setAudioVolumeGroupCallbacksEnabled(true);
1629 }
1630 return (ret < 0) ? INVALID_OPERATION : NO_ERROR;
1631 }
1632
removeAudioVolumeGroupCallback(const sp<AudioVolumeGroupCallback> & callback)1633 status_t AudioSystem::removeAudioVolumeGroupCallback(const sp<AudioVolumeGroupCallback>& callback) {
1634 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1635 if (aps == 0) return PERMISSION_DENIED;
1636
1637 Mutex::Autolock _l(gLockAPS);
1638 if (gAudioPolicyServiceClient == 0) {
1639 return NO_INIT;
1640 }
1641 int ret = gAudioPolicyServiceClient->removeAudioVolumeGroupCallback(callback);
1642 if (ret == 0) {
1643 aps->setAudioVolumeGroupCallbacksEnabled(false);
1644 }
1645 return (ret < 0) ? INVALID_OPERATION : NO_ERROR;
1646 }
1647
addAudioDeviceCallback(const wp<AudioDeviceCallback> & callback,audio_io_handle_t audioIo,audio_port_handle_t portId)1648 status_t AudioSystem::addAudioDeviceCallback(
1649 const wp<AudioDeviceCallback>& callback, audio_io_handle_t audioIo,
1650 audio_port_handle_t portId) {
1651 const sp<AudioFlingerClient> afc = getAudioFlingerClient();
1652 if (afc == 0) {
1653 return NO_INIT;
1654 }
1655 status_t status = afc->addAudioDeviceCallback(callback, audioIo, portId);
1656 if (status == NO_ERROR) {
1657 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
1658 if (af != 0) {
1659 af->registerClient(afc);
1660 }
1661 }
1662 return status;
1663 }
1664
removeAudioDeviceCallback(const wp<AudioDeviceCallback> & callback,audio_io_handle_t audioIo,audio_port_handle_t portId)1665 status_t AudioSystem::removeAudioDeviceCallback(
1666 const wp<AudioDeviceCallback>& callback, audio_io_handle_t audioIo,
1667 audio_port_handle_t portId) {
1668 const sp<AudioFlingerClient> afc = getAudioFlingerClient();
1669 if (afc == 0) {
1670 return NO_INIT;
1671 }
1672 return afc->removeAudioDeviceCallback(callback, audioIo, portId);
1673 }
1674
getDeviceIdForIo(audio_io_handle_t audioIo)1675 audio_port_handle_t AudioSystem::getDeviceIdForIo(audio_io_handle_t audioIo) {
1676 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
1677 if (af == 0) return PERMISSION_DENIED;
1678 const sp<AudioIoDescriptor> desc = getIoDescriptor(audioIo);
1679 if (desc == 0) {
1680 return AUDIO_PORT_HANDLE_NONE;
1681 }
1682 return desc->getDeviceId();
1683 }
1684
acquireSoundTriggerSession(audio_session_t * session,audio_io_handle_t * ioHandle,audio_devices_t * device)1685 status_t AudioSystem::acquireSoundTriggerSession(audio_session_t* session,
1686 audio_io_handle_t* ioHandle,
1687 audio_devices_t* device) {
1688 if (session == nullptr || ioHandle == nullptr || device == nullptr) {
1689 return BAD_VALUE;
1690 }
1691 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1692 if (aps == 0) return PERMISSION_DENIED;
1693
1694 media::SoundTriggerSession retAidl;
1695 RETURN_STATUS_IF_ERROR(
1696 statusTFromBinderStatus(aps->acquireSoundTriggerSession(&retAidl)));
1697 *session = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_session_t(retAidl.session));
1698 *ioHandle = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_io_handle_t(retAidl.ioHandle));
1699 *device = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_devices_t(retAidl.device));
1700 return OK;
1701 }
1702
releaseSoundTriggerSession(audio_session_t session)1703 status_t AudioSystem::releaseSoundTriggerSession(audio_session_t session) {
1704 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1705 if (aps == 0) return PERMISSION_DENIED;
1706
1707 int32_t sessionAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_session_t_int32_t(session));
1708 return statusTFromBinderStatus(aps->releaseSoundTriggerSession(sessionAidl));
1709 }
1710
getPhoneState()1711 audio_mode_t AudioSystem::getPhoneState() {
1712 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1713 if (aps == 0) return AUDIO_MODE_INVALID;
1714
1715 auto result = [&]() -> ConversionResult<audio_mode_t> {
1716 media::AudioMode retAidl;
1717 RETURN_IF_ERROR(statusTFromBinderStatus(aps->getPhoneState(&retAidl)));
1718 return aidl2legacy_AudioMode_audio_mode_t(retAidl);
1719 }();
1720
1721 return result.value_or(AUDIO_MODE_INVALID);
1722 }
1723
registerPolicyMixes(const Vector<AudioMix> & mixes,bool registration)1724 status_t AudioSystem::registerPolicyMixes(const Vector<AudioMix>& mixes, bool registration) {
1725 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1726 if (aps == 0) return PERMISSION_DENIED;
1727
1728 size_t mixesSize = std::min(mixes.size(), size_t{MAX_MIXES_PER_POLICY});
1729 std::vector<media::AudioMix> mixesAidl;
1730 RETURN_STATUS_IF_ERROR(
1731 convertRange(mixes.begin(), mixes.begin() + mixesSize, std::back_inserter(mixesAidl),
1732 legacy2aidl_AudioMix));
1733 return statusTFromBinderStatus(aps->registerPolicyMixes(mixesAidl, registration));
1734 }
1735
setUidDeviceAffinities(uid_t uid,const AudioDeviceTypeAddrVector & devices)1736 status_t AudioSystem::setUidDeviceAffinities(uid_t uid, const AudioDeviceTypeAddrVector& devices) {
1737 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1738 if (aps == 0) return PERMISSION_DENIED;
1739
1740 int32_t uidAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_uid_t_int32_t(uid));
1741 std::vector<media::AudioDevice> devicesAidl = VALUE_OR_RETURN_STATUS(
1742 convertContainer<std::vector<media::AudioDevice>>(devices,
1743 legacy2aidl_AudioDeviceTypeAddress));
1744 return statusTFromBinderStatus(aps->setUidDeviceAffinities(uidAidl, devicesAidl));
1745 }
1746
removeUidDeviceAffinities(uid_t uid)1747 status_t AudioSystem::removeUidDeviceAffinities(uid_t uid) {
1748 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1749 if (aps == 0) return PERMISSION_DENIED;
1750
1751 int32_t uidAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_uid_t_int32_t(uid));
1752 return statusTFromBinderStatus(aps->removeUidDeviceAffinities(uidAidl));
1753 }
1754
setUserIdDeviceAffinities(int userId,const AudioDeviceTypeAddrVector & devices)1755 status_t AudioSystem::setUserIdDeviceAffinities(int userId,
1756 const AudioDeviceTypeAddrVector& devices) {
1757 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1758 if (aps == 0) return PERMISSION_DENIED;
1759
1760 int32_t userIdAidl = VALUE_OR_RETURN_STATUS(convertReinterpret<int32_t>(userId));
1761 std::vector<media::AudioDevice> devicesAidl = VALUE_OR_RETURN_STATUS(
1762 convertContainer<std::vector<media::AudioDevice>>(devices,
1763 legacy2aidl_AudioDeviceTypeAddress));
1764 return statusTFromBinderStatus(
1765 aps->setUserIdDeviceAffinities(userIdAidl, devicesAidl));
1766 }
1767
removeUserIdDeviceAffinities(int userId)1768 status_t AudioSystem::removeUserIdDeviceAffinities(int userId) {
1769 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1770 if (aps == 0) return PERMISSION_DENIED;
1771 int32_t userIdAidl = VALUE_OR_RETURN_STATUS(convertReinterpret<int32_t>(userId));
1772 return statusTFromBinderStatus(aps->removeUserIdDeviceAffinities(userIdAidl));
1773 }
1774
startAudioSource(const struct audio_port_config * source,const audio_attributes_t * attributes,audio_port_handle_t * portId)1775 status_t AudioSystem::startAudioSource(const struct audio_port_config* source,
1776 const audio_attributes_t* attributes,
1777 audio_port_handle_t* portId) {
1778 if (source == nullptr || attributes == nullptr || portId == nullptr) {
1779 return BAD_VALUE;
1780 }
1781 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1782 if (aps == 0) return PERMISSION_DENIED;
1783
1784 media::AudioPortConfig sourceAidl = VALUE_OR_RETURN_STATUS(
1785 legacy2aidl_audio_port_config_AudioPortConfig(*source));
1786 media::AudioAttributesInternal attributesAidl = VALUE_OR_RETURN_STATUS(
1787 legacy2aidl_audio_attributes_t_AudioAttributesInternal(*attributes));
1788 int32_t portIdAidl;
1789 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1790 aps->startAudioSource(sourceAidl, attributesAidl, &portIdAidl)));
1791 *portId = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
1792 return OK;
1793 }
1794
stopAudioSource(audio_port_handle_t portId)1795 status_t AudioSystem::stopAudioSource(audio_port_handle_t portId) {
1796 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1797 if (aps == 0) return PERMISSION_DENIED;
1798
1799 int32_t portIdAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_port_handle_t_int32_t(portId));
1800 return statusTFromBinderStatus(aps->stopAudioSource(portIdAidl));
1801 }
1802
setMasterMono(bool mono)1803 status_t AudioSystem::setMasterMono(bool mono) {
1804 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1805 if (aps == 0) return PERMISSION_DENIED;
1806 return statusTFromBinderStatus(aps->setMasterMono(mono));
1807 }
1808
getMasterMono(bool * mono)1809 status_t AudioSystem::getMasterMono(bool* mono) {
1810 if (mono == nullptr) {
1811 return BAD_VALUE;
1812 }
1813 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1814 if (aps == 0) return PERMISSION_DENIED;
1815 return statusTFromBinderStatus(aps->getMasterMono(mono));
1816 }
1817
setMasterBalance(float balance)1818 status_t AudioSystem::setMasterBalance(float balance) {
1819 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
1820 if (af == 0) return PERMISSION_DENIED;
1821 return af->setMasterBalance(balance);
1822 }
1823
getMasterBalance(float * balance)1824 status_t AudioSystem::getMasterBalance(float* balance) {
1825 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
1826 if (af == 0) return PERMISSION_DENIED;
1827 return af->getMasterBalance(balance);
1828 }
1829
1830 float
getStreamVolumeDB(audio_stream_type_t stream,int index,audio_devices_t device)1831 AudioSystem::getStreamVolumeDB(audio_stream_type_t stream, int index, audio_devices_t device) {
1832 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1833 if (aps == 0) return NAN;
1834
1835 auto result = [&]() -> ConversionResult<float> {
1836 media::AudioStreamType streamAidl = VALUE_OR_RETURN(
1837 legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
1838 int32_t indexAidl = VALUE_OR_RETURN(convertIntegral<int32_t>(index));
1839 int32_t deviceAidl = VALUE_OR_RETURN(legacy2aidl_audio_devices_t_int32_t(device));
1840 float retAidl;
1841 RETURN_IF_ERROR(statusTFromBinderStatus(
1842 aps->getStreamVolumeDB(streamAidl, indexAidl, deviceAidl, &retAidl)));
1843 return retAidl;
1844 }();
1845 return result.value_or(NAN);
1846 }
1847
getMicrophones(std::vector<media::MicrophoneInfo> * microphones)1848 status_t AudioSystem::getMicrophones(std::vector<media::MicrophoneInfo>* microphones) {
1849 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
1850 if (af == 0) return PERMISSION_DENIED;
1851 return af->getMicrophones(microphones);
1852 }
1853
setAudioHalPids(const std::vector<pid_t> & pids)1854 status_t AudioSystem::setAudioHalPids(const std::vector<pid_t>& pids) {
1855 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
1856 if (af == nullptr) return PERMISSION_DENIED;
1857 return af->setAudioHalPids(pids);
1858 }
1859
getSurroundFormats(unsigned int * numSurroundFormats,audio_format_t * surroundFormats,bool * surroundFormatsEnabled)1860 status_t AudioSystem::getSurroundFormats(unsigned int* numSurroundFormats,
1861 audio_format_t* surroundFormats,
1862 bool* surroundFormatsEnabled) {
1863 if (numSurroundFormats == nullptr || (*numSurroundFormats != 0 &&
1864 (surroundFormats == nullptr ||
1865 surroundFormatsEnabled == nullptr))) {
1866 return BAD_VALUE;
1867 }
1868
1869 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1870 if (aps == 0) return PERMISSION_DENIED;
1871 media::Int numSurroundFormatsAidl;
1872 numSurroundFormatsAidl.value =
1873 VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(*numSurroundFormats));
1874 std::vector<media::audio::common::AudioFormat> surroundFormatsAidl;
1875 std::vector<bool> surroundFormatsEnabledAidl;
1876 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1877 aps->getSurroundFormats(&numSurroundFormatsAidl, &surroundFormatsAidl,
1878 &surroundFormatsEnabledAidl)));
1879
1880 *numSurroundFormats = VALUE_OR_RETURN_STATUS(
1881 convertIntegral<unsigned int>(numSurroundFormatsAidl.value));
1882 RETURN_STATUS_IF_ERROR(
1883 convertRange(surroundFormatsAidl.begin(), surroundFormatsAidl.end(), surroundFormats,
1884 aidl2legacy_AudioFormat_audio_format_t));
1885 std::copy(surroundFormatsEnabledAidl.begin(), surroundFormatsEnabledAidl.end(),
1886 surroundFormatsEnabled);
1887 return OK;
1888 }
1889
getReportedSurroundFormats(unsigned int * numSurroundFormats,audio_format_t * surroundFormats)1890 status_t AudioSystem::getReportedSurroundFormats(unsigned int* numSurroundFormats,
1891 audio_format_t* surroundFormats) {
1892 if (numSurroundFormats == nullptr || (*numSurroundFormats != 0 && surroundFormats == nullptr)) {
1893 return BAD_VALUE;
1894 }
1895
1896 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1897 if (aps == 0) return PERMISSION_DENIED;
1898 media::Int numSurroundFormatsAidl;
1899 numSurroundFormatsAidl.value =
1900 VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(*numSurroundFormats));
1901 std::vector<media::audio::common::AudioFormat> surroundFormatsAidl;
1902 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1903 aps->getReportedSurroundFormats(&numSurroundFormatsAidl, &surroundFormatsAidl)));
1904
1905 *numSurroundFormats = VALUE_OR_RETURN_STATUS(
1906 convertIntegral<unsigned int>(numSurroundFormatsAidl.value));
1907 RETURN_STATUS_IF_ERROR(
1908 convertRange(surroundFormatsAidl.begin(), surroundFormatsAidl.end(), surroundFormats,
1909 aidl2legacy_AudioFormat_audio_format_t));
1910 return OK;
1911 }
1912
setSurroundFormatEnabled(audio_format_t audioFormat,bool enabled)1913 status_t AudioSystem::setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled) {
1914 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1915 if (aps == 0) return PERMISSION_DENIED;
1916
1917 media::audio::common::AudioFormat audioFormatAidl = VALUE_OR_RETURN_STATUS(
1918 legacy2aidl_audio_format_t_AudioFormat(audioFormat));
1919 return statusTFromBinderStatus(
1920 aps->setSurroundFormatEnabled(audioFormatAidl, enabled));
1921 }
1922
setAssistantUid(uid_t uid)1923 status_t AudioSystem::setAssistantUid(uid_t uid) {
1924 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1925 if (aps == 0) return PERMISSION_DENIED;
1926
1927 int32_t uidAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_uid_t_int32_t(uid));
1928 return statusTFromBinderStatus(aps->setAssistantUid(uidAidl));
1929 }
1930
setHotwordDetectionServiceUid(uid_t uid)1931 status_t AudioSystem::setHotwordDetectionServiceUid(uid_t uid) {
1932 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1933 if (aps == 0) return PERMISSION_DENIED;
1934
1935 int32_t uidAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_uid_t_int32_t(uid));
1936 return statusTFromBinderStatus(aps->setHotwordDetectionServiceUid(uidAidl));
1937 }
1938
setA11yServicesUids(const std::vector<uid_t> & uids)1939 status_t AudioSystem::setA11yServicesUids(const std::vector<uid_t>& uids) {
1940 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1941 if (aps == 0) return PERMISSION_DENIED;
1942
1943 std::vector<int32_t> uidsAidl = VALUE_OR_RETURN_STATUS(
1944 convertContainer<std::vector<int32_t>>(uids, legacy2aidl_uid_t_int32_t));
1945 return statusTFromBinderStatus(aps->setA11yServicesUids(uidsAidl));
1946 }
1947
setCurrentImeUid(uid_t uid)1948 status_t AudioSystem::setCurrentImeUid(uid_t uid) {
1949 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1950 if (aps == 0) return PERMISSION_DENIED;
1951
1952 int32_t uidAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_uid_t_int32_t(uid));
1953 return statusTFromBinderStatus(aps->setCurrentImeUid(uidAidl));
1954 }
1955
isHapticPlaybackSupported()1956 bool AudioSystem::isHapticPlaybackSupported() {
1957 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1958 if (aps == 0) return false;
1959
1960 auto result = [&]() -> ConversionResult<bool> {
1961 bool retVal;
1962 RETURN_IF_ERROR(
1963 statusTFromBinderStatus(aps->isHapticPlaybackSupported(&retVal)));
1964 return retVal;
1965 }();
1966 return result.value_or(false);
1967 }
1968
getHwOffloadEncodingFormatsSupportedForA2DP(std::vector<audio_format_t> * formats)1969 status_t AudioSystem::getHwOffloadEncodingFormatsSupportedForA2DP(
1970 std::vector<audio_format_t>* formats) {
1971 if (formats == nullptr) {
1972 return BAD_VALUE;
1973 }
1974
1975 const sp<IAudioPolicyService>
1976 & aps = AudioSystem::get_audio_policy_service();
1977 if (aps == 0) return PERMISSION_DENIED;
1978
1979 std::vector<media::audio::common::AudioFormat> formatsAidl;
1980 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1981 aps->getHwOffloadEncodingFormatsSupportedForA2DP(&formatsAidl)));
1982 *formats = VALUE_OR_RETURN_STATUS(
1983 convertContainer<std::vector<audio_format_t>>(formatsAidl,
1984 aidl2legacy_AudioFormat_audio_format_t));
1985 return OK;
1986 }
1987
listAudioProductStrategies(AudioProductStrategyVector & strategies)1988 status_t AudioSystem::listAudioProductStrategies(AudioProductStrategyVector& strategies) {
1989 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
1990 if (aps == 0) return PERMISSION_DENIED;
1991
1992 std::vector<media::AudioProductStrategy> strategiesAidl;
1993 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1994 aps->listAudioProductStrategies(&strategiesAidl)));
1995 strategies = VALUE_OR_RETURN_STATUS(
1996 convertContainer<AudioProductStrategyVector>(strategiesAidl,
1997 aidl2legacy_AudioProductStrategy));
1998 return OK;
1999 }
2000
streamTypeToAttributes(audio_stream_type_t stream)2001 audio_attributes_t AudioSystem::streamTypeToAttributes(audio_stream_type_t stream) {
2002 AudioProductStrategyVector strategies;
2003 listAudioProductStrategies(strategies);
2004 for (const auto& strategy : strategies) {
2005 auto attrVect = strategy.getAudioAttributes();
2006 auto iter = std::find_if(begin(attrVect), end(attrVect), [&stream](const auto& attributes) {
2007 return attributes.getStreamType() == stream;
2008 });
2009 if (iter != end(attrVect)) {
2010 return iter->getAttributes();
2011 }
2012 }
2013 ALOGE("invalid stream type %s when converting to attributes", toString(stream).c_str());
2014 return AUDIO_ATTRIBUTES_INITIALIZER;
2015 }
2016
attributesToStreamType(const audio_attributes_t & attr)2017 audio_stream_type_t AudioSystem::attributesToStreamType(const audio_attributes_t& attr) {
2018 product_strategy_t psId;
2019 status_t ret = AudioSystem::getProductStrategyFromAudioAttributes(AudioAttributes(attr), psId);
2020 if (ret != NO_ERROR) {
2021 ALOGE("no strategy found for attributes %s", toString(attr).c_str());
2022 return AUDIO_STREAM_MUSIC;
2023 }
2024 AudioProductStrategyVector strategies;
2025 listAudioProductStrategies(strategies);
2026 for (const auto& strategy : strategies) {
2027 if (strategy.getId() == psId) {
2028 auto attrVect = strategy.getAudioAttributes();
2029 auto iter = std::find_if(begin(attrVect), end(attrVect), [&attr](const auto& refAttr) {
2030 return AudioProductStrategy::attributesMatches(
2031 refAttr.getAttributes(), attr);
2032 });
2033 if (iter != end(attrVect)) {
2034 return iter->getStreamType();
2035 }
2036 }
2037 }
2038 switch (attr.usage) {
2039 case AUDIO_USAGE_VIRTUAL_SOURCE:
2040 // virtual source is not expected to have an associated product strategy
2041 break;
2042 default:
2043 ALOGE("invalid attributes %s when converting to stream", toString(attr).c_str());
2044 break;
2045 }
2046 return AUDIO_STREAM_MUSIC;
2047 }
2048
getProductStrategyFromAudioAttributes(const AudioAttributes & aa,product_strategy_t & productStrategy,bool fallbackOnDefault)2049 status_t AudioSystem::getProductStrategyFromAudioAttributes(const AudioAttributes& aa,
2050 product_strategy_t& productStrategy,
2051 bool fallbackOnDefault) {
2052 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
2053 if (aps == 0) return PERMISSION_DENIED;
2054
2055 media::AudioAttributesEx aaAidl = VALUE_OR_RETURN_STATUS(
2056 legacy2aidl_AudioAttributes_AudioAttributesEx(aa));
2057 int32_t productStrategyAidl;
2058
2059 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
2060 aps->getProductStrategyFromAudioAttributes(aaAidl, fallbackOnDefault,
2061 &productStrategyAidl)));
2062 productStrategy = VALUE_OR_RETURN_STATUS(
2063 aidl2legacy_int32_t_product_strategy_t(productStrategyAidl));
2064 return OK;
2065 }
2066
listAudioVolumeGroups(AudioVolumeGroupVector & groups)2067 status_t AudioSystem::listAudioVolumeGroups(AudioVolumeGroupVector& groups) {
2068 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
2069 if (aps == 0) return PERMISSION_DENIED;
2070
2071 std::vector<media::AudioVolumeGroup> groupsAidl;
2072 RETURN_STATUS_IF_ERROR(
2073 statusTFromBinderStatus(aps->listAudioVolumeGroups(&groupsAidl)));
2074 groups = VALUE_OR_RETURN_STATUS(
2075 convertContainer<AudioVolumeGroupVector>(groupsAidl, aidl2legacy_AudioVolumeGroup));
2076 return OK;
2077 }
2078
getVolumeGroupFromAudioAttributes(const AudioAttributes & aa,volume_group_t & volumeGroup,bool fallbackOnDefault)2079 status_t AudioSystem::getVolumeGroupFromAudioAttributes(const AudioAttributes& aa,
2080 volume_group_t& volumeGroup,
2081 bool fallbackOnDefault) {
2082 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
2083 if (aps == 0) return PERMISSION_DENIED;
2084
2085 media::AudioAttributesEx aaAidl = VALUE_OR_RETURN_STATUS(
2086 legacy2aidl_AudioAttributes_AudioAttributesEx(aa));
2087 int32_t volumeGroupAidl;
2088 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
2089 aps->getVolumeGroupFromAudioAttributes(aaAidl, fallbackOnDefault, &volumeGroupAidl)));
2090 volumeGroup = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_volume_group_t(volumeGroupAidl));
2091 return OK;
2092 }
2093
setRttEnabled(bool enabled)2094 status_t AudioSystem::setRttEnabled(bool enabled) {
2095 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
2096 if (aps == 0) return PERMISSION_DENIED;
2097 return statusTFromBinderStatus(aps->setRttEnabled(enabled));
2098 }
2099
isCallScreenModeSupported()2100 bool AudioSystem::isCallScreenModeSupported() {
2101 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
2102 if (aps == 0) return false;
2103
2104 auto result = [&]() -> ConversionResult<bool> {
2105 bool retAidl;
2106 RETURN_IF_ERROR(
2107 statusTFromBinderStatus(aps->isCallScreenModeSupported(&retAidl)));
2108 return retAidl;
2109 }();
2110 return result.value_or(false);
2111 }
2112
setDevicesRoleForStrategy(product_strategy_t strategy,device_role_t role,const AudioDeviceTypeAddrVector & devices)2113 status_t AudioSystem::setDevicesRoleForStrategy(product_strategy_t strategy,
2114 device_role_t role,
2115 const AudioDeviceTypeAddrVector& devices) {
2116 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
2117 if (aps == 0) {
2118 return PERMISSION_DENIED;
2119 }
2120
2121 int32_t strategyAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_product_strategy_t_int32_t(strategy));
2122 media::DeviceRole roleAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_device_role_t_DeviceRole(role));
2123 std::vector<media::AudioDevice> devicesAidl = VALUE_OR_RETURN_STATUS(
2124 convertContainer<std::vector<media::AudioDevice>>(devices,
2125 legacy2aidl_AudioDeviceTypeAddress));
2126 return statusTFromBinderStatus(
2127 aps->setDevicesRoleForStrategy(strategyAidl, roleAidl, devicesAidl));
2128 }
2129
2130 status_t
removeDevicesRoleForStrategy(product_strategy_t strategy,device_role_t role)2131 AudioSystem::removeDevicesRoleForStrategy(product_strategy_t strategy, device_role_t role) {
2132 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
2133 if (aps == 0) {
2134 return PERMISSION_DENIED;
2135 }
2136 int32_t strategyAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_product_strategy_t_int32_t(strategy));
2137 media::DeviceRole roleAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_device_role_t_DeviceRole(role));
2138 return statusTFromBinderStatus(
2139 aps->removeDevicesRoleForStrategy(strategyAidl, roleAidl));
2140 }
2141
getDevicesForRoleAndStrategy(product_strategy_t strategy,device_role_t role,AudioDeviceTypeAddrVector & devices)2142 status_t AudioSystem::getDevicesForRoleAndStrategy(product_strategy_t strategy,
2143 device_role_t role,
2144 AudioDeviceTypeAddrVector& devices) {
2145 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
2146 if (aps == 0) {
2147 return PERMISSION_DENIED;
2148 }
2149 int32_t strategyAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_product_strategy_t_int32_t(strategy));
2150 media::DeviceRole roleAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_device_role_t_DeviceRole(role));
2151 std::vector<media::AudioDevice> devicesAidl;
2152 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
2153 aps->getDevicesForRoleAndStrategy(strategyAidl, roleAidl, &devicesAidl)));
2154 devices = VALUE_OR_RETURN_STATUS(
2155 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2156 aidl2legacy_AudioDeviceTypeAddress));
2157 return OK;
2158 }
2159
setDevicesRoleForCapturePreset(audio_source_t audioSource,device_role_t role,const AudioDeviceTypeAddrVector & devices)2160 status_t AudioSystem::setDevicesRoleForCapturePreset(audio_source_t audioSource,
2161 device_role_t role,
2162 const AudioDeviceTypeAddrVector& devices) {
2163 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
2164 if (aps == 0) {
2165 return PERMISSION_DENIED;
2166 }
2167
2168 media::AudioSourceType audioSourceAidl = VALUE_OR_RETURN_STATUS(
2169 legacy2aidl_audio_source_t_AudioSourceType(audioSource));
2170 media::DeviceRole roleAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_device_role_t_DeviceRole(role));
2171 std::vector<media::AudioDevice> devicesAidl = VALUE_OR_RETURN_STATUS(
2172 convertContainer<std::vector<media::AudioDevice>>(devices,
2173 legacy2aidl_AudioDeviceTypeAddress));
2174 return statusTFromBinderStatus(
2175 aps->setDevicesRoleForCapturePreset(audioSourceAidl, roleAidl, devicesAidl));
2176 }
2177
addDevicesRoleForCapturePreset(audio_source_t audioSource,device_role_t role,const AudioDeviceTypeAddrVector & devices)2178 status_t AudioSystem::addDevicesRoleForCapturePreset(audio_source_t audioSource,
2179 device_role_t role,
2180 const AudioDeviceTypeAddrVector& devices) {
2181 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
2182 if (aps == 0) {
2183 return PERMISSION_DENIED;
2184 }
2185 media::AudioSourceType audioSourceAidl = VALUE_OR_RETURN_STATUS(
2186 legacy2aidl_audio_source_t_AudioSourceType(audioSource));
2187 media::DeviceRole roleAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_device_role_t_DeviceRole(role));
2188 std::vector<media::AudioDevice> devicesAidl = VALUE_OR_RETURN_STATUS(
2189 convertContainer<std::vector<media::AudioDevice>>(devices,
2190 legacy2aidl_AudioDeviceTypeAddress));
2191 return statusTFromBinderStatus(
2192 aps->addDevicesRoleForCapturePreset(audioSourceAidl, roleAidl, devicesAidl));
2193 }
2194
removeDevicesRoleForCapturePreset(audio_source_t audioSource,device_role_t role,const AudioDeviceTypeAddrVector & devices)2195 status_t AudioSystem::removeDevicesRoleForCapturePreset(
2196 audio_source_t audioSource, device_role_t role, const AudioDeviceTypeAddrVector& devices) {
2197 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
2198 if (aps == 0) {
2199 return PERMISSION_DENIED;
2200 }
2201 media::AudioSourceType audioSourceAidl = VALUE_OR_RETURN_STATUS(
2202 legacy2aidl_audio_source_t_AudioSourceType(audioSource));
2203 media::DeviceRole roleAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_device_role_t_DeviceRole(role));
2204 std::vector<media::AudioDevice> devicesAidl = VALUE_OR_RETURN_STATUS(
2205 convertContainer<std::vector<media::AudioDevice>>(devices,
2206 legacy2aidl_AudioDeviceTypeAddress));
2207 return statusTFromBinderStatus(
2208 aps->removeDevicesRoleForCapturePreset(audioSourceAidl, roleAidl, devicesAidl));
2209 }
2210
clearDevicesRoleForCapturePreset(audio_source_t audioSource,device_role_t role)2211 status_t AudioSystem::clearDevicesRoleForCapturePreset(audio_source_t audioSource,
2212 device_role_t role) {
2213 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
2214 if (aps == 0) {
2215 return PERMISSION_DENIED;
2216 }
2217 media::AudioSourceType audioSourceAidl = VALUE_OR_RETURN_STATUS(
2218 legacy2aidl_audio_source_t_AudioSourceType(audioSource));
2219 media::DeviceRole roleAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_device_role_t_DeviceRole(role));
2220 return statusTFromBinderStatus(
2221 aps->clearDevicesRoleForCapturePreset(audioSourceAidl, roleAidl));
2222 }
2223
getDevicesForRoleAndCapturePreset(audio_source_t audioSource,device_role_t role,AudioDeviceTypeAddrVector & devices)2224 status_t AudioSystem::getDevicesForRoleAndCapturePreset(audio_source_t audioSource,
2225 device_role_t role,
2226 AudioDeviceTypeAddrVector& devices) {
2227 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
2228 if (aps == 0) {
2229 return PERMISSION_DENIED;
2230 }
2231 media::AudioSourceType audioSourceAidl = VALUE_OR_RETURN_STATUS(
2232 legacy2aidl_audio_source_t_AudioSourceType(audioSource));
2233 media::DeviceRole roleAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_device_role_t_DeviceRole(role));
2234 std::vector<media::AudioDevice> devicesAidl;
2235 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
2236 aps->getDevicesForRoleAndCapturePreset(audioSourceAidl, roleAidl, &devicesAidl)));
2237 devices = VALUE_OR_RETURN_STATUS(
2238 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2239 aidl2legacy_AudioDeviceTypeAddress));
2240 return OK;
2241 }
2242
getSpatializer(const sp<media::INativeSpatializerCallback> & callback,sp<media::ISpatializer> * spatializer)2243 status_t AudioSystem::getSpatializer(const sp<media::INativeSpatializerCallback>& callback,
2244 sp<media::ISpatializer>* spatializer) {
2245 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
2246 if (spatializer == nullptr) {
2247 return BAD_VALUE;
2248 }
2249 if (aps == 0) {
2250 return PERMISSION_DENIED;
2251 }
2252 media::GetSpatializerResponse response;
2253 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
2254 aps->getSpatializer(callback, &response)));
2255
2256 *spatializer = response.spatializer;
2257 return OK;
2258 }
2259
canBeSpatialized(const audio_attributes_t * attr,const audio_config_t * config,const AudioDeviceTypeAddrVector & devices,bool * canBeSpatialized)2260 status_t AudioSystem::canBeSpatialized(const audio_attributes_t *attr,
2261 const audio_config_t *config,
2262 const AudioDeviceTypeAddrVector &devices,
2263 bool *canBeSpatialized) {
2264 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
2265 if (aps == 0) {
2266 return PERMISSION_DENIED;
2267 }
2268 audio_attributes_t attributes = attr != nullptr ? *attr : AUDIO_ATTRIBUTES_INITIALIZER;
2269 audio_config_t configuration = config != nullptr ? *config : AUDIO_CONFIG_INITIALIZER;
2270
2271 std::optional<media::AudioAttributesInternal> attrAidl = VALUE_OR_RETURN_STATUS(
2272 legacy2aidl_audio_attributes_t_AudioAttributesInternal(attributes));
2273 std::optional<media::AudioConfig> configAidl = VALUE_OR_RETURN_STATUS(
2274 legacy2aidl_audio_config_t_AudioConfig(configuration));
2275 std::vector<media::AudioDevice> devicesAidl = VALUE_OR_RETURN_STATUS(
2276 convertContainer<std::vector<media::AudioDevice>>(devices,
2277 legacy2aidl_AudioDeviceTypeAddress));
2278 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
2279 aps->canBeSpatialized(attrAidl, configAidl, devicesAidl, canBeSpatialized)));
2280 return OK;
2281 }
2282
2283
2284 class CaptureStateListenerImpl : public media::BnCaptureStateListener,
2285 public IBinder::DeathRecipient {
2286 public:
CaptureStateListenerImpl(const sp<IAudioPolicyService> & aps,const sp<AudioSystem::CaptureStateListener> & listener)2287 CaptureStateListenerImpl(
2288 const sp<IAudioPolicyService>& aps,
2289 const sp<AudioSystem::CaptureStateListener>& listener)
2290 : mAps(aps), mListener(listener) {}
2291
init()2292 void init() {
2293 bool active;
2294 status_t status = statusTFromBinderStatus(
2295 mAps->registerSoundTriggerCaptureStateListener(this, &active));
2296 if (status != NO_ERROR) {
2297 mListener->onServiceDied();
2298 return;
2299 }
2300 mListener->onStateChanged(active);
2301 IInterface::asBinder(mAps)->linkToDeath(this);
2302 }
2303
setCaptureState(bool active)2304 binder::Status setCaptureState(bool active) override {
2305 Mutex::Autolock _l(gSoundTriggerCaptureStateListenerLock);
2306 mListener->onStateChanged(active);
2307 return binder::Status::ok();
2308 }
2309
binderDied(const wp<IBinder> &)2310 void binderDied(const wp<IBinder>&) override {
2311 Mutex::Autolock _l(gSoundTriggerCaptureStateListenerLock);
2312 mListener->onServiceDied();
2313 gSoundTriggerCaptureStateListener = nullptr;
2314 }
2315
2316 private:
2317 // Need this in order to keep the death receipent alive.
2318 sp<IAudioPolicyService> mAps;
2319 sp<AudioSystem::CaptureStateListener> mListener;
2320 };
2321
registerSoundTriggerCaptureStateListener(const sp<CaptureStateListener> & listener)2322 status_t AudioSystem::registerSoundTriggerCaptureStateListener(
2323 const sp<CaptureStateListener>& listener) {
2324 LOG_ALWAYS_FATAL_IF(listener == nullptr);
2325
2326 const sp<IAudioPolicyService>& aps =
2327 AudioSystem::get_audio_policy_service();
2328 if (aps == 0) {
2329 return PERMISSION_DENIED;
2330 }
2331
2332 Mutex::Autolock _l(gSoundTriggerCaptureStateListenerLock);
2333 gSoundTriggerCaptureStateListener = new CaptureStateListenerImpl(aps, listener);
2334 gSoundTriggerCaptureStateListener->init();
2335
2336 return NO_ERROR;
2337 }
2338
setVibratorInfos(const std::vector<media::AudioVibratorInfo> & vibratorInfos)2339 status_t AudioSystem::setVibratorInfos(
2340 const std::vector<media::AudioVibratorInfo>& vibratorInfos) {
2341 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
2342 if (af == nullptr) {
2343 return PERMISSION_DENIED;
2344 }
2345 return af->setVibratorInfos(vibratorInfos);
2346 }
2347
2348 // ---------------------------------------------------------------------------
2349
addAudioPortCallback(const sp<AudioPortCallback> & callback)2350 int AudioSystem::AudioPolicyServiceClient::addAudioPortCallback(
2351 const sp<AudioPortCallback>& callback) {
2352 Mutex::Autolock _l(mLock);
2353 for (size_t i = 0; i < mAudioPortCallbacks.size(); i++) {
2354 if (mAudioPortCallbacks[i] == callback) {
2355 return -1;
2356 }
2357 }
2358 mAudioPortCallbacks.add(callback);
2359 return mAudioPortCallbacks.size();
2360 }
2361
removeAudioPortCallback(const sp<AudioPortCallback> & callback)2362 int AudioSystem::AudioPolicyServiceClient::removeAudioPortCallback(
2363 const sp<AudioPortCallback>& callback) {
2364 Mutex::Autolock _l(mLock);
2365 size_t i;
2366 for (i = 0; i < mAudioPortCallbacks.size(); i++) {
2367 if (mAudioPortCallbacks[i] == callback) {
2368 break;
2369 }
2370 }
2371 if (i == mAudioPortCallbacks.size()) {
2372 return -1;
2373 }
2374 mAudioPortCallbacks.removeAt(i);
2375 return mAudioPortCallbacks.size();
2376 }
2377
2378
onAudioPortListUpdate()2379 Status AudioSystem::AudioPolicyServiceClient::onAudioPortListUpdate() {
2380 Mutex::Autolock _l(mLock);
2381 for (size_t i = 0; i < mAudioPortCallbacks.size(); i++) {
2382 mAudioPortCallbacks[i]->onAudioPortListUpdate();
2383 }
2384 return Status::ok();
2385 }
2386
onAudioPatchListUpdate()2387 Status AudioSystem::AudioPolicyServiceClient::onAudioPatchListUpdate() {
2388 Mutex::Autolock _l(mLock);
2389 for (size_t i = 0; i < mAudioPortCallbacks.size(); i++) {
2390 mAudioPortCallbacks[i]->onAudioPatchListUpdate();
2391 }
2392 return Status::ok();
2393 }
2394
2395 // ----------------------------------------------------------------------------
addAudioVolumeGroupCallback(const sp<AudioVolumeGroupCallback> & callback)2396 int AudioSystem::AudioPolicyServiceClient::addAudioVolumeGroupCallback(
2397 const sp<AudioVolumeGroupCallback>& callback) {
2398 Mutex::Autolock _l(mLock);
2399 for (size_t i = 0; i < mAudioVolumeGroupCallback.size(); i++) {
2400 if (mAudioVolumeGroupCallback[i] == callback) {
2401 return -1;
2402 }
2403 }
2404 mAudioVolumeGroupCallback.add(callback);
2405 return mAudioVolumeGroupCallback.size();
2406 }
2407
removeAudioVolumeGroupCallback(const sp<AudioVolumeGroupCallback> & callback)2408 int AudioSystem::AudioPolicyServiceClient::removeAudioVolumeGroupCallback(
2409 const sp<AudioVolumeGroupCallback>& callback) {
2410 Mutex::Autolock _l(mLock);
2411 size_t i;
2412 for (i = 0; i < mAudioVolumeGroupCallback.size(); i++) {
2413 if (mAudioVolumeGroupCallback[i] == callback) {
2414 break;
2415 }
2416 }
2417 if (i == mAudioVolumeGroupCallback.size()) {
2418 return -1;
2419 }
2420 mAudioVolumeGroupCallback.removeAt(i);
2421 return mAudioVolumeGroupCallback.size();
2422 }
2423
onAudioVolumeGroupChanged(int32_t group,int32_t flags)2424 Status AudioSystem::AudioPolicyServiceClient::onAudioVolumeGroupChanged(int32_t group,
2425 int32_t flags) {
2426 volume_group_t groupLegacy = VALUE_OR_RETURN_BINDER_STATUS(
2427 aidl2legacy_int32_t_volume_group_t(group));
2428 int flagsLegacy = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(flags));
2429
2430 Mutex::Autolock _l(mLock);
2431 for (size_t i = 0; i < mAudioVolumeGroupCallback.size(); i++) {
2432 mAudioVolumeGroupCallback[i]->onAudioVolumeGroupChanged(groupLegacy, flagsLegacy);
2433 }
2434 return Status::ok();
2435 }
2436 // ----------------------------------------------------------------------------
2437
onDynamicPolicyMixStateUpdate(const::std::string & regId,int32_t state)2438 Status AudioSystem::AudioPolicyServiceClient::onDynamicPolicyMixStateUpdate(
2439 const ::std::string& regId, int32_t state) {
2440 ALOGV("AudioPolicyServiceClient::onDynamicPolicyMixStateUpdate(%s, %d)", regId.c_str(), state);
2441
2442 String8 regIdLegacy = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_string_view_String8(regId));
2443 int stateLegacy = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(state));
2444 dynamic_policy_callback cb = NULL;
2445 {
2446 Mutex::Autolock _l(AudioSystem::gLock);
2447 cb = gDynPolicyCallback;
2448 }
2449
2450 if (cb != NULL) {
2451 cb(DYNAMIC_POLICY_EVENT_MIX_STATE_UPDATE, regIdLegacy, stateLegacy);
2452 }
2453 return Status::ok();
2454 }
2455
onRecordingConfigurationUpdate(int32_t event,const media::RecordClientInfo & clientInfo,const media::AudioConfigBase & clientConfig,const std::vector<media::EffectDescriptor> & clientEffects,const media::AudioConfigBase & deviceConfig,const std::vector<media::EffectDescriptor> & effects,int32_t patchHandle,media::AudioSourceType source)2456 Status AudioSystem::AudioPolicyServiceClient::onRecordingConfigurationUpdate(
2457 int32_t event,
2458 const media::RecordClientInfo& clientInfo,
2459 const media::AudioConfigBase& clientConfig,
2460 const std::vector<media::EffectDescriptor>& clientEffects,
2461 const media::AudioConfigBase& deviceConfig,
2462 const std::vector<media::EffectDescriptor>& effects,
2463 int32_t patchHandle,
2464 media::AudioSourceType source) {
2465 record_config_callback cb = NULL;
2466 {
2467 Mutex::Autolock _l(AudioSystem::gLock);
2468 cb = gRecordConfigCallback;
2469 }
2470
2471 if (cb != NULL) {
2472 int eventLegacy = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(event));
2473 record_client_info_t clientInfoLegacy = VALUE_OR_RETURN_BINDER_STATUS(
2474 aidl2legacy_RecordClientInfo_record_client_info_t(clientInfo));
2475 audio_config_base_t clientConfigLegacy = VALUE_OR_RETURN_BINDER_STATUS(
2476 aidl2legacy_AudioConfigBase_audio_config_base_t(clientConfig));
2477 std::vector<effect_descriptor_t> clientEffectsLegacy = VALUE_OR_RETURN_BINDER_STATUS(
2478 convertContainer<std::vector<effect_descriptor_t>>(
2479 clientEffects,
2480 aidl2legacy_EffectDescriptor_effect_descriptor_t));
2481 audio_config_base_t deviceConfigLegacy = VALUE_OR_RETURN_BINDER_STATUS(
2482 aidl2legacy_AudioConfigBase_audio_config_base_t(deviceConfig));
2483 std::vector<effect_descriptor_t> effectsLegacy = VALUE_OR_RETURN_BINDER_STATUS(
2484 convertContainer<std::vector<effect_descriptor_t>>(
2485 effects,
2486 aidl2legacy_EffectDescriptor_effect_descriptor_t));
2487 audio_patch_handle_t patchHandleLegacy = VALUE_OR_RETURN_BINDER_STATUS(
2488 aidl2legacy_int32_t_audio_patch_handle_t(patchHandle));
2489 audio_source_t sourceLegacy = VALUE_OR_RETURN_BINDER_STATUS(
2490 aidl2legacy_AudioSourceType_audio_source_t(source));
2491 cb(eventLegacy, &clientInfoLegacy, &clientConfigLegacy, clientEffectsLegacy,
2492 &deviceConfigLegacy, effectsLegacy, patchHandleLegacy, sourceLegacy);
2493 }
2494 return Status::ok();
2495 }
2496
onRoutingUpdated()2497 Status AudioSystem::AudioPolicyServiceClient::onRoutingUpdated() {
2498 routing_callback cb = NULL;
2499 {
2500 Mutex::Autolock _l(AudioSystem::gLock);
2501 cb = gRoutingCallback;
2502 }
2503
2504 if (cb != NULL) {
2505 cb();
2506 }
2507 return Status::ok();
2508 }
2509
binderDied(const wp<IBinder> & who __unused)2510 void AudioSystem::AudioPolicyServiceClient::binderDied(const wp<IBinder>& who __unused) {
2511 {
2512 Mutex::Autolock _l(mLock);
2513 for (size_t i = 0; i < mAudioPortCallbacks.size(); i++) {
2514 mAudioPortCallbacks[i]->onServiceDied();
2515 }
2516 for (size_t i = 0; i < mAudioVolumeGroupCallback.size(); i++) {
2517 mAudioVolumeGroupCallback[i]->onServiceDied();
2518 }
2519 }
2520 {
2521 Mutex::Autolock _l(gLockAPS);
2522 AudioSystem::gAudioPolicyService.clear();
2523 }
2524
2525 ALOGW("AudioPolicyService server died!");
2526 }
2527
2528 ConversionResult<record_client_info_t>
aidl2legacy_RecordClientInfo_record_client_info_t(const media::RecordClientInfo & aidl)2529 aidl2legacy_RecordClientInfo_record_client_info_t(const media::RecordClientInfo& aidl) {
2530 record_client_info_t legacy;
2531 legacy.riid = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_unique_id_t(aidl.riid));
2532 legacy.uid = VALUE_OR_RETURN(aidl2legacy_int32_t_uid_t(aidl.uid));
2533 legacy.session = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_session_t(aidl.session));
2534 legacy.source = VALUE_OR_RETURN(aidl2legacy_AudioSourceType_audio_source_t(aidl.source));
2535 legacy.port_id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.portId));
2536 legacy.silenced = aidl.silenced;
2537 return legacy;
2538 }
2539
2540 ConversionResult<media::RecordClientInfo>
legacy2aidl_record_client_info_t_RecordClientInfo(const record_client_info_t & legacy)2541 legacy2aidl_record_client_info_t_RecordClientInfo(const record_client_info_t& legacy) {
2542 media::RecordClientInfo aidl;
2543 aidl.riid = VALUE_OR_RETURN(legacy2aidl_audio_unique_id_t_int32_t(legacy.riid));
2544 aidl.uid = VALUE_OR_RETURN(legacy2aidl_uid_t_int32_t(legacy.uid));
2545 aidl.session = VALUE_OR_RETURN(legacy2aidl_audio_session_t_int32_t(legacy.session));
2546 aidl.source = VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSourceType(legacy.source));
2547 aidl.portId = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.port_id));
2548 aidl.silenced = legacy.silenced;
2549 return aidl;
2550 }
2551
2552 } // namespace android
2553