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