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