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