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