1 /*
2 **
3 ** Copyright 2007, The Android Open Source Project
4 **
5 ** Licensed under the Apache License, Version 2.0 (the "License");
6 ** you may not use this file except in compliance with the License.
7 ** You may obtain a copy of the License at
8 **
9 **     http://www.apache.org/licenses/LICENSE-2.0
10 **
11 ** Unless required by applicable law or agreed to in writing, software
12 ** distributed under the License is distributed on an "AS IS" BASIS,
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 ** See the License for the specific language governing permissions and
15 ** limitations under the License.
16 */
17 
18 
19 #define LOG_TAG "AudioFlinger"
20 //#define LOG_NDEBUG 0
21 
22 // Define AUDIO_ARRAYS_STATIC_CHECK to check all audio arrays are correct
23 #define AUDIO_ARRAYS_STATIC_CHECK 1
24 
25 #include "Configuration.h"
26 #include <dirent.h>
27 #include <math.h>
28 #include <signal.h>
29 #include <string>
30 #include <sys/time.h>
31 #include <sys/resource.h>
32 #include <thread>
33 
34 #include <android/media/IAudioPolicyService.h>
35 #include <android/os/IExternalVibratorService.h>
36 #include <binder/IPCThreadState.h>
37 #include <binder/IServiceManager.h>
38 #include <utils/Log.h>
39 #include <utils/Trace.h>
40 #include <binder/Parcel.h>
41 #include <media/audiohal/DeviceHalInterface.h>
42 #include <media/audiohal/DevicesFactoryHalInterface.h>
43 #include <media/audiohal/EffectsFactoryHalInterface.h>
44 #include <media/AudioParameter.h>
45 #include <media/MediaMetricsItem.h>
46 #include <media/TypeConverter.h>
47 #include <mediautils/TimeCheck.h>
48 #include <memunreachable/memunreachable.h>
49 #include <utils/String16.h>
50 #include <utils/threads.h>
51 
52 #include <cutils/atomic.h>
53 #include <cutils/properties.h>
54 
55 #include <system/audio.h>
56 #include <audiomanager/AudioManager.h>
57 
58 #include "AudioFlinger.h"
59 #include "NBAIO_Tee.h"
60 
61 #include <media/AudioResamplerPublic.h>
62 
63 #include <system/audio_effects/effect_visualizer.h>
64 #include <system/audio_effects/effect_ns.h>
65 #include <system/audio_effects/effect_aec.h>
66 #include <system/audio_effects/effect_hapticgenerator.h>
67 #include <system/audio_effects/effect_spatializer.h>
68 
69 #include <audio_utils/primitives.h>
70 
71 #include <powermanager/PowerManager.h>
72 
73 #include <media/IMediaLogService.h>
74 #include <media/AidlConversion.h>
75 #include <media/AudioValidator.h>
76 #include <media/nbaio/Pipe.h>
77 #include <media/nbaio/PipeReader.h>
78 #include <mediautils/BatteryNotifier.h>
79 #include <mediautils/MemoryLeakTrackUtil.h>
80 #include <mediautils/ServiceUtilities.h>
81 #include <mediautils/TimeCheck.h>
82 #include <private/android_filesystem_config.h>
83 
84 //#define BUFLOG_NDEBUG 0
85 #include <BufLog.h>
86 
87 #include "TypedLogger.h"
88 
89 // ----------------------------------------------------------------------------
90 
91 // Note: the following macro is used for extremely verbose logging message.  In
92 // order to run with ALOG_ASSERT turned on, we need to have LOG_NDEBUG set to
93 // 0; but one side effect of this is to turn all LOGV's as well.  Some messages
94 // are so verbose that we want to suppress them even when we have ALOG_ASSERT
95 // turned on.  Do not uncomment the #def below unless you really know what you
96 // are doing and want to see all of the extremely verbose messages.
97 //#define VERY_VERY_VERBOSE_LOGGING
98 #ifdef VERY_VERY_VERBOSE_LOGGING
99 #define ALOGVV ALOGV
100 #else
101 #define ALOGVV(a...) do { } while(0)
102 #endif
103 
104 namespace android {
105 
106 using media::IEffectClient;
107 using android::content::AttributionSourceState;
108 
109 static const char kDeadlockedString[] = "AudioFlinger may be deadlocked\n";
110 static const char kHardwareLockedString[] = "Hardware lock is taken\n";
111 static const char kClientLockedString[] = "Client lock is taken\n";
112 static const char kNoEffectsFactory[] = "Effects Factory is absent\n";
113 
114 
115 nsecs_t AudioFlinger::mStandbyTimeInNsecs = kDefaultStandbyTimeInNsecs;
116 
117 uint32_t AudioFlinger::mScreenState;
118 
119 // In order to avoid invalidating offloaded tracks each time a Visualizer is turned on and off
120 // we define a minimum time during which a global effect is considered enabled.
121 static const nsecs_t kMinGlobalEffectEnabletimeNs = seconds(7200);
122 
123 // Keep a strong reference to media.log service around forever.
124 // The service is within our parent process so it can never die in a way that we could observe.
125 // These two variables are const after initialization.
126 static sp<IBinder> sMediaLogServiceAsBinder;
127 static sp<IMediaLogService> sMediaLogService;
128 
129 static pthread_once_t sMediaLogOnce = PTHREAD_ONCE_INIT;
130 
sMediaLogInit()131 static void sMediaLogInit()
132 {
133     sMediaLogServiceAsBinder = defaultServiceManager()->getService(String16("media.log"));
134     if (sMediaLogServiceAsBinder != 0) {
135         sMediaLogService = interface_cast<IMediaLogService>(sMediaLogServiceAsBinder);
136     }
137 }
138 
139 // Keep a strong reference to external vibrator service
140 static sp<os::IExternalVibratorService> sExternalVibratorService;
141 
getExternalVibratorService()142 static sp<os::IExternalVibratorService> getExternalVibratorService() {
143     if (sExternalVibratorService == 0) {
144         sp<IBinder> binder = defaultServiceManager()->getService(
145             String16("external_vibrator_service"));
146         if (binder != 0) {
147             sExternalVibratorService =
148                 interface_cast<os::IExternalVibratorService>(binder);
149         }
150     }
151     return sExternalVibratorService;
152 }
153 
154 class DevicesFactoryHalCallbackImpl : public DevicesFactoryHalCallback {
155   public:
onNewDevicesAvailable()156     void onNewDevicesAvailable() override {
157         // Start a detached thread to execute notification in parallel.
158         // This is done to prevent mutual blocking of audio_flinger and
159         // audio_policy services during system initialization.
160         std::thread notifier([]() {
161             AudioSystem::onNewAudioModulesAvailable();
162         });
163         notifier.detach();
164     }
165 };
166 
167 // TODO b/182392769: use attribution source util
168 /* static */
checkAttributionSourcePackage(const AttributionSourceState & attributionSource)169 AttributionSourceState AudioFlinger::checkAttributionSourcePackage(
170         const AttributionSourceState& attributionSource) {
171     Vector<String16> packages;
172     PermissionController{}.getPackagesForUid(attributionSource.uid, packages);
173 
174     AttributionSourceState checkedAttributionSource = attributionSource;
175     if (!attributionSource.packageName.has_value()
176             || attributionSource.packageName.value().size() == 0) {
177         if (!packages.isEmpty()) {
178             checkedAttributionSource.packageName =
179                 std::move(legacy2aidl_String16_string(packages[0]).value());
180         }
181     } else {
182         String16 opPackageLegacy = VALUE_OR_FATAL(
183             aidl2legacy_string_view_String16(attributionSource.packageName.value_or("")));
184         if (std::find_if(packages.begin(), packages.end(),
185                 [&opPackageLegacy](const auto& package) {
186                 return opPackageLegacy == package; }) == packages.end()) {
187             ALOGW("The package name(%s) provided does not correspond to the uid %d",
188                     attributionSource.packageName.value_or("").c_str(), attributionSource.uid);
189             checkedAttributionSource.packageName = std::optional<std::string>();
190         }
191     }
192     return checkedAttributionSource;
193 }
194 
195 // ----------------------------------------------------------------------------
196 
formatToString(audio_format_t format)197 std::string formatToString(audio_format_t format) {
198     std::string result;
199     FormatConverter::toString(format, result);
200     return result;
201 }
202 
203 // ----------------------------------------------------------------------------
204 
instantiate()205 void AudioFlinger::instantiate() {
206     sp<IServiceManager> sm(defaultServiceManager());
207     sm->addService(String16(IAudioFlinger::DEFAULT_SERVICE_NAME),
208                    new AudioFlingerServerAdapter(new AudioFlinger()), false,
209                    IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT);
210 }
211 
AudioFlinger()212 AudioFlinger::AudioFlinger()
213     : mMediaLogNotifier(new AudioFlinger::MediaLogNotifier()),
214       mPrimaryHardwareDev(NULL),
215       mAudioHwDevs(NULL),
216       mHardwareStatus(AUDIO_HW_IDLE),
217       mMasterVolume(1.0f),
218       mMasterMute(false),
219       // mNextUniqueId(AUDIO_UNIQUE_ID_USE_MAX),
220       mMode(AUDIO_MODE_INVALID),
221       mBtNrecIsOff(false),
222       mIsLowRamDevice(true),
223       mIsDeviceTypeKnown(false),
224       mTotalMemory(0),
225       mClientSharedHeapSize(kMinimumClientSharedHeapSizeBytes),
226       mGlobalEffectEnableTime(0),
227       mPatchPanel(this),
228       mDeviceEffectManager(this),
229       mSystemReady(false)
230 {
231     // Move the audio session unique ID generator start base as time passes to limit risk of
232     // generating the same ID again after an audioserver restart.
233     // This is important because clients will reuse previously allocated audio session IDs
234     // when reconnecting after an audioserver restart and newly allocated IDs may conflict with
235     // active clients.
236     // Moving the base by 1 for each elapsed second is a good compromise between avoiding overlap
237     // between allocation ranges and not reaching wrap around too soon.
238     timespec ts{};
239     clock_gettime(CLOCK_MONOTONIC, &ts);
240     // zero ID has a special meaning, so start allocation at least at AUDIO_UNIQUE_ID_USE_MAX
241     uint32_t movingBase = (uint32_t)std::max((long)1, ts.tv_sec);
242     // unsigned instead of audio_unique_id_use_t, because ++ operator is unavailable for enum
243     for (unsigned use = AUDIO_UNIQUE_ID_USE_UNSPECIFIED; use < AUDIO_UNIQUE_ID_USE_MAX; use++) {
244         mNextUniqueIds[use] =
245                 ((use == AUDIO_UNIQUE_ID_USE_SESSION || use == AUDIO_UNIQUE_ID_USE_CLIENT) ?
246                         movingBase : 1) * AUDIO_UNIQUE_ID_USE_MAX;
247     }
248 
249 #if 1
250     // FIXME See bug 165702394 and bug 168511485
251     const bool doLog = false;
252 #else
253     const bool doLog = property_get_bool("ro.test_harness", false);
254 #endif
255     if (doLog) {
256         mLogMemoryDealer = new MemoryDealer(kLogMemorySize, "LogWriters",
257                 MemoryHeapBase::READ_ONLY);
258         (void) pthread_once(&sMediaLogOnce, sMediaLogInit);
259     }
260 
261     // reset battery stats.
262     // if the audio service has crashed, battery stats could be left
263     // in bad state, reset the state upon service start.
264     BatteryNotifier::getInstance().noteResetAudio();
265 
266     mDevicesFactoryHal = DevicesFactoryHalInterface::create();
267     mEffectsFactoryHal = EffectsFactoryHalInterface::create();
268 
269     mMediaLogNotifier->run("MediaLogNotifier");
270     std::vector<pid_t> halPids;
271     mDevicesFactoryHal->getHalPids(&halPids);
272     TimeCheck::setAudioHalPids(halPids);
273 
274     // Notify that we have started (also called when audioserver service restarts)
275     mediametrics::LogItem(mMetricsId)
276         .set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_CTOR)
277         .record();
278 }
279 
onFirstRef()280 void AudioFlinger::onFirstRef()
281 {
282     Mutex::Autolock _l(mLock);
283 
284     /* TODO: move all this work into an Init() function */
285     char val_str[PROPERTY_VALUE_MAX] = { 0 };
286     if (property_get("ro.audio.flinger_standbytime_ms", val_str, NULL) >= 0) {
287         uint32_t int_val;
288         if (1 == sscanf(val_str, "%u", &int_val)) {
289             mStandbyTimeInNsecs = milliseconds(int_val);
290             ALOGI("Using %u mSec as standby time.", int_val);
291         } else {
292             mStandbyTimeInNsecs = kDefaultStandbyTimeInNsecs;
293             ALOGI("Using default %u mSec as standby time.",
294                     (uint32_t)(mStandbyTimeInNsecs / 1000000));
295         }
296     }
297 
298     mMode = AUDIO_MODE_NORMAL;
299 
300     gAudioFlinger = this;  // we are already refcounted, store into atomic pointer.
301 
302     mDevicesFactoryHalCallback = new DevicesFactoryHalCallbackImpl;
303     mDevicesFactoryHal->setCallbackOnce(mDevicesFactoryHalCallback);
304 }
305 
setAudioHalPids(const std::vector<pid_t> & pids)306 status_t AudioFlinger::setAudioHalPids(const std::vector<pid_t>& pids) {
307   TimeCheck::setAudioHalPids(pids);
308   return NO_ERROR;
309 }
310 
setVibratorInfos(const std::vector<media::AudioVibratorInfo> & vibratorInfos)311 status_t AudioFlinger::setVibratorInfos(
312         const std::vector<media::AudioVibratorInfo>& vibratorInfos) {
313     Mutex::Autolock _l(mLock);
314     mAudioVibratorInfos = vibratorInfos;
315     return NO_ERROR;
316 }
317 
updateSecondaryOutputs(const TrackSecondaryOutputsMap & trackSecondaryOutputs)318 status_t AudioFlinger::updateSecondaryOutputs(
319         const TrackSecondaryOutputsMap& trackSecondaryOutputs) {
320     Mutex::Autolock _l(mLock);
321     for (const auto& [trackId, secondaryOutputs] : trackSecondaryOutputs) {
322         size_t i = 0;
323         for (; i < mPlaybackThreads.size(); ++i) {
324             PlaybackThread *thread = mPlaybackThreads.valueAt(i).get();
325             Mutex::Autolock _tl(thread->mLock);
326             sp<PlaybackThread::Track> track = thread->getTrackById_l(trackId);
327             if (track != nullptr) {
328                 ALOGD("%s trackId: %u", __func__, trackId);
329                 updateSecondaryOutputsForTrack_l(track.get(), thread, secondaryOutputs);
330                 break;
331             }
332         }
333         ALOGW_IF(i >= mPlaybackThreads.size(),
334                  "%s cannot find track with id %u", __func__, trackId);
335     }
336     return NO_ERROR;
337 }
338 
339 // getDefaultVibratorInfo_l must be called with AudioFlinger lock held.
getDefaultVibratorInfo_l()340 std::optional<media::AudioVibratorInfo> AudioFlinger::getDefaultVibratorInfo_l() {
341     if (mAudioVibratorInfos.empty()) {
342         return {};
343     }
344     return mAudioVibratorInfos.front();
345 }
346 
~AudioFlinger()347 AudioFlinger::~AudioFlinger()
348 {
349     while (!mRecordThreads.isEmpty()) {
350         // closeInput_nonvirtual() will remove specified entry from mRecordThreads
351         closeInput_nonvirtual(mRecordThreads.keyAt(0));
352     }
353     while (!mPlaybackThreads.isEmpty()) {
354         // closeOutput_nonvirtual() will remove specified entry from mPlaybackThreads
355         closeOutput_nonvirtual(mPlaybackThreads.keyAt(0));
356     }
357     while (!mMmapThreads.isEmpty()) {
358         const audio_io_handle_t io = mMmapThreads.keyAt(0);
359         if (mMmapThreads.valueAt(0)->isOutput()) {
360             closeOutput_nonvirtual(io); // removes entry from mMmapThreads
361         } else {
362             closeInput_nonvirtual(io);  // removes entry from mMmapThreads
363         }
364     }
365 
366     for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
367         // no mHardwareLock needed, as there are no other references to this
368         delete mAudioHwDevs.valueAt(i);
369     }
370 
371     // Tell media.log service about any old writers that still need to be unregistered
372     if (sMediaLogService != 0) {
373         for (size_t count = mUnregisteredWriters.size(); count > 0; count--) {
374             sp<IMemory> iMemory(mUnregisteredWriters.top()->getIMemory());
375             mUnregisteredWriters.pop();
376             sMediaLogService->unregisterWriter(iMemory);
377         }
378     }
379 }
380 
381 //static
382 __attribute__ ((visibility ("default")))
openMmapStream(MmapStreamInterface::stream_direction_t direction,const audio_attributes_t * attr,audio_config_base_t * config,const AudioClient & client,audio_port_handle_t * deviceId,audio_session_t * sessionId,const sp<MmapStreamCallback> & callback,sp<MmapStreamInterface> & interface,audio_port_handle_t * handle)383 status_t MmapStreamInterface::openMmapStream(MmapStreamInterface::stream_direction_t direction,
384                                              const audio_attributes_t *attr,
385                                              audio_config_base_t *config,
386                                              const AudioClient& client,
387                                              audio_port_handle_t *deviceId,
388                                              audio_session_t *sessionId,
389                                              const sp<MmapStreamCallback>& callback,
390                                              sp<MmapStreamInterface>& interface,
391                                              audio_port_handle_t *handle)
392 {
393     // TODO: Use ServiceManager to get IAudioFlinger instead of by atomic pointer.
394     // This allows moving oboeservice (AAudio) to a separate process in the future.
395     sp<AudioFlinger> af = AudioFlinger::gAudioFlinger.load();  // either nullptr or singleton AF.
396     status_t ret = NO_INIT;
397     if (af != 0) {
398         ret = af->openMmapStream(
399                 direction, attr, config, client, deviceId,
400                 sessionId, callback, interface, handle);
401     }
402     return ret;
403 }
404 
openMmapStream(MmapStreamInterface::stream_direction_t direction,const audio_attributes_t * attr,audio_config_base_t * config,const AudioClient & client,audio_port_handle_t * deviceId,audio_session_t * sessionId,const sp<MmapStreamCallback> & callback,sp<MmapStreamInterface> & interface,audio_port_handle_t * handle)405 status_t AudioFlinger::openMmapStream(MmapStreamInterface::stream_direction_t direction,
406                                       const audio_attributes_t *attr,
407                                       audio_config_base_t *config,
408                                       const AudioClient& client,
409                                       audio_port_handle_t *deviceId,
410                                       audio_session_t *sessionId,
411                                       const sp<MmapStreamCallback>& callback,
412                                       sp<MmapStreamInterface>& interface,
413                                       audio_port_handle_t *handle)
414 {
415     status_t ret = initCheck();
416     if (ret != NO_ERROR) {
417         return ret;
418     }
419     audio_session_t actualSessionId = *sessionId;
420     if (actualSessionId == AUDIO_SESSION_ALLOCATE) {
421         actualSessionId = (audio_session_t) newAudioUniqueId(AUDIO_UNIQUE_ID_USE_SESSION);
422     }
423     audio_stream_type_t streamType = AUDIO_STREAM_DEFAULT;
424     audio_io_handle_t io = AUDIO_IO_HANDLE_NONE;
425     audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
426     audio_attributes_t localAttr = *attr;
427     if (direction == MmapStreamInterface::DIRECTION_OUTPUT) {
428         audio_config_t fullConfig = AUDIO_CONFIG_INITIALIZER;
429         fullConfig.sample_rate = config->sample_rate;
430         fullConfig.channel_mask = config->channel_mask;
431         fullConfig.format = config->format;
432         std::vector<audio_io_handle_t> secondaryOutputs;
433 
434         ret = AudioSystem::getOutputForAttr(&localAttr, &io,
435                                             actualSessionId,
436                                             &streamType, client.attributionSource,
437                                             &fullConfig,
438                                             (audio_output_flags_t)(AUDIO_OUTPUT_FLAG_MMAP_NOIRQ |
439                                                     AUDIO_OUTPUT_FLAG_DIRECT),
440                                             deviceId, &portId, &secondaryOutputs);
441         ALOGW_IF(!secondaryOutputs.empty(),
442                  "%s does not support secondary outputs, ignoring them", __func__);
443     } else {
444         ret = AudioSystem::getInputForAttr(&localAttr, &io,
445                                               RECORD_RIID_INVALID,
446                                               actualSessionId,
447                                               client.attributionSource,
448                                               config,
449                                               AUDIO_INPUT_FLAG_MMAP_NOIRQ, deviceId, &portId);
450     }
451     if (ret != NO_ERROR) {
452         return ret;
453     }
454 
455     // at this stage, a MmapThread was created when openOutput() or openInput() was called by
456     // audio policy manager and we can retrieve it
457     sp<MmapThread> thread = mMmapThreads.valueFor(io);
458     if (thread != 0) {
459         interface = new MmapThreadHandle(thread);
460         thread->configure(&localAttr, streamType, actualSessionId, callback, *deviceId, portId);
461         *handle = portId;
462         *sessionId = actualSessionId;
463         config->sample_rate = thread->sampleRate();
464         config->channel_mask = thread->channelMask();
465         config->format = thread->format();
466     } else {
467         if (direction == MmapStreamInterface::DIRECTION_OUTPUT) {
468             AudioSystem::releaseOutput(portId);
469         } else {
470             AudioSystem::releaseInput(portId);
471         }
472         ret = NO_INIT;
473     }
474 
475     ALOGV("%s done status %d portId %d", __FUNCTION__, ret, portId);
476 
477     return ret;
478 }
479 
480 /* static */
onExternalVibrationStart(const sp<os::ExternalVibration> & externalVibration)481 int AudioFlinger::onExternalVibrationStart(const sp<os::ExternalVibration>& externalVibration) {
482     sp<os::IExternalVibratorService> evs = getExternalVibratorService();
483     if (evs != nullptr) {
484         int32_t ret;
485         binder::Status status = evs->onExternalVibrationStart(*externalVibration, &ret);
486         if (status.isOk()) {
487             ALOGD("%s, start external vibration with intensity as %d", __func__, ret);
488             return ret;
489         }
490     }
491     ALOGD("%s, start external vibration with intensity as MUTE due to %s",
492             __func__,
493             evs == nullptr ? "external vibration service not found"
494                            : "error when querying intensity");
495     return static_cast<int>(os::HapticScale::MUTE);
496 }
497 
498 /* static */
onExternalVibrationStop(const sp<os::ExternalVibration> & externalVibration)499 void AudioFlinger::onExternalVibrationStop(const sp<os::ExternalVibration>& externalVibration) {
500     sp<os::IExternalVibratorService> evs = getExternalVibratorService();
501     if (evs != 0) {
502         evs->onExternalVibrationStop(*externalVibration);
503     }
504 }
505 
addEffectToHal(audio_port_handle_t deviceId,audio_module_handle_t hwModuleId,sp<EffectHalInterface> effect)506 status_t AudioFlinger::addEffectToHal(audio_port_handle_t deviceId,
507         audio_module_handle_t hwModuleId, sp<EffectHalInterface> effect) {
508     AutoMutex lock(mHardwareLock);
509     AudioHwDevice *audioHwDevice = mAudioHwDevs.valueFor(hwModuleId);
510     if (audioHwDevice == nullptr) {
511         return NO_INIT;
512     }
513     return audioHwDevice->hwDevice()->addDeviceEffect(deviceId, effect);
514 }
515 
removeEffectFromHal(audio_port_handle_t deviceId,audio_module_handle_t hwModuleId,sp<EffectHalInterface> effect)516 status_t AudioFlinger::removeEffectFromHal(audio_port_handle_t deviceId,
517         audio_module_handle_t hwModuleId, sp<EffectHalInterface> effect) {
518     AutoMutex lock(mHardwareLock);
519     AudioHwDevice *audioHwDevice = mAudioHwDevs.valueFor(hwModuleId);
520     if (audioHwDevice == nullptr) {
521         return NO_INIT;
522     }
523     return audioHwDevice->hwDevice()->removeDeviceEffect(deviceId, effect);
524 }
525 
526 static const char * const audio_interfaces[] = {
527     AUDIO_HARDWARE_MODULE_ID_PRIMARY,
528     AUDIO_HARDWARE_MODULE_ID_A2DP,
529     AUDIO_HARDWARE_MODULE_ID_USB,
530 };
531 
findSuitableHwDev_l(audio_module_handle_t module,audio_devices_t deviceType)532 AudioHwDevice* AudioFlinger::findSuitableHwDev_l(
533         audio_module_handle_t module,
534         audio_devices_t deviceType)
535 {
536     // if module is 0, the request comes from an old policy manager and we should load
537     // well known modules
538     AutoMutex lock(mHardwareLock);
539     if (module == 0) {
540         ALOGW("findSuitableHwDev_l() loading well know audio hw modules");
541         for (size_t i = 0; i < arraysize(audio_interfaces); i++) {
542             loadHwModule_l(audio_interfaces[i]);
543         }
544         // then try to find a module supporting the requested device.
545         for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
546             AudioHwDevice *audioHwDevice = mAudioHwDevs.valueAt(i);
547             sp<DeviceHalInterface> dev = audioHwDevice->hwDevice();
548             uint32_t supportedDevices;
549             if (dev->getSupportedDevices(&supportedDevices) == OK &&
550                     (supportedDevices & deviceType) == deviceType) {
551                 return audioHwDevice;
552             }
553         }
554     } else {
555         // check a match for the requested module handle
556         AudioHwDevice *audioHwDevice = mAudioHwDevs.valueFor(module);
557         if (audioHwDevice != NULL) {
558             return audioHwDevice;
559         }
560     }
561 
562     return NULL;
563 }
564 
dumpClients(int fd,const Vector<String16> & args __unused)565 void AudioFlinger::dumpClients(int fd, const Vector<String16>& args __unused)
566 {
567     String8 result;
568 
569     result.append("Clients:\n");
570     for (size_t i = 0; i < mClients.size(); ++i) {
571         sp<Client> client = mClients.valueAt(i).promote();
572         if (client != 0) {
573             result.appendFormat("  pid: %d\n", client->pid());
574         }
575     }
576 
577     result.append("Notification Clients:\n");
578     result.append("   pid    uid  name\n");
579     for (size_t i = 0; i < mNotificationClients.size(); ++i) {
580         const pid_t pid = mNotificationClients[i]->getPid();
581         const uid_t uid = mNotificationClients[i]->getUid();
582         const mediautils::UidInfo::Info info = mUidInfo.getInfo(uid);
583         result.appendFormat("%6d %6u  %s\n", pid, uid, info.package.c_str());
584     }
585 
586     result.append("Global session refs:\n");
587     result.append("  session  cnt     pid    uid  name\n");
588     for (size_t i = 0; i < mAudioSessionRefs.size(); i++) {
589         AudioSessionRef *r = mAudioSessionRefs[i];
590         const mediautils::UidInfo::Info info = mUidInfo.getInfo(r->mUid);
591         result.appendFormat("  %7d %4d %7d %6u  %s\n", r->mSessionid, r->mCnt, r->mPid,
592                 r->mUid, info.package.c_str());
593     }
594     write(fd, result.string(), result.size());
595 }
596 
597 
dumpInternals(int fd,const Vector<String16> & args __unused)598 void AudioFlinger::dumpInternals(int fd, const Vector<String16>& args __unused)
599 {
600     const size_t SIZE = 256;
601     char buffer[SIZE];
602     String8 result;
603     hardware_call_state hardwareStatus = mHardwareStatus;
604 
605     snprintf(buffer, SIZE, "Hardware status: %d\n"
606                            "Standby Time mSec: %u\n",
607                             hardwareStatus,
608                             (uint32_t)(mStandbyTimeInNsecs / 1000000));
609     result.append(buffer);
610     write(fd, result.string(), result.size());
611 }
612 
dumpPermissionDenial(int fd,const Vector<String16> & args __unused)613 void AudioFlinger::dumpPermissionDenial(int fd, const Vector<String16>& args __unused)
614 {
615     const size_t SIZE = 256;
616     char buffer[SIZE];
617     String8 result;
618     snprintf(buffer, SIZE, "Permission Denial: "
619             "can't dump AudioFlinger from pid=%d, uid=%d\n",
620             IPCThreadState::self()->getCallingPid(),
621             IPCThreadState::self()->getCallingUid());
622     result.append(buffer);
623     write(fd, result.string(), result.size());
624 }
625 
dumpTryLock(Mutex & mutex)626 bool AudioFlinger::dumpTryLock(Mutex& mutex)
627 {
628     status_t err = mutex.timedLock(kDumpLockTimeoutNs);
629     return err == NO_ERROR;
630 }
631 
dump(int fd,const Vector<String16> & args)632 status_t AudioFlinger::dump(int fd, const Vector<String16>& args)
633 {
634     if (!dumpAllowed()) {
635         dumpPermissionDenial(fd, args);
636     } else {
637         // get state of hardware lock
638         bool hardwareLocked = dumpTryLock(mHardwareLock);
639         if (!hardwareLocked) {
640             String8 result(kHardwareLockedString);
641             write(fd, result.string(), result.size());
642         } else {
643             mHardwareLock.unlock();
644         }
645 
646         const bool locked = dumpTryLock(mLock);
647 
648         // failed to lock - AudioFlinger is probably deadlocked
649         if (!locked) {
650             String8 result(kDeadlockedString);
651             write(fd, result.string(), result.size());
652         }
653 
654         bool clientLocked = dumpTryLock(mClientLock);
655         if (!clientLocked) {
656             String8 result(kClientLockedString);
657             write(fd, result.string(), result.size());
658         }
659 
660         if (mEffectsFactoryHal != 0) {
661             mEffectsFactoryHal->dumpEffects(fd);
662         } else {
663             String8 result(kNoEffectsFactory);
664             write(fd, result.string(), result.size());
665         }
666 
667         dumpClients(fd, args);
668         if (clientLocked) {
669             mClientLock.unlock();
670         }
671 
672         dumpInternals(fd, args);
673 
674         // dump playback threads
675         for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
676             mPlaybackThreads.valueAt(i)->dump(fd, args);
677         }
678 
679         // dump record threads
680         for (size_t i = 0; i < mRecordThreads.size(); i++) {
681             mRecordThreads.valueAt(i)->dump(fd, args);
682         }
683 
684         // dump mmap threads
685         for (size_t i = 0; i < mMmapThreads.size(); i++) {
686             mMmapThreads.valueAt(i)->dump(fd, args);
687         }
688 
689         // dump orphan effect chains
690         if (mOrphanEffectChains.size() != 0) {
691             write(fd, "  Orphan Effect Chains\n", strlen("  Orphan Effect Chains\n"));
692             for (size_t i = 0; i < mOrphanEffectChains.size(); i++) {
693                 mOrphanEffectChains.valueAt(i)->dump(fd, args);
694             }
695         }
696         // dump all hardware devs
697         for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
698             sp<DeviceHalInterface> dev = mAudioHwDevs.valueAt(i)->hwDevice();
699             dev->dump(fd, args);
700         }
701 
702         mPatchPanel.dump(fd);
703 
704         mDeviceEffectManager.dump(fd);
705 
706         // dump external setParameters
707         auto dumpLogger = [fd](SimpleLog& logger, const char* name) {
708             dprintf(fd, "\n%s setParameters:\n", name);
709             logger.dump(fd, "    " /* prefix */);
710         };
711         dumpLogger(mRejectedSetParameterLog, "Rejected");
712         dumpLogger(mAppSetParameterLog, "App");
713         dumpLogger(mSystemSetParameterLog, "System");
714 
715         // dump historical threads in the last 10 seconds
716         const std::string threadLog = mThreadLog.dumpToString(
717                 "Historical Thread Log ", 0 /* lines */,
718                 audio_utils_get_real_time_ns() - 10 * 60 * NANOS_PER_SECOND);
719         write(fd, threadLog.c_str(), threadLog.size());
720 
721         BUFLOG_RESET;
722 
723         if (locked) {
724             mLock.unlock();
725         }
726 
727 #ifdef TEE_SINK
728         // NBAIO_Tee dump is safe to call outside of AF lock.
729         NBAIO_Tee::dumpAll(fd, "_DUMP");
730 #endif
731         // append a copy of media.log here by forwarding fd to it, but don't attempt
732         // to lookup the service if it's not running, as it will block for a second
733         if (sMediaLogServiceAsBinder != 0) {
734             dprintf(fd, "\nmedia.log:\n");
735             Vector<String16> args;
736             sMediaLogServiceAsBinder->dump(fd, args);
737         }
738 
739         // check for optional arguments
740         bool dumpMem = false;
741         bool unreachableMemory = false;
742         for (const auto &arg : args) {
743             if (arg == String16("-m")) {
744                 dumpMem = true;
745             } else if (arg == String16("--unreachable")) {
746                 unreachableMemory = true;
747             }
748         }
749 
750         if (dumpMem) {
751             dprintf(fd, "\nDumping memory:\n");
752             std::string s = dumpMemoryAddresses(100 /* limit */);
753             write(fd, s.c_str(), s.size());
754         }
755         if (unreachableMemory) {
756             dprintf(fd, "\nDumping unreachable memory:\n");
757             // TODO - should limit be an argument parameter?
758             std::string s = GetUnreachableMemoryString(true /* contents */, 100 /* limit */);
759             write(fd, s.c_str(), s.size());
760         }
761     }
762     return NO_ERROR;
763 }
764 
registerPid(pid_t pid)765 sp<AudioFlinger::Client> AudioFlinger::registerPid(pid_t pid)
766 {
767     Mutex::Autolock _cl(mClientLock);
768     // If pid is already in the mClients wp<> map, then use that entry
769     // (for which promote() is always != 0), otherwise create a new entry and Client.
770     sp<Client> client = mClients.valueFor(pid).promote();
771     if (client == 0) {
772         client = new Client(this, pid);
773         mClients.add(pid, client);
774     }
775 
776     return client;
777 }
778 
newWriter_l(size_t size,const char * name)779 sp<NBLog::Writer> AudioFlinger::newWriter_l(size_t size, const char *name)
780 {
781     // If there is no memory allocated for logs, return a no-op writer that does nothing.
782     // Similarly if we can't contact the media.log service, also return a no-op writer.
783     if (mLogMemoryDealer == 0 || sMediaLogService == 0) {
784         return new NBLog::Writer();
785     }
786     sp<IMemory> shared = mLogMemoryDealer->allocate(NBLog::Timeline::sharedSize(size));
787     // If allocation fails, consult the vector of previously unregistered writers
788     // and garbage-collect one or more them until an allocation succeeds
789     if (shared == 0) {
790         Mutex::Autolock _l(mUnregisteredWritersLock);
791         for (size_t count = mUnregisteredWriters.size(); count > 0; count--) {
792             {
793                 // Pick the oldest stale writer to garbage-collect
794                 sp<IMemory> iMemory(mUnregisteredWriters[0]->getIMemory());
795                 mUnregisteredWriters.removeAt(0);
796                 sMediaLogService->unregisterWriter(iMemory);
797                 // Now the media.log remote reference to IMemory is gone.  When our last local
798                 // reference to IMemory also drops to zero at end of this block,
799                 // the IMemory destructor will deallocate the region from mLogMemoryDealer.
800             }
801             // Re-attempt the allocation
802             shared = mLogMemoryDealer->allocate(NBLog::Timeline::sharedSize(size));
803             if (shared != 0) {
804                 goto success;
805             }
806         }
807         // Even after garbage-collecting all old writers, there is still not enough memory,
808         // so return a no-op writer
809         return new NBLog::Writer();
810     }
811 success:
812     NBLog::Shared *sharedRawPtr = (NBLog::Shared *) shared->unsecurePointer();
813     new((void *) sharedRawPtr) NBLog::Shared(); // placement new here, but the corresponding
814                                                 // explicit destructor not needed since it is POD
815     sMediaLogService->registerWriter(shared, size, name);
816     return new NBLog::Writer(shared, size);
817 }
818 
unregisterWriter(const sp<NBLog::Writer> & writer)819 void AudioFlinger::unregisterWriter(const sp<NBLog::Writer>& writer)
820 {
821     if (writer == 0) {
822         return;
823     }
824     sp<IMemory> iMemory(writer->getIMemory());
825     if (iMemory == 0) {
826         return;
827     }
828     // Rather than removing the writer immediately, append it to a queue of old writers to
829     // be garbage-collected later.  This allows us to continue to view old logs for a while.
830     Mutex::Autolock _l(mUnregisteredWritersLock);
831     mUnregisteredWriters.push(writer);
832 }
833 
834 // IAudioFlinger interface
835 
createTrack(const media::CreateTrackRequest & _input,media::CreateTrackResponse & _output)836 status_t AudioFlinger::createTrack(const media::CreateTrackRequest& _input,
837                                    media::CreateTrackResponse& _output)
838 {
839     // Local version of VALUE_OR_RETURN, specific to this method's calling conventions.
840     CreateTrackInput input = VALUE_OR_RETURN_STATUS(CreateTrackInput::fromAidl(_input));
841     CreateTrackOutput output;
842 
843     sp<PlaybackThread::Track> track;
844     sp<TrackHandle> trackHandle;
845     sp<Client> client;
846     status_t lStatus;
847     audio_stream_type_t streamType;
848     audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
849     std::vector<audio_io_handle_t> secondaryOutputs;
850 
851     // TODO b/182392553: refactor or make clearer
852     pid_t clientPid =
853         VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_pid_t(input.clientInfo.attributionSource.pid));
854     bool updatePid = (clientPid == (pid_t)-1);
855     const uid_t callingUid = IPCThreadState::self()->getCallingUid();
856     uid_t clientUid =
857         VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_uid_t(input.clientInfo.attributionSource.uid));
858     audio_io_handle_t effectThreadId = AUDIO_IO_HANDLE_NONE;
859     std::vector<int> effectIds;
860     audio_attributes_t localAttr = input.attr;
861 
862     AttributionSourceState adjAttributionSource = input.clientInfo.attributionSource;
863     if (!isAudioServerOrMediaServerUid(callingUid)) {
864         ALOGW_IF(clientUid != callingUid,
865                 "%s uid %d tried to pass itself off as %d",
866                 __FUNCTION__, callingUid, clientUid);
867         adjAttributionSource.uid = VALUE_OR_RETURN_STATUS(legacy2aidl_uid_t_int32_t(callingUid));
868         clientUid = callingUid;
869         updatePid = true;
870     }
871     const pid_t callingPid = IPCThreadState::self()->getCallingPid();
872     if (updatePid) {
873         ALOGW_IF(clientPid != (pid_t)-1 && clientPid != callingPid,
874                  "%s uid %d pid %d tried to pass itself off as pid %d",
875                  __func__, callingUid, callingPid, clientPid);
876         clientPid = callingPid;
877         adjAttributionSource.pid = VALUE_OR_RETURN_STATUS(legacy2aidl_pid_t_int32_t(callingPid));
878     }
879 
880     audio_session_t sessionId = input.sessionId;
881     if (sessionId == AUDIO_SESSION_ALLOCATE) {
882         sessionId = (audio_session_t) newAudioUniqueId(AUDIO_UNIQUE_ID_USE_SESSION);
883     } else if (audio_unique_id_get_use(sessionId) != AUDIO_UNIQUE_ID_USE_SESSION) {
884         lStatus = BAD_VALUE;
885         goto Exit;
886     }
887 
888     output.sessionId = sessionId;
889     output.outputId = AUDIO_IO_HANDLE_NONE;
890     output.selectedDeviceId = input.selectedDeviceId;
891     lStatus = AudioSystem::getOutputForAttr(&localAttr, &output.outputId, sessionId, &streamType,
892                                             adjAttributionSource, &input.config, input.flags,
893                                             &output.selectedDeviceId, &portId, &secondaryOutputs);
894 
895     if (lStatus != NO_ERROR || output.outputId == AUDIO_IO_HANDLE_NONE) {
896         ALOGE("createTrack() getOutputForAttr() return error %d or invalid output handle", lStatus);
897         goto Exit;
898     }
899     // client AudioTrack::set already implements AUDIO_STREAM_DEFAULT => AUDIO_STREAM_MUSIC,
900     // but if someone uses binder directly they could bypass that and cause us to crash
901     if (uint32_t(streamType) >= AUDIO_STREAM_CNT) {
902         ALOGE("createTrack() invalid stream type %d", streamType);
903         lStatus = BAD_VALUE;
904         goto Exit;
905     }
906 
907     // further channel mask checks are performed by createTrack_l() depending on the thread type
908     if (!audio_is_output_channel(input.config.channel_mask)) {
909         ALOGE("createTrack() invalid channel mask %#x", input.config.channel_mask);
910         lStatus = BAD_VALUE;
911         goto Exit;
912     }
913 
914     // further format checks are performed by createTrack_l() depending on the thread type
915     if (!audio_is_valid_format(input.config.format)) {
916         ALOGE("createTrack() invalid format %#x", input.config.format);
917         lStatus = BAD_VALUE;
918         goto Exit;
919     }
920 
921     {
922         Mutex::Autolock _l(mLock);
923         PlaybackThread *thread = checkPlaybackThread_l(output.outputId);
924         if (thread == NULL) {
925             ALOGE("no playback thread found for output handle %d", output.outputId);
926             lStatus = BAD_VALUE;
927             goto Exit;
928         }
929 
930         client = registerPid(clientPid);
931 
932         PlaybackThread *effectThread = NULL;
933         // check if an effect chain with the same session ID is present on another
934         // output thread and move it here.
935         for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
936             sp<PlaybackThread> t = mPlaybackThreads.valueAt(i);
937             if (mPlaybackThreads.keyAt(i) != output.outputId) {
938                 uint32_t sessions = t->hasAudioSession(sessionId);
939                 if (sessions & ThreadBase::EFFECT_SESSION) {
940                     effectThread = t.get();
941                     break;
942                 }
943             }
944         }
945         ALOGV("createTrack() sessionId: %d", sessionId);
946 
947         output.sampleRate = input.config.sample_rate;
948         output.frameCount = input.frameCount;
949         output.notificationFrameCount = input.notificationFrameCount;
950         output.flags = input.flags;
951         output.streamType = streamType;
952 
953         track = thread->createTrack_l(client, streamType, localAttr, &output.sampleRate,
954                                       input.config.format, input.config.channel_mask,
955                                       &output.frameCount, &output.notificationFrameCount,
956                                       input.notificationsPerBuffer, input.speed,
957                                       input.sharedBuffer, sessionId, &output.flags,
958                                       callingPid, adjAttributionSource, input.clientInfo.clientTid,
959                                       &lStatus, portId, input.audioTrackCallback);
960         LOG_ALWAYS_FATAL_IF((lStatus == NO_ERROR) && (track == 0));
961         // we don't abort yet if lStatus != NO_ERROR; there is still work to be done regardless
962 
963         output.afFrameCount = thread->frameCount();
964         output.afSampleRate = thread->sampleRate();
965         output.afLatencyMs = thread->latency();
966         output.portId = portId;
967 
968         if (lStatus == NO_ERROR) {
969             // Connect secondary outputs. Failure on a secondary output must not imped the primary
970             // Any secondary output setup failure will lead to a desync between the AP and AF until
971             // the track is destroyed.
972             updateSecondaryOutputsForTrack_l(track.get(), thread, secondaryOutputs);
973         }
974 
975         // move effect chain to this output thread if an effect on same session was waiting
976         // for a track to be created
977         if (lStatus == NO_ERROR && effectThread != NULL) {
978             // no risk of deadlock because AudioFlinger::mLock is held
979             Mutex::Autolock _dl(thread->mLock);
980             Mutex::Autolock _sl(effectThread->mLock);
981             if (moveEffectChain_l(sessionId, effectThread, thread) == NO_ERROR) {
982                 effectThreadId = thread->id();
983                 effectIds = thread->getEffectIds_l(sessionId);
984             }
985         }
986 
987         // Look for sync events awaiting for a session to be used.
988         for (size_t i = 0; i < mPendingSyncEvents.size(); i++) {
989             if (mPendingSyncEvents[i]->triggerSession() == sessionId) {
990                 if (thread->isValidSyncEvent(mPendingSyncEvents[i])) {
991                     if (lStatus == NO_ERROR) {
992                         (void) track->setSyncEvent(mPendingSyncEvents[i]);
993                     } else {
994                         mPendingSyncEvents[i]->cancel();
995                     }
996                     mPendingSyncEvents.removeAt(i);
997                     i--;
998                 }
999             }
1000         }
1001 
1002         setAudioHwSyncForSession_l(thread, sessionId);
1003     }
1004 
1005     if (lStatus != NO_ERROR) {
1006         // remove local strong reference to Client before deleting the Track so that the
1007         // Client destructor is called by the TrackBase destructor with mClientLock held
1008         // Don't hold mClientLock when releasing the reference on the track as the
1009         // destructor will acquire it.
1010         {
1011             Mutex::Autolock _cl(mClientLock);
1012             client.clear();
1013         }
1014         track.clear();
1015         goto Exit;
1016     }
1017 
1018     // effectThreadId is not NONE if an effect chain corresponding to the track session
1019     // was found on another thread and must be moved on this thread
1020     if (effectThreadId != AUDIO_IO_HANDLE_NONE) {
1021         AudioSystem::moveEffectsToIo(effectIds, effectThreadId);
1022     }
1023 
1024     output.audioTrack = new TrackHandle(track);
1025     _output = VALUE_OR_FATAL(output.toAidl());
1026 
1027 Exit:
1028     if (lStatus != NO_ERROR && output.outputId != AUDIO_IO_HANDLE_NONE) {
1029         AudioSystem::releaseOutput(portId);
1030     }
1031     return lStatus;
1032 }
1033 
sampleRate(audio_io_handle_t ioHandle) const1034 uint32_t AudioFlinger::sampleRate(audio_io_handle_t ioHandle) const
1035 {
1036     Mutex::Autolock _l(mLock);
1037     ThreadBase *thread = checkThread_l(ioHandle);
1038     if (thread == NULL) {
1039         ALOGW("sampleRate() unknown thread %d", ioHandle);
1040         return 0;
1041     }
1042     return thread->sampleRate();
1043 }
1044 
format(audio_io_handle_t output) const1045 audio_format_t AudioFlinger::format(audio_io_handle_t output) const
1046 {
1047     Mutex::Autolock _l(mLock);
1048     PlaybackThread *thread = checkPlaybackThread_l(output);
1049     if (thread == NULL) {
1050         ALOGW("format() unknown thread %d", output);
1051         return AUDIO_FORMAT_INVALID;
1052     }
1053     return thread->format();
1054 }
1055 
frameCount(audio_io_handle_t ioHandle) const1056 size_t AudioFlinger::frameCount(audio_io_handle_t ioHandle) const
1057 {
1058     Mutex::Autolock _l(mLock);
1059     ThreadBase *thread = checkThread_l(ioHandle);
1060     if (thread == NULL) {
1061         ALOGW("frameCount() unknown thread %d", ioHandle);
1062         return 0;
1063     }
1064     // FIXME currently returns the normal mixer's frame count to avoid confusing legacy callers;
1065     //       should examine all callers and fix them to handle smaller counts
1066     return thread->frameCount();
1067 }
1068 
frameCountHAL(audio_io_handle_t ioHandle) const1069 size_t AudioFlinger::frameCountHAL(audio_io_handle_t ioHandle) const
1070 {
1071     Mutex::Autolock _l(mLock);
1072     ThreadBase *thread = checkThread_l(ioHandle);
1073     if (thread == NULL) {
1074         ALOGW("frameCountHAL() unknown thread %d", ioHandle);
1075         return 0;
1076     }
1077     return thread->frameCountHAL();
1078 }
1079 
latency(audio_io_handle_t output) const1080 uint32_t AudioFlinger::latency(audio_io_handle_t output) const
1081 {
1082     Mutex::Autolock _l(mLock);
1083     PlaybackThread *thread = checkPlaybackThread_l(output);
1084     if (thread == NULL) {
1085         ALOGW("latency(): no playback thread found for output handle %d", output);
1086         return 0;
1087     }
1088     return thread->latency();
1089 }
1090 
setMasterVolume(float value)1091 status_t AudioFlinger::setMasterVolume(float value)
1092 {
1093     status_t ret = initCheck();
1094     if (ret != NO_ERROR) {
1095         return ret;
1096     }
1097 
1098     // check calling permissions
1099     if (!settingsAllowed()) {
1100         return PERMISSION_DENIED;
1101     }
1102 
1103     Mutex::Autolock _l(mLock);
1104     mMasterVolume = value;
1105 
1106     // Set master volume in the HALs which support it.
1107     {
1108         AutoMutex lock(mHardwareLock);
1109         for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
1110             AudioHwDevice *dev = mAudioHwDevs.valueAt(i);
1111 
1112             mHardwareStatus = AUDIO_HW_SET_MASTER_VOLUME;
1113             if (dev->canSetMasterVolume()) {
1114                 dev->hwDevice()->setMasterVolume(value);
1115             }
1116             mHardwareStatus = AUDIO_HW_IDLE;
1117         }
1118     }
1119     // Now set the master volume in each playback thread.  Playback threads
1120     // assigned to HALs which do not have master volume support will apply
1121     // master volume during the mix operation.  Threads with HALs which do
1122     // support master volume will simply ignore the setting.
1123     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
1124         if (mPlaybackThreads.valueAt(i)->isDuplicating()) {
1125             continue;
1126         }
1127         mPlaybackThreads.valueAt(i)->setMasterVolume(value);
1128     }
1129 
1130     return NO_ERROR;
1131 }
1132 
setMasterBalance(float balance)1133 status_t AudioFlinger::setMasterBalance(float balance)
1134 {
1135     status_t ret = initCheck();
1136     if (ret != NO_ERROR) {
1137         return ret;
1138     }
1139 
1140     // check calling permissions
1141     if (!settingsAllowed()) {
1142         return PERMISSION_DENIED;
1143     }
1144 
1145     // check range
1146     if (isnan(balance) || fabs(balance) > 1.f) {
1147         return BAD_VALUE;
1148     }
1149 
1150     Mutex::Autolock _l(mLock);
1151 
1152     // short cut.
1153     if (mMasterBalance == balance) return NO_ERROR;
1154 
1155     mMasterBalance = balance;
1156 
1157     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
1158         if (mPlaybackThreads.valueAt(i)->isDuplicating()) {
1159             continue;
1160         }
1161         mPlaybackThreads.valueAt(i)->setMasterBalance(balance);
1162     }
1163 
1164     return NO_ERROR;
1165 }
1166 
setMode(audio_mode_t mode)1167 status_t AudioFlinger::setMode(audio_mode_t mode)
1168 {
1169     status_t ret = initCheck();
1170     if (ret != NO_ERROR) {
1171         return ret;
1172     }
1173 
1174     // check calling permissions
1175     if (!settingsAllowed()) {
1176         return PERMISSION_DENIED;
1177     }
1178     if (uint32_t(mode) >= AUDIO_MODE_CNT) {
1179         ALOGW("Illegal value: setMode(%d)", mode);
1180         return BAD_VALUE;
1181     }
1182 
1183     { // scope for the lock
1184         AutoMutex lock(mHardwareLock);
1185         if (mPrimaryHardwareDev == nullptr) {
1186             return INVALID_OPERATION;
1187         }
1188         sp<DeviceHalInterface> dev = mPrimaryHardwareDev->hwDevice();
1189         mHardwareStatus = AUDIO_HW_SET_MODE;
1190         ret = dev->setMode(mode);
1191         mHardwareStatus = AUDIO_HW_IDLE;
1192     }
1193 
1194     if (NO_ERROR == ret) {
1195         Mutex::Autolock _l(mLock);
1196         mMode = mode;
1197         for (size_t i = 0; i < mPlaybackThreads.size(); i++)
1198             mPlaybackThreads.valueAt(i)->setMode(mode);
1199     }
1200 
1201     mediametrics::LogItem(mMetricsId)
1202         .set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_SETMODE)
1203         .set(AMEDIAMETRICS_PROP_AUDIOMODE, toString(mode))
1204         .record();
1205     return ret;
1206 }
1207 
setMicMute(bool state)1208 status_t AudioFlinger::setMicMute(bool state)
1209 {
1210     status_t ret = initCheck();
1211     if (ret != NO_ERROR) {
1212         return ret;
1213     }
1214 
1215     // check calling permissions
1216     if (!settingsAllowed()) {
1217         return PERMISSION_DENIED;
1218     }
1219 
1220     AutoMutex lock(mHardwareLock);
1221     if (mPrimaryHardwareDev == nullptr) {
1222         return INVALID_OPERATION;
1223     }
1224     sp<DeviceHalInterface> primaryDev = mPrimaryHardwareDev->hwDevice();
1225     if (primaryDev == nullptr) {
1226         ALOGW("%s: no primary HAL device", __func__);
1227         return INVALID_OPERATION;
1228     }
1229     mHardwareStatus = AUDIO_HW_SET_MIC_MUTE;
1230     ret = primaryDev->setMicMute(state);
1231     for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
1232         sp<DeviceHalInterface> dev = mAudioHwDevs.valueAt(i)->hwDevice();
1233         if (dev != primaryDev) {
1234             (void)dev->setMicMute(state);
1235         }
1236     }
1237     mHardwareStatus = AUDIO_HW_IDLE;
1238     ALOGW_IF(ret != NO_ERROR, "%s: error %d setting state to HAL", __func__, ret);
1239     return ret;
1240 }
1241 
getMicMute() const1242 bool AudioFlinger::getMicMute() const
1243 {
1244     status_t ret = initCheck();
1245     if (ret != NO_ERROR) {
1246         return false;
1247     }
1248     AutoMutex lock(mHardwareLock);
1249     if (mPrimaryHardwareDev == nullptr) {
1250         return false;
1251     }
1252     sp<DeviceHalInterface> primaryDev = mPrimaryHardwareDev->hwDevice();
1253     if (primaryDev == nullptr) {
1254         ALOGW("%s: no primary HAL device", __func__);
1255         return false;
1256     }
1257     bool state;
1258     mHardwareStatus = AUDIO_HW_GET_MIC_MUTE;
1259     ret = primaryDev->getMicMute(&state);
1260     mHardwareStatus = AUDIO_HW_IDLE;
1261     ALOGE_IF(ret != NO_ERROR, "%s: error %d getting state from HAL", __func__, ret);
1262     return (ret == NO_ERROR) && state;
1263 }
1264 
setRecordSilenced(audio_port_handle_t portId,bool silenced)1265 void AudioFlinger::setRecordSilenced(audio_port_handle_t portId, bool silenced)
1266 {
1267     ALOGV("AudioFlinger::setRecordSilenced(portId:%d, silenced:%d)", portId, silenced);
1268 
1269     AutoMutex lock(mLock);
1270     for (size_t i = 0; i < mRecordThreads.size(); i++) {
1271         mRecordThreads[i]->setRecordSilenced(portId, silenced);
1272     }
1273     for (size_t i = 0; i < mMmapThreads.size(); i++) {
1274         mMmapThreads[i]->setRecordSilenced(portId, silenced);
1275     }
1276 }
1277 
setMasterMute(bool muted)1278 status_t AudioFlinger::setMasterMute(bool muted)
1279 {
1280     status_t ret = initCheck();
1281     if (ret != NO_ERROR) {
1282         return ret;
1283     }
1284 
1285     // check calling permissions
1286     if (!settingsAllowed()) {
1287         return PERMISSION_DENIED;
1288     }
1289 
1290     Mutex::Autolock _l(mLock);
1291     mMasterMute = muted;
1292 
1293     // Set master mute in the HALs which support it.
1294     {
1295         AutoMutex lock(mHardwareLock);
1296         for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
1297             AudioHwDevice *dev = mAudioHwDevs.valueAt(i);
1298 
1299             mHardwareStatus = AUDIO_HW_SET_MASTER_MUTE;
1300             if (dev->canSetMasterMute()) {
1301                 dev->hwDevice()->setMasterMute(muted);
1302             }
1303             mHardwareStatus = AUDIO_HW_IDLE;
1304         }
1305     }
1306 
1307     // Now set the master mute in each playback thread.  Playback threads
1308     // assigned to HALs which do not have master mute support will apply master mute
1309     // during the mix operation.  Threads with HALs which do support master mute
1310     // will simply ignore the setting.
1311     Vector<VolumeInterface *> volumeInterfaces = getAllVolumeInterfaces_l();
1312     for (size_t i = 0; i < volumeInterfaces.size(); i++) {
1313         volumeInterfaces[i]->setMasterMute(muted);
1314     }
1315 
1316     return NO_ERROR;
1317 }
1318 
masterVolume() const1319 float AudioFlinger::masterVolume() const
1320 {
1321     Mutex::Autolock _l(mLock);
1322     return masterVolume_l();
1323 }
1324 
getMasterBalance(float * balance) const1325 status_t AudioFlinger::getMasterBalance(float *balance) const
1326 {
1327     Mutex::Autolock _l(mLock);
1328     *balance = getMasterBalance_l();
1329     return NO_ERROR; // if called through binder, may return a transactional error
1330 }
1331 
masterMute() const1332 bool AudioFlinger::masterMute() const
1333 {
1334     Mutex::Autolock _l(mLock);
1335     return masterMute_l();
1336 }
1337 
masterVolume_l() const1338 float AudioFlinger::masterVolume_l() const
1339 {
1340     return mMasterVolume;
1341 }
1342 
getMasterBalance_l() const1343 float AudioFlinger::getMasterBalance_l() const
1344 {
1345     return mMasterBalance;
1346 }
1347 
masterMute_l() const1348 bool AudioFlinger::masterMute_l() const
1349 {
1350     return mMasterMute;
1351 }
1352 
checkStreamType(audio_stream_type_t stream) const1353 status_t AudioFlinger::checkStreamType(audio_stream_type_t stream) const
1354 {
1355     if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
1356         ALOGW("checkStreamType() invalid stream %d", stream);
1357         return BAD_VALUE;
1358     }
1359     const uid_t callerUid = IPCThreadState::self()->getCallingUid();
1360     if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT && !isAudioServerUid(callerUid)) {
1361         ALOGW("checkStreamType() uid %d cannot use internal stream type %d", callerUid, stream);
1362         return PERMISSION_DENIED;
1363     }
1364 
1365     return NO_ERROR;
1366 }
1367 
setStreamVolume(audio_stream_type_t stream,float value,audio_io_handle_t output)1368 status_t AudioFlinger::setStreamVolume(audio_stream_type_t stream, float value,
1369         audio_io_handle_t output)
1370 {
1371     // check calling permissions
1372     if (!settingsAllowed()) {
1373         return PERMISSION_DENIED;
1374     }
1375 
1376     status_t status = checkStreamType(stream);
1377     if (status != NO_ERROR) {
1378         return status;
1379     }
1380     if (output == AUDIO_IO_HANDLE_NONE) {
1381         return BAD_VALUE;
1382     }
1383     LOG_ALWAYS_FATAL_IF(stream == AUDIO_STREAM_PATCH && value != 1.0f,
1384                         "AUDIO_STREAM_PATCH must have full scale volume");
1385 
1386     AutoMutex lock(mLock);
1387     VolumeInterface *volumeInterface = getVolumeInterface_l(output);
1388     if (volumeInterface == NULL) {
1389         return BAD_VALUE;
1390     }
1391     volumeInterface->setStreamVolume(stream, value);
1392 
1393     return NO_ERROR;
1394 }
1395 
setStreamMute(audio_stream_type_t stream,bool muted)1396 status_t AudioFlinger::setStreamMute(audio_stream_type_t stream, bool muted)
1397 {
1398     // check calling permissions
1399     if (!settingsAllowed()) {
1400         return PERMISSION_DENIED;
1401     }
1402 
1403     status_t status = checkStreamType(stream);
1404     if (status != NO_ERROR) {
1405         return status;
1406     }
1407     ALOG_ASSERT(stream != AUDIO_STREAM_PATCH, "attempt to mute AUDIO_STREAM_PATCH");
1408 
1409     if (uint32_t(stream) == AUDIO_STREAM_ENFORCED_AUDIBLE) {
1410         ALOGE("setStreamMute() invalid stream %d", stream);
1411         return BAD_VALUE;
1412     }
1413 
1414     AutoMutex lock(mLock);
1415     mStreamTypes[stream].mute = muted;
1416     Vector<VolumeInterface *> volumeInterfaces = getAllVolumeInterfaces_l();
1417     for (size_t i = 0; i < volumeInterfaces.size(); i++) {
1418         volumeInterfaces[i]->setStreamMute(stream, muted);
1419     }
1420 
1421     return NO_ERROR;
1422 }
1423 
streamVolume(audio_stream_type_t stream,audio_io_handle_t output) const1424 float AudioFlinger::streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const
1425 {
1426     status_t status = checkStreamType(stream);
1427     if (status != NO_ERROR) {
1428         return 0.0f;
1429     }
1430     if (output == AUDIO_IO_HANDLE_NONE) {
1431         return 0.0f;
1432     }
1433 
1434     AutoMutex lock(mLock);
1435     VolumeInterface *volumeInterface = getVolumeInterface_l(output);
1436     if (volumeInterface == NULL) {
1437         return 0.0f;
1438     }
1439 
1440     return volumeInterface->streamVolume(stream);
1441 }
1442 
streamMute(audio_stream_type_t stream) const1443 bool AudioFlinger::streamMute(audio_stream_type_t stream) const
1444 {
1445     status_t status = checkStreamType(stream);
1446     if (status != NO_ERROR) {
1447         return true;
1448     }
1449 
1450     AutoMutex lock(mLock);
1451     return streamMute_l(stream);
1452 }
1453 
1454 
broadcastParametersToRecordThreads_l(const String8 & keyValuePairs)1455 void AudioFlinger::broadcastParametersToRecordThreads_l(const String8& keyValuePairs)
1456 {
1457     for (size_t i = 0; i < mRecordThreads.size(); i++) {
1458         mRecordThreads.valueAt(i)->setParameters(keyValuePairs);
1459     }
1460 }
1461 
updateOutDevicesForRecordThreads_l(const DeviceDescriptorBaseVector & devices)1462 void AudioFlinger::updateOutDevicesForRecordThreads_l(const DeviceDescriptorBaseVector& devices)
1463 {
1464     for (size_t i = 0; i < mRecordThreads.size(); i++) {
1465         mRecordThreads.valueAt(i)->updateOutDevices(devices);
1466     }
1467 }
1468 
1469 // forwardAudioHwSyncToDownstreamPatches_l() must be called with AudioFlinger::mLock held
forwardParametersToDownstreamPatches_l(audio_io_handle_t upStream,const String8 & keyValuePairs,std::function<bool (const sp<PlaybackThread> &)> useThread)1470 void AudioFlinger::forwardParametersToDownstreamPatches_l(
1471         audio_io_handle_t upStream, const String8& keyValuePairs,
1472         std::function<bool(const sp<PlaybackThread>&)> useThread)
1473 {
1474     std::vector<PatchPanel::SoftwarePatch> swPatches;
1475     if (mPatchPanel.getDownstreamSoftwarePatches(upStream, &swPatches) != OK) return;
1476     ALOGV_IF(!swPatches.empty(), "%s found %zu downstream patches for stream ID %d",
1477             __func__, swPatches.size(), upStream);
1478     for (const auto& swPatch : swPatches) {
1479         sp<PlaybackThread> downStream = checkPlaybackThread_l(swPatch.getPlaybackThreadHandle());
1480         if (downStream != NULL && (useThread == nullptr || useThread(downStream))) {
1481             downStream->setParameters(keyValuePairs);
1482         }
1483     }
1484 }
1485 
1486 // Update downstream patches for all playback threads attached to an MSD module
updateDownStreamPatches_l(const struct audio_patch * patch,const std::set<audio_io_handle_t> streams)1487 void AudioFlinger::updateDownStreamPatches_l(const struct audio_patch *patch,
1488                                              const std::set<audio_io_handle_t> streams)
1489 {
1490     for (const audio_io_handle_t stream : streams) {
1491         PlaybackThread *playbackThread = checkPlaybackThread_l(stream);
1492         if (playbackThread == nullptr || !playbackThread->isMsdDevice()) {
1493             continue;
1494         }
1495         playbackThread->setDownStreamPatch(patch);
1496         playbackThread->sendIoConfigEvent(AUDIO_OUTPUT_CONFIG_CHANGED);
1497     }
1498 }
1499 
1500 // Filter reserved keys from setParameters() before forwarding to audio HAL or acting upon.
1501 // Some keys are used for audio routing and audio path configuration and should be reserved for use
1502 // by audio policy and audio flinger for functional, privacy and security reasons.
filterReservedParameters(String8 & keyValuePairs,uid_t callingUid)1503 void AudioFlinger::filterReservedParameters(String8& keyValuePairs, uid_t callingUid)
1504 {
1505     static const String8 kReservedParameters[] = {
1506         String8(AudioParameter::keyRouting),
1507         String8(AudioParameter::keySamplingRate),
1508         String8(AudioParameter::keyFormat),
1509         String8(AudioParameter::keyChannels),
1510         String8(AudioParameter::keyFrameCount),
1511         String8(AudioParameter::keyInputSource),
1512         String8(AudioParameter::keyMonoOutput),
1513         String8(AudioParameter::keyDeviceConnect),
1514         String8(AudioParameter::keyDeviceDisconnect),
1515         String8(AudioParameter::keyStreamSupportedFormats),
1516         String8(AudioParameter::keyStreamSupportedChannels),
1517         String8(AudioParameter::keyStreamSupportedSamplingRates),
1518     };
1519 
1520     if (isAudioServerUid(callingUid)) {
1521         return; // no need to filter if audioserver.
1522     }
1523 
1524     AudioParameter param = AudioParameter(keyValuePairs);
1525     String8 value;
1526     AudioParameter rejectedParam;
1527     for (auto& key : kReservedParameters) {
1528         if (param.get(key, value) == NO_ERROR) {
1529             rejectedParam.add(key, value);
1530             param.remove(key);
1531         }
1532     }
1533     logFilteredParameters(param.size() + rejectedParam.size(), keyValuePairs,
1534                           rejectedParam.size(), rejectedParam.toString(), callingUid);
1535     keyValuePairs = param.toString();
1536 }
1537 
logFilteredParameters(size_t originalKVPSize,const String8 & originalKVPs,size_t rejectedKVPSize,const String8 & rejectedKVPs,uid_t callingUid)1538 void AudioFlinger::logFilteredParameters(size_t originalKVPSize, const String8& originalKVPs,
1539                                          size_t rejectedKVPSize, const String8& rejectedKVPs,
1540                                          uid_t callingUid) {
1541     auto prefix = String8::format("UID %5d", callingUid);
1542     auto suffix = String8::format("%zu KVP received: %s", originalKVPSize, originalKVPs.c_str());
1543     if (rejectedKVPSize != 0) {
1544         auto error = String8::format("%zu KVP rejected: %s", rejectedKVPSize, rejectedKVPs.c_str());
1545         ALOGW("%s: %s, %s, %s", __func__, prefix.c_str(), error.c_str(), suffix.c_str());
1546         mRejectedSetParameterLog.log("%s, %s, %s", prefix.c_str(), error.c_str(), suffix.c_str());
1547     } else {
1548         auto& logger = (isServiceUid(callingUid) ? mSystemSetParameterLog : mAppSetParameterLog);
1549         logger.log("%s, %s", prefix.c_str(), suffix.c_str());
1550     }
1551 }
1552 
setParameters(audio_io_handle_t ioHandle,const String8 & keyValuePairs)1553 status_t AudioFlinger::setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
1554 {
1555     ALOGV("setParameters(): io %d, keyvalue %s, calling pid %d calling uid %d",
1556             ioHandle, keyValuePairs.string(),
1557             IPCThreadState::self()->getCallingPid(), IPCThreadState::self()->getCallingUid());
1558 
1559     // check calling permissions
1560     if (!settingsAllowed()) {
1561         return PERMISSION_DENIED;
1562     }
1563 
1564     String8 filteredKeyValuePairs = keyValuePairs;
1565     filterReservedParameters(filteredKeyValuePairs, IPCThreadState::self()->getCallingUid());
1566 
1567     ALOGV("%s: filtered keyvalue %s", __func__, filteredKeyValuePairs.string());
1568 
1569     // AUDIO_IO_HANDLE_NONE means the parameters are global to the audio hardware interface
1570     if (ioHandle == AUDIO_IO_HANDLE_NONE) {
1571         Mutex::Autolock _l(mLock);
1572         // result will remain NO_INIT if no audio device is present
1573         status_t final_result = NO_INIT;
1574         {
1575             AutoMutex lock(mHardwareLock);
1576             mHardwareStatus = AUDIO_HW_SET_PARAMETER;
1577             for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
1578                 sp<DeviceHalInterface> dev = mAudioHwDevs.valueAt(i)->hwDevice();
1579                 status_t result = dev->setParameters(filteredKeyValuePairs);
1580                 // return success if at least one audio device accepts the parameters as not all
1581                 // HALs are requested to support all parameters. If no audio device supports the
1582                 // requested parameters, the last error is reported.
1583                 if (final_result != NO_ERROR) {
1584                     final_result = result;
1585                 }
1586             }
1587             mHardwareStatus = AUDIO_HW_IDLE;
1588         }
1589         // disable AEC and NS if the device is a BT SCO headset supporting those pre processings
1590         AudioParameter param = AudioParameter(filteredKeyValuePairs);
1591         String8 value;
1592         if (param.get(String8(AudioParameter::keyBtNrec), value) == NO_ERROR) {
1593             bool btNrecIsOff = (value == AudioParameter::valueOff);
1594             if (mBtNrecIsOff.exchange(btNrecIsOff) != btNrecIsOff) {
1595                 for (size_t i = 0; i < mRecordThreads.size(); i++) {
1596                     mRecordThreads.valueAt(i)->checkBtNrec();
1597                 }
1598             }
1599         }
1600         String8 screenState;
1601         if (param.get(String8(AudioParameter::keyScreenState), screenState) == NO_ERROR) {
1602             bool isOff = (screenState == AudioParameter::valueOff);
1603             if (isOff != (AudioFlinger::mScreenState & 1)) {
1604                 AudioFlinger::mScreenState = ((AudioFlinger::mScreenState & ~1) + 2) | isOff;
1605             }
1606         }
1607         return final_result;
1608     }
1609 
1610     // hold a strong ref on thread in case closeOutput() or closeInput() is called
1611     // and the thread is exited once the lock is released
1612     sp<ThreadBase> thread;
1613     {
1614         Mutex::Autolock _l(mLock);
1615         thread = checkPlaybackThread_l(ioHandle);
1616         if (thread == 0) {
1617             thread = checkRecordThread_l(ioHandle);
1618             if (thread == 0) {
1619                 thread = checkMmapThread_l(ioHandle);
1620             }
1621         } else if (thread == primaryPlaybackThread_l()) {
1622             // indicate output device change to all input threads for pre processing
1623             AudioParameter param = AudioParameter(filteredKeyValuePairs);
1624             int value;
1625             if ((param.getInt(String8(AudioParameter::keyRouting), value) == NO_ERROR) &&
1626                     (value != 0)) {
1627                 broadcastParametersToRecordThreads_l(filteredKeyValuePairs);
1628             }
1629         }
1630     }
1631     if (thread != 0) {
1632         status_t result = thread->setParameters(filteredKeyValuePairs);
1633         forwardParametersToDownstreamPatches_l(thread->id(), filteredKeyValuePairs);
1634         return result;
1635     }
1636     return BAD_VALUE;
1637 }
1638 
getParameters(audio_io_handle_t ioHandle,const String8 & keys) const1639 String8 AudioFlinger::getParameters(audio_io_handle_t ioHandle, const String8& keys) const
1640 {
1641     ALOGVV("getParameters() io %d, keys %s, calling pid %d",
1642             ioHandle, keys.string(), IPCThreadState::self()->getCallingPid());
1643 
1644     Mutex::Autolock _l(mLock);
1645 
1646     if (ioHandle == AUDIO_IO_HANDLE_NONE) {
1647         String8 out_s8;
1648 
1649         AutoMutex lock(mHardwareLock);
1650         for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
1651             String8 s;
1652             mHardwareStatus = AUDIO_HW_GET_PARAMETER;
1653             sp<DeviceHalInterface> dev = mAudioHwDevs.valueAt(i)->hwDevice();
1654             status_t result = dev->getParameters(keys, &s);
1655             mHardwareStatus = AUDIO_HW_IDLE;
1656             if (result == OK) out_s8 += s;
1657         }
1658         return out_s8;
1659     }
1660 
1661     ThreadBase *thread = (ThreadBase *)checkPlaybackThread_l(ioHandle);
1662     if (thread == NULL) {
1663         thread = (ThreadBase *)checkRecordThread_l(ioHandle);
1664         if (thread == NULL) {
1665             thread = (ThreadBase *)checkMmapThread_l(ioHandle);
1666             if (thread == NULL) {
1667                 return String8("");
1668             }
1669         }
1670     }
1671     return thread->getParameters(keys);
1672 }
1673 
getInputBufferSize(uint32_t sampleRate,audio_format_t format,audio_channel_mask_t channelMask) const1674 size_t AudioFlinger::getInputBufferSize(uint32_t sampleRate, audio_format_t format,
1675         audio_channel_mask_t channelMask) const
1676 {
1677     status_t ret = initCheck();
1678     if (ret != NO_ERROR) {
1679         return 0;
1680     }
1681     if ((sampleRate == 0) ||
1682             !audio_is_valid_format(format) || !audio_has_proportional_frames(format) ||
1683             !audio_is_input_channel(channelMask)) {
1684         return 0;
1685     }
1686 
1687     AutoMutex lock(mHardwareLock);
1688     if (mPrimaryHardwareDev == nullptr) {
1689         return 0;
1690     }
1691     mHardwareStatus = AUDIO_HW_GET_INPUT_BUFFER_SIZE;
1692 
1693     sp<DeviceHalInterface> dev = mPrimaryHardwareDev->hwDevice();
1694     std::vector<audio_channel_mask_t> channelMasks = {channelMask};
1695     if (channelMask != AUDIO_CHANNEL_IN_MONO)
1696         channelMasks.push_back(AUDIO_CHANNEL_IN_MONO);
1697     if (channelMask != AUDIO_CHANNEL_IN_STEREO)
1698         channelMasks.push_back(AUDIO_CHANNEL_IN_STEREO);
1699 
1700     std::vector<audio_format_t> formats = {format};
1701     if (format != AUDIO_FORMAT_PCM_16_BIT)
1702         formats.push_back(AUDIO_FORMAT_PCM_16_BIT);
1703 
1704     std::vector<uint32_t> sampleRates = {sampleRate};
1705     static const uint32_t SR_44100 = 44100;
1706     static const uint32_t SR_48000 = 48000;
1707 
1708     if (sampleRate != SR_48000)
1709         sampleRates.push_back(SR_48000);
1710     if (sampleRate != SR_44100)
1711         sampleRates.push_back(SR_44100);
1712 
1713     mHardwareStatus = AUDIO_HW_IDLE;
1714 
1715     // Change parameters of the configuration each iteration until we find a
1716     // configuration that the device will support.
1717     audio_config_t config = AUDIO_CONFIG_INITIALIZER;
1718     for (auto testChannelMask : channelMasks) {
1719         config.channel_mask = testChannelMask;
1720         for (auto testFormat : formats) {
1721             config.format = testFormat;
1722             for (auto testSampleRate : sampleRates) {
1723                 config.sample_rate = testSampleRate;
1724 
1725                 size_t bytes = 0;
1726                 status_t result = dev->getInputBufferSize(&config, &bytes);
1727                 if (result != OK || bytes == 0) {
1728                     continue;
1729                 }
1730 
1731                 if (config.sample_rate != sampleRate || config.channel_mask != channelMask ||
1732                     config.format != format) {
1733                     uint32_t dstChannelCount = audio_channel_count_from_in_mask(channelMask);
1734                     uint32_t srcChannelCount =
1735                         audio_channel_count_from_in_mask(config.channel_mask);
1736                     size_t srcFrames =
1737                         bytes / audio_bytes_per_frame(srcChannelCount, config.format);
1738                     size_t dstFrames = destinationFramesPossible(
1739                         srcFrames, config.sample_rate, sampleRate);
1740                     bytes = dstFrames * audio_bytes_per_frame(dstChannelCount, format);
1741                 }
1742                 return bytes;
1743             }
1744         }
1745     }
1746 
1747     ALOGW("getInputBufferSize failed with minimum buffer size sampleRate %u, "
1748               "format %#x, channelMask %#x",sampleRate, format, channelMask);
1749     return 0;
1750 }
1751 
getInputFramesLost(audio_io_handle_t ioHandle) const1752 uint32_t AudioFlinger::getInputFramesLost(audio_io_handle_t ioHandle) const
1753 {
1754     Mutex::Autolock _l(mLock);
1755 
1756     RecordThread *recordThread = checkRecordThread_l(ioHandle);
1757     if (recordThread != NULL) {
1758         return recordThread->getInputFramesLost();
1759     }
1760     return 0;
1761 }
1762 
setVoiceVolume(float value)1763 status_t AudioFlinger::setVoiceVolume(float value)
1764 {
1765     status_t ret = initCheck();
1766     if (ret != NO_ERROR) {
1767         return ret;
1768     }
1769 
1770     // check calling permissions
1771     if (!settingsAllowed()) {
1772         return PERMISSION_DENIED;
1773     }
1774 
1775     AutoMutex lock(mHardwareLock);
1776     if (mPrimaryHardwareDev == nullptr) {
1777         return INVALID_OPERATION;
1778     }
1779     sp<DeviceHalInterface> dev = mPrimaryHardwareDev->hwDevice();
1780     mHardwareStatus = AUDIO_HW_SET_VOICE_VOLUME;
1781     ret = dev->setVoiceVolume(value);
1782     mHardwareStatus = AUDIO_HW_IDLE;
1783 
1784     mediametrics::LogItem(mMetricsId)
1785         .set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_SETVOICEVOLUME)
1786         .set(AMEDIAMETRICS_PROP_VOICEVOLUME, (double)value)
1787         .record();
1788     return ret;
1789 }
1790 
getRenderPosition(uint32_t * halFrames,uint32_t * dspFrames,audio_io_handle_t output) const1791 status_t AudioFlinger::getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
1792         audio_io_handle_t output) const
1793 {
1794     Mutex::Autolock _l(mLock);
1795 
1796     PlaybackThread *playbackThread = checkPlaybackThread_l(output);
1797     if (playbackThread != NULL) {
1798         return playbackThread->getRenderPosition(halFrames, dspFrames);
1799     }
1800 
1801     return BAD_VALUE;
1802 }
1803 
registerClient(const sp<media::IAudioFlingerClient> & client)1804 void AudioFlinger::registerClient(const sp<media::IAudioFlingerClient>& client)
1805 {
1806     Mutex::Autolock _l(mLock);
1807     if (client == 0) {
1808         return;
1809     }
1810     pid_t pid = IPCThreadState::self()->getCallingPid();
1811     const uid_t uid = IPCThreadState::self()->getCallingUid();
1812     {
1813         Mutex::Autolock _cl(mClientLock);
1814         if (mNotificationClients.indexOfKey(pid) < 0) {
1815             sp<NotificationClient> notificationClient = new NotificationClient(this,
1816                                                                                 client,
1817                                                                                 pid,
1818                                                                                 uid);
1819             ALOGV("registerClient() client %p, pid %d, uid %u",
1820                     notificationClient.get(), pid, uid);
1821 
1822             mNotificationClients.add(pid, notificationClient);
1823 
1824             sp<IBinder> binder = IInterface::asBinder(client);
1825             binder->linkToDeath(notificationClient);
1826         }
1827     }
1828 
1829     // mClientLock should not be held here because ThreadBase::sendIoConfigEvent() will lock the
1830     // ThreadBase mutex and the locking order is ThreadBase::mLock then AudioFlinger::mClientLock.
1831     // the config change is always sent from playback or record threads to avoid deadlock
1832     // with AudioSystem::gLock
1833     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
1834         mPlaybackThreads.valueAt(i)->sendIoConfigEvent(AUDIO_OUTPUT_REGISTERED, pid);
1835     }
1836 
1837     for (size_t i = 0; i < mRecordThreads.size(); i++) {
1838         mRecordThreads.valueAt(i)->sendIoConfigEvent(AUDIO_INPUT_REGISTERED, pid);
1839     }
1840 }
1841 
removeNotificationClient(pid_t pid)1842 void AudioFlinger::removeNotificationClient(pid_t pid)
1843 {
1844     std::vector< sp<AudioFlinger::EffectModule> > removedEffects;
1845     {
1846         Mutex::Autolock _l(mLock);
1847         {
1848             Mutex::Autolock _cl(mClientLock);
1849             mNotificationClients.removeItem(pid);
1850         }
1851 
1852         ALOGV("%d died, releasing its sessions", pid);
1853         size_t num = mAudioSessionRefs.size();
1854         bool removed = false;
1855         for (size_t i = 0; i < num; ) {
1856             AudioSessionRef *ref = mAudioSessionRefs.itemAt(i);
1857             ALOGV(" pid %d @ %zu", ref->mPid, i);
1858             if (ref->mPid == pid) {
1859                 ALOGV(" removing entry for pid %d session %d", pid, ref->mSessionid);
1860                 mAudioSessionRefs.removeAt(i);
1861                 delete ref;
1862                 removed = true;
1863                 num--;
1864             } else {
1865                 i++;
1866             }
1867         }
1868         if (removed) {
1869             removedEffects = purgeStaleEffects_l();
1870         }
1871     }
1872     for (auto& effect : removedEffects) {
1873         effect->updatePolicyState();
1874     }
1875 }
1876 
ioConfigChanged(audio_io_config_event event,const sp<AudioIoDescriptor> & ioDesc,pid_t pid)1877 void AudioFlinger::ioConfigChanged(audio_io_config_event event,
1878                                    const sp<AudioIoDescriptor>& ioDesc,
1879                                    pid_t pid) {
1880     media::AudioIoDescriptor descAidl = VALUE_OR_FATAL(
1881             legacy2aidl_AudioIoDescriptor_AudioIoDescriptor(ioDesc));
1882     media::AudioIoConfigEvent eventAidl = VALUE_OR_FATAL(
1883             legacy2aidl_audio_io_config_event_AudioIoConfigEvent(event));
1884 
1885     Mutex::Autolock _l(mClientLock);
1886     size_t size = mNotificationClients.size();
1887     for (size_t i = 0; i < size; i++) {
1888         if ((pid == 0) || (mNotificationClients.keyAt(i) == pid)) {
1889             mNotificationClients.valueAt(i)->audioFlingerClient()->ioConfigChanged(eventAidl,
1890                                                                                    descAidl);
1891         }
1892     }
1893 }
1894 
1895 // removeClient_l() must be called with AudioFlinger::mClientLock held
removeClient_l(pid_t pid)1896 void AudioFlinger::removeClient_l(pid_t pid)
1897 {
1898     ALOGV("removeClient_l() pid %d, calling pid %d", pid,
1899             IPCThreadState::self()->getCallingPid());
1900     mClients.removeItem(pid);
1901 }
1902 
1903 // getEffectThread_l() must be called with AudioFlinger::mLock held
getEffectThread_l(audio_session_t sessionId,int effectId)1904 sp<AudioFlinger::ThreadBase> AudioFlinger::getEffectThread_l(audio_session_t sessionId,
1905         int effectId)
1906 {
1907     sp<ThreadBase> thread;
1908 
1909     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
1910         if (mPlaybackThreads.valueAt(i)->getEffect(sessionId, effectId) != 0) {
1911             ALOG_ASSERT(thread == 0);
1912             thread = mPlaybackThreads.valueAt(i);
1913         }
1914     }
1915     if (thread != nullptr) {
1916         return thread;
1917     }
1918     for (size_t i = 0; i < mRecordThreads.size(); i++) {
1919         if (mRecordThreads.valueAt(i)->getEffect(sessionId, effectId) != 0) {
1920             ALOG_ASSERT(thread == 0);
1921             thread = mRecordThreads.valueAt(i);
1922         }
1923     }
1924     if (thread != nullptr) {
1925         return thread;
1926     }
1927     for (size_t i = 0; i < mMmapThreads.size(); i++) {
1928         if (mMmapThreads.valueAt(i)->getEffect(sessionId, effectId) != 0) {
1929             ALOG_ASSERT(thread == 0);
1930             thread = mMmapThreads.valueAt(i);
1931         }
1932     }
1933     return thread;
1934 }
1935 
1936 
1937 
1938 // ----------------------------------------------------------------------------
1939 
Client(const sp<AudioFlinger> & audioFlinger,pid_t pid)1940 AudioFlinger::Client::Client(const sp<AudioFlinger>& audioFlinger, pid_t pid)
1941     :   RefBase(),
1942         mAudioFlinger(audioFlinger),
1943         mPid(pid)
1944 {
1945     mMemoryDealer = new MemoryDealer(
1946             audioFlinger->getClientSharedHeapSize(),
1947             (std::string("AudioFlinger::Client(") + std::to_string(pid) + ")").c_str());
1948 }
1949 
1950 // Client destructor must be called with AudioFlinger::mClientLock held
~Client()1951 AudioFlinger::Client::~Client()
1952 {
1953     mAudioFlinger->removeClient_l(mPid);
1954 }
1955 
heap() const1956 sp<MemoryDealer> AudioFlinger::Client::heap() const
1957 {
1958     return mMemoryDealer;
1959 }
1960 
1961 // ----------------------------------------------------------------------------
1962 
NotificationClient(const sp<AudioFlinger> & audioFlinger,const sp<media::IAudioFlingerClient> & client,pid_t pid,uid_t uid)1963 AudioFlinger::NotificationClient::NotificationClient(const sp<AudioFlinger>& audioFlinger,
1964                                                      const sp<media::IAudioFlingerClient>& client,
1965                                                      pid_t pid,
1966                                                      uid_t uid)
1967     : mAudioFlinger(audioFlinger), mPid(pid), mUid(uid), mAudioFlingerClient(client)
1968 {
1969 }
1970 
~NotificationClient()1971 AudioFlinger::NotificationClient::~NotificationClient()
1972 {
1973 }
1974 
binderDied(const wp<IBinder> & who __unused)1975 void AudioFlinger::NotificationClient::binderDied(const wp<IBinder>& who __unused)
1976 {
1977     sp<NotificationClient> keep(this);
1978     mAudioFlinger->removeNotificationClient(mPid);
1979 }
1980 
1981 // ----------------------------------------------------------------------------
MediaLogNotifier()1982 AudioFlinger::MediaLogNotifier::MediaLogNotifier()
1983     : mPendingRequests(false) {}
1984 
1985 
requestMerge()1986 void AudioFlinger::MediaLogNotifier::requestMerge() {
1987     AutoMutex _l(mMutex);
1988     mPendingRequests = true;
1989     mCond.signal();
1990 }
1991 
threadLoop()1992 bool AudioFlinger::MediaLogNotifier::threadLoop() {
1993     // Should already have been checked, but just in case
1994     if (sMediaLogService == 0) {
1995         return false;
1996     }
1997     // Wait until there are pending requests
1998     {
1999         AutoMutex _l(mMutex);
2000         mPendingRequests = false; // to ignore past requests
2001         while (!mPendingRequests) {
2002             mCond.wait(mMutex);
2003             // TODO may also need an exitPending check
2004         }
2005         mPendingRequests = false;
2006     }
2007     // Execute the actual MediaLogService binder call and ignore extra requests for a while
2008     sMediaLogService->requestMergeWakeup();
2009     usleep(kPostTriggerSleepPeriod);
2010     return true;
2011 }
2012 
requestLogMerge()2013 void AudioFlinger::requestLogMerge() {
2014     mMediaLogNotifier->requestMerge();
2015 }
2016 
2017 // ----------------------------------------------------------------------------
2018 
createRecord(const media::CreateRecordRequest & _input,media::CreateRecordResponse & _output)2019 status_t AudioFlinger::createRecord(const media::CreateRecordRequest& _input,
2020                                     media::CreateRecordResponse& _output)
2021 {
2022     CreateRecordInput input = VALUE_OR_RETURN_STATUS(CreateRecordInput::fromAidl(_input));
2023     CreateRecordOutput output;
2024 
2025     sp<RecordThread::RecordTrack> recordTrack;
2026     sp<RecordHandle> recordHandle;
2027     sp<Client> client;
2028     status_t lStatus;
2029     audio_session_t sessionId = input.sessionId;
2030     audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
2031 
2032     output.cblk.clear();
2033     output.buffers.clear();
2034     output.inputId = AUDIO_IO_HANDLE_NONE;
2035 
2036     // TODO b/182392553: refactor or clean up
2037     AttributionSourceState adjAttributionSource = input.clientInfo.attributionSource;
2038     bool updatePid = (adjAttributionSource.pid == -1);
2039     const uid_t callingUid = IPCThreadState::self()->getCallingUid();
2040     const uid_t currentUid = VALUE_OR_RETURN_STATUS(legacy2aidl_uid_t_int32_t(
2041            adjAttributionSource.uid));
2042     if (!isAudioServerOrMediaServerUid(callingUid)) {
2043         ALOGW_IF(currentUid != callingUid,
2044                 "%s uid %d tried to pass itself off as %d",
2045                 __FUNCTION__, callingUid, currentUid);
2046         adjAttributionSource.uid = VALUE_OR_RETURN_STATUS(legacy2aidl_uid_t_int32_t(callingUid));
2047         updatePid = true;
2048     }
2049     const pid_t callingPid = IPCThreadState::self()->getCallingPid();
2050     const pid_t currentPid = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_pid_t(
2051             adjAttributionSource.pid));
2052     if (updatePid) {
2053         ALOGW_IF(currentPid != (pid_t)-1 && currentPid != callingPid,
2054                  "%s uid %d pid %d tried to pass itself off as pid %d",
2055                  __func__, callingUid, callingPid, currentPid);
2056         adjAttributionSource.pid = VALUE_OR_RETURN_STATUS(legacy2aidl_pid_t_int32_t(callingPid));
2057     }
2058 
2059     // we don't yet support anything other than linear PCM
2060     if (!audio_is_valid_format(input.config.format) || !audio_is_linear_pcm(input.config.format)) {
2061         ALOGE("createRecord() invalid format %#x", input.config.format);
2062         lStatus = BAD_VALUE;
2063         goto Exit;
2064     }
2065 
2066     // further channel mask checks are performed by createRecordTrack_l()
2067     if (!audio_is_input_channel(input.config.channel_mask)) {
2068         ALOGE("createRecord() invalid channel mask %#x", input.config.channel_mask);
2069         lStatus = BAD_VALUE;
2070         goto Exit;
2071     }
2072 
2073     if (sessionId == AUDIO_SESSION_ALLOCATE) {
2074         sessionId = (audio_session_t) newAudioUniqueId(AUDIO_UNIQUE_ID_USE_SESSION);
2075     } else if (audio_unique_id_get_use(sessionId) != AUDIO_UNIQUE_ID_USE_SESSION) {
2076         lStatus = BAD_VALUE;
2077         goto Exit;
2078     }
2079 
2080     output.sessionId = sessionId;
2081     output.selectedDeviceId = input.selectedDeviceId;
2082     output.flags = input.flags;
2083 
2084     client = registerPid(VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(adjAttributionSource.pid)));
2085 
2086     // Not a conventional loop, but a retry loop for at most two iterations total.
2087     // Try first maybe with FAST flag then try again without FAST flag if that fails.
2088     // Exits loop via break on no error of got exit on error
2089     // The sp<> references will be dropped when re-entering scope.
2090     // The lack of indentation is deliberate, to reduce code churn and ease merges.
2091     for (;;) {
2092     // release previously opened input if retrying.
2093     if (output.inputId != AUDIO_IO_HANDLE_NONE) {
2094         recordTrack.clear();
2095         AudioSystem::releaseInput(portId);
2096         output.inputId = AUDIO_IO_HANDLE_NONE;
2097         output.selectedDeviceId = input.selectedDeviceId;
2098         portId = AUDIO_PORT_HANDLE_NONE;
2099     }
2100     lStatus = AudioSystem::getInputForAttr(&input.attr, &output.inputId,
2101                                       input.riid,
2102                                       sessionId,
2103                                     // FIXME compare to AudioTrack
2104                                       adjAttributionSource,
2105                                       &input.config,
2106                                       output.flags, &output.selectedDeviceId, &portId);
2107     if (lStatus != NO_ERROR) {
2108         ALOGE("createRecord() getInputForAttr return error %d", lStatus);
2109         goto Exit;
2110     }
2111 
2112     {
2113         Mutex::Autolock _l(mLock);
2114         RecordThread *thread = checkRecordThread_l(output.inputId);
2115         if (thread == NULL) {
2116             ALOGW("createRecord() checkRecordThread_l failed, input handle %d", output.inputId);
2117             lStatus = FAILED_TRANSACTION;
2118             goto Exit;
2119         }
2120 
2121         ALOGV("createRecord() lSessionId: %d input %d", sessionId, output.inputId);
2122 
2123         output.sampleRate = input.config.sample_rate;
2124         output.frameCount = input.frameCount;
2125         output.notificationFrameCount = input.notificationFrameCount;
2126 
2127         recordTrack = thread->createRecordTrack_l(client, input.attr, &output.sampleRate,
2128                                                   input.config.format, input.config.channel_mask,
2129                                                   &output.frameCount, sessionId,
2130                                                   &output.notificationFrameCount,
2131                                                   callingPid, adjAttributionSource, &output.flags,
2132                                                   input.clientInfo.clientTid,
2133                                                   &lStatus, portId, input.maxSharedAudioHistoryMs);
2134         LOG_ALWAYS_FATAL_IF((lStatus == NO_ERROR) && (recordTrack == 0));
2135 
2136         // lStatus == BAD_TYPE means FAST flag was rejected: request a new input from
2137         // audio policy manager without FAST constraint
2138         if (lStatus == BAD_TYPE) {
2139             continue;
2140         }
2141 
2142         if (lStatus != NO_ERROR) {
2143             goto Exit;
2144         }
2145 
2146         // Check if one effect chain was awaiting for an AudioRecord to be created on this
2147         // session and move it to this thread.
2148         sp<EffectChain> chain = getOrphanEffectChain_l(sessionId);
2149         if (chain != 0) {
2150             Mutex::Autolock _l(thread->mLock);
2151             thread->addEffectChain_l(chain);
2152         }
2153         break;
2154     }
2155     // End of retry loop.
2156     // The lack of indentation is deliberate, to reduce code churn and ease merges.
2157     }
2158 
2159     output.cblk = recordTrack->getCblk();
2160     output.buffers = recordTrack->getBuffers();
2161     output.portId = portId;
2162 
2163     output.audioRecord = new RecordHandle(recordTrack);
2164     _output = VALUE_OR_FATAL(output.toAidl());
2165 
2166 Exit:
2167     if (lStatus != NO_ERROR) {
2168         // remove local strong reference to Client before deleting the RecordTrack so that the
2169         // Client destructor is called by the TrackBase destructor with mClientLock held
2170         // Don't hold mClientLock when releasing the reference on the track as the
2171         // destructor will acquire it.
2172         {
2173             Mutex::Autolock _cl(mClientLock);
2174             client.clear();
2175         }
2176         recordTrack.clear();
2177         if (output.inputId != AUDIO_IO_HANDLE_NONE) {
2178             AudioSystem::releaseInput(portId);
2179         }
2180     }
2181 
2182     return lStatus;
2183 }
2184 
2185 
2186 
2187 // ----------------------------------------------------------------------------
2188 
loadHwModule(const char * name)2189 audio_module_handle_t AudioFlinger::loadHwModule(const char *name)
2190 {
2191     if (name == NULL) {
2192         return AUDIO_MODULE_HANDLE_NONE;
2193     }
2194     if (!settingsAllowed()) {
2195         return AUDIO_MODULE_HANDLE_NONE;
2196     }
2197     Mutex::Autolock _l(mLock);
2198     AutoMutex lock(mHardwareLock);
2199     return loadHwModule_l(name);
2200 }
2201 
2202 // loadHwModule_l() must be called with AudioFlinger::mLock and AudioFlinger::mHardwareLock held
loadHwModule_l(const char * name)2203 audio_module_handle_t AudioFlinger::loadHwModule_l(const char *name)
2204 {
2205     for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
2206         if (strncmp(mAudioHwDevs.valueAt(i)->moduleName(), name, strlen(name)) == 0) {
2207             ALOGW("loadHwModule() module %s already loaded", name);
2208             return mAudioHwDevs.keyAt(i);
2209         }
2210     }
2211 
2212     sp<DeviceHalInterface> dev;
2213 
2214     int rc = mDevicesFactoryHal->openDevice(name, &dev);
2215     if (rc) {
2216         ALOGE("loadHwModule() error %d loading module %s", rc, name);
2217         return AUDIO_MODULE_HANDLE_NONE;
2218     }
2219 
2220     mHardwareStatus = AUDIO_HW_INIT;
2221     rc = dev->initCheck();
2222     mHardwareStatus = AUDIO_HW_IDLE;
2223     if (rc) {
2224         ALOGE("loadHwModule() init check error %d for module %s", rc, name);
2225         return AUDIO_MODULE_HANDLE_NONE;
2226     }
2227 
2228     // Check and cache this HAL's level of support for master mute and master
2229     // volume.  If this is the first HAL opened, and it supports the get
2230     // methods, use the initial values provided by the HAL as the current
2231     // master mute and volume settings.
2232 
2233     AudioHwDevice::Flags flags = static_cast<AudioHwDevice::Flags>(0);
2234     if (0 == mAudioHwDevs.size()) {
2235         mHardwareStatus = AUDIO_HW_GET_MASTER_VOLUME;
2236         float mv;
2237         if (OK == dev->getMasterVolume(&mv)) {
2238             mMasterVolume = mv;
2239         }
2240 
2241         mHardwareStatus = AUDIO_HW_GET_MASTER_MUTE;
2242         bool mm;
2243         if (OK == dev->getMasterMute(&mm)) {
2244             mMasterMute = mm;
2245         }
2246     }
2247 
2248     mHardwareStatus = AUDIO_HW_SET_MASTER_VOLUME;
2249     if (OK == dev->setMasterVolume(mMasterVolume)) {
2250         flags = static_cast<AudioHwDevice::Flags>(flags |
2251                 AudioHwDevice::AHWD_CAN_SET_MASTER_VOLUME);
2252     }
2253 
2254     mHardwareStatus = AUDIO_HW_SET_MASTER_MUTE;
2255     if (OK == dev->setMasterMute(mMasterMute)) {
2256         flags = static_cast<AudioHwDevice::Flags>(flags |
2257                 AudioHwDevice::AHWD_CAN_SET_MASTER_MUTE);
2258     }
2259 
2260     mHardwareStatus = AUDIO_HW_IDLE;
2261 
2262     if (strcmp(name, AUDIO_HARDWARE_MODULE_ID_MSD) == 0) {
2263         // An MSD module is inserted before hardware modules in order to mix encoded streams.
2264         flags = static_cast<AudioHwDevice::Flags>(flags | AudioHwDevice::AHWD_IS_INSERT);
2265     }
2266 
2267     audio_module_handle_t handle = (audio_module_handle_t) nextUniqueId(AUDIO_UNIQUE_ID_USE_MODULE);
2268     AudioHwDevice *audioDevice = new AudioHwDevice(handle, name, dev, flags);
2269     if (strcmp(name, AUDIO_HARDWARE_MODULE_ID_PRIMARY) == 0) {
2270         mPrimaryHardwareDev = audioDevice;
2271         mHardwareStatus = AUDIO_HW_SET_MODE;
2272         mPrimaryHardwareDev->hwDevice()->setMode(mMode);
2273         mHardwareStatus = AUDIO_HW_IDLE;
2274     }
2275 
2276     mAudioHwDevs.add(handle, audioDevice);
2277 
2278     ALOGI("loadHwModule() Loaded %s audio interface, handle %d", name, handle);
2279 
2280     return handle;
2281 
2282 }
2283 
2284 // ----------------------------------------------------------------------------
2285 
getPrimaryOutputSamplingRate()2286 uint32_t AudioFlinger::getPrimaryOutputSamplingRate()
2287 {
2288     Mutex::Autolock _l(mLock);
2289     PlaybackThread *thread = fastPlaybackThread_l();
2290     return thread != NULL ? thread->sampleRate() : 0;
2291 }
2292 
getPrimaryOutputFrameCount()2293 size_t AudioFlinger::getPrimaryOutputFrameCount()
2294 {
2295     Mutex::Autolock _l(mLock);
2296     PlaybackThread *thread = fastPlaybackThread_l();
2297     return thread != NULL ? thread->frameCountHAL() : 0;
2298 }
2299 
2300 // ----------------------------------------------------------------------------
2301 
setLowRamDevice(bool isLowRamDevice,int64_t totalMemory)2302 status_t AudioFlinger::setLowRamDevice(bool isLowRamDevice, int64_t totalMemory)
2303 {
2304     uid_t uid = IPCThreadState::self()->getCallingUid();
2305     if (!isAudioServerOrSystemServerUid(uid)) {
2306         return PERMISSION_DENIED;
2307     }
2308     Mutex::Autolock _l(mLock);
2309     if (mIsDeviceTypeKnown) {
2310         return INVALID_OPERATION;
2311     }
2312     mIsLowRamDevice = isLowRamDevice;
2313     mTotalMemory = totalMemory;
2314     // mIsLowRamDevice and mTotalMemory are obtained through ActivityManager;
2315     // see ActivityManager.isLowRamDevice() and ActivityManager.getMemoryInfo().
2316     // mIsLowRamDevice generally represent devices with less than 1GB of memory,
2317     // though actual setting is determined through device configuration.
2318     constexpr int64_t GB = 1024 * 1024 * 1024;
2319     mClientSharedHeapSize =
2320             isLowRamDevice ? kMinimumClientSharedHeapSizeBytes
2321                     : mTotalMemory < 2 * GB ? 4 * kMinimumClientSharedHeapSizeBytes
2322                     : mTotalMemory < 3 * GB ? 8 * kMinimumClientSharedHeapSizeBytes
2323                     : mTotalMemory < 4 * GB ? 16 * kMinimumClientSharedHeapSizeBytes
2324                     : 32 * kMinimumClientSharedHeapSizeBytes;
2325     mIsDeviceTypeKnown = true;
2326 
2327     // TODO: Cache the client shared heap size in a persistent property.
2328     // It's possible that a native process or Java service or app accesses audioserver
2329     // after it is registered by system server, but before AudioService updates
2330     // the memory info.  This would occur immediately after boot or an audioserver
2331     // crash and restore. Before update from AudioService, the client would get the
2332     // minimum heap size.
2333 
2334     ALOGD("isLowRamDevice:%s totalMemory:%lld mClientSharedHeapSize:%zu",
2335             (isLowRamDevice ? "true" : "false"),
2336             (long long)mTotalMemory,
2337             mClientSharedHeapSize.load());
2338     return NO_ERROR;
2339 }
2340 
getClientSharedHeapSize() const2341 size_t AudioFlinger::getClientSharedHeapSize() const
2342 {
2343     size_t heapSizeInBytes = property_get_int32("ro.af.client_heap_size_kbyte", 0) * 1024;
2344     if (heapSizeInBytes != 0) { // read-only property overrides all.
2345         return heapSizeInBytes;
2346     }
2347     return mClientSharedHeapSize;
2348 }
2349 
setAudioPortConfig(const struct audio_port_config * config)2350 status_t AudioFlinger::setAudioPortConfig(const struct audio_port_config *config)
2351 {
2352     ALOGV(__func__);
2353 
2354     status_t status = AudioValidator::validateAudioPortConfig(*config);
2355     if (status != NO_ERROR) {
2356         return status;
2357     }
2358 
2359     audio_module_handle_t module;
2360     if (config->type == AUDIO_PORT_TYPE_DEVICE) {
2361         module = config->ext.device.hw_module;
2362     } else {
2363         module = config->ext.mix.hw_module;
2364     }
2365 
2366     Mutex::Autolock _l(mLock);
2367     AutoMutex lock(mHardwareLock);
2368     ssize_t index = mAudioHwDevs.indexOfKey(module);
2369     if (index < 0) {
2370         ALOGW("%s() bad hw module %d", __func__, module);
2371         return BAD_VALUE;
2372     }
2373 
2374     AudioHwDevice *audioHwDevice = mAudioHwDevs.valueAt(index);
2375     return audioHwDevice->hwDevice()->setAudioPortConfig(config);
2376 }
2377 
getAudioHwSyncForSession(audio_session_t sessionId)2378 audio_hw_sync_t AudioFlinger::getAudioHwSyncForSession(audio_session_t sessionId)
2379 {
2380     Mutex::Autolock _l(mLock);
2381 
2382     ssize_t index = mHwAvSyncIds.indexOfKey(sessionId);
2383     if (index >= 0) {
2384         ALOGV("getAudioHwSyncForSession found ID %d for session %d",
2385               mHwAvSyncIds.valueAt(index), sessionId);
2386         return mHwAvSyncIds.valueAt(index);
2387     }
2388 
2389     sp<DeviceHalInterface> dev;
2390     {
2391         AutoMutex lock(mHardwareLock);
2392         if (mPrimaryHardwareDev == nullptr) {
2393             return AUDIO_HW_SYNC_INVALID;
2394         }
2395         dev = mPrimaryHardwareDev->hwDevice();
2396     }
2397     if (dev == nullptr) {
2398         return AUDIO_HW_SYNC_INVALID;
2399     }
2400     String8 reply;
2401     AudioParameter param;
2402     if (dev->getParameters(String8(AudioParameter::keyHwAvSync), &reply) == OK) {
2403         param = AudioParameter(reply);
2404     }
2405 
2406     int value;
2407     if (param.getInt(String8(AudioParameter::keyHwAvSync), value) != NO_ERROR) {
2408         ALOGW("getAudioHwSyncForSession error getting sync for session %d", sessionId);
2409         return AUDIO_HW_SYNC_INVALID;
2410     }
2411 
2412     // allow only one session for a given HW A/V sync ID.
2413     for (size_t i = 0; i < mHwAvSyncIds.size(); i++) {
2414         if (mHwAvSyncIds.valueAt(i) == (audio_hw_sync_t)value) {
2415             ALOGV("getAudioHwSyncForSession removing ID %d for session %d",
2416                   value, mHwAvSyncIds.keyAt(i));
2417             mHwAvSyncIds.removeItemsAt(i);
2418             break;
2419         }
2420     }
2421 
2422     mHwAvSyncIds.add(sessionId, value);
2423 
2424     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
2425         sp<PlaybackThread> thread = mPlaybackThreads.valueAt(i);
2426         uint32_t sessions = thread->hasAudioSession(sessionId);
2427         if (sessions & ThreadBase::TRACK_SESSION) {
2428             AudioParameter param = AudioParameter();
2429             param.addInt(String8(AudioParameter::keyStreamHwAvSync), value);
2430             String8 keyValuePairs = param.toString();
2431             thread->setParameters(keyValuePairs);
2432             forwardParametersToDownstreamPatches_l(thread->id(), keyValuePairs,
2433                     [](const sp<PlaybackThread>& thread) { return thread->usesHwAvSync(); });
2434             break;
2435         }
2436     }
2437 
2438     ALOGV("getAudioHwSyncForSession adding ID %d for session %d", value, sessionId);
2439     return (audio_hw_sync_t)value;
2440 }
2441 
systemReady()2442 status_t AudioFlinger::systemReady()
2443 {
2444     Mutex::Autolock _l(mLock);
2445     ALOGI("%s", __FUNCTION__);
2446     if (mSystemReady) {
2447         ALOGW("%s called twice", __FUNCTION__);
2448         return NO_ERROR;
2449     }
2450     mSystemReady = true;
2451     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
2452         ThreadBase *thread = (ThreadBase *)mPlaybackThreads.valueAt(i).get();
2453         thread->systemReady();
2454     }
2455     for (size_t i = 0; i < mRecordThreads.size(); i++) {
2456         ThreadBase *thread = (ThreadBase *)mRecordThreads.valueAt(i).get();
2457         thread->systemReady();
2458     }
2459     for (size_t i = 0; i < mMmapThreads.size(); i++) {
2460         ThreadBase *thread = (ThreadBase *)mMmapThreads.valueAt(i).get();
2461         thread->systemReady();
2462     }
2463     return NO_ERROR;
2464 }
2465 
getMicrophones(std::vector<media::MicrophoneInfo> * microphones)2466 status_t AudioFlinger::getMicrophones(std::vector<media::MicrophoneInfo> *microphones)
2467 {
2468     AutoMutex lock(mHardwareLock);
2469     status_t status = INVALID_OPERATION;
2470 
2471     for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
2472         std::vector<media::MicrophoneInfo> mics;
2473         AudioHwDevice *dev = mAudioHwDevs.valueAt(i);
2474         mHardwareStatus = AUDIO_HW_GET_MICROPHONES;
2475         status_t devStatus = dev->hwDevice()->getMicrophones(&mics);
2476         mHardwareStatus = AUDIO_HW_IDLE;
2477         if (devStatus == NO_ERROR) {
2478             microphones->insert(microphones->begin(), mics.begin(), mics.end());
2479             // report success if at least one HW module supports the function.
2480             status = NO_ERROR;
2481         }
2482     }
2483 
2484     return status;
2485 }
2486 
2487 // setAudioHwSyncForSession_l() must be called with AudioFlinger::mLock held
setAudioHwSyncForSession_l(PlaybackThread * thread,audio_session_t sessionId)2488 void AudioFlinger::setAudioHwSyncForSession_l(PlaybackThread *thread, audio_session_t sessionId)
2489 {
2490     ssize_t index = mHwAvSyncIds.indexOfKey(sessionId);
2491     if (index >= 0) {
2492         audio_hw_sync_t syncId = mHwAvSyncIds.valueAt(index);
2493         ALOGV("setAudioHwSyncForSession_l found ID %d for session %d", syncId, sessionId);
2494         AudioParameter param = AudioParameter();
2495         param.addInt(String8(AudioParameter::keyStreamHwAvSync), syncId);
2496         String8 keyValuePairs = param.toString();
2497         thread->setParameters(keyValuePairs);
2498         forwardParametersToDownstreamPatches_l(thread->id(), keyValuePairs,
2499                 [](const sp<PlaybackThread>& thread) { return thread->usesHwAvSync(); });
2500     }
2501 }
2502 
2503 
2504 // ----------------------------------------------------------------------------
2505 
2506 
openOutput_l(audio_module_handle_t module,audio_io_handle_t * output,audio_config_t * halConfig,audio_config_base_t * mixerConfig __unused,audio_devices_t deviceType,const String8 & address,audio_output_flags_t flags)2507 sp<AudioFlinger::ThreadBase> AudioFlinger::openOutput_l(audio_module_handle_t module,
2508                                                         audio_io_handle_t *output,
2509                                                         audio_config_t *halConfig,
2510                                                         audio_config_base_t *mixerConfig __unused,
2511                                                         audio_devices_t deviceType,
2512                                                         const String8& address,
2513                                                         audio_output_flags_t flags)
2514 {
2515     AudioHwDevice *outHwDev = findSuitableHwDev_l(module, deviceType);
2516     if (outHwDev == NULL) {
2517         return 0;
2518     }
2519 
2520     if (*output == AUDIO_IO_HANDLE_NONE) {
2521         *output = nextUniqueId(AUDIO_UNIQUE_ID_USE_OUTPUT);
2522     } else {
2523         // Audio Policy does not currently request a specific output handle.
2524         // If this is ever needed, see openInput_l() for example code.
2525         ALOGE("openOutput_l requested output handle %d is not AUDIO_IO_HANDLE_NONE", *output);
2526         return 0;
2527     }
2528 
2529     mHardwareStatus = AUDIO_HW_OUTPUT_OPEN;
2530 
2531     // FOR TESTING ONLY:
2532     // This if statement allows overriding the audio policy settings
2533     // and forcing a specific format or channel mask to the HAL/Sink device for testing.
2534     if (!(flags & (AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD | AUDIO_OUTPUT_FLAG_DIRECT))) {
2535         // Check only for Normal Mixing mode
2536         if (kEnableExtendedPrecision) {
2537             // Specify format (uncomment one below to choose)
2538             //halConfig->format = AUDIO_FORMAT_PCM_FLOAT;
2539             //halConfig->format = AUDIO_FORMAT_PCM_24_BIT_PACKED;
2540             //halConfig->format = AUDIO_FORMAT_PCM_32_BIT;
2541             //halConfig->format = AUDIO_FORMAT_PCM_8_24_BIT;
2542             // ALOGV("openOutput_l() upgrading format to %#08x", halConfig->format);
2543         }
2544         if (kEnableExtendedChannels) {
2545             // Specify channel mask (uncomment one below to choose)
2546             //halConfig->channel_mask = audio_channel_out_mask_from_count(4);  // for USB 4ch
2547             //halConfig->channel_mask = audio_channel_mask_from_representation_and_bits(
2548             //        AUDIO_CHANNEL_REPRESENTATION_INDEX, (1 << 4) - 1);  // another 4ch example
2549         }
2550     }
2551 
2552     AudioStreamOut *outputStream = NULL;
2553     status_t status = outHwDev->openOutputStream(
2554             &outputStream,
2555             *output,
2556             deviceType,
2557             flags,
2558             halConfig,
2559             address.string());
2560 
2561     mHardwareStatus = AUDIO_HW_IDLE;
2562 
2563     if (status == NO_ERROR) {
2564         if (flags & AUDIO_OUTPUT_FLAG_MMAP_NOIRQ) {
2565             sp<MmapPlaybackThread> thread =
2566                     new MmapPlaybackThread(this, *output, outHwDev, outputStream, mSystemReady);
2567             mMmapThreads.add(*output, thread);
2568             ALOGV("openOutput_l() created mmap playback thread: ID %d thread %p",
2569                   *output, thread.get());
2570             return thread;
2571         } else {
2572             sp<PlaybackThread> thread;
2573             //TODO: b/193496180 use spatializer flag at audio HAL when available
2574             if (flags == (audio_output_flags_t)(AUDIO_OUTPUT_FLAG_FAST
2575                                                     | AUDIO_OUTPUT_FLAG_DEEP_BUFFER)) {
2576 #ifdef MULTICHANNEL_EFFECT_CHAIN
2577                 thread = new SpatializerThread(this, outputStream, *output,
2578                                                     mSystemReady, mixerConfig);
2579                 ALOGD("openOutput_l() created spatializer output: ID %d thread %p",
2580                       *output, thread.get());
2581 #else
2582                 ALOGE("openOutput_l() cannot create spatializer thread "
2583                         "without #define MULTICHANNEL_EFFECT_CHAIN");
2584 #endif
2585             } else if (flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) {
2586                 thread = new OffloadThread(this, outputStream, *output, mSystemReady);
2587                 ALOGV("openOutput_l() created offload output: ID %d thread %p",
2588                       *output, thread.get());
2589             } else if ((flags & AUDIO_OUTPUT_FLAG_DIRECT)
2590                     || !isValidPcmSinkFormat(halConfig->format)
2591                     || !isValidPcmSinkChannelMask(halConfig->channel_mask)) {
2592                 thread = new DirectOutputThread(this, outputStream, *output, mSystemReady);
2593                 ALOGV("openOutput_l() created direct output: ID %d thread %p",
2594                       *output, thread.get());
2595             } else {
2596                 thread = new MixerThread(this, outputStream, *output, mSystemReady);
2597                 ALOGV("openOutput_l() created mixer output: ID %d thread %p",
2598                       *output, thread.get());
2599             }
2600             mPlaybackThreads.add(*output, thread);
2601             struct audio_patch patch;
2602             mPatchPanel.notifyStreamOpened(outHwDev, *output, &patch);
2603             if (thread->isMsdDevice()) {
2604                 thread->setDownStreamPatch(&patch);
2605             }
2606             return thread;
2607         }
2608     }
2609 
2610     return 0;
2611 }
2612 
openOutput(const media::OpenOutputRequest & request,media::OpenOutputResponse * response)2613 status_t AudioFlinger::openOutput(const media::OpenOutputRequest& request,
2614                                 media::OpenOutputResponse* response)
2615 {
2616     audio_module_handle_t module = VALUE_OR_RETURN_STATUS(
2617             aidl2legacy_int32_t_audio_module_handle_t(request.module));
2618     audio_config_t halConfig = VALUE_OR_RETURN_STATUS(
2619             aidl2legacy_AudioConfig_audio_config_t(request.halConfig));
2620     audio_config_base_t mixerConfig = VALUE_OR_RETURN_STATUS(
2621             aidl2legacy_AudioConfigBase_audio_config_base_t(request.mixerConfig));
2622     sp<DeviceDescriptorBase> device = VALUE_OR_RETURN_STATUS(
2623             aidl2legacy_DeviceDescriptorBase(request.device));
2624     audio_output_flags_t flags = VALUE_OR_RETURN_STATUS(
2625             aidl2legacy_int32_t_audio_output_flags_t_mask(request.flags));
2626 
2627     audio_io_handle_t output;
2628     uint32_t latencyMs;
2629 
2630     ALOGI("openOutput() this %p, module %d Device %s, SamplingRate %d, Format %#08x, "
2631               "Channels %#x, flags %#x",
2632               this, module,
2633               device->toString().c_str(),
2634               halConfig.sample_rate,
2635               halConfig.format,
2636               halConfig.channel_mask,
2637               flags);
2638 
2639     audio_devices_t deviceType = device->type();
2640     const String8 address = String8(device->address().c_str());
2641 
2642     if (deviceType == AUDIO_DEVICE_NONE) {
2643         return BAD_VALUE;
2644     }
2645 
2646     Mutex::Autolock _l(mLock);
2647 
2648     sp<ThreadBase> thread = openOutput_l(module, &output, &halConfig,
2649             &mixerConfig, deviceType, address, flags);
2650     if (thread != 0) {
2651         if ((flags & AUDIO_OUTPUT_FLAG_MMAP_NOIRQ) == 0) {
2652             PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
2653             latencyMs = playbackThread->latency();
2654 
2655             // notify client processes of the new output creation
2656             playbackThread->ioConfigChanged(AUDIO_OUTPUT_OPENED);
2657 
2658             // the first primary output opened designates the primary hw device if no HW module
2659             // named "primary" was already loaded.
2660             AutoMutex lock(mHardwareLock);
2661             if ((mPrimaryHardwareDev == nullptr) && (flags & AUDIO_OUTPUT_FLAG_PRIMARY)) {
2662                 ALOGI("Using module %d as the primary audio interface", module);
2663                 mPrimaryHardwareDev = playbackThread->getOutput()->audioHwDev;
2664 
2665                 mHardwareStatus = AUDIO_HW_SET_MODE;
2666                 mPrimaryHardwareDev->hwDevice()->setMode(mMode);
2667                 mHardwareStatus = AUDIO_HW_IDLE;
2668             }
2669         } else {
2670             MmapThread *mmapThread = (MmapThread *)thread.get();
2671             mmapThread->ioConfigChanged(AUDIO_OUTPUT_OPENED);
2672         }
2673         response->output = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_io_handle_t_int32_t(output));
2674         response->config =
2675                 VALUE_OR_RETURN_STATUS(legacy2aidl_audio_config_t_AudioConfig(halConfig));
2676         response->latencyMs = VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(latencyMs));
2677         response->flags = VALUE_OR_RETURN_STATUS(
2678                 legacy2aidl_audio_output_flags_t_int32_t_mask(flags));
2679         return NO_ERROR;
2680     }
2681 
2682     return NO_INIT;
2683 }
2684 
openDuplicateOutput(audio_io_handle_t output1,audio_io_handle_t output2)2685 audio_io_handle_t AudioFlinger::openDuplicateOutput(audio_io_handle_t output1,
2686         audio_io_handle_t output2)
2687 {
2688     Mutex::Autolock _l(mLock);
2689     MixerThread *thread1 = checkMixerThread_l(output1);
2690     MixerThread *thread2 = checkMixerThread_l(output2);
2691 
2692     if (thread1 == NULL || thread2 == NULL) {
2693         ALOGW("openDuplicateOutput() wrong output mixer type for output %d or %d", output1,
2694                 output2);
2695         return AUDIO_IO_HANDLE_NONE;
2696     }
2697 
2698     audio_io_handle_t id = nextUniqueId(AUDIO_UNIQUE_ID_USE_OUTPUT);
2699     DuplicatingThread *thread = new DuplicatingThread(this, thread1, id, mSystemReady);
2700     thread->addOutputTrack(thread2);
2701     mPlaybackThreads.add(id, thread);
2702     // notify client processes of the new output creation
2703     thread->ioConfigChanged(AUDIO_OUTPUT_OPENED);
2704     return id;
2705 }
2706 
closeOutput(audio_io_handle_t output)2707 status_t AudioFlinger::closeOutput(audio_io_handle_t output)
2708 {
2709     return closeOutput_nonvirtual(output);
2710 }
2711 
closeOutput_nonvirtual(audio_io_handle_t output)2712 status_t AudioFlinger::closeOutput_nonvirtual(audio_io_handle_t output)
2713 {
2714     // keep strong reference on the playback thread so that
2715     // it is not destroyed while exit() is executed
2716     sp<PlaybackThread> playbackThread;
2717     sp<MmapPlaybackThread> mmapThread;
2718     {
2719         Mutex::Autolock _l(mLock);
2720         playbackThread = checkPlaybackThread_l(output);
2721         if (playbackThread != NULL) {
2722             ALOGV("closeOutput() %d", output);
2723 
2724             dumpToThreadLog_l(playbackThread);
2725 
2726             if (playbackThread->type() == ThreadBase::MIXER) {
2727                 for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
2728                     if (mPlaybackThreads.valueAt(i)->isDuplicating()) {
2729                         DuplicatingThread *dupThread =
2730                                 (DuplicatingThread *)mPlaybackThreads.valueAt(i).get();
2731                         dupThread->removeOutputTrack((MixerThread *)playbackThread.get());
2732                     }
2733                 }
2734             }
2735 
2736 
2737             mPlaybackThreads.removeItem(output);
2738             // save all effects to the default thread
2739             if (mPlaybackThreads.size()) {
2740                 PlaybackThread *dstThread = checkPlaybackThread_l(mPlaybackThreads.keyAt(0));
2741                 if (dstThread != NULL) {
2742                     // audioflinger lock is held so order of thread lock acquisition doesn't matter
2743                     Mutex::Autolock _dl(dstThread->mLock);
2744                     Mutex::Autolock _sl(playbackThread->mLock);
2745                     Vector< sp<EffectChain> > effectChains = playbackThread->getEffectChains_l();
2746                     for (size_t i = 0; i < effectChains.size(); i ++) {
2747                         moveEffectChain_l(effectChains[i]->sessionId(), playbackThread.get(),
2748                                 dstThread);
2749                     }
2750                 }
2751             }
2752         } else {
2753             mmapThread = (MmapPlaybackThread *)checkMmapThread_l(output);
2754             if (mmapThread == 0) {
2755                 return BAD_VALUE;
2756             }
2757             dumpToThreadLog_l(mmapThread);
2758             mMmapThreads.removeItem(output);
2759             ALOGD("closing mmapThread %p", mmapThread.get());
2760         }
2761         const sp<AudioIoDescriptor> ioDesc = new AudioIoDescriptor();
2762         ioDesc->mIoHandle = output;
2763         ioConfigChanged(AUDIO_OUTPUT_CLOSED, ioDesc);
2764         mPatchPanel.notifyStreamClosed(output);
2765     }
2766     // The thread entity (active unit of execution) is no longer running here,
2767     // but the ThreadBase container still exists.
2768 
2769     if (playbackThread != 0) {
2770         playbackThread->exit();
2771         if (!playbackThread->isDuplicating()) {
2772             closeOutputFinish(playbackThread);
2773         }
2774     } else if (mmapThread != 0) {
2775         ALOGD("mmapThread exit()");
2776         mmapThread->exit();
2777         AudioStreamOut *out = mmapThread->clearOutput();
2778         ALOG_ASSERT(out != NULL, "out shouldn't be NULL");
2779         // from now on thread->mOutput is NULL
2780         delete out;
2781     }
2782     return NO_ERROR;
2783 }
2784 
closeOutputFinish(const sp<PlaybackThread> & thread)2785 void AudioFlinger::closeOutputFinish(const sp<PlaybackThread>& thread)
2786 {
2787     AudioStreamOut *out = thread->clearOutput();
2788     ALOG_ASSERT(out != NULL, "out shouldn't be NULL");
2789     // from now on thread->mOutput is NULL
2790     delete out;
2791 }
2792 
closeThreadInternal_l(const sp<PlaybackThread> & thread)2793 void AudioFlinger::closeThreadInternal_l(const sp<PlaybackThread>& thread)
2794 {
2795     mPlaybackThreads.removeItem(thread->mId);
2796     thread->exit();
2797     closeOutputFinish(thread);
2798 }
2799 
suspendOutput(audio_io_handle_t output)2800 status_t AudioFlinger::suspendOutput(audio_io_handle_t output)
2801 {
2802     Mutex::Autolock _l(mLock);
2803     PlaybackThread *thread = checkPlaybackThread_l(output);
2804 
2805     if (thread == NULL) {
2806         return BAD_VALUE;
2807     }
2808 
2809     ALOGV("suspendOutput() %d", output);
2810     thread->suspend();
2811 
2812     return NO_ERROR;
2813 }
2814 
restoreOutput(audio_io_handle_t output)2815 status_t AudioFlinger::restoreOutput(audio_io_handle_t output)
2816 {
2817     Mutex::Autolock _l(mLock);
2818     PlaybackThread *thread = checkPlaybackThread_l(output);
2819 
2820     if (thread == NULL) {
2821         return BAD_VALUE;
2822     }
2823 
2824     ALOGV("restoreOutput() %d", output);
2825 
2826     thread->restore();
2827 
2828     return NO_ERROR;
2829 }
2830 
openInput(const media::OpenInputRequest & request,media::OpenInputResponse * response)2831 status_t AudioFlinger::openInput(const media::OpenInputRequest& request,
2832                                  media::OpenInputResponse* response)
2833 {
2834     Mutex::Autolock _l(mLock);
2835 
2836     if (request.device.type == AUDIO_DEVICE_NONE) {
2837         return BAD_VALUE;
2838     }
2839 
2840     audio_io_handle_t input = VALUE_OR_RETURN_STATUS(
2841             aidl2legacy_int32_t_audio_io_handle_t(request.input));
2842     audio_config_t config = VALUE_OR_RETURN_STATUS(
2843             aidl2legacy_AudioConfig_audio_config_t(request.config));
2844     AudioDeviceTypeAddr device = VALUE_OR_RETURN_STATUS(
2845             aidl2legacy_AudioDeviceTypeAddress(request.device));
2846 
2847     sp<ThreadBase> thread = openInput_l(
2848             VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_module_handle_t(request.module)),
2849             &input,
2850             &config,
2851             device.mType,
2852             device.address().c_str(),
2853             VALUE_OR_RETURN_STATUS(aidl2legacy_AudioSourceType_audio_source_t(request.source)),
2854             VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_input_flags_t_mask(request.flags)),
2855             AUDIO_DEVICE_NONE,
2856             String8{});
2857 
2858     response->input = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_io_handle_t_int32_t(input));
2859     response->config = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_config_t_AudioConfig(config));
2860     response->device = request.device;
2861 
2862     if (thread != 0) {
2863         // notify client processes of the new input creation
2864         thread->ioConfigChanged(AUDIO_INPUT_OPENED);
2865         return NO_ERROR;
2866     }
2867     return NO_INIT;
2868 }
2869 
openInput_l(audio_module_handle_t module,audio_io_handle_t * input,audio_config_t * config,audio_devices_t devices,const char * address,audio_source_t source,audio_input_flags_t flags,audio_devices_t outputDevice,const String8 & outputDeviceAddress)2870 sp<AudioFlinger::ThreadBase> AudioFlinger::openInput_l(audio_module_handle_t module,
2871                                                          audio_io_handle_t *input,
2872                                                          audio_config_t *config,
2873                                                          audio_devices_t devices,
2874                                                          const char* address,
2875                                                          audio_source_t source,
2876                                                          audio_input_flags_t flags,
2877                                                          audio_devices_t outputDevice,
2878                                                          const String8& outputDeviceAddress)
2879 {
2880     AudioHwDevice *inHwDev = findSuitableHwDev_l(module, devices);
2881     if (inHwDev == NULL) {
2882         *input = AUDIO_IO_HANDLE_NONE;
2883         return 0;
2884     }
2885 
2886     // Audio Policy can request a specific handle for hardware hotword.
2887     // The goal here is not to re-open an already opened input.
2888     // It is to use a pre-assigned I/O handle.
2889     if (*input == AUDIO_IO_HANDLE_NONE) {
2890         *input = nextUniqueId(AUDIO_UNIQUE_ID_USE_INPUT);
2891     } else if (audio_unique_id_get_use(*input) != AUDIO_UNIQUE_ID_USE_INPUT) {
2892         ALOGE("openInput_l() requested input handle %d is invalid", *input);
2893         return 0;
2894     } else if (mRecordThreads.indexOfKey(*input) >= 0) {
2895         // This should not happen in a transient state with current design.
2896         ALOGE("openInput_l() requested input handle %d is already assigned", *input);
2897         return 0;
2898     }
2899 
2900     audio_config_t halconfig = *config;
2901     sp<DeviceHalInterface> inHwHal = inHwDev->hwDevice();
2902     sp<StreamInHalInterface> inStream;
2903     status_t status = inHwHal->openInputStream(
2904             *input, devices, &halconfig, flags, address, source,
2905             outputDevice, outputDeviceAddress, &inStream);
2906     ALOGV("openInput_l() openInputStream returned input %p, devices %#x, SamplingRate %d"
2907            ", Format %#x, Channels %#x, flags %#x, status %d addr %s",
2908             inStream.get(),
2909             devices,
2910             halconfig.sample_rate,
2911             halconfig.format,
2912             halconfig.channel_mask,
2913             flags,
2914             status, address);
2915 
2916     // If the input could not be opened with the requested parameters and we can handle the
2917     // conversion internally, try to open again with the proposed parameters.
2918     if (status == BAD_VALUE &&
2919         audio_is_linear_pcm(config->format) &&
2920         audio_is_linear_pcm(halconfig.format) &&
2921         (halconfig.sample_rate <= AUDIO_RESAMPLER_DOWN_RATIO_MAX * config->sample_rate) &&
2922         (audio_channel_count_from_in_mask(halconfig.channel_mask) <= FCC_LIMIT) &&
2923         (audio_channel_count_from_in_mask(config->channel_mask) <= FCC_LIMIT)) {
2924         // FIXME describe the change proposed by HAL (save old values so we can log them here)
2925         ALOGV("openInput_l() reopening with proposed sampling rate and channel mask");
2926         inStream.clear();
2927         status = inHwHal->openInputStream(
2928                 *input, devices, &halconfig, flags, address, source,
2929                 outputDevice, outputDeviceAddress, &inStream);
2930         // FIXME log this new status; HAL should not propose any further changes
2931     }
2932 
2933     if (status == NO_ERROR && inStream != 0) {
2934         AudioStreamIn *inputStream = new AudioStreamIn(inHwDev, inStream, flags);
2935         if ((flags & AUDIO_INPUT_FLAG_MMAP_NOIRQ) != 0) {
2936             sp<MmapCaptureThread> thread =
2937                     new MmapCaptureThread(this, *input, inHwDev, inputStream, mSystemReady);
2938             mMmapThreads.add(*input, thread);
2939             ALOGV("openInput_l() created mmap capture thread: ID %d thread %p", *input,
2940                     thread.get());
2941             return thread;
2942         } else {
2943             // Start record thread
2944             // RecordThread requires both input and output device indication to forward to audio
2945             // pre processing modules
2946             sp<RecordThread> thread = new RecordThread(this, inputStream, *input, mSystemReady);
2947             mRecordThreads.add(*input, thread);
2948             ALOGV("openInput_l() created record thread: ID %d thread %p", *input, thread.get());
2949             return thread;
2950         }
2951     }
2952 
2953     *input = AUDIO_IO_HANDLE_NONE;
2954     return 0;
2955 }
2956 
closeInput(audio_io_handle_t input)2957 status_t AudioFlinger::closeInput(audio_io_handle_t input)
2958 {
2959     return closeInput_nonvirtual(input);
2960 }
2961 
closeInput_nonvirtual(audio_io_handle_t input)2962 status_t AudioFlinger::closeInput_nonvirtual(audio_io_handle_t input)
2963 {
2964     // keep strong reference on the record thread so that
2965     // it is not destroyed while exit() is executed
2966     sp<RecordThread> recordThread;
2967     sp<MmapCaptureThread> mmapThread;
2968     {
2969         Mutex::Autolock _l(mLock);
2970         recordThread = checkRecordThread_l(input);
2971         if (recordThread != 0) {
2972             ALOGV("closeInput() %d", input);
2973 
2974             dumpToThreadLog_l(recordThread);
2975 
2976             // If we still have effect chains, it means that a client still holds a handle
2977             // on at least one effect. We must either move the chain to an existing thread with the
2978             // same session ID or put it aside in case a new record thread is opened for a
2979             // new capture on the same session
2980             sp<EffectChain> chain;
2981             {
2982                 Mutex::Autolock _sl(recordThread->mLock);
2983                 Vector< sp<EffectChain> > effectChains = recordThread->getEffectChains_l();
2984                 // Note: maximum one chain per record thread
2985                 if (effectChains.size() != 0) {
2986                     chain = effectChains[0];
2987                 }
2988             }
2989             if (chain != 0) {
2990                 // first check if a record thread is already opened with a client on same session.
2991                 // This should only happen in case of overlap between one thread tear down and the
2992                 // creation of its replacement
2993                 size_t i;
2994                 for (i = 0; i < mRecordThreads.size(); i++) {
2995                     sp<RecordThread> t = mRecordThreads.valueAt(i);
2996                     if (t == recordThread) {
2997                         continue;
2998                     }
2999                     if (t->hasAudioSession(chain->sessionId()) != 0) {
3000                         Mutex::Autolock _l(t->mLock);
3001                         ALOGV("closeInput() found thread %d for effect session %d",
3002                               t->id(), chain->sessionId());
3003                         t->addEffectChain_l(chain);
3004                         break;
3005                     }
3006                 }
3007                 // put the chain aside if we could not find a record thread with the same session id
3008                 if (i == mRecordThreads.size()) {
3009                     putOrphanEffectChain_l(chain);
3010                 }
3011             }
3012             mRecordThreads.removeItem(input);
3013         } else {
3014             mmapThread = (MmapCaptureThread *)checkMmapThread_l(input);
3015             if (mmapThread == 0) {
3016                 return BAD_VALUE;
3017             }
3018             dumpToThreadLog_l(mmapThread);
3019             mMmapThreads.removeItem(input);
3020         }
3021         const sp<AudioIoDescriptor> ioDesc = new AudioIoDescriptor();
3022         ioDesc->mIoHandle = input;
3023         ioConfigChanged(AUDIO_INPUT_CLOSED, ioDesc);
3024     }
3025     // FIXME: calling thread->exit() without mLock held should not be needed anymore now that
3026     // we have a different lock for notification client
3027     if (recordThread != 0) {
3028         closeInputFinish(recordThread);
3029     } else if (mmapThread != 0) {
3030         mmapThread->exit();
3031         AudioStreamIn *in = mmapThread->clearInput();
3032         ALOG_ASSERT(in != NULL, "in shouldn't be NULL");
3033         // from now on thread->mInput is NULL
3034         delete in;
3035     }
3036     return NO_ERROR;
3037 }
3038 
closeInputFinish(const sp<RecordThread> & thread)3039 void AudioFlinger::closeInputFinish(const sp<RecordThread>& thread)
3040 {
3041     thread->exit();
3042     AudioStreamIn *in = thread->clearInput();
3043     ALOG_ASSERT(in != NULL, "in shouldn't be NULL");
3044     // from now on thread->mInput is NULL
3045     delete in;
3046 }
3047 
closeThreadInternal_l(const sp<RecordThread> & thread)3048 void AudioFlinger::closeThreadInternal_l(const sp<RecordThread>& thread)
3049 {
3050     mRecordThreads.removeItem(thread->mId);
3051     closeInputFinish(thread);
3052 }
3053 
invalidateStream(audio_stream_type_t stream)3054 status_t AudioFlinger::invalidateStream(audio_stream_type_t stream)
3055 {
3056     Mutex::Autolock _l(mLock);
3057     ALOGV("invalidateStream() stream %d", stream);
3058 
3059     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
3060         PlaybackThread *thread = mPlaybackThreads.valueAt(i).get();
3061         thread->invalidateTracks(stream);
3062     }
3063     for (size_t i = 0; i < mMmapThreads.size(); i++) {
3064         mMmapThreads[i]->invalidateTracks(stream);
3065     }
3066     return NO_ERROR;
3067 }
3068 
3069 
newAudioUniqueId(audio_unique_id_use_t use)3070 audio_unique_id_t AudioFlinger::newAudioUniqueId(audio_unique_id_use_t use)
3071 {
3072     // This is a binder API, so a malicious client could pass in a bad parameter.
3073     // Check for that before calling the internal API nextUniqueId().
3074     if ((unsigned) use >= (unsigned) AUDIO_UNIQUE_ID_USE_MAX) {
3075         ALOGE("newAudioUniqueId invalid use %d", use);
3076         return AUDIO_UNIQUE_ID_ALLOCATE;
3077     }
3078     return nextUniqueId(use);
3079 }
3080 
acquireAudioSessionId(audio_session_t audioSession,pid_t pid,uid_t uid)3081 void AudioFlinger::acquireAudioSessionId(
3082         audio_session_t audioSession, pid_t pid, uid_t uid)
3083 {
3084     Mutex::Autolock _l(mLock);
3085     pid_t caller = IPCThreadState::self()->getCallingPid();
3086     ALOGV("acquiring %d from %d, for %d", audioSession, caller, pid);
3087     const uid_t callerUid = IPCThreadState::self()->getCallingUid();
3088     if (pid != (pid_t)-1 && isAudioServerOrMediaServerUid(callerUid)) {
3089         caller = pid;  // check must match releaseAudioSessionId()
3090     }
3091     if (uid == (uid_t)-1 || !isAudioServerOrMediaServerUid(callerUid)) {
3092         uid = callerUid;
3093     }
3094 
3095     {
3096         Mutex::Autolock _cl(mClientLock);
3097         // Ignore requests received from processes not known as notification client. The request
3098         // is likely proxied by mediaserver (e.g CameraService) and releaseAudioSessionId() can be
3099         // called from a different pid leaving a stale session reference.  Also we don't know how
3100         // to clear this reference if the client process dies.
3101         if (mNotificationClients.indexOfKey(caller) < 0) {
3102             ALOGW("acquireAudioSessionId() unknown client %d for session %d", caller, audioSession);
3103             return;
3104         }
3105     }
3106 
3107     size_t num = mAudioSessionRefs.size();
3108     for (size_t i = 0; i < num; i++) {
3109         AudioSessionRef *ref = mAudioSessionRefs.editItemAt(i);
3110         if (ref->mSessionid == audioSession && ref->mPid == caller) {
3111             ref->mCnt++;
3112             ALOGV(" incremented refcount to %d", ref->mCnt);
3113             return;
3114         }
3115     }
3116     mAudioSessionRefs.push(new AudioSessionRef(audioSession, caller, uid));
3117     ALOGV(" added new entry for %d", audioSession);
3118 }
3119 
releaseAudioSessionId(audio_session_t audioSession,pid_t pid)3120 void AudioFlinger::releaseAudioSessionId(audio_session_t audioSession, pid_t pid)
3121 {
3122     std::vector< sp<EffectModule> > removedEffects;
3123     {
3124         Mutex::Autolock _l(mLock);
3125         pid_t caller = IPCThreadState::self()->getCallingPid();
3126         ALOGV("releasing %d from %d for %d", audioSession, caller, pid);
3127         const uid_t callerUid = IPCThreadState::self()->getCallingUid();
3128         if (pid != (pid_t)-1 && isAudioServerOrMediaServerUid(callerUid)) {
3129             caller = pid;  // check must match acquireAudioSessionId()
3130         }
3131         size_t num = mAudioSessionRefs.size();
3132         for (size_t i = 0; i < num; i++) {
3133             AudioSessionRef *ref = mAudioSessionRefs.itemAt(i);
3134             if (ref->mSessionid == audioSession && ref->mPid == caller) {
3135                 ref->mCnt--;
3136                 ALOGV(" decremented refcount to %d", ref->mCnt);
3137                 if (ref->mCnt == 0) {
3138                     mAudioSessionRefs.removeAt(i);
3139                     delete ref;
3140                     std::vector< sp<EffectModule> > effects = purgeStaleEffects_l();
3141                     removedEffects.insert(removedEffects.end(), effects.begin(), effects.end());
3142                 }
3143                 goto Exit;
3144             }
3145         }
3146         // If the caller is audioserver it is likely that the session being released was acquired
3147         // on behalf of a process not in notification clients and we ignore the warning.
3148         ALOGW_IF(!isAudioServerUid(callerUid),
3149                  "session id %d not found for pid %d", audioSession, caller);
3150     }
3151 
3152 Exit:
3153     for (auto& effect : removedEffects) {
3154         effect->updatePolicyState();
3155     }
3156 }
3157 
isSessionAcquired_l(audio_session_t audioSession)3158 bool AudioFlinger::isSessionAcquired_l(audio_session_t audioSession)
3159 {
3160     size_t num = mAudioSessionRefs.size();
3161     for (size_t i = 0; i < num; i++) {
3162         AudioSessionRef *ref = mAudioSessionRefs.itemAt(i);
3163         if (ref->mSessionid == audioSession) {
3164             return true;
3165         }
3166     }
3167     return false;
3168 }
3169 
purgeStaleEffects_l()3170 std::vector<sp<AudioFlinger::EffectModule>> AudioFlinger::purgeStaleEffects_l() {
3171 
3172     ALOGV("purging stale effects");
3173 
3174     Vector< sp<EffectChain> > chains;
3175     std::vector< sp<EffectModule> > removedEffects;
3176 
3177     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
3178         sp<PlaybackThread> t = mPlaybackThreads.valueAt(i);
3179         Mutex::Autolock _l(t->mLock);
3180         for (size_t j = 0; j < t->mEffectChains.size(); j++) {
3181             sp<EffectChain> ec = t->mEffectChains[j];
3182             if (!audio_is_global_session(ec->sessionId())) {
3183                 chains.push(ec);
3184             }
3185         }
3186     }
3187 
3188     for (size_t i = 0; i < mRecordThreads.size(); i++) {
3189         sp<RecordThread> t = mRecordThreads.valueAt(i);
3190         Mutex::Autolock _l(t->mLock);
3191         for (size_t j = 0; j < t->mEffectChains.size(); j++) {
3192             sp<EffectChain> ec = t->mEffectChains[j];
3193             chains.push(ec);
3194         }
3195     }
3196 
3197     for (size_t i = 0; i < mMmapThreads.size(); i++) {
3198         sp<MmapThread> t = mMmapThreads.valueAt(i);
3199         Mutex::Autolock _l(t->mLock);
3200         for (size_t j = 0; j < t->mEffectChains.size(); j++) {
3201             sp<EffectChain> ec = t->mEffectChains[j];
3202             chains.push(ec);
3203         }
3204     }
3205 
3206     for (size_t i = 0; i < chains.size(); i++) {
3207         sp<EffectChain> ec = chains[i];
3208         int sessionid = ec->sessionId();
3209         sp<ThreadBase> t = ec->thread().promote();
3210         if (t == 0) {
3211             continue;
3212         }
3213         size_t numsessionrefs = mAudioSessionRefs.size();
3214         bool found = false;
3215         for (size_t k = 0; k < numsessionrefs; k++) {
3216             AudioSessionRef *ref = mAudioSessionRefs.itemAt(k);
3217             if (ref->mSessionid == sessionid) {
3218                 ALOGV(" session %d still exists for %d with %d refs",
3219                     sessionid, ref->mPid, ref->mCnt);
3220                 found = true;
3221                 break;
3222             }
3223         }
3224         if (!found) {
3225             Mutex::Autolock _l(t->mLock);
3226             // remove all effects from the chain
3227             while (ec->mEffects.size()) {
3228                 sp<EffectModule> effect = ec->mEffects[0];
3229                 effect->unPin();
3230                 t->removeEffect_l(effect, /*release*/ true);
3231                 if (effect->purgeHandles()) {
3232                     effect->checkSuspendOnEffectEnabled(false, true /*threadLocked*/);
3233                 }
3234                 removedEffects.push_back(effect);
3235             }
3236         }
3237     }
3238     return removedEffects;
3239 }
3240 
3241 // dumpToThreadLog_l() must be called with AudioFlinger::mLock held
dumpToThreadLog_l(const sp<ThreadBase> & thread)3242 void AudioFlinger::dumpToThreadLog_l(const sp<ThreadBase> &thread)
3243 {
3244     constexpr int THREAD_DUMP_TIMEOUT_MS = 2;
3245     audio_utils::FdToString fdToString("- ", THREAD_DUMP_TIMEOUT_MS);
3246     const int fd = fdToString.fd();
3247     if (fd >= 0) {
3248         thread->dump(fd, {} /* args */);
3249         mThreadLog.logs(-1 /* time */, fdToString.getStringAndClose());
3250     }
3251 }
3252 
3253 // checkThread_l() must be called with AudioFlinger::mLock held
checkThread_l(audio_io_handle_t ioHandle) const3254 AudioFlinger::ThreadBase *AudioFlinger::checkThread_l(audio_io_handle_t ioHandle) const
3255 {
3256     ThreadBase *thread = checkMmapThread_l(ioHandle);
3257     if (thread == 0) {
3258         switch (audio_unique_id_get_use(ioHandle)) {
3259         case AUDIO_UNIQUE_ID_USE_OUTPUT:
3260             thread = checkPlaybackThread_l(ioHandle);
3261             break;
3262         case AUDIO_UNIQUE_ID_USE_INPUT:
3263             thread = checkRecordThread_l(ioHandle);
3264             break;
3265         default:
3266             break;
3267         }
3268     }
3269     return thread;
3270 }
3271 
3272 // checkPlaybackThread_l() must be called with AudioFlinger::mLock held
checkPlaybackThread_l(audio_io_handle_t output) const3273 AudioFlinger::PlaybackThread *AudioFlinger::checkPlaybackThread_l(audio_io_handle_t output) const
3274 {
3275     return mPlaybackThreads.valueFor(output).get();
3276 }
3277 
3278 // checkMixerThread_l() must be called with AudioFlinger::mLock held
checkMixerThread_l(audio_io_handle_t output) const3279 AudioFlinger::MixerThread *AudioFlinger::checkMixerThread_l(audio_io_handle_t output) const
3280 {
3281     PlaybackThread *thread = checkPlaybackThread_l(output);
3282     return thread != NULL && thread->type() != ThreadBase::DIRECT ? (MixerThread *) thread : NULL;
3283 }
3284 
3285 // checkRecordThread_l() must be called with AudioFlinger::mLock held
checkRecordThread_l(audio_io_handle_t input) const3286 AudioFlinger::RecordThread *AudioFlinger::checkRecordThread_l(audio_io_handle_t input) const
3287 {
3288     return mRecordThreads.valueFor(input).get();
3289 }
3290 
3291 // checkMmapThread_l() must be called with AudioFlinger::mLock held
checkMmapThread_l(audio_io_handle_t io) const3292 AudioFlinger::MmapThread *AudioFlinger::checkMmapThread_l(audio_io_handle_t io) const
3293 {
3294     return mMmapThreads.valueFor(io).get();
3295 }
3296 
3297 
3298 // checkPlaybackThread_l() must be called with AudioFlinger::mLock held
getVolumeInterface_l(audio_io_handle_t output) const3299 AudioFlinger::VolumeInterface *AudioFlinger::getVolumeInterface_l(audio_io_handle_t output) const
3300 {
3301     VolumeInterface *volumeInterface = mPlaybackThreads.valueFor(output).get();
3302     if (volumeInterface == nullptr) {
3303         MmapThread *mmapThread = mMmapThreads.valueFor(output).get();
3304         if (mmapThread != nullptr) {
3305             if (mmapThread->isOutput()) {
3306                 MmapPlaybackThread *mmapPlaybackThread =
3307                         static_cast<MmapPlaybackThread *>(mmapThread);
3308                 volumeInterface = mmapPlaybackThread;
3309             }
3310         }
3311     }
3312     return volumeInterface;
3313 }
3314 
getAllVolumeInterfaces_l() const3315 Vector <AudioFlinger::VolumeInterface *> AudioFlinger::getAllVolumeInterfaces_l() const
3316 {
3317     Vector <VolumeInterface *> volumeInterfaces;
3318     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
3319         volumeInterfaces.add(mPlaybackThreads.valueAt(i).get());
3320     }
3321     for (size_t i = 0; i < mMmapThreads.size(); i++) {
3322         if (mMmapThreads.valueAt(i)->isOutput()) {
3323             MmapPlaybackThread *mmapPlaybackThread =
3324                     static_cast<MmapPlaybackThread *>(mMmapThreads.valueAt(i).get());
3325             volumeInterfaces.add(mmapPlaybackThread);
3326         }
3327     }
3328     return volumeInterfaces;
3329 }
3330 
nextUniqueId(audio_unique_id_use_t use)3331 audio_unique_id_t AudioFlinger::nextUniqueId(audio_unique_id_use_t use)
3332 {
3333     // This is the internal API, so it is OK to assert on bad parameter.
3334     LOG_ALWAYS_FATAL_IF((unsigned) use >= (unsigned) AUDIO_UNIQUE_ID_USE_MAX);
3335     const int maxRetries = use == AUDIO_UNIQUE_ID_USE_SESSION ? 3 : 1;
3336     for (int retry = 0; retry < maxRetries; retry++) {
3337         // The cast allows wraparound from max positive to min negative instead of abort
3338         uint32_t base = (uint32_t) atomic_fetch_add_explicit(&mNextUniqueIds[use],
3339                 (uint_fast32_t) AUDIO_UNIQUE_ID_USE_MAX, memory_order_acq_rel);
3340         ALOG_ASSERT(audio_unique_id_get_use(base) == AUDIO_UNIQUE_ID_USE_UNSPECIFIED);
3341         // allow wrap by skipping 0 and -1 for session ids
3342         if (!(base == 0 || base == (~0u & ~AUDIO_UNIQUE_ID_USE_MASK))) {
3343             ALOGW_IF(retry != 0, "unique ID overflow for use %d", use);
3344             return (audio_unique_id_t) (base | use);
3345         }
3346     }
3347     // We have no way of recovering from wraparound
3348     LOG_ALWAYS_FATAL("unique ID overflow for use %d", use);
3349     // TODO Use a floor after wraparound.  This may need a mutex.
3350 }
3351 
primaryPlaybackThread_l() const3352 AudioFlinger::PlaybackThread *AudioFlinger::primaryPlaybackThread_l() const
3353 {
3354     AutoMutex lock(mHardwareLock);
3355     if (mPrimaryHardwareDev == nullptr) {
3356         return nullptr;
3357     }
3358     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
3359         PlaybackThread *thread = mPlaybackThreads.valueAt(i).get();
3360         if(thread->isDuplicating()) {
3361             continue;
3362         }
3363         AudioStreamOut *output = thread->getOutput();
3364         if (output != NULL && output->audioHwDev == mPrimaryHardwareDev) {
3365             return thread;
3366         }
3367     }
3368     return nullptr;
3369 }
3370 
primaryOutputDevice_l() const3371 DeviceTypeSet AudioFlinger::primaryOutputDevice_l() const
3372 {
3373     PlaybackThread *thread = primaryPlaybackThread_l();
3374 
3375     if (thread == NULL) {
3376         return DeviceTypeSet();
3377     }
3378 
3379     return thread->outDeviceTypes();
3380 }
3381 
fastPlaybackThread_l() const3382 AudioFlinger::PlaybackThread *AudioFlinger::fastPlaybackThread_l() const
3383 {
3384     size_t minFrameCount = 0;
3385     PlaybackThread *minThread = NULL;
3386     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
3387         PlaybackThread *thread = mPlaybackThreads.valueAt(i).get();
3388         if (!thread->isDuplicating()) {
3389             size_t frameCount = thread->frameCountHAL();
3390             if (frameCount != 0 && (minFrameCount == 0 || frameCount < minFrameCount ||
3391                     (frameCount == minFrameCount && thread->hasFastMixer() &&
3392                     /*minThread != NULL &&*/ !minThread->hasFastMixer()))) {
3393                 minFrameCount = frameCount;
3394                 minThread = thread;
3395             }
3396         }
3397     }
3398     return minThread;
3399 }
3400 
hapticPlaybackThread_l() const3401 AudioFlinger::ThreadBase *AudioFlinger::hapticPlaybackThread_l() const {
3402     for (size_t i  = 0; i < mPlaybackThreads.size(); ++i) {
3403         PlaybackThread *thread = mPlaybackThreads.valueAt(i).get();
3404         if (thread->hapticChannelMask() != AUDIO_CHANNEL_NONE) {
3405             return thread;
3406         }
3407     }
3408     return nullptr;
3409 }
3410 
updateSecondaryOutputsForTrack_l(PlaybackThread::Track * track,PlaybackThread * thread,const std::vector<audio_io_handle_t> & secondaryOutputs) const3411 void AudioFlinger::updateSecondaryOutputsForTrack_l(
3412         PlaybackThread::Track* track,
3413         PlaybackThread* thread,
3414         const std::vector<audio_io_handle_t> &secondaryOutputs) const {
3415     TeePatches teePatches;
3416     for (audio_io_handle_t secondaryOutput : secondaryOutputs) {
3417         PlaybackThread *secondaryThread = checkPlaybackThread_l(secondaryOutput);
3418         if (secondaryThread == nullptr) {
3419             ALOGE("no playback thread found for secondary output %d", thread->id());
3420             continue;
3421         }
3422 
3423         size_t sourceFrameCount = thread->frameCount() * track->sampleRate()
3424                                   / thread->sampleRate();
3425         size_t sinkFrameCount = secondaryThread->frameCount() * track->sampleRate()
3426                                   / secondaryThread->sampleRate();
3427         // If the secondary output has just been opened, the first secondaryThread write
3428         // will not block as it will fill the empty startup buffer of the HAL,
3429         // so a second sink buffer needs to be ready for the immediate next blocking write.
3430         // Additionally, have a margin of one main thread buffer as the scheduling jitter
3431         // can reorder the writes (eg if thread A&B have the same write intervale,
3432         // the scheduler could schedule AB...BA)
3433         size_t frameCountToBeReady = 2 * sinkFrameCount + sourceFrameCount;
3434         // Total secondary output buffer must be at least as the read frames plus
3435         // the margin of a few buffers on both sides in case the
3436         // threads scheduling has some jitter.
3437         // That value should not impact latency as the secondary track is started before
3438         // its buffer is full, see frameCountToBeReady.
3439         size_t frameCount = frameCountToBeReady + 2 * (sourceFrameCount + sinkFrameCount);
3440         // The frameCount should also not be smaller than the secondary thread min frame
3441         // count
3442         size_t minFrameCount = AudioSystem::calculateMinFrameCount(
3443                     [&] { Mutex::Autolock _l(secondaryThread->mLock);
3444                           return secondaryThread->latency_l(); }(),
3445                     secondaryThread->mNormalFrameCount,
3446                     secondaryThread->mSampleRate,
3447                     track->sampleRate(),
3448                     track->getSpeed());
3449         frameCount = std::max(frameCount, minFrameCount);
3450 
3451         using namespace std::chrono_literals;
3452         auto inChannelMask = audio_channel_mask_out_to_in(track->channelMask());
3453         sp patchRecord = new RecordThread::PatchRecord(nullptr /* thread */,
3454                                                        track->sampleRate(),
3455                                                        inChannelMask,
3456                                                        track->format(),
3457                                                        frameCount,
3458                                                        nullptr /* buffer */,
3459                                                        (size_t)0 /* bufferSize */,
3460                                                        AUDIO_INPUT_FLAG_DIRECT,
3461                                                        0ns /* timeout */);
3462         status_t status = patchRecord->initCheck();
3463         if (status != NO_ERROR) {
3464             ALOGE("Secondary output patchRecord init failed: %d", status);
3465             continue;
3466         }
3467 
3468         // TODO: We could check compatibility of the secondaryThread with the PatchTrack
3469         // for fast usage: thread has fast mixer, sample rate matches, etc.;
3470         // for now, we exclude fast tracks by removing the Fast flag.
3471         const audio_output_flags_t outputFlags =
3472                 (audio_output_flags_t)(track->getOutputFlags() & ~AUDIO_OUTPUT_FLAG_FAST);
3473         sp patchTrack = new PlaybackThread::PatchTrack(secondaryThread,
3474                                                        track->streamType(),
3475                                                        track->sampleRate(),
3476                                                        track->channelMask(),
3477                                                        track->format(),
3478                                                        frameCount,
3479                                                        patchRecord->buffer(),
3480                                                        patchRecord->bufferSize(),
3481                                                        outputFlags,
3482                                                        0ns /* timeout */,
3483                                                        frameCountToBeReady);
3484         status = patchTrack->initCheck();
3485         if (status != NO_ERROR) {
3486             ALOGE("Secondary output patchTrack init failed: %d", status);
3487             continue;
3488         }
3489         teePatches.push_back({patchRecord, patchTrack});
3490         secondaryThread->addPatchTrack(patchTrack);
3491         // In case the downstream patchTrack on the secondaryThread temporarily outlives
3492         // our created track, ensure the corresponding patchRecord is still alive.
3493         patchTrack->setPeerProxy(patchRecord, true /* holdReference */);
3494         patchRecord->setPeerProxy(patchTrack, false /* holdReference */);
3495     }
3496     track->setTeePatches(std::move(teePatches));
3497 }
3498 
createSyncEvent(AudioSystem::sync_event_t type,audio_session_t triggerSession,audio_session_t listenerSession,sync_event_callback_t callBack,const wp<RefBase> & cookie)3499 sp<AudioFlinger::SyncEvent> AudioFlinger::createSyncEvent(AudioSystem::sync_event_t type,
3500                                     audio_session_t triggerSession,
3501                                     audio_session_t listenerSession,
3502                                     sync_event_callback_t callBack,
3503                                     const wp<RefBase>& cookie)
3504 {
3505     Mutex::Autolock _l(mLock);
3506 
3507     sp<SyncEvent> event = new SyncEvent(type, triggerSession, listenerSession, callBack, cookie);
3508     status_t playStatus = NAME_NOT_FOUND;
3509     status_t recStatus = NAME_NOT_FOUND;
3510     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
3511         playStatus = mPlaybackThreads.valueAt(i)->setSyncEvent(event);
3512         if (playStatus == NO_ERROR) {
3513             return event;
3514         }
3515     }
3516     for (size_t i = 0; i < mRecordThreads.size(); i++) {
3517         recStatus = mRecordThreads.valueAt(i)->setSyncEvent(event);
3518         if (recStatus == NO_ERROR) {
3519             return event;
3520         }
3521     }
3522     if (playStatus == NAME_NOT_FOUND || recStatus == NAME_NOT_FOUND) {
3523         mPendingSyncEvents.add(event);
3524     } else {
3525         ALOGV("createSyncEvent() invalid event %d", event->type());
3526         event.clear();
3527     }
3528     return event;
3529 }
3530 
3531 // ----------------------------------------------------------------------------
3532 //  Effect management
3533 // ----------------------------------------------------------------------------
3534 
getEffectsFactory()3535 sp<EffectsFactoryHalInterface> AudioFlinger::getEffectsFactory() {
3536     return mEffectsFactoryHal;
3537 }
3538 
queryNumberEffects(uint32_t * numEffects) const3539 status_t AudioFlinger::queryNumberEffects(uint32_t *numEffects) const
3540 {
3541     Mutex::Autolock _l(mLock);
3542     if (mEffectsFactoryHal.get()) {
3543         return mEffectsFactoryHal->queryNumberEffects(numEffects);
3544     } else {
3545         return -ENODEV;
3546     }
3547 }
3548 
queryEffect(uint32_t index,effect_descriptor_t * descriptor) const3549 status_t AudioFlinger::queryEffect(uint32_t index, effect_descriptor_t *descriptor) const
3550 {
3551     Mutex::Autolock _l(mLock);
3552     if (mEffectsFactoryHal.get()) {
3553         return mEffectsFactoryHal->getDescriptor(index, descriptor);
3554     } else {
3555         return -ENODEV;
3556     }
3557 }
3558 
getEffectDescriptor(const effect_uuid_t * pUuid,const effect_uuid_t * pTypeUuid,uint32_t preferredTypeFlag,effect_descriptor_t * descriptor) const3559 status_t AudioFlinger::getEffectDescriptor(const effect_uuid_t *pUuid,
3560                                            const effect_uuid_t *pTypeUuid,
3561                                            uint32_t preferredTypeFlag,
3562                                            effect_descriptor_t *descriptor) const
3563 {
3564     if (pUuid == NULL || pTypeUuid == NULL || descriptor == NULL) {
3565         return BAD_VALUE;
3566     }
3567 
3568     Mutex::Autolock _l(mLock);
3569 
3570     if (!mEffectsFactoryHal.get()) {
3571         return -ENODEV;
3572     }
3573 
3574     status_t status = NO_ERROR;
3575     if (!EffectsFactoryHalInterface::isNullUuid(pUuid)) {
3576         // If uuid is specified, request effect descriptor from that.
3577         status = mEffectsFactoryHal->getDescriptor(pUuid, descriptor);
3578     } else if (!EffectsFactoryHalInterface::isNullUuid(pTypeUuid)) {
3579         // If uuid is not specified, look for an available implementation
3580         // of the required type instead.
3581 
3582         // Use a temporary descriptor to avoid modifying |descriptor| in the failure case.
3583         effect_descriptor_t desc;
3584         desc.flags = 0; // prevent compiler warning
3585 
3586         uint32_t numEffects = 0;
3587         status = mEffectsFactoryHal->queryNumberEffects(&numEffects);
3588         if (status < 0) {
3589             ALOGW("getEffectDescriptor() error %d from FactoryHal queryNumberEffects", status);
3590             return status;
3591         }
3592 
3593         bool found = false;
3594         for (uint32_t i = 0; i < numEffects; i++) {
3595             status = mEffectsFactoryHal->getDescriptor(i, &desc);
3596             if (status < 0) {
3597                 ALOGW("getEffectDescriptor() error %d from FactoryHal getDescriptor", status);
3598                 continue;
3599             }
3600             if (memcmp(&desc.type, pTypeUuid, sizeof(effect_uuid_t)) == 0) {
3601                 // If matching type found save effect descriptor.
3602                 found = true;
3603                 *descriptor = desc;
3604 
3605                 // If there's no preferred flag or this descriptor matches the preferred
3606                 // flag, success! If this descriptor doesn't match the preferred
3607                 // flag, continue enumeration in case a better matching version of this
3608                 // effect type is available. Note that this means if no effect with a
3609                 // correct flag is found, the descriptor returned will correspond to the
3610                 // last effect that at least had a matching type uuid (if any).
3611                 if (preferredTypeFlag == EFFECT_FLAG_TYPE_MASK ||
3612                     (desc.flags & EFFECT_FLAG_TYPE_MASK) == preferredTypeFlag) {
3613                     break;
3614                 }
3615             }
3616         }
3617 
3618         if (!found) {
3619             status = NAME_NOT_FOUND;
3620             ALOGW("getEffectDescriptor(): Effect not found by type.");
3621         }
3622     } else {
3623         status = BAD_VALUE;
3624         ALOGE("getEffectDescriptor(): Either uuid or type uuid must be non-null UUIDs.");
3625     }
3626     return status;
3627 }
3628 
createEffect(const media::CreateEffectRequest & request,media::CreateEffectResponse * response)3629 status_t AudioFlinger::createEffect(const media::CreateEffectRequest& request,
3630                                     media::CreateEffectResponse* response) {
3631     const sp<IEffectClient>& effectClient = request.client;
3632     const int32_t priority = request.priority;
3633     const AudioDeviceTypeAddr device = VALUE_OR_RETURN_STATUS(
3634             aidl2legacy_AudioDeviceTypeAddress(request.device));
3635     AttributionSourceState adjAttributionSource = request.attributionSource;
3636     const audio_session_t sessionId = VALUE_OR_RETURN_STATUS(
3637             aidl2legacy_int32_t_audio_session_t(request.sessionId));
3638     audio_io_handle_t io = VALUE_OR_RETURN_STATUS(
3639             aidl2legacy_int32_t_audio_io_handle_t(request.output));
3640     const effect_descriptor_t descIn = VALUE_OR_RETURN_STATUS(
3641             aidl2legacy_EffectDescriptor_effect_descriptor_t(request.desc));
3642     const bool probe = request.probe;
3643 
3644     sp<EffectHandle> handle;
3645     effect_descriptor_t descOut;
3646     int enabledOut = 0;
3647     int idOut = -1;
3648 
3649     status_t lStatus = NO_ERROR;
3650 
3651     // TODO b/182392553: refactor or make clearer
3652     const uid_t callingUid = IPCThreadState::self()->getCallingUid();
3653     adjAttributionSource.uid = VALUE_OR_RETURN_STATUS(legacy2aidl_uid_t_int32_t(callingUid));
3654     pid_t currentPid = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_pid_t(adjAttributionSource.pid));
3655     if (currentPid == -1 || !isAudioServerOrMediaServerUid(callingUid)) {
3656         const pid_t callingPid = IPCThreadState::self()->getCallingPid();
3657         ALOGW_IF(currentPid != -1 && currentPid != callingPid,
3658                  "%s uid %d pid %d tried to pass itself off as pid %d",
3659                  __func__, callingUid, callingPid, currentPid);
3660         adjAttributionSource.pid = VALUE_OR_RETURN_STATUS(legacy2aidl_pid_t_int32_t(callingPid));
3661         currentPid = callingPid;
3662     }
3663 
3664     ALOGV("createEffect pid %d, effectClient %p, priority %d, sessionId %d, io %d, factory %p",
3665           adjAttributionSource.pid, effectClient.get(), priority, sessionId, io,
3666           mEffectsFactoryHal.get());
3667 
3668     if (mEffectsFactoryHal == 0) {
3669         ALOGE("%s: no effects factory hal", __func__);
3670         lStatus = NO_INIT;
3671         goto Exit;
3672     }
3673 
3674     // check audio settings permission for global effects
3675     if (sessionId == AUDIO_SESSION_OUTPUT_MIX) {
3676         if (!settingsAllowed()) {
3677             ALOGE("%s: no permission for AUDIO_SESSION_OUTPUT_MIX", __func__);
3678             lStatus = PERMISSION_DENIED;
3679             goto Exit;
3680         }
3681     } else if (sessionId == AUDIO_SESSION_OUTPUT_STAGE) {
3682         if (!isAudioServerUid(callingUid)) {
3683             ALOGE("%s: only APM can create using AUDIO_SESSION_OUTPUT_STAGE", __func__);
3684             lStatus = PERMISSION_DENIED;
3685             goto Exit;
3686         }
3687 
3688         if (io == AUDIO_IO_HANDLE_NONE) {
3689             ALOGE("%s: APM must specify output when using AUDIO_SESSION_OUTPUT_STAGE", __func__);
3690             lStatus = BAD_VALUE;
3691             goto Exit;
3692         }
3693     } else if (sessionId == AUDIO_SESSION_DEVICE) {
3694         if (!modifyDefaultAudioEffectsAllowed(adjAttributionSource)) {
3695             ALOGE("%s: device effect permission denied for uid %d", __func__, callingUid);
3696             lStatus = PERMISSION_DENIED;
3697             goto Exit;
3698         }
3699         if (io != AUDIO_IO_HANDLE_NONE) {
3700             ALOGE("%s: io handle should not be specified for device effect", __func__);
3701             lStatus = BAD_VALUE;
3702             goto Exit;
3703         }
3704     } else {
3705         // general sessionId.
3706 
3707         if (audio_unique_id_get_use(sessionId) != AUDIO_UNIQUE_ID_USE_SESSION) {
3708             ALOGE("%s: invalid sessionId %d", __func__, sessionId);
3709             lStatus = BAD_VALUE;
3710             goto Exit;
3711         }
3712 
3713         // TODO: should we check if the callingUid (limited to pid) is in mAudioSessionRefs
3714         // to prevent creating an effect when one doesn't actually have track with that session?
3715     }
3716 
3717     {
3718         // Get the full effect descriptor from the uuid/type.
3719         // If the session is the output mix, prefer an auxiliary effect,
3720         // otherwise no preference.
3721         uint32_t preferredType = (sessionId == AUDIO_SESSION_OUTPUT_MIX ?
3722                                   EFFECT_FLAG_TYPE_AUXILIARY : EFFECT_FLAG_TYPE_MASK);
3723         lStatus = getEffectDescriptor(&descIn.uuid, &descIn.type, preferredType, &descOut);
3724         if (lStatus < 0) {
3725             ALOGW("createEffect() error %d from getEffectDescriptor", lStatus);
3726             goto Exit;
3727         }
3728 
3729         // Do not allow auxiliary effects on a session different from 0 (output mix)
3730         if (sessionId != AUDIO_SESSION_OUTPUT_MIX &&
3731              (descOut.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
3732             lStatus = INVALID_OPERATION;
3733             goto Exit;
3734         }
3735 
3736         // check recording permission for visualizer
3737         if ((memcmp(&descOut.type, SL_IID_VISUALIZATION, sizeof(effect_uuid_t)) == 0) &&
3738             // TODO: Do we need to start/stop op - i.e. is there recording being performed?
3739             !recordingAllowed(adjAttributionSource)) {
3740             lStatus = PERMISSION_DENIED;
3741             goto Exit;
3742         }
3743 
3744         const bool hapticPlaybackRequired = EffectModule::isHapticGenerator(&descOut.type);
3745         if (hapticPlaybackRequired
3746                 && (sessionId == AUDIO_SESSION_DEVICE
3747                         || sessionId == AUDIO_SESSION_OUTPUT_MIX
3748                         || sessionId == AUDIO_SESSION_OUTPUT_STAGE)) {
3749             // haptic-generating effect is only valid when the session id is a general session id
3750             lStatus = INVALID_OPERATION;
3751             goto Exit;
3752         }
3753 
3754         // Only audio policy service can create a spatializer effect
3755         if ((memcmp(&descOut.type, FX_IID_SPATIALIZER, sizeof(effect_uuid_t)) == 0) &&
3756             (callingUid != AID_AUDIOSERVER || currentPid != getpid())) {
3757             ALOGW("%s: attempt to create a spatializer effect from uid/pid %d/%d",
3758                     __func__, callingUid, currentPid);
3759             lStatus = PERMISSION_DENIED;
3760             goto Exit;
3761         }
3762 
3763         if (io == AUDIO_IO_HANDLE_NONE && sessionId == AUDIO_SESSION_OUTPUT_MIX) {
3764             // if the output returned by getOutputForEffect() is removed before we lock the
3765             // mutex below, the call to checkPlaybackThread_l(io) below will detect it
3766             // and we will exit safely
3767             io = AudioSystem::getOutputForEffect(&descOut);
3768             ALOGV("createEffect got output %d", io);
3769         }
3770 
3771         Mutex::Autolock _l(mLock);
3772 
3773         if (sessionId == AUDIO_SESSION_DEVICE) {
3774             sp<Client> client = registerPid(currentPid);
3775             ALOGV("%s device type %#x address %s", __func__, device.mType, device.getAddress());
3776             handle = mDeviceEffectManager.createEffect_l(
3777                     &descOut, device, client, effectClient, mPatchPanel.patches_l(),
3778                     &enabledOut, &lStatus, probe, request.notifyFramesProcessed);
3779             if (lStatus != NO_ERROR && lStatus != ALREADY_EXISTS) {
3780                 // remove local strong reference to Client with mClientLock held
3781                 Mutex::Autolock _cl(mClientLock);
3782                 client.clear();
3783             } else {
3784                 // handle must be valid here, but check again to be safe.
3785                 if (handle.get() != nullptr) idOut = handle->id();
3786             }
3787             goto Register;
3788         }
3789 
3790         // If output is not specified try to find a matching audio session ID in one of the
3791         // output threads.
3792         // If output is 0 here, sessionId is neither SESSION_OUTPUT_STAGE nor SESSION_OUTPUT_MIX
3793         // because of code checking output when entering the function.
3794         // Note: io is never AUDIO_IO_HANDLE_NONE when creating an effect on an input by APM.
3795         // An AudioEffect created from the Java API will have io as AUDIO_IO_HANDLE_NONE.
3796         if (io == AUDIO_IO_HANDLE_NONE) {
3797             // look for the thread where the specified audio session is present
3798             io = findIoHandleBySessionId_l(sessionId, mPlaybackThreads);
3799             if (io == AUDIO_IO_HANDLE_NONE) {
3800                 io = findIoHandleBySessionId_l(sessionId, mRecordThreads);
3801             }
3802             if (io == AUDIO_IO_HANDLE_NONE) {
3803                 io = findIoHandleBySessionId_l(sessionId, mMmapThreads);
3804             }
3805 
3806             // If you wish to create a Record preprocessing AudioEffect in Java,
3807             // you MUST create an AudioRecord first and keep it alive so it is picked up above.
3808             // Otherwise it will fail when created on a Playback thread by legacy
3809             // handling below.  Ditto with Mmap, the associated Mmap track must be created
3810             // before creating the AudioEffect or the io handle must be specified.
3811             //
3812             // Detect if the effect is created after an AudioRecord is destroyed.
3813             if (getOrphanEffectChain_l(sessionId).get() != nullptr) {
3814                 ALOGE("%s: effect %s with no specified io handle is denied because the AudioRecord"
3815                       " for session %d no longer exists",
3816                       __func__, descOut.name, sessionId);
3817                 lStatus = PERMISSION_DENIED;
3818                 goto Exit;
3819             }
3820 
3821             // Legacy handling of creating an effect on an expired or made-up
3822             // session id.  We think that it is a Playback effect.
3823             //
3824             // If no output thread contains the requested session ID, default to
3825             // first output. The effect chain will be moved to the correct output
3826             // thread when a track with the same session ID is created
3827             if (io == AUDIO_IO_HANDLE_NONE && mPlaybackThreads.size() > 0) {
3828                 io = mPlaybackThreads.keyAt(0);
3829             }
3830             ALOGV("createEffect() got io %d for effect %s", io, descOut.name);
3831         } else if (checkPlaybackThread_l(io) != nullptr
3832                         && sessionId != AUDIO_SESSION_OUTPUT_STAGE) {
3833             // allow only one effect chain per sessionId on mPlaybackThreads.
3834             for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
3835                 const audio_io_handle_t checkIo = mPlaybackThreads.keyAt(i);
3836                 if (io == checkIo) {
3837                     if (hapticPlaybackRequired
3838                             && mPlaybackThreads.valueAt(i)
3839                                     ->hapticChannelMask() == AUDIO_CHANNEL_NONE) {
3840                         ALOGE("%s: haptic playback thread is required while the required playback "
3841                               "thread(io=%d) doesn't support", __func__, (int)io);
3842                         lStatus = BAD_VALUE;
3843                         goto Exit;
3844                     }
3845                     continue;
3846                 }
3847                 const uint32_t sessionType =
3848                         mPlaybackThreads.valueAt(i)->hasAudioSession(sessionId);
3849                 if ((sessionType & ThreadBase::EFFECT_SESSION) != 0) {
3850                     ALOGE("%s: effect %s io %d denied because session %d effect exists on io %d",
3851                           __func__, descOut.name, (int) io, (int) sessionId, (int) checkIo);
3852                     android_errorWriteLog(0x534e4554, "123237974");
3853                     lStatus = BAD_VALUE;
3854                     goto Exit;
3855                 }
3856             }
3857         }
3858         ThreadBase *thread = checkRecordThread_l(io);
3859         if (thread == NULL) {
3860             thread = checkPlaybackThread_l(io);
3861             if (thread == NULL) {
3862                 thread = checkMmapThread_l(io);
3863                 if (thread == NULL) {
3864                     ALOGE("createEffect() unknown output thread");
3865                     lStatus = BAD_VALUE;
3866                     goto Exit;
3867                 }
3868             }
3869         } else {
3870             // Check if one effect chain was awaiting for an effect to be created on this
3871             // session and used it instead of creating a new one.
3872             sp<EffectChain> chain = getOrphanEffectChain_l(sessionId);
3873             if (chain != 0) {
3874                 Mutex::Autolock _l(thread->mLock);
3875                 thread->addEffectChain_l(chain);
3876             }
3877         }
3878 
3879         sp<Client> client = registerPid(currentPid);
3880 
3881         // create effect on selected output thread
3882         bool pinned = !audio_is_global_session(sessionId) && isSessionAcquired_l(sessionId);
3883         ThreadBase *oriThread = nullptr;
3884         if (hapticPlaybackRequired && thread->hapticChannelMask() == AUDIO_CHANNEL_NONE) {
3885             ThreadBase *hapticThread = hapticPlaybackThread_l();
3886             if (hapticThread == nullptr) {
3887                 ALOGE("%s haptic thread not found while it is required", __func__);
3888                 lStatus = INVALID_OPERATION;
3889                 goto Exit;
3890             }
3891             if (hapticThread != thread) {
3892                 // Force to use haptic thread for haptic-generating effect.
3893                 oriThread = thread;
3894                 thread = hapticThread;
3895             }
3896         }
3897         handle = thread->createEffect_l(client, effectClient, priority, sessionId,
3898                                         &descOut, &enabledOut, &lStatus, pinned, probe,
3899                                         request.notifyFramesProcessed);
3900         if (lStatus != NO_ERROR && lStatus != ALREADY_EXISTS) {
3901             // remove local strong reference to Client with mClientLock held
3902             Mutex::Autolock _cl(mClientLock);
3903             client.clear();
3904         } else {
3905             // handle must be valid here, but check again to be safe.
3906             if (handle.get() != nullptr) idOut = handle->id();
3907             // Invalidate audio session when haptic playback is created.
3908             if (hapticPlaybackRequired && oriThread != nullptr) {
3909                 // invalidateTracksForAudioSession will trigger locking the thread.
3910                 oriThread->invalidateTracksForAudioSession(sessionId);
3911             }
3912         }
3913     }
3914 
3915 Register:
3916     if (!probe && (lStatus == NO_ERROR || lStatus == ALREADY_EXISTS)) {
3917         // Check CPU and memory usage
3918         sp<EffectBase> effect = handle->effect().promote();
3919         if (effect != nullptr) {
3920             status_t rStatus = effect->updatePolicyState();
3921             if (rStatus != NO_ERROR) {
3922                 lStatus = rStatus;
3923             }
3924         }
3925     } else {
3926         handle.clear();
3927     }
3928 
3929     response->id = idOut;
3930     response->enabled = enabledOut != 0;
3931     response->effect = handle;
3932     response->desc = VALUE_OR_RETURN_STATUS(
3933             legacy2aidl_effect_descriptor_t_EffectDescriptor(descOut));
3934 
3935 Exit:
3936     return lStatus;
3937 }
3938 
moveEffects(audio_session_t sessionId,audio_io_handle_t srcOutput,audio_io_handle_t dstOutput)3939 status_t AudioFlinger::moveEffects(audio_session_t sessionId, audio_io_handle_t srcOutput,
3940         audio_io_handle_t dstOutput)
3941 {
3942     ALOGV("moveEffects() session %d, srcOutput %d, dstOutput %d",
3943             sessionId, srcOutput, dstOutput);
3944     Mutex::Autolock _l(mLock);
3945     if (srcOutput == dstOutput) {
3946         ALOGW("moveEffects() same dst and src outputs %d", dstOutput);
3947         return NO_ERROR;
3948     }
3949     PlaybackThread *srcThread = checkPlaybackThread_l(srcOutput);
3950     if (srcThread == NULL) {
3951         ALOGW("moveEffects() bad srcOutput %d", srcOutput);
3952         return BAD_VALUE;
3953     }
3954     PlaybackThread *dstThread = checkPlaybackThread_l(dstOutput);
3955     if (dstThread == NULL) {
3956         ALOGW("moveEffects() bad dstOutput %d", dstOutput);
3957         return BAD_VALUE;
3958     }
3959 
3960     Mutex::Autolock _dl(dstThread->mLock);
3961     Mutex::Autolock _sl(srcThread->mLock);
3962     return moveEffectChain_l(sessionId, srcThread, dstThread);
3963 }
3964 
3965 
setEffectSuspended(int effectId,audio_session_t sessionId,bool suspended)3966 void AudioFlinger::setEffectSuspended(int effectId,
3967                                 audio_session_t sessionId,
3968                                 bool suspended)
3969 {
3970     Mutex::Autolock _l(mLock);
3971 
3972     sp<ThreadBase> thread = getEffectThread_l(sessionId, effectId);
3973     if (thread == nullptr) {
3974       return;
3975     }
3976     Mutex::Autolock _sl(thread->mLock);
3977     sp<EffectModule> effect = thread->getEffect_l(sessionId, effectId);
3978     thread->setEffectSuspended_l(&effect->desc().type, suspended, sessionId);
3979 }
3980 
3981 
3982 // moveEffectChain_l must be called with both srcThread and dstThread mLocks held
moveEffectChain_l(audio_session_t sessionId,AudioFlinger::PlaybackThread * srcThread,AudioFlinger::PlaybackThread * dstThread)3983 status_t AudioFlinger::moveEffectChain_l(audio_session_t sessionId,
3984                                    AudioFlinger::PlaybackThread *srcThread,
3985                                    AudioFlinger::PlaybackThread *dstThread)
3986 {
3987     ALOGV("moveEffectChain_l() session %d from thread %p to thread %p",
3988             sessionId, srcThread, dstThread);
3989 
3990     sp<EffectChain> chain = srcThread->getEffectChain_l(sessionId);
3991     if (chain == 0) {
3992         ALOGW("moveEffectChain_l() effect chain for session %d not on source thread %p",
3993                 sessionId, srcThread);
3994         return INVALID_OPERATION;
3995     }
3996 
3997     // Check whether the destination thread and all effects in the chain are compatible
3998     if (!chain->isCompatibleWithThread_l(dstThread)) {
3999         ALOGW("moveEffectChain_l() effect chain failed because"
4000                 " destination thread %p is not compatible with effects in the chain",
4001                 dstThread);
4002         return INVALID_OPERATION;
4003     }
4004 
4005     // remove chain first. This is useful only if reconfiguring effect chain on same output thread,
4006     // so that a new chain is created with correct parameters when first effect is added. This is
4007     // otherwise unnecessary as removeEffect_l() will remove the chain when last effect is
4008     // removed.
4009     srcThread->removeEffectChain_l(chain);
4010 
4011     // transfer all effects one by one so that new effect chain is created on new thread with
4012     // correct buffer sizes and audio parameters and effect engines reconfigured accordingly
4013     sp<EffectChain> dstChain;
4014     uint32_t strategy = 0; // prevent compiler warning
4015     sp<EffectModule> effect = chain->getEffectFromId_l(0);
4016     Vector< sp<EffectModule> > removed;
4017     status_t status = NO_ERROR;
4018     while (effect != 0) {
4019         srcThread->removeEffect_l(effect);
4020         removed.add(effect);
4021         status = dstThread->addEffect_l(effect);
4022         if (status != NO_ERROR) {
4023             break;
4024         }
4025         // removeEffect_l() has stopped the effect if it was active so it must be restarted
4026         if (effect->state() == EffectModule::ACTIVE ||
4027                 effect->state() == EffectModule::STOPPING) {
4028             effect->start();
4029         }
4030         // if the move request is not received from audio policy manager, the effect must be
4031         // re-registered with the new strategy and output
4032         if (dstChain == 0) {
4033             dstChain = effect->getCallback()->chain().promote();
4034             if (dstChain == 0) {
4035                 ALOGW("moveEffectChain_l() cannot get chain from effect %p", effect.get());
4036                 status = NO_INIT;
4037                 break;
4038             }
4039             strategy = dstChain->strategy();
4040         }
4041         effect = chain->getEffectFromId_l(0);
4042     }
4043 
4044     if (status != NO_ERROR) {
4045         for (size_t i = 0; i < removed.size(); i++) {
4046             srcThread->addEffect_l(removed[i]);
4047         }
4048     }
4049 
4050     return status;
4051 }
4052 
moveAuxEffectToIo(int EffectId,const sp<PlaybackThread> & dstThread,sp<PlaybackThread> * srcThread)4053 status_t AudioFlinger::moveAuxEffectToIo(int EffectId,
4054                                          const sp<PlaybackThread>& dstThread,
4055                                          sp<PlaybackThread> *srcThread)
4056 {
4057     status_t status = NO_ERROR;
4058     Mutex::Autolock _l(mLock);
4059     sp<PlaybackThread> thread =
4060         static_cast<PlaybackThread *>(getEffectThread_l(AUDIO_SESSION_OUTPUT_MIX, EffectId).get());
4061 
4062     if (EffectId != 0 && thread != 0 && dstThread != thread.get()) {
4063         Mutex::Autolock _dl(dstThread->mLock);
4064         Mutex::Autolock _sl(thread->mLock);
4065         sp<EffectChain> srcChain = thread->getEffectChain_l(AUDIO_SESSION_OUTPUT_MIX);
4066         sp<EffectChain> dstChain;
4067         if (srcChain == 0) {
4068             return INVALID_OPERATION;
4069         }
4070 
4071         sp<EffectModule> effect = srcChain->getEffectFromId_l(EffectId);
4072         if (effect == 0) {
4073             return INVALID_OPERATION;
4074         }
4075         thread->removeEffect_l(effect);
4076         status = dstThread->addEffect_l(effect);
4077         if (status != NO_ERROR) {
4078             thread->addEffect_l(effect);
4079             status = INVALID_OPERATION;
4080             goto Exit;
4081         }
4082 
4083         dstChain = effect->getCallback()->chain().promote();
4084         if (dstChain == 0) {
4085             thread->addEffect_l(effect);
4086             status = INVALID_OPERATION;
4087         }
4088 
4089 Exit:
4090         // removeEffect_l() has stopped the effect if it was active so it must be restarted
4091         if (effect->state() == EffectModule::ACTIVE ||
4092             effect->state() == EffectModule::STOPPING) {
4093             effect->start();
4094         }
4095     }
4096 
4097     if (status == NO_ERROR && srcThread != nullptr) {
4098         *srcThread = thread;
4099     }
4100     return status;
4101 }
4102 
isNonOffloadableGlobalEffectEnabled_l()4103 bool AudioFlinger::isNonOffloadableGlobalEffectEnabled_l()
4104 {
4105     if (mGlobalEffectEnableTime != 0 &&
4106             ((systemTime() - mGlobalEffectEnableTime) < kMinGlobalEffectEnabletimeNs)) {
4107         return true;
4108     }
4109 
4110     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
4111         sp<EffectChain> ec =
4112                 mPlaybackThreads.valueAt(i)->getEffectChain_l(AUDIO_SESSION_OUTPUT_MIX);
4113         if (ec != 0 && ec->isNonOffloadableEnabled()) {
4114             return true;
4115         }
4116     }
4117     return false;
4118 }
4119 
onNonOffloadableGlobalEffectEnable()4120 void AudioFlinger::onNonOffloadableGlobalEffectEnable()
4121 {
4122     Mutex::Autolock _l(mLock);
4123 
4124     mGlobalEffectEnableTime = systemTime();
4125 
4126     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
4127         sp<PlaybackThread> t = mPlaybackThreads.valueAt(i);
4128         if (t->mType == ThreadBase::OFFLOAD) {
4129             t->invalidateTracks(AUDIO_STREAM_MUSIC);
4130         }
4131     }
4132 
4133 }
4134 
putOrphanEffectChain_l(const sp<AudioFlinger::EffectChain> & chain)4135 status_t AudioFlinger::putOrphanEffectChain_l(const sp<AudioFlinger::EffectChain>& chain)
4136 {
4137     // clear possible suspended state before parking the chain so that it starts in default state
4138     // when attached to a new record thread
4139     chain->setEffectSuspended_l(FX_IID_AEC, false);
4140     chain->setEffectSuspended_l(FX_IID_NS, false);
4141 
4142     audio_session_t session = chain->sessionId();
4143     ssize_t index = mOrphanEffectChains.indexOfKey(session);
4144     ALOGV("putOrphanEffectChain_l session %d index %zd", session, index);
4145     if (index >= 0) {
4146         ALOGW("putOrphanEffectChain_l chain for session %d already present", session);
4147         return ALREADY_EXISTS;
4148     }
4149     mOrphanEffectChains.add(session, chain);
4150     return NO_ERROR;
4151 }
4152 
getOrphanEffectChain_l(audio_session_t session)4153 sp<AudioFlinger::EffectChain> AudioFlinger::getOrphanEffectChain_l(audio_session_t session)
4154 {
4155     sp<EffectChain> chain;
4156     ssize_t index = mOrphanEffectChains.indexOfKey(session);
4157     ALOGV("getOrphanEffectChain_l session %d index %zd", session, index);
4158     if (index >= 0) {
4159         chain = mOrphanEffectChains.valueAt(index);
4160         mOrphanEffectChains.removeItemsAt(index);
4161     }
4162     return chain;
4163 }
4164 
updateOrphanEffectChains(const sp<AudioFlinger::EffectModule> & effect)4165 bool AudioFlinger::updateOrphanEffectChains(const sp<AudioFlinger::EffectModule>& effect)
4166 {
4167     Mutex::Autolock _l(mLock);
4168     audio_session_t session = effect->sessionId();
4169     ssize_t index = mOrphanEffectChains.indexOfKey(session);
4170     ALOGV("updateOrphanEffectChains session %d index %zd", session, index);
4171     if (index >= 0) {
4172         sp<EffectChain> chain = mOrphanEffectChains.valueAt(index);
4173         if (chain->removeEffect_l(effect, true) == 0) {
4174             ALOGV("updateOrphanEffectChains removing effect chain at index %zd", index);
4175             mOrphanEffectChains.removeItemsAt(index);
4176         }
4177         return true;
4178     }
4179     return false;
4180 }
4181 
4182 
4183 // ----------------------------------------------------------------------------
4184 
onTransactWrapper(TransactionCode code,const Parcel & data,uint32_t flags,const std::function<status_t ()> & delegate)4185 status_t AudioFlinger::onTransactWrapper(TransactionCode code,
4186                                          const Parcel& data,
4187                                          uint32_t flags,
4188                                          const std::function<status_t()>& delegate) {
4189     (void) data;
4190     (void) flags;
4191 
4192     // make sure transactions reserved to AudioPolicyManager do not come from other processes
4193     switch (code) {
4194         case TransactionCode::SET_STREAM_VOLUME:
4195         case TransactionCode::SET_STREAM_MUTE:
4196         case TransactionCode::OPEN_OUTPUT:
4197         case TransactionCode::OPEN_DUPLICATE_OUTPUT:
4198         case TransactionCode::CLOSE_OUTPUT:
4199         case TransactionCode::SUSPEND_OUTPUT:
4200         case TransactionCode::RESTORE_OUTPUT:
4201         case TransactionCode::OPEN_INPUT:
4202         case TransactionCode::CLOSE_INPUT:
4203         case TransactionCode::INVALIDATE_STREAM:
4204         case TransactionCode::SET_VOICE_VOLUME:
4205         case TransactionCode::MOVE_EFFECTS:
4206         case TransactionCode::SET_EFFECT_SUSPENDED:
4207         case TransactionCode::LOAD_HW_MODULE:
4208         case TransactionCode::GET_AUDIO_PORT:
4209         case TransactionCode::CREATE_AUDIO_PATCH:
4210         case TransactionCode::RELEASE_AUDIO_PATCH:
4211         case TransactionCode::LIST_AUDIO_PATCHES:
4212         case TransactionCode::SET_AUDIO_PORT_CONFIG:
4213         case TransactionCode::SET_RECORD_SILENCED:
4214         case TransactionCode::AUDIO_POLICY_READY:
4215             ALOGW("%s: transaction %d received from PID %d",
4216                   __func__, code, IPCThreadState::self()->getCallingPid());
4217             // return status only for non void methods
4218             switch (code) {
4219                 case TransactionCode::SET_RECORD_SILENCED:
4220                 case TransactionCode::SET_EFFECT_SUSPENDED:
4221                     break;
4222                 default:
4223                     return INVALID_OPERATION;
4224             }
4225             // Fail silently in these cases.
4226             return OK;
4227         default:
4228             break;
4229     }
4230 
4231     // make sure the following transactions come from system components
4232     switch (code) {
4233         case TransactionCode::SET_MASTER_VOLUME:
4234         case TransactionCode::SET_MASTER_MUTE:
4235         case TransactionCode::MASTER_MUTE:
4236         case TransactionCode::SET_MODE:
4237         case TransactionCode::SET_MIC_MUTE:
4238         case TransactionCode::SET_LOW_RAM_DEVICE:
4239         case TransactionCode::SYSTEM_READY:
4240         case TransactionCode::SET_AUDIO_HAL_PIDS:
4241         case TransactionCode::SET_VIBRATOR_INFOS:
4242         case TransactionCode::UPDATE_SECONDARY_OUTPUTS: {
4243             if (!isServiceUid(IPCThreadState::self()->getCallingUid())) {
4244                 ALOGW("%s: transaction %d received from PID %d unauthorized UID %d",
4245                       __func__, code, IPCThreadState::self()->getCallingPid(),
4246                       IPCThreadState::self()->getCallingUid());
4247                 // return status only for non void methods
4248                 switch (code) {
4249                     case TransactionCode::SYSTEM_READY:
4250                         break;
4251                     default:
4252                         return INVALID_OPERATION;
4253                 }
4254                 // Fail silently in these cases.
4255                 return OK;
4256             }
4257         } break;
4258         default:
4259             break;
4260     }
4261 
4262     // List of relevant events that trigger log merging.
4263     // Log merging should activate during audio activity of any kind. This are considered the
4264     // most relevant events.
4265     // TODO should select more wisely the items from the list
4266     switch (code) {
4267         case TransactionCode::CREATE_TRACK:
4268         case TransactionCode::CREATE_RECORD:
4269         case TransactionCode::SET_MASTER_VOLUME:
4270         case TransactionCode::SET_MASTER_MUTE:
4271         case TransactionCode::SET_MIC_MUTE:
4272         case TransactionCode::SET_PARAMETERS:
4273         case TransactionCode::CREATE_EFFECT:
4274         case TransactionCode::SYSTEM_READY: {
4275             requestLogMerge();
4276             break;
4277         }
4278         default:
4279             break;
4280     }
4281 
4282     std::string tag("IAudioFlinger command " +
4283                     std::to_string(static_cast<std::underlying_type_t<TransactionCode>>(code)));
4284     TimeCheck check(tag.c_str());
4285 
4286     // Make sure we connect to Audio Policy Service before calling into AudioFlinger:
4287     //  - AudioFlinger can call into Audio Policy Service with its global mutex held
4288     //  - If this is the first time Audio Policy Service is queried from inside audioserver process
4289     //  this will trigger Audio Policy Manager initialization.
4290     //  - Audio Policy Manager initialization calls into AudioFlinger which will try to lock
4291     //  its global mutex and a deadlock will occur.
4292     if (IPCThreadState::self()->getCallingPid() != getpid()) {
4293         AudioSystem::get_audio_policy_service();
4294     }
4295 
4296     return delegate();
4297 }
4298 
4299 } // namespace android
4300