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