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