• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 **
3 ** Copyright 2012, 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 #define ATRACE_TAG ATRACE_TAG_AUDIO
22 
23 #include "Configuration.h"
24 #include <math.h>
25 #include <fcntl.h>
26 #include <memory>
27 #include <sstream>
28 #include <string>
29 #include <linux/futex.h>
30 #include <sys/stat.h>
31 #include <sys/syscall.h>
32 #include <cutils/properties.h>
33 #include <media/AudioContainers.h>
34 #include <media/AudioDeviceTypeAddr.h>
35 #include <media/AudioParameter.h>
36 #include <media/AudioResamplerPublic.h>
37 #include <media/RecordBufferConverter.h>
38 #include <media/TypeConverter.h>
39 #include <utils/Log.h>
40 #include <utils/Trace.h>
41 
42 #include <private/media/AudioTrackShared.h>
43 #include <private/android_filesystem_config.h>
44 #include <audio_utils/Balance.h>
45 #include <audio_utils/Metadata.h>
46 #include <audio_utils/channels.h>
47 #include <audio_utils/mono_blend.h>
48 #include <audio_utils/primitives.h>
49 #include <audio_utils/format.h>
50 #include <audio_utils/minifloat.h>
51 #include <audio_utils/safe_math.h>
52 #include <system/audio_effects/effect_ns.h>
53 #include <system/audio_effects/effect_aec.h>
54 #include <system/audio.h>
55 
56 // NBAIO implementations
57 #include <media/nbaio/AudioStreamInSource.h>
58 #include <media/nbaio/AudioStreamOutSink.h>
59 #include <media/nbaio/MonoPipe.h>
60 #include <media/nbaio/MonoPipeReader.h>
61 #include <media/nbaio/Pipe.h>
62 #include <media/nbaio/PipeReader.h>
63 #include <media/nbaio/SourceAudioBufferProvider.h>
64 #include <mediautils/BatteryNotifier.h>
65 
66 #include <audiomanager/AudioManager.h>
67 #include <powermanager/PowerManager.h>
68 
69 #include <media/audiohal/EffectsFactoryHalInterface.h>
70 #include <media/audiohal/StreamHalInterface.h>
71 
72 #include "AudioFlinger.h"
73 #include "FastMixer.h"
74 #include "FastCapture.h"
75 #include <mediautils/SchedulingPolicyService.h>
76 #include <mediautils/ServiceUtilities.h>
77 
78 #ifdef ADD_BATTERY_DATA
79 #include <media/IMediaPlayerService.h>
80 #include <media/IMediaDeathNotifier.h>
81 #endif
82 
83 #ifdef DEBUG_CPU_USAGE
84 #include <audio_utils/Statistics.h>
85 #include <cpustats/ThreadCpuUsage.h>
86 #endif
87 
88 #include "AutoPark.h"
89 
90 #include <pthread.h>
91 #include "TypedLogger.h"
92 
93 // ----------------------------------------------------------------------------
94 
95 // Note: the following macro is used for extremely verbose logging message.  In
96 // order to run with ALOG_ASSERT turned on, we need to have LOG_NDEBUG set to
97 // 0; but one side effect of this is to turn all LOGV's as well.  Some messages
98 // are so verbose that we want to suppress them even when we have ALOG_ASSERT
99 // turned on.  Do not uncomment the #def below unless you really know what you
100 // are doing and want to see all of the extremely verbose messages.
101 //#define VERY_VERY_VERBOSE_LOGGING
102 #ifdef VERY_VERY_VERBOSE_LOGGING
103 #define ALOGVV ALOGV
104 #else
105 #define ALOGVV(a...) do { } while(0)
106 #endif
107 
108 // TODO: Move these macro/inlines to a header file.
109 #define max(a, b) ((a) > (b) ? (a) : (b))
110 template <typename T>
min(const T & a,const T & b)111 static inline T min(const T& a, const T& b)
112 {
113     return a < b ? a : b;
114 }
115 
116 namespace android {
117 
118 // retry counts for buffer fill timeout
119 // 50 * ~20msecs = 1 second
120 static const int8_t kMaxTrackRetries = 50;
121 static const int8_t kMaxTrackStartupRetries = 50;
122 // allow less retry attempts on direct output thread.
123 // direct outputs can be a scarce resource in audio hardware and should
124 // be released as quickly as possible.
125 static const int8_t kMaxTrackRetriesDirect = 2;
126 
127 
128 
129 // don't warn about blocked writes or record buffer overflows more often than this
130 static const nsecs_t kWarningThrottleNs = seconds(5);
131 
132 // RecordThread loop sleep time upon application overrun or audio HAL read error
133 static const int kRecordThreadSleepUs = 5000;
134 
135 // maximum time to wait in sendConfigEvent_l() for a status to be received
136 static const nsecs_t kConfigEventTimeoutNs = seconds(2);
137 
138 // minimum sleep time for the mixer thread loop when tracks are active but in underrun
139 static const uint32_t kMinThreadSleepTimeUs = 5000;
140 // maximum divider applied to the active sleep time in the mixer thread loop
141 static const uint32_t kMaxThreadSleepTimeShift = 2;
142 
143 // minimum normal sink buffer size, expressed in milliseconds rather than frames
144 // FIXME This should be based on experimentally observed scheduling jitter
145 static const uint32_t kMinNormalSinkBufferSizeMs = 20;
146 // maximum normal sink buffer size
147 static const uint32_t kMaxNormalSinkBufferSizeMs = 24;
148 
149 // minimum capture buffer size in milliseconds to _not_ need a fast capture thread
150 // FIXME This should be based on experimentally observed scheduling jitter
151 static const uint32_t kMinNormalCaptureBufferSizeMs = 12;
152 
153 // Offloaded output thread standby delay: allows track transition without going to standby
154 static const nsecs_t kOffloadStandbyDelayNs = seconds(1);
155 
156 // Direct output thread minimum sleep time in idle or active(underrun) state
157 static const nsecs_t kDirectMinSleepTimeUs = 10000;
158 
159 // The universal constant for ubiquitous 20ms value. The value of 20ms seems to provide a good
160 // balance between power consumption and latency, and allows threads to be scheduled reliably
161 // by the CFS scheduler.
162 // FIXME Express other hardcoded references to 20ms with references to this constant and move
163 // it appropriately.
164 #define FMS_20 20
165 
166 // Whether to use fast mixer
167 static const enum {
168     FastMixer_Never,    // never initialize or use: for debugging only
169     FastMixer_Always,   // always initialize and use, even if not needed: for debugging only
170                         // normal mixer multiplier is 1
171     FastMixer_Static,   // initialize if needed, then use all the time if initialized,
172                         // multiplier is calculated based on min & max normal mixer buffer size
173     FastMixer_Dynamic,  // initialize if needed, then use dynamically depending on track load,
174                         // multiplier is calculated based on min & max normal mixer buffer size
175     // FIXME for FastMixer_Dynamic:
176     //  Supporting this option will require fixing HALs that can't handle large writes.
177     //  For example, one HAL implementation returns an error from a large write,
178     //  and another HAL implementation corrupts memory, possibly in the sample rate converter.
179     //  We could either fix the HAL implementations, or provide a wrapper that breaks
180     //  up large writes into smaller ones, and the wrapper would need to deal with scheduler.
181 } kUseFastMixer = FastMixer_Static;
182 
183 // Whether to use fast capture
184 static const enum {
185     FastCapture_Never,  // never initialize or use: for debugging only
186     FastCapture_Always, // always initialize and use, even if not needed: for debugging only
187     FastCapture_Static, // initialize if needed, then use all the time if initialized
188 } kUseFastCapture = FastCapture_Static;
189 
190 // Priorities for requestPriority
191 static const int kPriorityAudioApp = 2;
192 static const int kPriorityFastMixer = 3;
193 static const int kPriorityFastCapture = 3;
194 
195 // IAudioFlinger::createTrack() has an in/out parameter 'pFrameCount' for the total size of the
196 // track buffer in shared memory.  Zero on input means to use a default value.  For fast tracks,
197 // AudioFlinger derives the default from HAL buffer size and 'fast track multiplier'.
198 
199 // This is the default value, if not specified by property.
200 static const int kFastTrackMultiplier = 2;
201 
202 // The minimum and maximum allowed values
203 static const int kFastTrackMultiplierMin = 1;
204 static const int kFastTrackMultiplierMax = 2;
205 
206 // The actual value to use, which can be specified per-device via property af.fast_track_multiplier.
207 static int sFastTrackMultiplier = kFastTrackMultiplier;
208 
209 // See Thread::readOnlyHeap().
210 // Initially this heap is used to allocate client buffers for "fast" AudioRecord.
211 // Eventually it will be the single buffer that FastCapture writes into via HAL read(),
212 // and that all "fast" AudioRecord clients read from.  In either case, the size can be small.
213 static const size_t kRecordThreadReadOnlyHeapSize = 0xD000;
214 
215 // ----------------------------------------------------------------------------
216 
217 // TODO: move all toString helpers to audio.h
218 // under  #ifdef __cplusplus #endif
patchSinksToString(const struct audio_patch * patch)219 static std::string patchSinksToString(const struct audio_patch *patch)
220 {
221     std::stringstream ss;
222     for (size_t i = 0; i < patch->num_sinks; ++i) {
223         if (i > 0) {
224             ss << "|";
225         }
226         ss << "(" << toString(patch->sinks[i].ext.device.type)
227             << ", " << patch->sinks[i].ext.device.address << ")";
228     }
229     return ss.str();
230 }
231 
patchSourcesToString(const struct audio_patch * patch)232 static std::string patchSourcesToString(const struct audio_patch *patch)
233 {
234     std::stringstream ss;
235     for (size_t i = 0; i < patch->num_sources; ++i) {
236         if (i > 0) {
237             ss << "|";
238         }
239         ss << "(" << toString(patch->sources[i].ext.device.type)
240             << ", " << patch->sources[i].ext.device.address << ")";
241     }
242     return ss.str();
243 }
244 
245 static pthread_once_t sFastTrackMultiplierOnce = PTHREAD_ONCE_INIT;
246 
sFastTrackMultiplierInit()247 static void sFastTrackMultiplierInit()
248 {
249     char value[PROPERTY_VALUE_MAX];
250     if (property_get("af.fast_track_multiplier", value, NULL) > 0) {
251         char *endptr;
252         unsigned long ul = strtoul(value, &endptr, 0);
253         if (*endptr == '\0' && kFastTrackMultiplierMin <= ul && ul <= kFastTrackMultiplierMax) {
254             sFastTrackMultiplier = (int) ul;
255         }
256     }
257 }
258 
259 // ----------------------------------------------------------------------------
260 
261 #ifdef ADD_BATTERY_DATA
262 // To collect the amplifier usage
addBatteryData(uint32_t params)263 static void addBatteryData(uint32_t params) {
264     sp<IMediaPlayerService> service = IMediaDeathNotifier::getMediaPlayerService();
265     if (service == NULL) {
266         // it already logged
267         return;
268     }
269 
270     service->addBatteryData(params);
271 }
272 #endif
273 
274 // Track the CLOCK_BOOTTIME versus CLOCK_MONOTONIC timebase offset
275 struct {
276     // call when you acquire a partial wakelock
acquireandroid::__anondc1713d70308277     void acquire(const sp<IBinder> &wakeLockToken) {
278         pthread_mutex_lock(&mLock);
279         if (wakeLockToken.get() == nullptr) {
280             adjustTimebaseOffset(&mBoottimeOffset, ExtendedTimestamp::TIMEBASE_BOOTTIME);
281         } else {
282             if (mCount == 0) {
283                 adjustTimebaseOffset(&mBoottimeOffset, ExtendedTimestamp::TIMEBASE_BOOTTIME);
284             }
285             ++mCount;
286         }
287         pthread_mutex_unlock(&mLock);
288     }
289 
290     // call when you release a partial wakelock.
releaseandroid::__anondc1713d70308291     void release(const sp<IBinder> &wakeLockToken) {
292         if (wakeLockToken.get() == nullptr) {
293             return;
294         }
295         pthread_mutex_lock(&mLock);
296         if (--mCount < 0) {
297             ALOGE("negative wakelock count");
298             mCount = 0;
299         }
300         pthread_mutex_unlock(&mLock);
301     }
302 
303     // retrieves the boottime timebase offset from monotonic.
getBoottimeOffsetandroid::__anondc1713d70308304     int64_t getBoottimeOffset() {
305         pthread_mutex_lock(&mLock);
306         int64_t boottimeOffset = mBoottimeOffset;
307         pthread_mutex_unlock(&mLock);
308         return boottimeOffset;
309     }
310 
311     // Adjusts the timebase offset between TIMEBASE_MONOTONIC
312     // and the selected timebase.
313     // Currently only TIMEBASE_BOOTTIME is allowed.
314     //
315     // This only needs to be called upon acquiring the first partial wakelock
316     // after all other partial wakelocks are released.
317     //
318     // We do an empirical measurement of the offset rather than parsing
319     // /proc/timer_list since the latter is not a formal kernel ABI.
adjustTimebaseOffsetandroid::__anondc1713d70308320     static void adjustTimebaseOffset(int64_t *offset, ExtendedTimestamp::Timebase timebase) {
321         int clockbase;
322         switch (timebase) {
323         case ExtendedTimestamp::TIMEBASE_BOOTTIME:
324             clockbase = SYSTEM_TIME_BOOTTIME;
325             break;
326         default:
327             LOG_ALWAYS_FATAL("invalid timebase %d", timebase);
328             break;
329         }
330         // try three times to get the clock offset, choose the one
331         // with the minimum gap in measurements.
332         const int tries = 3;
333         nsecs_t bestGap, measured;
334         for (int i = 0; i < tries; ++i) {
335             const nsecs_t tmono = systemTime(SYSTEM_TIME_MONOTONIC);
336             const nsecs_t tbase = systemTime(clockbase);
337             const nsecs_t tmono2 = systemTime(SYSTEM_TIME_MONOTONIC);
338             const nsecs_t gap = tmono2 - tmono;
339             if (i == 0 || gap < bestGap) {
340                 bestGap = gap;
341                 measured = tbase - ((tmono + tmono2) >> 1);
342             }
343         }
344 
345         // to avoid micro-adjusting, we don't change the timebase
346         // unless it is significantly different.
347         //
348         // Assumption: It probably takes more than toleranceNs to
349         // suspend and resume the device.
350         static int64_t toleranceNs = 10000; // 10 us
351         if (llabs(*offset - measured) > toleranceNs) {
352             ALOGV("Adjusting timebase offset old: %lld  new: %lld",
353                     (long long)*offset, (long long)measured);
354             *offset = measured;
355         }
356     }
357 
358     pthread_mutex_t mLock;
359     int32_t mCount;
360     int64_t mBoottimeOffset;
361 } gBoottime = { PTHREAD_MUTEX_INITIALIZER, 0, 0 }; // static, so use POD initialization
362 
363 // ----------------------------------------------------------------------------
364 //      CPU Stats
365 // ----------------------------------------------------------------------------
366 
367 class CpuStats {
368 public:
369     CpuStats();
370     void sample(const String8 &title);
371 #ifdef DEBUG_CPU_USAGE
372 private:
373     ThreadCpuUsage mCpuUsage;           // instantaneous thread CPU usage in wall clock ns
374     audio_utils::Statistics<double> mWcStats; // statistics on thread CPU usage in wall clock ns
375 
376     audio_utils::Statistics<double> mHzStats; // statistics on thread CPU usage in cycles
377 
378     int mCpuNum;                        // thread's current CPU number
379     int mCpukHz;                        // frequency of thread's current CPU in kHz
380 #endif
381 };
382 
CpuStats()383 CpuStats::CpuStats()
384 #ifdef DEBUG_CPU_USAGE
385     : mCpuNum(-1), mCpukHz(-1)
386 #endif
387 {
388 }
389 
sample(const String8 & title __unused)390 void CpuStats::sample(const String8 &title
391 #ifndef DEBUG_CPU_USAGE
392                 __unused
393 #endif
394         ) {
395 #ifdef DEBUG_CPU_USAGE
396     // get current thread's delta CPU time in wall clock ns
397     double wcNs;
398     bool valid = mCpuUsage.sampleAndEnable(wcNs);
399 
400     // record sample for wall clock statistics
401     if (valid) {
402         mWcStats.add(wcNs);
403     }
404 
405     // get the current CPU number
406     int cpuNum = sched_getcpu();
407 
408     // get the current CPU frequency in kHz
409     int cpukHz = mCpuUsage.getCpukHz(cpuNum);
410 
411     // check if either CPU number or frequency changed
412     if (cpuNum != mCpuNum || cpukHz != mCpukHz) {
413         mCpuNum = cpuNum;
414         mCpukHz = cpukHz;
415         // ignore sample for purposes of cycles
416         valid = false;
417     }
418 
419     // if no change in CPU number or frequency, then record sample for cycle statistics
420     if (valid && mCpukHz > 0) {
421         const double cycles = wcNs * cpukHz * 0.000001;
422         mHzStats.add(cycles);
423     }
424 
425     const unsigned n = mWcStats.getN();
426     // mCpuUsage.elapsed() is expensive, so don't call it every loop
427     if ((n & 127) == 1) {
428         const long long elapsed = mCpuUsage.elapsed();
429         if (elapsed >= DEBUG_CPU_USAGE * 1000000000LL) {
430             const double perLoop = elapsed / (double) n;
431             const double perLoop100 = perLoop * 0.01;
432             const double perLoop1k = perLoop * 0.001;
433             const double mean = mWcStats.getMean();
434             const double stddev = mWcStats.getStdDev();
435             const double minimum = mWcStats.getMin();
436             const double maximum = mWcStats.getMax();
437             const double meanCycles = mHzStats.getMean();
438             const double stddevCycles = mHzStats.getStdDev();
439             const double minCycles = mHzStats.getMin();
440             const double maxCycles = mHzStats.getMax();
441             mCpuUsage.resetElapsed();
442             mWcStats.reset();
443             mHzStats.reset();
444             ALOGD("CPU usage for %s over past %.1f secs\n"
445                 "  (%u mixer loops at %.1f mean ms per loop):\n"
446                 "  us per mix loop: mean=%.0f stddev=%.0f min=%.0f max=%.0f\n"
447                 "  %% of wall: mean=%.1f stddev=%.1f min=%.1f max=%.1f\n"
448                 "  MHz: mean=%.1f, stddev=%.1f, min=%.1f max=%.1f",
449                     title.string(),
450                     elapsed * .000000001, n, perLoop * .000001,
451                     mean * .001,
452                     stddev * .001,
453                     minimum * .001,
454                     maximum * .001,
455                     mean / perLoop100,
456                     stddev / perLoop100,
457                     minimum / perLoop100,
458                     maximum / perLoop100,
459                     meanCycles / perLoop1k,
460                     stddevCycles / perLoop1k,
461                     minCycles / perLoop1k,
462                     maxCycles / perLoop1k);
463 
464         }
465     }
466 #endif
467 };
468 
469 // ----------------------------------------------------------------------------
470 //      ThreadBase
471 // ----------------------------------------------------------------------------
472 
473 // static
threadTypeToString(AudioFlinger::ThreadBase::type_t type)474 const char *AudioFlinger::ThreadBase::threadTypeToString(AudioFlinger::ThreadBase::type_t type)
475 {
476     switch (type) {
477     case MIXER:
478         return "MIXER";
479     case DIRECT:
480         return "DIRECT";
481     case DUPLICATING:
482         return "DUPLICATING";
483     case RECORD:
484         return "RECORD";
485     case OFFLOAD:
486         return "OFFLOAD";
487     case MMAP_PLAYBACK:
488         return "MMAP_PLAYBACK";
489     case MMAP_CAPTURE:
490         return "MMAP_CAPTURE";
491     default:
492         return "unknown";
493     }
494 }
495 
ThreadBase(const sp<AudioFlinger> & audioFlinger,audio_io_handle_t id,type_t type,bool systemReady,bool isOut)496 AudioFlinger::ThreadBase::ThreadBase(const sp<AudioFlinger>& audioFlinger, audio_io_handle_t id,
497         type_t type, bool systemReady, bool isOut)
498     :   Thread(false /*canCallJava*/),
499         mType(type),
500         mAudioFlinger(audioFlinger),
501         mThreadMetrics(std::string(AMEDIAMETRICS_KEY_PREFIX_AUDIO_THREAD) + std::to_string(id),
502                isOut),
503         mIsOut(isOut),
504         // mSampleRate, mFrameCount, mChannelMask, mChannelCount, mFrameSize, mFormat, mBufferSize
505         // are set by PlaybackThread::readOutputParameters_l() or
506         // RecordThread::readInputParameters_l()
507         //FIXME: mStandby should be true here. Is this some kind of hack?
508         mStandby(false),
509         mAudioSource(AUDIO_SOURCE_DEFAULT), mId(id),
510         // mName will be set by concrete (non-virtual) subclass
511         mDeathRecipient(new PMDeathRecipient(this)),
512         mSystemReady(systemReady),
513         mSignalPending(false)
514 {
515     mThreadMetrics.logConstructor(getpid(), threadTypeToString(type), id);
516     memset(&mPatch, 0, sizeof(struct audio_patch));
517 }
518 
~ThreadBase()519 AudioFlinger::ThreadBase::~ThreadBase()
520 {
521     // mConfigEvents should be empty, but just in case it isn't, free the memory it owns
522     mConfigEvents.clear();
523 
524     // do not lock the mutex in destructor
525     releaseWakeLock_l();
526     if (mPowerManager != 0) {
527         sp<IBinder> binder = IInterface::asBinder(mPowerManager);
528         binder->unlinkToDeath(mDeathRecipient);
529     }
530 
531     sendStatistics(true /* force */);
532 }
533 
readyToRun()534 status_t AudioFlinger::ThreadBase::readyToRun()
535 {
536     status_t status = initCheck();
537     if (status == NO_ERROR) {
538         ALOGI("AudioFlinger's thread %p tid=%d ready to run", this, getTid());
539     } else {
540         ALOGE("No working audio driver found.");
541     }
542     return status;
543 }
544 
exit()545 void AudioFlinger::ThreadBase::exit()
546 {
547     ALOGV("ThreadBase::exit");
548     // do any cleanup required for exit to succeed
549     preExit();
550     {
551         // This lock prevents the following race in thread (uniprocessor for illustration):
552         //  if (!exitPending()) {
553         //      // context switch from here to exit()
554         //      // exit() calls requestExit(), what exitPending() observes
555         //      // exit() calls signal(), which is dropped since no waiters
556         //      // context switch back from exit() to here
557         //      mWaitWorkCV.wait(...);
558         //      // now thread is hung
559         //  }
560         AutoMutex lock(mLock);
561         requestExit();
562         mWaitWorkCV.broadcast();
563     }
564     // When Thread::requestExitAndWait is made virtual and this method is renamed to
565     // "virtual status_t requestExitAndWait()", replace by "return Thread::requestExitAndWait();"
566     requestExitAndWait();
567 }
568 
setParameters(const String8 & keyValuePairs)569 status_t AudioFlinger::ThreadBase::setParameters(const String8& keyValuePairs)
570 {
571     ALOGV("ThreadBase::setParameters() %s", keyValuePairs.string());
572     Mutex::Autolock _l(mLock);
573 
574     return sendSetParameterConfigEvent_l(keyValuePairs);
575 }
576 
577 // sendConfigEvent_l() must be called with ThreadBase::mLock held
578 // Can temporarily release the lock if waiting for a reply from processConfigEvents_l().
sendConfigEvent_l(sp<ConfigEvent> & event)579 status_t AudioFlinger::ThreadBase::sendConfigEvent_l(sp<ConfigEvent>& event)
580 {
581     status_t status = NO_ERROR;
582 
583     if (event->mRequiresSystemReady && !mSystemReady) {
584         event->mWaitStatus = false;
585         mPendingConfigEvents.add(event);
586         return status;
587     }
588     mConfigEvents.add(event);
589     ALOGV("sendConfigEvent_l() num events %zu event %d", mConfigEvents.size(), event->mType);
590     mWaitWorkCV.signal();
591     mLock.unlock();
592     {
593         Mutex::Autolock _l(event->mLock);
594         while (event->mWaitStatus) {
595             if (event->mCond.waitRelative(event->mLock, kConfigEventTimeoutNs) != NO_ERROR) {
596                 event->mStatus = TIMED_OUT;
597                 event->mWaitStatus = false;
598             }
599         }
600         status = event->mStatus;
601     }
602     mLock.lock();
603     return status;
604 }
605 
sendIoConfigEvent(audio_io_config_event event,pid_t pid,audio_port_handle_t portId)606 void AudioFlinger::ThreadBase::sendIoConfigEvent(audio_io_config_event event, pid_t pid,
607                                                  audio_port_handle_t portId)
608 {
609     Mutex::Autolock _l(mLock);
610     sendIoConfigEvent_l(event, pid, portId);
611 }
612 
613 // sendIoConfigEvent_l() must be called with ThreadBase::mLock held
sendIoConfigEvent_l(audio_io_config_event event,pid_t pid,audio_port_handle_t portId)614 void AudioFlinger::ThreadBase::sendIoConfigEvent_l(audio_io_config_event event, pid_t pid,
615                                                    audio_port_handle_t portId)
616 {
617     // The audio statistics history is exponentially weighted to forget events
618     // about five or more seconds in the past.  In order to have
619     // crisper statistics for mediametrics, we reset the statistics on
620     // an IoConfigEvent, to reflect different properties for a new device.
621     mIoJitterMs.reset();
622     mLatencyMs.reset();
623     mProcessTimeMs.reset();
624     mTimestampVerifier.discontinuity();
625 
626     sp<ConfigEvent> configEvent = (ConfigEvent *)new IoConfigEvent(event, pid, portId);
627     sendConfigEvent_l(configEvent);
628 }
629 
sendPrioConfigEvent(pid_t pid,pid_t tid,int32_t prio,bool forApp)630 void AudioFlinger::ThreadBase::sendPrioConfigEvent(pid_t pid, pid_t tid, int32_t prio, bool forApp)
631 {
632     Mutex::Autolock _l(mLock);
633     sendPrioConfigEvent_l(pid, tid, prio, forApp);
634 }
635 
636 // sendPrioConfigEvent_l() must be called with ThreadBase::mLock held
sendPrioConfigEvent_l(pid_t pid,pid_t tid,int32_t prio,bool forApp)637 void AudioFlinger::ThreadBase::sendPrioConfigEvent_l(
638         pid_t pid, pid_t tid, int32_t prio, bool forApp)
639 {
640     sp<ConfigEvent> configEvent = (ConfigEvent *)new PrioConfigEvent(pid, tid, prio, forApp);
641     sendConfigEvent_l(configEvent);
642 }
643 
644 // sendSetParameterConfigEvent_l() must be called with ThreadBase::mLock held
sendSetParameterConfigEvent_l(const String8 & keyValuePair)645 status_t AudioFlinger::ThreadBase::sendSetParameterConfigEvent_l(const String8& keyValuePair)
646 {
647     sp<ConfigEvent> configEvent;
648     AudioParameter param(keyValuePair);
649     int value;
650     if (param.getInt(String8(AudioParameter::keyMonoOutput), value) == NO_ERROR) {
651         setMasterMono_l(value != 0);
652         if (param.size() == 1) {
653             return NO_ERROR; // should be a solo parameter - we don't pass down
654         }
655         param.remove(String8(AudioParameter::keyMonoOutput));
656         configEvent = new SetParameterConfigEvent(param.toString());
657     } else {
658         configEvent = new SetParameterConfigEvent(keyValuePair);
659     }
660     return sendConfigEvent_l(configEvent);
661 }
662 
sendCreateAudioPatchConfigEvent(const struct audio_patch * patch,audio_patch_handle_t * handle)663 status_t AudioFlinger::ThreadBase::sendCreateAudioPatchConfigEvent(
664                                                         const struct audio_patch *patch,
665                                                         audio_patch_handle_t *handle)
666 {
667     Mutex::Autolock _l(mLock);
668     sp<ConfigEvent> configEvent = (ConfigEvent *)new CreateAudioPatchConfigEvent(*patch, *handle);
669     status_t status = sendConfigEvent_l(configEvent);
670     if (status == NO_ERROR) {
671         CreateAudioPatchConfigEventData *data =
672                                         (CreateAudioPatchConfigEventData *)configEvent->mData.get();
673         *handle = data->mHandle;
674     }
675     return status;
676 }
677 
sendReleaseAudioPatchConfigEvent(const audio_patch_handle_t handle)678 status_t AudioFlinger::ThreadBase::sendReleaseAudioPatchConfigEvent(
679                                                                 const audio_patch_handle_t handle)
680 {
681     Mutex::Autolock _l(mLock);
682     sp<ConfigEvent> configEvent = (ConfigEvent *)new ReleaseAudioPatchConfigEvent(handle);
683     return sendConfigEvent_l(configEvent);
684 }
685 
sendUpdateOutDeviceConfigEvent(const DeviceDescriptorBaseVector & outDevices)686 status_t AudioFlinger::ThreadBase::sendUpdateOutDeviceConfigEvent(
687         const DeviceDescriptorBaseVector& outDevices)
688 {
689     if (type() != RECORD) {
690         // The update out device operation is only for record thread.
691         return INVALID_OPERATION;
692     }
693     Mutex::Autolock _l(mLock);
694     sp<ConfigEvent> configEvent = (ConfigEvent *)new UpdateOutDevicesConfigEvent(outDevices);
695     return sendConfigEvent_l(configEvent);
696 }
697 
698 
699 // post condition: mConfigEvents.isEmpty()
processConfigEvents_l()700 void AudioFlinger::ThreadBase::processConfigEvents_l()
701 {
702     bool configChanged = false;
703 
704     while (!mConfigEvents.isEmpty()) {
705         ALOGV("processConfigEvents_l() remaining events %zu", mConfigEvents.size());
706         sp<ConfigEvent> event = mConfigEvents[0];
707         mConfigEvents.removeAt(0);
708         switch (event->mType) {
709         case CFG_EVENT_PRIO: {
710             PrioConfigEventData *data = (PrioConfigEventData *)event->mData.get();
711             // FIXME Need to understand why this has to be done asynchronously
712             int err = requestPriority(data->mPid, data->mTid, data->mPrio, data->mForApp,
713                     true /*asynchronous*/);
714             if (err != 0) {
715                 ALOGW("Policy SCHED_FIFO priority %d is unavailable for pid %d tid %d; error %d",
716                       data->mPrio, data->mPid, data->mTid, err);
717             }
718         } break;
719         case CFG_EVENT_IO: {
720             IoConfigEventData *data = (IoConfigEventData *)event->mData.get();
721             ioConfigChanged(data->mEvent, data->mPid, data->mPortId);
722         } break;
723         case CFG_EVENT_SET_PARAMETER: {
724             SetParameterConfigEventData *data = (SetParameterConfigEventData *)event->mData.get();
725             if (checkForNewParameter_l(data->mKeyValuePairs, event->mStatus)) {
726                 configChanged = true;
727                 mLocalLog.log("CFG_EVENT_SET_PARAMETER: (%s) configuration changed",
728                         data->mKeyValuePairs.string());
729             }
730         } break;
731         case CFG_EVENT_CREATE_AUDIO_PATCH: {
732             const DeviceTypeSet oldDevices = getDeviceTypes();
733             CreateAudioPatchConfigEventData *data =
734                                             (CreateAudioPatchConfigEventData *)event->mData.get();
735             event->mStatus = createAudioPatch_l(&data->mPatch, &data->mHandle);
736             const DeviceTypeSet newDevices = getDeviceTypes();
737             mLocalLog.log("CFG_EVENT_CREATE_AUDIO_PATCH: old device %s (%s) new device %s (%s)",
738                     dumpDeviceTypes(oldDevices).c_str(), toString(oldDevices).c_str(),
739                     dumpDeviceTypes(newDevices).c_str(), toString(newDevices).c_str());
740         } break;
741         case CFG_EVENT_RELEASE_AUDIO_PATCH: {
742             const DeviceTypeSet oldDevices = getDeviceTypes();
743             ReleaseAudioPatchConfigEventData *data =
744                                             (ReleaseAudioPatchConfigEventData *)event->mData.get();
745             event->mStatus = releaseAudioPatch_l(data->mHandle);
746             const DeviceTypeSet newDevices = getDeviceTypes();
747             mLocalLog.log("CFG_EVENT_RELEASE_AUDIO_PATCH: old device %s (%s) new device %s (%s)",
748                     dumpDeviceTypes(oldDevices).c_str(), toString(oldDevices).c_str(),
749                     dumpDeviceTypes(newDevices).c_str(), toString(newDevices).c_str());
750         } break;
751         case CFG_EVENT_UPDATE_OUT_DEVICE: {
752             UpdateOutDevicesConfigEventData *data =
753                     (UpdateOutDevicesConfigEventData *)event->mData.get();
754             updateOutDevices(data->mOutDevices);
755         } break;
756         default:
757             ALOG_ASSERT(false, "processConfigEvents_l() unknown event type %d", event->mType);
758             break;
759         }
760         {
761             Mutex::Autolock _l(event->mLock);
762             if (event->mWaitStatus) {
763                 event->mWaitStatus = false;
764                 event->mCond.signal();
765             }
766         }
767         ALOGV_IF(mConfigEvents.isEmpty(), "processConfigEvents_l() DONE thread %p", this);
768     }
769 
770     if (configChanged) {
771         cacheParameters_l();
772     }
773 }
774 
channelMaskToString(audio_channel_mask_t mask,bool output)775 String8 channelMaskToString(audio_channel_mask_t mask, bool output) {
776     String8 s;
777     const audio_channel_representation_t representation =
778             audio_channel_mask_get_representation(mask);
779 
780     switch (representation) {
781     // Travel all single bit channel mask to convert channel mask to string.
782     case AUDIO_CHANNEL_REPRESENTATION_POSITION: {
783         if (output) {
784             if (mask & AUDIO_CHANNEL_OUT_FRONT_LEFT) s.append("front-left, ");
785             if (mask & AUDIO_CHANNEL_OUT_FRONT_RIGHT) s.append("front-right, ");
786             if (mask & AUDIO_CHANNEL_OUT_FRONT_CENTER) s.append("front-center, ");
787             if (mask & AUDIO_CHANNEL_OUT_LOW_FREQUENCY) s.append("low freq, ");
788             if (mask & AUDIO_CHANNEL_OUT_BACK_LEFT) s.append("back-left, ");
789             if (mask & AUDIO_CHANNEL_OUT_BACK_RIGHT) s.append("back-right, ");
790             if (mask & AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER) s.append("front-left-of-center, ");
791             if (mask & AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER) s.append("front-right-of-center, ");
792             if (mask & AUDIO_CHANNEL_OUT_BACK_CENTER) s.append("back-center, ");
793             if (mask & AUDIO_CHANNEL_OUT_SIDE_LEFT) s.append("side-left, ");
794             if (mask & AUDIO_CHANNEL_OUT_SIDE_RIGHT) s.append("side-right, ");
795             if (mask & AUDIO_CHANNEL_OUT_TOP_CENTER) s.append("top-center ,");
796             if (mask & AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT) s.append("top-front-left, ");
797             if (mask & AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER) s.append("top-front-center, ");
798             if (mask & AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT) s.append("top-front-right, ");
799             if (mask & AUDIO_CHANNEL_OUT_TOP_BACK_LEFT) s.append("top-back-left, ");
800             if (mask & AUDIO_CHANNEL_OUT_TOP_BACK_CENTER) s.append("top-back-center, " );
801             if (mask & AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT) s.append("top-back-right, " );
802             if (mask & AUDIO_CHANNEL_OUT_TOP_SIDE_LEFT) s.append("top-side-left, " );
803             if (mask & AUDIO_CHANNEL_OUT_TOP_SIDE_RIGHT) s.append("top-side-right, " );
804             if (mask & AUDIO_CHANNEL_OUT_HAPTIC_B) s.append("haptic-B, " );
805             if (mask & AUDIO_CHANNEL_OUT_HAPTIC_A) s.append("haptic-A, " );
806             if (mask & ~AUDIO_CHANNEL_OUT_ALL) s.append("unknown,  ");
807         } else {
808             if (mask & AUDIO_CHANNEL_IN_LEFT) s.append("left, ");
809             if (mask & AUDIO_CHANNEL_IN_RIGHT) s.append("right, ");
810             if (mask & AUDIO_CHANNEL_IN_FRONT) s.append("front, ");
811             if (mask & AUDIO_CHANNEL_IN_BACK) s.append("back, ");
812             if (mask & AUDIO_CHANNEL_IN_LEFT_PROCESSED) s.append("left-processed, ");
813             if (mask & AUDIO_CHANNEL_IN_RIGHT_PROCESSED) s.append("right-processed, ");
814             if (mask & AUDIO_CHANNEL_IN_FRONT_PROCESSED) s.append("front-processed, ");
815             if (mask & AUDIO_CHANNEL_IN_BACK_PROCESSED) s.append("back-processed, ");
816             if (mask & AUDIO_CHANNEL_IN_PRESSURE) s.append("pressure, ");
817             if (mask & AUDIO_CHANNEL_IN_X_AXIS) s.append("X, ");
818             if (mask & AUDIO_CHANNEL_IN_Y_AXIS) s.append("Y, ");
819             if (mask & AUDIO_CHANNEL_IN_Z_AXIS) s.append("Z, ");
820             if (mask & AUDIO_CHANNEL_IN_BACK_LEFT) s.append("back-left, ");
821             if (mask & AUDIO_CHANNEL_IN_BACK_RIGHT) s.append("back-right, ");
822             if (mask & AUDIO_CHANNEL_IN_CENTER) s.append("center, ");
823             if (mask & AUDIO_CHANNEL_IN_LOW_FREQUENCY) s.append("low freq, ");
824             if (mask & AUDIO_CHANNEL_IN_TOP_LEFT) s.append("top-left, " );
825             if (mask & AUDIO_CHANNEL_IN_TOP_RIGHT) s.append("top-right, " );
826             if (mask & AUDIO_CHANNEL_IN_VOICE_UPLINK) s.append("voice-uplink, ");
827             if (mask & AUDIO_CHANNEL_IN_VOICE_DNLINK) s.append("voice-dnlink, ");
828             if (mask & ~AUDIO_CHANNEL_IN_ALL) s.append("unknown,  ");
829         }
830         const int len = s.length();
831         if (len > 2) {
832             (void) s.lockBuffer(len);      // needed?
833             s.unlockBuffer(len - 2);       // remove trailing ", "
834         }
835         return s;
836     }
837     case AUDIO_CHANNEL_REPRESENTATION_INDEX:
838         s.appendFormat("index mask, bits:%#x", audio_channel_mask_get_bits(mask));
839         return s;
840     default:
841         s.appendFormat("unknown mask, representation:%d  bits:%#x",
842                 representation, audio_channel_mask_get_bits(mask));
843         return s;
844     }
845 }
846 
dump(int fd,const Vector<String16> & args)847 void AudioFlinger::ThreadBase::dump(int fd, const Vector<String16>& args)
848 {
849     dprintf(fd, "\n%s thread %p, name %s, tid %d, type %d (%s):\n", isOutput() ? "Output" : "Input",
850             this, mThreadName, getTid(), type(), threadTypeToString(type()));
851 
852     bool locked = AudioFlinger::dumpTryLock(mLock);
853     if (!locked) {
854         dprintf(fd, "  Thread may be deadlocked\n");
855     }
856 
857     dumpBase_l(fd, args);
858     dumpInternals_l(fd, args);
859     dumpTracks_l(fd, args);
860     dumpEffectChains_l(fd, args);
861 
862     if (locked) {
863         mLock.unlock();
864     }
865 
866     dprintf(fd, "  Local log:\n");
867     mLocalLog.dump(fd, "   " /* prefix */, 40 /* lines */);
868 }
869 
dumpBase_l(int fd,const Vector<String16> & args __unused)870 void AudioFlinger::ThreadBase::dumpBase_l(int fd, const Vector<String16>& args __unused)
871 {
872     dprintf(fd, "  I/O handle: %d\n", mId);
873     dprintf(fd, "  Standby: %s\n", mStandby ? "yes" : "no");
874     dprintf(fd, "  Sample rate: %u Hz\n", mSampleRate);
875     dprintf(fd, "  HAL frame count: %zu\n", mFrameCount);
876     dprintf(fd, "  HAL format: 0x%x (%s)\n", mHALFormat, formatToString(mHALFormat).c_str());
877     dprintf(fd, "  HAL buffer size: %zu bytes\n", mBufferSize);
878     dprintf(fd, "  Channel count: %u\n", mChannelCount);
879     dprintf(fd, "  Channel mask: 0x%08x (%s)\n", mChannelMask,
880             channelMaskToString(mChannelMask, mType != RECORD).string());
881     dprintf(fd, "  Processing format: 0x%x (%s)\n", mFormat, formatToString(mFormat).c_str());
882     dprintf(fd, "  Processing frame size: %zu bytes\n", mFrameSize);
883     dprintf(fd, "  Pending config events:");
884     size_t numConfig = mConfigEvents.size();
885     if (numConfig) {
886         const size_t SIZE = 256;
887         char buffer[SIZE];
888         for (size_t i = 0; i < numConfig; i++) {
889             mConfigEvents[i]->dump(buffer, SIZE);
890             dprintf(fd, "\n    %s", buffer);
891         }
892         dprintf(fd, "\n");
893     } else {
894         dprintf(fd, " none\n");
895     }
896     // Note: output device may be used by capture threads for effects such as AEC.
897     dprintf(fd, "  Output devices: %s (%s)\n",
898             dumpDeviceTypes(outDeviceTypes()).c_str(), toString(outDeviceTypes()).c_str());
899     dprintf(fd, "  Input device: %#x (%s)\n",
900             inDeviceType(), toString(inDeviceType()).c_str());
901     dprintf(fd, "  Audio source: %d (%s)\n", mAudioSource, toString(mAudioSource).c_str());
902 
903     // Dump timestamp statistics for the Thread types that support it.
904     if (mType == RECORD
905             || mType == MIXER
906             || mType == DUPLICATING
907             || mType == DIRECT
908             || mType == OFFLOAD) {
909         dprintf(fd, "  Timestamp stats: %s\n", mTimestampVerifier.toString().c_str());
910         dprintf(fd, "  Timestamp corrected: %s\n", isTimestampCorrectionEnabled() ? "yes" : "no");
911     }
912 
913     if (mLastIoBeginNs > 0) { // MMAP may not set this
914         dprintf(fd, "  Last %s occurred (msecs): %lld\n",
915                 isOutput() ? "write" : "read",
916                 (long long) (systemTime() - mLastIoBeginNs) / NANOS_PER_MILLISECOND);
917     }
918 
919     if (mProcessTimeMs.getN() > 0) {
920         dprintf(fd, "  Process time ms stats: %s\n", mProcessTimeMs.toString().c_str());
921     }
922 
923     if (mIoJitterMs.getN() > 0) {
924         dprintf(fd, "  Hal %s jitter ms stats: %s\n",
925                 isOutput() ? "write" : "read",
926                 mIoJitterMs.toString().c_str());
927     }
928 
929     if (mLatencyMs.getN() > 0) {
930         dprintf(fd, "  Threadloop %s latency stats: %s\n",
931                 isOutput() ? "write" : "read",
932                 mLatencyMs.toString().c_str());
933     }
934 }
935 
dumpEffectChains_l(int fd,const Vector<String16> & args)936 void AudioFlinger::ThreadBase::dumpEffectChains_l(int fd, const Vector<String16>& args)
937 {
938     const size_t SIZE = 256;
939     char buffer[SIZE];
940 
941     size_t numEffectChains = mEffectChains.size();
942     snprintf(buffer, SIZE, "  %zu Effect Chains\n", numEffectChains);
943     write(fd, buffer, strlen(buffer));
944 
945     for (size_t i = 0; i < numEffectChains; ++i) {
946         sp<EffectChain> chain = mEffectChains[i];
947         if (chain != 0) {
948             chain->dump(fd, args);
949         }
950     }
951 }
952 
acquireWakeLock()953 void AudioFlinger::ThreadBase::acquireWakeLock()
954 {
955     Mutex::Autolock _l(mLock);
956     acquireWakeLock_l();
957 }
958 
getWakeLockTag()959 String16 AudioFlinger::ThreadBase::getWakeLockTag()
960 {
961     switch (mType) {
962     case MIXER:
963         return String16("AudioMix");
964     case DIRECT:
965         return String16("AudioDirectOut");
966     case DUPLICATING:
967         return String16("AudioDup");
968     case RECORD:
969         return String16("AudioIn");
970     case OFFLOAD:
971         return String16("AudioOffload");
972     case MMAP_PLAYBACK:
973         return String16("MmapPlayback");
974     case MMAP_CAPTURE:
975         return String16("MmapCapture");
976     default:
977         ALOG_ASSERT(false);
978         return String16("AudioUnknown");
979     }
980 }
981 
acquireWakeLock_l()982 void AudioFlinger::ThreadBase::acquireWakeLock_l()
983 {
984     getPowerManager_l();
985     if (mPowerManager != 0) {
986         sp<IBinder> binder = new BBinder();
987         // Uses AID_AUDIOSERVER for wakelock.  updateWakeLockUids_l() updates with client uids.
988         status_t status = mPowerManager->acquireWakeLock(POWERMANAGER_PARTIAL_WAKE_LOCK,
989                     binder,
990                     getWakeLockTag(),
991                     String16("audioserver"),
992                     true /* FIXME force oneway contrary to .aidl */);
993         if (status == NO_ERROR) {
994             mWakeLockToken = binder;
995         }
996         ALOGV("acquireWakeLock_l() %s status %d", mThreadName, status);
997     }
998 
999     gBoottime.acquire(mWakeLockToken);
1000     mTimestamp.mTimebaseOffset[ExtendedTimestamp::TIMEBASE_BOOTTIME] =
1001             gBoottime.getBoottimeOffset();
1002 }
1003 
releaseWakeLock()1004 void AudioFlinger::ThreadBase::releaseWakeLock()
1005 {
1006     Mutex::Autolock _l(mLock);
1007     releaseWakeLock_l();
1008 }
1009 
releaseWakeLock_l()1010 void AudioFlinger::ThreadBase::releaseWakeLock_l()
1011 {
1012     gBoottime.release(mWakeLockToken);
1013     if (mWakeLockToken != 0) {
1014         ALOGV("releaseWakeLock_l() %s", mThreadName);
1015         if (mPowerManager != 0) {
1016             mPowerManager->releaseWakeLock(mWakeLockToken, 0,
1017                     true /* FIXME force oneway contrary to .aidl */);
1018         }
1019         mWakeLockToken.clear();
1020     }
1021 }
1022 
getPowerManager_l()1023 void AudioFlinger::ThreadBase::getPowerManager_l() {
1024     if (mSystemReady && mPowerManager == 0) {
1025         // use checkService() to avoid blocking if power service is not up yet
1026         sp<IBinder> binder =
1027             defaultServiceManager()->checkService(String16("power"));
1028         if (binder == 0) {
1029             ALOGW("Thread %s cannot connect to the power manager service", mThreadName);
1030         } else {
1031             mPowerManager = interface_cast<IPowerManager>(binder);
1032             binder->linkToDeath(mDeathRecipient);
1033         }
1034     }
1035 }
1036 
updateWakeLockUids_l(const SortedVector<uid_t> & uids)1037 void AudioFlinger::ThreadBase::updateWakeLockUids_l(const SortedVector<uid_t> &uids) {
1038     getPowerManager_l();
1039 
1040 #if !LOG_NDEBUG
1041     std::stringstream s;
1042     for (uid_t uid : uids) {
1043         s << uid << " ";
1044     }
1045     ALOGD("updateWakeLockUids_l %s uids:%s", mThreadName, s.str().c_str());
1046 #endif
1047 
1048     if (mWakeLockToken == NULL) { // token may be NULL if AudioFlinger::systemReady() not called.
1049         if (mSystemReady) {
1050             ALOGE("no wake lock to update, but system ready!");
1051         } else {
1052             ALOGW("no wake lock to update, system not ready yet");
1053         }
1054         return;
1055     }
1056     if (mPowerManager != 0) {
1057         std::vector<int> uidsAsInt(uids.begin(), uids.end()); // powermanager expects uids as ints
1058         status_t status = mPowerManager->updateWakeLockUids(
1059                 mWakeLockToken, uidsAsInt.size(), uidsAsInt.data(),
1060                 true /* FIXME force oneway contrary to .aidl */);
1061         ALOGV("updateWakeLockUids_l() %s status %d", mThreadName, status);
1062     }
1063 }
1064 
clearPowerManager()1065 void AudioFlinger::ThreadBase::clearPowerManager()
1066 {
1067     Mutex::Autolock _l(mLock);
1068     releaseWakeLock_l();
1069     mPowerManager.clear();
1070 }
1071 
updateOutDevices(const DeviceDescriptorBaseVector & outDevices __unused)1072 void AudioFlinger::ThreadBase::updateOutDevices(
1073         const DeviceDescriptorBaseVector& outDevices __unused)
1074 {
1075     ALOGE("%s should only be called in RecordThread", __func__);
1076 }
1077 
binderDied(const wp<IBinder> & who __unused)1078 void AudioFlinger::ThreadBase::PMDeathRecipient::binderDied(const wp<IBinder>& who __unused)
1079 {
1080     sp<ThreadBase> thread = mThread.promote();
1081     if (thread != 0) {
1082         thread->clearPowerManager();
1083     }
1084     ALOGW("power manager service died !!!");
1085 }
1086 
setEffectSuspended_l(const effect_uuid_t * type,bool suspend,audio_session_t sessionId)1087 void AudioFlinger::ThreadBase::setEffectSuspended_l(
1088         const effect_uuid_t *type, bool suspend, audio_session_t sessionId)
1089 {
1090     sp<EffectChain> chain = getEffectChain_l(sessionId);
1091     if (chain != 0) {
1092         if (type != NULL) {
1093             chain->setEffectSuspended_l(type, suspend);
1094         } else {
1095             chain->setEffectSuspendedAll_l(suspend);
1096         }
1097     }
1098 
1099     updateSuspendedSessions_l(type, suspend, sessionId);
1100 }
1101 
checkSuspendOnAddEffectChain_l(const sp<EffectChain> & chain)1102 void AudioFlinger::ThreadBase::checkSuspendOnAddEffectChain_l(const sp<EffectChain>& chain)
1103 {
1104     ssize_t index = mSuspendedSessions.indexOfKey(chain->sessionId());
1105     if (index < 0) {
1106         return;
1107     }
1108 
1109     const KeyedVector <int, sp<SuspendedSessionDesc> >& sessionEffects =
1110             mSuspendedSessions.valueAt(index);
1111 
1112     for (size_t i = 0; i < sessionEffects.size(); i++) {
1113         const sp<SuspendedSessionDesc>& desc = sessionEffects.valueAt(i);
1114         for (int j = 0; j < desc->mRefCount; j++) {
1115             if (sessionEffects.keyAt(i) == EffectChain::kKeyForSuspendAll) {
1116                 chain->setEffectSuspendedAll_l(true);
1117             } else {
1118                 ALOGV("checkSuspendOnAddEffectChain_l() suspending effects %08x",
1119                     desc->mType.timeLow);
1120                 chain->setEffectSuspended_l(&desc->mType, true);
1121             }
1122         }
1123     }
1124 }
1125 
updateSuspendedSessions_l(const effect_uuid_t * type,bool suspend,audio_session_t sessionId)1126 void AudioFlinger::ThreadBase::updateSuspendedSessions_l(const effect_uuid_t *type,
1127                                                          bool suspend,
1128                                                          audio_session_t sessionId)
1129 {
1130     ssize_t index = mSuspendedSessions.indexOfKey(sessionId);
1131 
1132     KeyedVector <int, sp<SuspendedSessionDesc> > sessionEffects;
1133 
1134     if (suspend) {
1135         if (index >= 0) {
1136             sessionEffects = mSuspendedSessions.valueAt(index);
1137         } else {
1138             mSuspendedSessions.add(sessionId, sessionEffects);
1139         }
1140     } else {
1141         if (index < 0) {
1142             return;
1143         }
1144         sessionEffects = mSuspendedSessions.valueAt(index);
1145     }
1146 
1147 
1148     int key = EffectChain::kKeyForSuspendAll;
1149     if (type != NULL) {
1150         key = type->timeLow;
1151     }
1152     index = sessionEffects.indexOfKey(key);
1153 
1154     sp<SuspendedSessionDesc> desc;
1155     if (suspend) {
1156         if (index >= 0) {
1157             desc = sessionEffects.valueAt(index);
1158         } else {
1159             desc = new SuspendedSessionDesc();
1160             if (type != NULL) {
1161                 desc->mType = *type;
1162             }
1163             sessionEffects.add(key, desc);
1164             ALOGV("updateSuspendedSessions_l() suspend adding effect %08x", key);
1165         }
1166         desc->mRefCount++;
1167     } else {
1168         if (index < 0) {
1169             return;
1170         }
1171         desc = sessionEffects.valueAt(index);
1172         if (--desc->mRefCount == 0) {
1173             ALOGV("updateSuspendedSessions_l() restore removing effect %08x", key);
1174             sessionEffects.removeItemsAt(index);
1175             if (sessionEffects.isEmpty()) {
1176                 ALOGV("updateSuspendedSessions_l() restore removing session %d",
1177                                  sessionId);
1178                 mSuspendedSessions.removeItem(sessionId);
1179             }
1180         }
1181     }
1182     if (!sessionEffects.isEmpty()) {
1183         mSuspendedSessions.replaceValueFor(sessionId, sessionEffects);
1184     }
1185 }
1186 
checkSuspendOnEffectEnabled(bool enabled,audio_session_t sessionId,bool threadLocked)1187 void AudioFlinger::ThreadBase::checkSuspendOnEffectEnabled(bool enabled,
1188                                                            audio_session_t sessionId,
1189                                                            bool threadLocked) {
1190     if (!threadLocked) {
1191         mLock.lock();
1192     }
1193 
1194     if (mType != RECORD) {
1195         // suspend all effects in AUDIO_SESSION_OUTPUT_MIX when enabling any effect on
1196         // another session. This gives the priority to well behaved effect control panels
1197         // and applications not using global effects.
1198         // Enabling post processing in AUDIO_SESSION_OUTPUT_STAGE session does not affect
1199         // global effects
1200         if (!audio_is_global_session(sessionId)) {
1201             setEffectSuspended_l(NULL, enabled, AUDIO_SESSION_OUTPUT_MIX);
1202         }
1203     }
1204 
1205     if (!threadLocked) {
1206         mLock.unlock();
1207     }
1208 }
1209 
1210 // checkEffectCompatibility_l() must be called with ThreadBase::mLock held
checkEffectCompatibility_l(const effect_descriptor_t * desc,audio_session_t sessionId)1211 status_t AudioFlinger::RecordThread::checkEffectCompatibility_l(
1212         const effect_descriptor_t *desc, audio_session_t sessionId)
1213 {
1214     // No global output effect sessions on record threads
1215     if (sessionId == AUDIO_SESSION_OUTPUT_MIX
1216             || sessionId == AUDIO_SESSION_OUTPUT_STAGE) {
1217         ALOGW("checkEffectCompatibility_l(): global effect %s on record thread %s",
1218                 desc->name, mThreadName);
1219         return BAD_VALUE;
1220     }
1221     // only pre processing effects on record thread
1222     if ((desc->flags & EFFECT_FLAG_TYPE_MASK) != EFFECT_FLAG_TYPE_PRE_PROC) {
1223         ALOGW("checkEffectCompatibility_l(): non pre processing effect %s on record thread %s",
1224                 desc->name, mThreadName);
1225         return BAD_VALUE;
1226     }
1227 
1228     // always allow effects without processing load or latency
1229     if ((desc->flags & EFFECT_FLAG_NO_PROCESS_MASK) == EFFECT_FLAG_NO_PROCESS) {
1230         return NO_ERROR;
1231     }
1232 
1233     audio_input_flags_t flags = mInput->flags;
1234     if (hasFastCapture() || (flags & AUDIO_INPUT_FLAG_FAST)) {
1235         if (flags & AUDIO_INPUT_FLAG_RAW) {
1236             ALOGW("checkEffectCompatibility_l(): effect %s on record thread %s in raw mode",
1237                   desc->name, mThreadName);
1238             return BAD_VALUE;
1239         }
1240         if ((desc->flags & EFFECT_FLAG_HW_ACC_TUNNEL) == 0) {
1241             ALOGW("checkEffectCompatibility_l(): non HW effect %s on record thread %s in fast mode",
1242                   desc->name, mThreadName);
1243             return BAD_VALUE;
1244         }
1245     }
1246     return NO_ERROR;
1247 }
1248 
1249 // checkEffectCompatibility_l() must be called with ThreadBase::mLock held
checkEffectCompatibility_l(const effect_descriptor_t * desc,audio_session_t sessionId)1250 status_t AudioFlinger::PlaybackThread::checkEffectCompatibility_l(
1251         const effect_descriptor_t *desc, audio_session_t sessionId)
1252 {
1253     // no preprocessing on playback threads
1254     if ((desc->flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_PRE_PROC) {
1255         ALOGW("checkEffectCompatibility_l(): pre processing effect %s created on playback"
1256                 " thread %s", desc->name, mThreadName);
1257         return BAD_VALUE;
1258     }
1259 
1260     // always allow effects without processing load or latency
1261     if ((desc->flags & EFFECT_FLAG_NO_PROCESS_MASK) == EFFECT_FLAG_NO_PROCESS) {
1262         return NO_ERROR;
1263     }
1264 
1265     switch (mType) {
1266     case MIXER: {
1267 #ifndef MULTICHANNEL_EFFECT_CHAIN
1268         // Reject any effect on mixer multichannel sinks.
1269         // TODO: fix both format and multichannel issues with effects.
1270         if (mChannelCount != FCC_2) {
1271             ALOGW("checkEffectCompatibility_l(): effect %s for multichannel(%d) on MIXER"
1272                     " thread %s", desc->name, mChannelCount, mThreadName);
1273             return BAD_VALUE;
1274         }
1275 #endif
1276         audio_output_flags_t flags = mOutput->flags;
1277         if (hasFastMixer() || (flags & AUDIO_OUTPUT_FLAG_FAST)) {
1278             if (sessionId == AUDIO_SESSION_OUTPUT_MIX) {
1279                 // global effects are applied only to non fast tracks if they are SW
1280                 if ((desc->flags & EFFECT_FLAG_HW_ACC_TUNNEL) == 0) {
1281                     break;
1282                 }
1283             } else if (sessionId == AUDIO_SESSION_OUTPUT_STAGE) {
1284                 // only post processing on output stage session
1285                 if ((desc->flags & EFFECT_FLAG_TYPE_MASK) != EFFECT_FLAG_TYPE_POST_PROC) {
1286                     ALOGW("checkEffectCompatibility_l(): non post processing effect %s not allowed"
1287                             " on output stage session", desc->name);
1288                     return BAD_VALUE;
1289                 }
1290             } else if (sessionId == AUDIO_SESSION_DEVICE) {
1291                 // only post processing on output stage session
1292                 if ((desc->flags & EFFECT_FLAG_TYPE_MASK) != EFFECT_FLAG_TYPE_POST_PROC) {
1293                     ALOGW("checkEffectCompatibility_l(): non post processing effect %s not allowed"
1294                             " on device session", desc->name);
1295                     return BAD_VALUE;
1296                 }
1297             } else {
1298                 // no restriction on effects applied on non fast tracks
1299                 if ((hasAudioSession_l(sessionId) & ThreadBase::FAST_SESSION) == 0) {
1300                     break;
1301                 }
1302             }
1303 
1304             if (flags & AUDIO_OUTPUT_FLAG_RAW) {
1305                 ALOGW("checkEffectCompatibility_l(): effect %s on playback thread in raw mode",
1306                       desc->name);
1307                 return BAD_VALUE;
1308             }
1309             if ((desc->flags & EFFECT_FLAG_HW_ACC_TUNNEL) == 0) {
1310                 ALOGW("checkEffectCompatibility_l(): non HW effect %s on playback thread"
1311                         " in fast mode", desc->name);
1312                 return BAD_VALUE;
1313             }
1314         }
1315     } break;
1316     case OFFLOAD:
1317         // nothing actionable on offload threads, if the effect:
1318         //   - is offloadable: the effect can be created
1319         //   - is NOT offloadable: the effect should still be created, but EffectHandle::enable()
1320         //     will take care of invalidating the tracks of the thread
1321         break;
1322     case DIRECT:
1323         // Reject any effect on Direct output threads for now, since the format of
1324         // mSinkBuffer is not guaranteed to be compatible with effect processing (PCM 16 stereo).
1325         ALOGW("checkEffectCompatibility_l(): effect %s on DIRECT output thread %s",
1326                 desc->name, mThreadName);
1327         return BAD_VALUE;
1328     case DUPLICATING:
1329 #ifndef MULTICHANNEL_EFFECT_CHAIN
1330         // Reject any effect on mixer multichannel sinks.
1331         // TODO: fix both format and multichannel issues with effects.
1332         if (mChannelCount != FCC_2) {
1333             ALOGW("checkEffectCompatibility_l(): effect %s for multichannel(%d)"
1334                     " on DUPLICATING thread %s", desc->name, mChannelCount, mThreadName);
1335             return BAD_VALUE;
1336         }
1337 #endif
1338         if (audio_is_global_session(sessionId)) {
1339             ALOGW("checkEffectCompatibility_l(): global effect %s on DUPLICATING"
1340                     " thread %s", desc->name, mThreadName);
1341             return BAD_VALUE;
1342         }
1343         if ((desc->flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_POST_PROC) {
1344             ALOGW("checkEffectCompatibility_l(): post processing effect %s on"
1345                     " DUPLICATING thread %s", desc->name, mThreadName);
1346             return BAD_VALUE;
1347         }
1348         if ((desc->flags & EFFECT_FLAG_HW_ACC_TUNNEL) != 0) {
1349             ALOGW("checkEffectCompatibility_l(): HW tunneled effect %s on"
1350                     " DUPLICATING thread %s", desc->name, mThreadName);
1351             return BAD_VALUE;
1352         }
1353         break;
1354     default:
1355         LOG_ALWAYS_FATAL("checkEffectCompatibility_l(): wrong thread type %d", mType);
1356     }
1357 
1358     return NO_ERROR;
1359 }
1360 
1361 // ThreadBase::createEffect_l() must be called with AudioFlinger::mLock held
createEffect_l(const sp<AudioFlinger::Client> & client,const sp<IEffectClient> & effectClient,int32_t priority,audio_session_t sessionId,effect_descriptor_t * desc,int * enabled,status_t * status,bool pinned,bool probe)1362 sp<AudioFlinger::EffectHandle> AudioFlinger::ThreadBase::createEffect_l(
1363         const sp<AudioFlinger::Client>& client,
1364         const sp<IEffectClient>& effectClient,
1365         int32_t priority,
1366         audio_session_t sessionId,
1367         effect_descriptor_t *desc,
1368         int *enabled,
1369         status_t *status,
1370         bool pinned,
1371         bool probe)
1372 {
1373     sp<EffectModule> effect;
1374     sp<EffectHandle> handle;
1375     status_t lStatus;
1376     sp<EffectChain> chain;
1377     bool chainCreated = false;
1378     bool effectCreated = false;
1379     audio_unique_id_t effectId = AUDIO_UNIQUE_ID_USE_UNSPECIFIED;
1380 
1381     lStatus = initCheck();
1382     if (lStatus != NO_ERROR) {
1383         ALOGW("createEffect_l() Audio driver not initialized.");
1384         goto Exit;
1385     }
1386 
1387     ALOGV("createEffect_l() thread %p effect %s on session %d", this, desc->name, sessionId);
1388 
1389     { // scope for mLock
1390         Mutex::Autolock _l(mLock);
1391 
1392         lStatus = checkEffectCompatibility_l(desc, sessionId);
1393         if (probe || lStatus != NO_ERROR) {
1394             goto Exit;
1395         }
1396 
1397         // check for existing effect chain with the requested audio session
1398         chain = getEffectChain_l(sessionId);
1399         if (chain == 0) {
1400             // create a new chain for this session
1401             ALOGV("createEffect_l() new effect chain for session %d", sessionId);
1402             chain = new EffectChain(this, sessionId);
1403             addEffectChain_l(chain);
1404             chain->setStrategy(getStrategyForSession_l(sessionId));
1405             chainCreated = true;
1406         } else {
1407             effect = chain->getEffectFromDesc_l(desc);
1408         }
1409 
1410         ALOGV("createEffect_l() got effect %p on chain %p", effect.get(), chain.get());
1411 
1412         if (effect == 0) {
1413             effectId = mAudioFlinger->nextUniqueId(AUDIO_UNIQUE_ID_USE_EFFECT);
1414             // create a new effect module if none present in the chain
1415             lStatus = chain->createEffect_l(effect, desc, effectId, sessionId, pinned);
1416             if (lStatus != NO_ERROR) {
1417                 goto Exit;
1418             }
1419             effectCreated = true;
1420 
1421             // FIXME: use vector of device and address when effect interface is ready.
1422             effect->setDevices(outDeviceTypeAddrs());
1423             effect->setInputDevice(inDeviceTypeAddr());
1424             effect->setMode(mAudioFlinger->getMode());
1425             effect->setAudioSource(mAudioSource);
1426         }
1427         // create effect handle and connect it to effect module
1428         handle = new EffectHandle(effect, client, effectClient, priority);
1429         lStatus = handle->initCheck();
1430         if (lStatus == OK) {
1431             lStatus = effect->addHandle(handle.get());
1432         }
1433         if (enabled != NULL) {
1434             *enabled = (int)effect->isEnabled();
1435         }
1436     }
1437 
1438 Exit:
1439     if (!probe && lStatus != NO_ERROR && lStatus != ALREADY_EXISTS) {
1440         Mutex::Autolock _l(mLock);
1441         if (effectCreated) {
1442             chain->removeEffect_l(effect);
1443         }
1444         if (chainCreated) {
1445             removeEffectChain_l(chain);
1446         }
1447         // handle must be cleared by caller to avoid deadlock.
1448     }
1449 
1450     *status = lStatus;
1451     return handle;
1452 }
1453 
disconnectEffectHandle(EffectHandle * handle,bool unpinIfLast)1454 void AudioFlinger::ThreadBase::disconnectEffectHandle(EffectHandle *handle,
1455                                                       bool unpinIfLast)
1456 {
1457     bool remove = false;
1458     sp<EffectModule> effect;
1459     {
1460         Mutex::Autolock _l(mLock);
1461         sp<EffectBase> effectBase = handle->effect().promote();
1462         if (effectBase == nullptr) {
1463             return;
1464         }
1465         effect = effectBase->asEffectModule();
1466         if (effect == nullptr) {
1467             return;
1468         }
1469         // restore suspended effects if the disconnected handle was enabled and the last one.
1470         remove = (effect->removeHandle(handle) == 0) && (!effect->isPinned() || unpinIfLast);
1471         if (remove) {
1472             removeEffect_l(effect, true);
1473         }
1474     }
1475     if (remove) {
1476         mAudioFlinger->updateOrphanEffectChains(effect);
1477         if (handle->enabled()) {
1478             effect->checkSuspendOnEffectEnabled(false, false /*threadLocked*/);
1479         }
1480     }
1481 }
1482 
onEffectEnable(const sp<EffectModule> & effect)1483 void AudioFlinger::ThreadBase::onEffectEnable(const sp<EffectModule>& effect) {
1484     if (isOffloadOrMmap()) {
1485         Mutex::Autolock _l(mLock);
1486         broadcast_l();
1487     }
1488     if (!effect->isOffloadable()) {
1489         if (mType == ThreadBase::OFFLOAD) {
1490             PlaybackThread *t = (PlaybackThread *)this;
1491             t->invalidateTracks(AUDIO_STREAM_MUSIC);
1492         }
1493         if (effect->sessionId() == AUDIO_SESSION_OUTPUT_MIX) {
1494             mAudioFlinger->onNonOffloadableGlobalEffectEnable();
1495         }
1496     }
1497 }
1498 
onEffectDisable()1499 void AudioFlinger::ThreadBase::onEffectDisable() {
1500     if (isOffloadOrMmap()) {
1501         Mutex::Autolock _l(mLock);
1502         broadcast_l();
1503     }
1504 }
1505 
getEffect(audio_session_t sessionId,int effectId)1506 sp<AudioFlinger::EffectModule> AudioFlinger::ThreadBase::getEffect(audio_session_t sessionId,
1507         int effectId)
1508 {
1509     Mutex::Autolock _l(mLock);
1510     return getEffect_l(sessionId, effectId);
1511 }
1512 
getEffect_l(audio_session_t sessionId,int effectId)1513 sp<AudioFlinger::EffectModule> AudioFlinger::ThreadBase::getEffect_l(audio_session_t sessionId,
1514         int effectId)
1515 {
1516     sp<EffectChain> chain = getEffectChain_l(sessionId);
1517     return chain != 0 ? chain->getEffectFromId_l(effectId) : 0;
1518 }
1519 
getEffectIds_l(audio_session_t sessionId)1520 std::vector<int> AudioFlinger::ThreadBase::getEffectIds_l(audio_session_t sessionId)
1521 {
1522     sp<EffectChain> chain = getEffectChain_l(sessionId);
1523     return chain != nullptr ? chain->getEffectIds() : std::vector<int>{};
1524 }
1525 
1526 // PlaybackThread::addEffect_l() must be called with AudioFlinger::mLock and
1527 // PlaybackThread::mLock held
addEffect_l(const sp<EffectModule> & effect)1528 status_t AudioFlinger::ThreadBase::addEffect_l(const sp<EffectModule>& effect)
1529 {
1530     // check for existing effect chain with the requested audio session
1531     audio_session_t sessionId = effect->sessionId();
1532     sp<EffectChain> chain = getEffectChain_l(sessionId);
1533     bool chainCreated = false;
1534 
1535     ALOGD_IF((mType == OFFLOAD) && !effect->isOffloadable(),
1536              "addEffect_l() on offloaded thread %p: effect %s does not support offload flags %#x",
1537                     this, effect->desc().name, effect->desc().flags);
1538 
1539     if (chain == 0) {
1540         // create a new chain for this session
1541         ALOGV("addEffect_l() new effect chain for session %d", sessionId);
1542         chain = new EffectChain(this, sessionId);
1543         addEffectChain_l(chain);
1544         chain->setStrategy(getStrategyForSession_l(sessionId));
1545         chainCreated = true;
1546     }
1547     ALOGV("addEffect_l() %p chain %p effect %p", this, chain.get(), effect.get());
1548 
1549     if (chain->getEffectFromId_l(effect->id()) != 0) {
1550         ALOGW("addEffect_l() %p effect %s already present in chain %p",
1551                 this, effect->desc().name, chain.get());
1552         return BAD_VALUE;
1553     }
1554 
1555     effect->setOffloaded(mType == OFFLOAD, mId);
1556 
1557     status_t status = chain->addEffect_l(effect);
1558     if (status != NO_ERROR) {
1559         if (chainCreated) {
1560             removeEffectChain_l(chain);
1561         }
1562         return status;
1563     }
1564 
1565     effect->setDevices(outDeviceTypeAddrs());
1566     effect->setInputDevice(inDeviceTypeAddr());
1567     effect->setMode(mAudioFlinger->getMode());
1568     effect->setAudioSource(mAudioSource);
1569 
1570     return NO_ERROR;
1571 }
1572 
removeEffect_l(const sp<EffectModule> & effect,bool release)1573 void AudioFlinger::ThreadBase::removeEffect_l(const sp<EffectModule>& effect, bool release) {
1574 
1575     ALOGV("%s %p effect %p", __FUNCTION__, this, effect.get());
1576     effect_descriptor_t desc = effect->desc();
1577     if ((desc.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
1578         detachAuxEffect_l(effect->id());
1579     }
1580 
1581     sp<EffectChain> chain = effect->callback()->chain().promote();
1582     if (chain != 0) {
1583         // remove effect chain if removing last effect
1584         if (chain->removeEffect_l(effect, release) == 0) {
1585             removeEffectChain_l(chain);
1586         }
1587     } else {
1588         ALOGW("removeEffect_l() %p cannot promote chain for effect %p", this, effect.get());
1589     }
1590 }
1591 
lockEffectChains_l(Vector<sp<AudioFlinger::EffectChain>> & effectChains)1592 void AudioFlinger::ThreadBase::lockEffectChains_l(
1593         Vector< sp<AudioFlinger::EffectChain> >& effectChains)
1594 {
1595     effectChains = mEffectChains;
1596     for (size_t i = 0; i < mEffectChains.size(); i++) {
1597         mEffectChains[i]->lock();
1598     }
1599 }
1600 
unlockEffectChains(const Vector<sp<AudioFlinger::EffectChain>> & effectChains)1601 void AudioFlinger::ThreadBase::unlockEffectChains(
1602         const Vector< sp<AudioFlinger::EffectChain> >& effectChains)
1603 {
1604     for (size_t i = 0; i < effectChains.size(); i++) {
1605         effectChains[i]->unlock();
1606     }
1607 }
1608 
getEffectChain(audio_session_t sessionId)1609 sp<AudioFlinger::EffectChain> AudioFlinger::ThreadBase::getEffectChain(audio_session_t sessionId)
1610 {
1611     Mutex::Autolock _l(mLock);
1612     return getEffectChain_l(sessionId);
1613 }
1614 
getEffectChain_l(audio_session_t sessionId) const1615 sp<AudioFlinger::EffectChain> AudioFlinger::ThreadBase::getEffectChain_l(audio_session_t sessionId)
1616         const
1617 {
1618     size_t size = mEffectChains.size();
1619     for (size_t i = 0; i < size; i++) {
1620         if (mEffectChains[i]->sessionId() == sessionId) {
1621             return mEffectChains[i];
1622         }
1623     }
1624     return 0;
1625 }
1626 
setMode(audio_mode_t mode)1627 void AudioFlinger::ThreadBase::setMode(audio_mode_t mode)
1628 {
1629     Mutex::Autolock _l(mLock);
1630     size_t size = mEffectChains.size();
1631     for (size_t i = 0; i < size; i++) {
1632         mEffectChains[i]->setMode_l(mode);
1633     }
1634 }
1635 
toAudioPortConfig(struct audio_port_config * config)1636 void AudioFlinger::ThreadBase::toAudioPortConfig(struct audio_port_config *config)
1637 {
1638     config->type = AUDIO_PORT_TYPE_MIX;
1639     config->ext.mix.handle = mId;
1640     config->sample_rate = mSampleRate;
1641     config->format = mFormat;
1642     config->channel_mask = mChannelMask;
1643     config->config_mask = AUDIO_PORT_CONFIG_SAMPLE_RATE|AUDIO_PORT_CONFIG_CHANNEL_MASK|
1644                             AUDIO_PORT_CONFIG_FORMAT;
1645 }
1646 
systemReady()1647 void AudioFlinger::ThreadBase::systemReady()
1648 {
1649     Mutex::Autolock _l(mLock);
1650     if (mSystemReady) {
1651         return;
1652     }
1653     mSystemReady = true;
1654 
1655     for (size_t i = 0; i < mPendingConfigEvents.size(); i++) {
1656         sendConfigEvent_l(mPendingConfigEvents.editItemAt(i));
1657     }
1658     mPendingConfigEvents.clear();
1659 }
1660 
1661 template <typename T>
add(const sp<T> & track)1662 ssize_t AudioFlinger::ThreadBase::ActiveTracks<T>::add(const sp<T> &track) {
1663     ssize_t index = mActiveTracks.indexOf(track);
1664     if (index >= 0) {
1665         ALOGW("ActiveTracks<T>::add track %p already there", track.get());
1666         return index;
1667     }
1668     logTrack("add", track);
1669     mActiveTracksGeneration++;
1670     mLatestActiveTrack = track;
1671     ++mBatteryCounter[track->uid()].second;
1672     mHasChanged = true;
1673     return mActiveTracks.add(track);
1674 }
1675 
1676 template <typename T>
remove(const sp<T> & track)1677 ssize_t AudioFlinger::ThreadBase::ActiveTracks<T>::remove(const sp<T> &track) {
1678     ssize_t index = mActiveTracks.remove(track);
1679     if (index < 0) {
1680         ALOGW("ActiveTracks<T>::remove nonexistent track %p", track.get());
1681         return index;
1682     }
1683     logTrack("remove", track);
1684     mActiveTracksGeneration++;
1685     --mBatteryCounter[track->uid()].second;
1686     // mLatestActiveTrack is not cleared even if is the same as track.
1687     mHasChanged = true;
1688 #ifdef TEE_SINK
1689     track->dumpTee(-1 /* fd */, "_REMOVE");
1690 #endif
1691     track->logEndInterval(); // log to MediaMetrics
1692     return index;
1693 }
1694 
1695 template <typename T>
clear()1696 void AudioFlinger::ThreadBase::ActiveTracks<T>::clear() {
1697     for (const sp<T> &track : mActiveTracks) {
1698         BatteryNotifier::getInstance().noteStopAudio(track->uid());
1699         logTrack("clear", track);
1700     }
1701     mLastActiveTracksGeneration = mActiveTracksGeneration;
1702     if (!mActiveTracks.empty()) { mHasChanged = true; }
1703     mActiveTracks.clear();
1704     mLatestActiveTrack.clear();
1705     mBatteryCounter.clear();
1706 }
1707 
1708 template <typename T>
updatePowerState(sp<ThreadBase> thread,bool force)1709 void AudioFlinger::ThreadBase::ActiveTracks<T>::updatePowerState(
1710         sp<ThreadBase> thread, bool force) {
1711     // Updates ActiveTracks client uids to the thread wakelock.
1712     if (mActiveTracksGeneration != mLastActiveTracksGeneration || force) {
1713         thread->updateWakeLockUids_l(getWakeLockUids());
1714         mLastActiveTracksGeneration = mActiveTracksGeneration;
1715     }
1716 
1717     // Updates BatteryNotifier uids
1718     for (auto it = mBatteryCounter.begin(); it != mBatteryCounter.end();) {
1719         const uid_t uid = it->first;
1720         ssize_t &previous = it->second.first;
1721         ssize_t &current = it->second.second;
1722         if (current > 0) {
1723             if (previous == 0) {
1724                 BatteryNotifier::getInstance().noteStartAudio(uid);
1725             }
1726             previous = current;
1727             ++it;
1728         } else if (current == 0) {
1729             if (previous > 0) {
1730                 BatteryNotifier::getInstance().noteStopAudio(uid);
1731             }
1732             it = mBatteryCounter.erase(it); // std::map<> is stable on iterator erase.
1733         } else /* (current < 0) */ {
1734             LOG_ALWAYS_FATAL("negative battery count %zd", current);
1735         }
1736     }
1737 }
1738 
1739 template <typename T>
readAndClearHasChanged()1740 bool AudioFlinger::ThreadBase::ActiveTracks<T>::readAndClearHasChanged() {
1741     const bool hasChanged = mHasChanged;
1742     mHasChanged = false;
1743     return hasChanged;
1744 }
1745 
1746 template <typename T>
logTrack(const char * funcName,const sp<T> & track) const1747 void AudioFlinger::ThreadBase::ActiveTracks<T>::logTrack(
1748         const char *funcName, const sp<T> &track) const {
1749     if (mLocalLog != nullptr) {
1750         String8 result;
1751         track->appendDump(result, false /* active */);
1752         mLocalLog->log("AT::%-10s(%p) %s", funcName, track.get(), result.string());
1753     }
1754 }
1755 
broadcast_l()1756 void AudioFlinger::ThreadBase::broadcast_l()
1757 {
1758     // Thread could be blocked waiting for async
1759     // so signal it to handle state changes immediately
1760     // If threadLoop is currently unlocked a signal of mWaitWorkCV will
1761     // be lost so we also flag to prevent it blocking on mWaitWorkCV
1762     mSignalPending = true;
1763     mWaitWorkCV.broadcast();
1764 }
1765 
1766 // Call only from threadLoop() or when it is idle.
1767 // Do not call from high performance code as this may do binder rpc to the MediaMetrics service.
sendStatistics(bool force)1768 void AudioFlinger::ThreadBase::sendStatistics(bool force)
1769 {
1770     // Do not log if we have no stats.
1771     // We choose the timestamp verifier because it is the most likely item to be present.
1772     const int64_t nstats = mTimestampVerifier.getN() - mLastRecordedTimestampVerifierN;
1773     if (nstats == 0) {
1774         return;
1775     }
1776 
1777     // Don't log more frequently than once per 12 hours.
1778     // We use BOOTTIME to include suspend time.
1779     const int64_t timeNs = systemTime(SYSTEM_TIME_BOOTTIME);
1780     const int64_t sinceNs = timeNs - mLastRecordedTimeNs; // ok if mLastRecordedTimeNs = 0
1781     if (!force && sinceNs <= 12 * NANOS_PER_HOUR) {
1782         return;
1783     }
1784 
1785     mLastRecordedTimestampVerifierN = mTimestampVerifier.getN();
1786     mLastRecordedTimeNs = timeNs;
1787 
1788     std::unique_ptr<mediametrics::Item> item(mediametrics::Item::create("audiothread"));
1789 
1790 #define MM_PREFIX "android.media.audiothread." // avoid cut-n-paste errors.
1791 
1792     // thread configuration
1793     item->setInt32(MM_PREFIX "id", (int32_t)mId); // IO handle
1794     // item->setInt32(MM_PREFIX "portId", (int32_t)mPortId);
1795     item->setCString(MM_PREFIX "type", threadTypeToString(mType));
1796     item->setInt32(MM_PREFIX "sampleRate", (int32_t)mSampleRate);
1797     item->setInt64(MM_PREFIX "channelMask", (int64_t)mChannelMask);
1798     item->setCString(MM_PREFIX "encoding", toString(mFormat).c_str());
1799     item->setInt32(MM_PREFIX "frameCount", (int32_t)mFrameCount);
1800     item->setCString(MM_PREFIX "outDevice", toString(outDeviceTypes()).c_str());
1801     item->setCString(MM_PREFIX "inDevice", toString(inDeviceType()).c_str());
1802 
1803     // thread statistics
1804     if (mIoJitterMs.getN() > 0) {
1805         item->setDouble(MM_PREFIX "ioJitterMs.mean", mIoJitterMs.getMean());
1806         item->setDouble(MM_PREFIX "ioJitterMs.std", mIoJitterMs.getStdDev());
1807     }
1808     if (mProcessTimeMs.getN() > 0) {
1809         item->setDouble(MM_PREFIX "processTimeMs.mean", mProcessTimeMs.getMean());
1810         item->setDouble(MM_PREFIX "processTimeMs.std", mProcessTimeMs.getStdDev());
1811     }
1812     const auto tsjitter = mTimestampVerifier.getJitterMs();
1813     if (tsjitter.getN() > 0) {
1814         item->setDouble(MM_PREFIX "timestampJitterMs.mean", tsjitter.getMean());
1815         item->setDouble(MM_PREFIX "timestampJitterMs.std", tsjitter.getStdDev());
1816     }
1817     if (mLatencyMs.getN() > 0) {
1818         item->setDouble(MM_PREFIX "latencyMs.mean", mLatencyMs.getMean());
1819         item->setDouble(MM_PREFIX "latencyMs.std", mLatencyMs.getStdDev());
1820     }
1821 
1822     item->selfrecord();
1823 }
1824 
1825 // ----------------------------------------------------------------------------
1826 //      Playback
1827 // ----------------------------------------------------------------------------
1828 
PlaybackThread(const sp<AudioFlinger> & audioFlinger,AudioStreamOut * output,audio_io_handle_t id,type_t type,bool systemReady)1829 AudioFlinger::PlaybackThread::PlaybackThread(const sp<AudioFlinger>& audioFlinger,
1830                                              AudioStreamOut* output,
1831                                              audio_io_handle_t id,
1832                                              type_t type,
1833                                              bool systemReady)
1834     :   ThreadBase(audioFlinger, id, type, systemReady, true /* isOut */),
1835         mNormalFrameCount(0), mSinkBuffer(NULL),
1836         mMixerBufferEnabled(AudioFlinger::kEnableExtendedPrecision),
1837         mMixerBuffer(NULL),
1838         mMixerBufferSize(0),
1839         mMixerBufferFormat(AUDIO_FORMAT_INVALID),
1840         mMixerBufferValid(false),
1841         mEffectBufferEnabled(AudioFlinger::kEnableExtendedPrecision),
1842         mEffectBuffer(NULL),
1843         mEffectBufferSize(0),
1844         mEffectBufferFormat(AUDIO_FORMAT_INVALID),
1845         mEffectBufferValid(false),
1846         mSuspended(0), mBytesWritten(0),
1847         mFramesWritten(0),
1848         mSuspendedFrames(0),
1849         mActiveTracks(&this->mLocalLog),
1850         // mStreamTypes[] initialized in constructor body
1851         mTracks(type == MIXER),
1852         mOutput(output),
1853         mNumWrites(0), mNumDelayedWrites(0), mInWrite(false),
1854         mMixerStatus(MIXER_IDLE),
1855         mMixerStatusIgnoringFastTracks(MIXER_IDLE),
1856         mStandbyDelayNs(AudioFlinger::mStandbyTimeInNsecs),
1857         mBytesRemaining(0),
1858         mCurrentWriteLength(0),
1859         mUseAsyncWrite(false),
1860         mWriteAckSequence(0),
1861         mDrainSequence(0),
1862         mScreenState(AudioFlinger::mScreenState),
1863         // index 0 is reserved for normal mixer's submix
1864         mFastTrackAvailMask(((1 << FastMixerState::sMaxFastTracks) - 1) & ~1),
1865         mHwSupportsPause(false), mHwPaused(false), mFlushPending(false),
1866         mLeftVolFloat(-1.0), mRightVolFloat(-1.0)
1867 {
1868     snprintf(mThreadName, kThreadNameLength, "AudioOut_%X", id);
1869     mNBLogWriter = audioFlinger->newWriter_l(kLogSize, mThreadName);
1870 
1871     // Assumes constructor is called by AudioFlinger with it's mLock held, but
1872     // it would be safer to explicitly pass initial masterVolume/masterMute as
1873     // parameter.
1874     //
1875     // If the HAL we are using has support for master volume or master mute,
1876     // then do not attenuate or mute during mixing (just leave the volume at 1.0
1877     // and the mute set to false).
1878     mMasterVolume = audioFlinger->masterVolume_l();
1879     mMasterMute = audioFlinger->masterMute_l();
1880     if (mOutput->audioHwDev) {
1881         if (mOutput->audioHwDev->canSetMasterVolume()) {
1882             mMasterVolume = 1.0;
1883         }
1884 
1885         if (mOutput->audioHwDev->canSetMasterMute()) {
1886             mMasterMute = false;
1887         }
1888         mIsMsdDevice = strcmp(
1889                 mOutput->audioHwDev->moduleName(), AUDIO_HARDWARE_MODULE_ID_MSD) == 0;
1890     }
1891 
1892     readOutputParameters_l();
1893 
1894     // TODO: We may also match on address as well as device type for
1895     // AUDIO_DEVICE_OUT_BUS, AUDIO_DEVICE_OUT_ALL_A2DP, AUDIO_DEVICE_OUT_REMOTE_SUBMIX
1896     if (type == MIXER || type == DIRECT || type == OFFLOAD) {
1897         // TODO: This property should be ensure that only contains one single device type.
1898         mTimestampCorrectedDevice = (audio_devices_t)property_get_int64(
1899                 "audio.timestamp.corrected_output_device",
1900                 (int64_t)(mIsMsdDevice ? AUDIO_DEVICE_OUT_BUS // turn on by default for MSD
1901                                        : AUDIO_DEVICE_NONE));
1902     }
1903 
1904     // ++ operator does not compile
1905     for (audio_stream_type_t stream = AUDIO_STREAM_MIN; stream < AUDIO_STREAM_FOR_POLICY_CNT;
1906             stream = (audio_stream_type_t) (stream + 1)) {
1907         mStreamTypes[stream].volume = 0.0f;
1908         mStreamTypes[stream].mute = mAudioFlinger->streamMute_l(stream);
1909     }
1910     // Audio patch and call assistant volume are always max
1911     mStreamTypes[AUDIO_STREAM_PATCH].volume = 1.0f;
1912     mStreamTypes[AUDIO_STREAM_PATCH].mute = false;
1913     mStreamTypes[AUDIO_STREAM_CALL_ASSISTANT].volume = 1.0f;
1914     mStreamTypes[AUDIO_STREAM_CALL_ASSISTANT].mute = false;
1915 }
1916 
~PlaybackThread()1917 AudioFlinger::PlaybackThread::~PlaybackThread()
1918 {
1919     mAudioFlinger->unregisterWriter(mNBLogWriter);
1920     free(mSinkBuffer);
1921     free(mMixerBuffer);
1922     free(mEffectBuffer);
1923 }
1924 
1925 // Thread virtuals
1926 
onFirstRef()1927 void AudioFlinger::PlaybackThread::onFirstRef()
1928 {
1929     if (mOutput == nullptr || mOutput->stream == nullptr) {
1930         ALOGE("The stream is not open yet"); // This should not happen.
1931     } else {
1932         // setEventCallback will need a strong pointer as a parameter. Calling it
1933         // here instead of constructor of PlaybackThread so that the onFirstRef
1934         // callback would not be made on an incompletely constructed object.
1935         if (mOutput->stream->setEventCallback(this) != OK) {
1936             ALOGE("Failed to add event callback");
1937         }
1938     }
1939     run(mThreadName, ANDROID_PRIORITY_URGENT_AUDIO);
1940 }
1941 
1942 // ThreadBase virtuals
preExit()1943 void AudioFlinger::PlaybackThread::preExit()
1944 {
1945     ALOGV("  preExit()");
1946     // FIXME this is using hard-coded strings but in the future, this functionality will be
1947     //       converted to use audio HAL extensions required to support tunneling
1948     status_t result = mOutput->stream->setParameters(String8("exiting=1"));
1949     ALOGE_IF(result != OK, "Error when setting parameters on exit: %d", result);
1950 }
1951 
dumpTracks_l(int fd,const Vector<String16> & args __unused)1952 void AudioFlinger::PlaybackThread::dumpTracks_l(int fd, const Vector<String16>& args __unused)
1953 {
1954     String8 result;
1955 
1956     result.appendFormat("  Stream volumes in dB: ");
1957     for (int i = 0; i < AUDIO_STREAM_CNT; ++i) {
1958         const stream_type_t *st = &mStreamTypes[i];
1959         if (i > 0) {
1960             result.appendFormat(", ");
1961         }
1962         result.appendFormat("%d:%.2g", i, 20.0 * log10(st->volume));
1963         if (st->mute) {
1964             result.append("M");
1965         }
1966     }
1967     result.append("\n");
1968     write(fd, result.string(), result.length());
1969     result.clear();
1970 
1971     // These values are "raw"; they will wrap around.  See prepareTracks_l() for a better way.
1972     FastTrackUnderruns underruns = getFastTrackUnderruns(0);
1973     dprintf(fd, "  Normal mixer raw underrun counters: partial=%u empty=%u\n",
1974             underruns.mBitFields.mPartial, underruns.mBitFields.mEmpty);
1975 
1976     size_t numtracks = mTracks.size();
1977     size_t numactive = mActiveTracks.size();
1978     dprintf(fd, "  %zu Tracks", numtracks);
1979     size_t numactiveseen = 0;
1980     const char *prefix = "    ";
1981     if (numtracks) {
1982         dprintf(fd, " of which %zu are active\n", numactive);
1983         result.append(prefix);
1984         mTracks[0]->appendDumpHeader(result);
1985         for (size_t i = 0; i < numtracks; ++i) {
1986             sp<Track> track = mTracks[i];
1987             if (track != 0) {
1988                 bool active = mActiveTracks.indexOf(track) >= 0;
1989                 if (active) {
1990                     numactiveseen++;
1991                 }
1992                 result.append(prefix);
1993                 track->appendDump(result, active);
1994             }
1995         }
1996     } else {
1997         result.append("\n");
1998     }
1999     if (numactiveseen != numactive) {
2000         // some tracks in the active list were not in the tracks list
2001         result.append("  The following tracks are in the active list but"
2002                 " not in the track list\n");
2003         result.append(prefix);
2004         mActiveTracks[0]->appendDumpHeader(result);
2005         for (size_t i = 0; i < numactive; ++i) {
2006             sp<Track> track = mActiveTracks[i];
2007             if (mTracks.indexOf(track) < 0) {
2008                 result.append(prefix);
2009                 track->appendDump(result, true /* active */);
2010             }
2011         }
2012     }
2013 
2014     write(fd, result.string(), result.size());
2015 }
2016 
dumpInternals_l(int fd,const Vector<String16> & args __unused)2017 void AudioFlinger::PlaybackThread::dumpInternals_l(int fd, const Vector<String16>& args __unused)
2018 {
2019     dprintf(fd, "  Master volume: %f\n", mMasterVolume);
2020     dprintf(fd, "  Master mute: %s\n", mMasterMute ? "on" : "off");
2021     if (mHapticChannelMask != AUDIO_CHANNEL_NONE) {
2022         dprintf(fd, "  Haptic channel mask: %#x (%s)\n", mHapticChannelMask,
2023                 channelMaskToString(mHapticChannelMask, true /* output */).c_str());
2024     }
2025     dprintf(fd, "  Normal frame count: %zu\n", mNormalFrameCount);
2026     dprintf(fd, "  Total writes: %d\n", mNumWrites);
2027     dprintf(fd, "  Delayed writes: %d\n", mNumDelayedWrites);
2028     dprintf(fd, "  Blocked in write: %s\n", mInWrite ? "yes" : "no");
2029     dprintf(fd, "  Suspend count: %d\n", mSuspended);
2030     dprintf(fd, "  Sink buffer : %p\n", mSinkBuffer);
2031     dprintf(fd, "  Mixer buffer: %p\n", mMixerBuffer);
2032     dprintf(fd, "  Effect buffer: %p\n", mEffectBuffer);
2033     dprintf(fd, "  Fast track availMask=%#x\n", mFastTrackAvailMask);
2034     dprintf(fd, "  Standby delay ns=%lld\n", (long long)mStandbyDelayNs);
2035     AudioStreamOut *output = mOutput;
2036     audio_output_flags_t flags = output != NULL ? output->flags : AUDIO_OUTPUT_FLAG_NONE;
2037     dprintf(fd, "  AudioStreamOut: %p flags %#x (%s)\n",
2038             output, flags, toString(flags).c_str());
2039     dprintf(fd, "  Frames written: %lld\n", (long long)mFramesWritten);
2040     dprintf(fd, "  Suspended frames: %lld\n", (long long)mSuspendedFrames);
2041     if (mPipeSink.get() != nullptr) {
2042         dprintf(fd, "  PipeSink frames written: %lld\n", (long long)mPipeSink->framesWritten());
2043     }
2044     if (output != nullptr) {
2045         dprintf(fd, "  Hal stream dump:\n");
2046         (void)output->stream->dump(fd);
2047     }
2048 }
2049 
2050 // PlaybackThread::createTrack_l() must be called with AudioFlinger::mLock held
createTrack_l(const sp<AudioFlinger::Client> & client,audio_stream_type_t streamType,const audio_attributes_t & attr,uint32_t * pSampleRate,audio_format_t format,audio_channel_mask_t channelMask,size_t * pFrameCount,size_t * pNotificationFrameCount,uint32_t notificationsPerBuffer,float speed,const sp<IMemory> & sharedBuffer,audio_session_t sessionId,audio_output_flags_t * flags,pid_t creatorPid,pid_t tid,uid_t uid,status_t * status,audio_port_handle_t portId,const sp<media::IAudioTrackCallback> & callback,const std::string & opPackageName)2051 sp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTrack_l(
2052         const sp<AudioFlinger::Client>& client,
2053         audio_stream_type_t streamType,
2054         const audio_attributes_t& attr,
2055         uint32_t *pSampleRate,
2056         audio_format_t format,
2057         audio_channel_mask_t channelMask,
2058         size_t *pFrameCount,
2059         size_t *pNotificationFrameCount,
2060         uint32_t notificationsPerBuffer,
2061         float speed,
2062         const sp<IMemory>& sharedBuffer,
2063         audio_session_t sessionId,
2064         audio_output_flags_t *flags,
2065         pid_t creatorPid,
2066         pid_t tid,
2067         uid_t uid,
2068         status_t *status,
2069         audio_port_handle_t portId,
2070         const sp<media::IAudioTrackCallback>& callback,
2071         const std::string& opPackageName)
2072 {
2073     size_t frameCount = *pFrameCount;
2074     size_t notificationFrameCount = *pNotificationFrameCount;
2075     sp<Track> track;
2076     status_t lStatus;
2077     audio_output_flags_t outputFlags = mOutput->flags;
2078     audio_output_flags_t requestedFlags = *flags;
2079     uint32_t sampleRate;
2080 
2081     if (sharedBuffer != 0 && checkIMemory(sharedBuffer) != NO_ERROR) {
2082         lStatus = BAD_VALUE;
2083         goto Exit;
2084     }
2085 
2086     if (*pSampleRate == 0) {
2087         *pSampleRate = mSampleRate;
2088     }
2089     sampleRate = *pSampleRate;
2090 
2091     // special case for FAST flag considered OK if fast mixer is present
2092     if (hasFastMixer()) {
2093         outputFlags = (audio_output_flags_t)(outputFlags | AUDIO_OUTPUT_FLAG_FAST);
2094     }
2095 
2096     // Check if requested flags are compatible with output stream flags
2097     if ((*flags & outputFlags) != *flags) {
2098         ALOGW("createTrack_l(): mismatch between requested flags (%08x) and output flags (%08x)",
2099               *flags, outputFlags);
2100         *flags = (audio_output_flags_t)(*flags & outputFlags);
2101     }
2102 
2103     // client expresses a preference for FAST, but we get the final say
2104     if (*flags & AUDIO_OUTPUT_FLAG_FAST) {
2105       if (
2106             // PCM data
2107             audio_is_linear_pcm(format) &&
2108             // TODO: extract as a data library function that checks that a computationally
2109             // expensive downmixer is not required: isFastOutputChannelConversion()
2110             (channelMask == (mChannelMask | mHapticChannelMask) ||
2111                     mChannelMask != AUDIO_CHANNEL_OUT_STEREO ||
2112                     (channelMask == AUDIO_CHANNEL_OUT_MONO
2113                             /* && mChannelMask == AUDIO_CHANNEL_OUT_STEREO */)) &&
2114             // hardware sample rate
2115             (sampleRate == mSampleRate) &&
2116             // normal mixer has an associated fast mixer
2117             hasFastMixer() &&
2118             // there are sufficient fast track slots available
2119             (mFastTrackAvailMask != 0)
2120             // FIXME test that MixerThread for this fast track has a capable output HAL
2121             // FIXME add a permission test also?
2122         ) {
2123         // static tracks can have any nonzero framecount, streaming tracks check against minimum.
2124         if (sharedBuffer == 0) {
2125             // read the fast track multiplier property the first time it is needed
2126             int ok = pthread_once(&sFastTrackMultiplierOnce, sFastTrackMultiplierInit);
2127             if (ok != 0) {
2128                 ALOGE("%s pthread_once failed: %d", __func__, ok);
2129             }
2130             frameCount = max(frameCount, mFrameCount * sFastTrackMultiplier); // incl framecount 0
2131         }
2132 
2133         // check compatibility with audio effects.
2134         { // scope for mLock
2135             Mutex::Autolock _l(mLock);
2136             for (audio_session_t session : {
2137                     AUDIO_SESSION_DEVICE,
2138                     AUDIO_SESSION_OUTPUT_STAGE,
2139                     AUDIO_SESSION_OUTPUT_MIX,
2140                     sessionId,
2141                 }) {
2142                 sp<EffectChain> chain = getEffectChain_l(session);
2143                 if (chain.get() != nullptr) {
2144                     audio_output_flags_t old = *flags;
2145                     chain->checkOutputFlagCompatibility(flags);
2146                     if (old != *flags) {
2147                         ALOGV("AUDIO_OUTPUT_FLAGS denied by effect, session=%d old=%#x new=%#x",
2148                                 (int)session, (int)old, (int)*flags);
2149                     }
2150                 }
2151             }
2152         }
2153         ALOGV_IF((*flags & AUDIO_OUTPUT_FLAG_FAST) != 0,
2154                  "AUDIO_OUTPUT_FLAG_FAST accepted: frameCount=%zu mFrameCount=%zu",
2155                  frameCount, mFrameCount);
2156       } else {
2157         ALOGV("AUDIO_OUTPUT_FLAG_FAST denied: sharedBuffer=%p frameCount=%zu "
2158                 "mFrameCount=%zu format=%#x mFormat=%#x isLinear=%d channelMask=%#x "
2159                 "sampleRate=%u mSampleRate=%u "
2160                 "hasFastMixer=%d tid=%d fastTrackAvailMask=%#x",
2161                 sharedBuffer.get(), frameCount, mFrameCount, format, mFormat,
2162                 audio_is_linear_pcm(format),
2163                 channelMask, sampleRate, mSampleRate, hasFastMixer(), tid, mFastTrackAvailMask);
2164         *flags = (audio_output_flags_t)(*flags & ~AUDIO_OUTPUT_FLAG_FAST);
2165       }
2166     }
2167 
2168     if (!audio_has_proportional_frames(format)) {
2169         if (sharedBuffer != 0) {
2170             // Same comment as below about ignoring frameCount parameter for set()
2171             frameCount = sharedBuffer->size();
2172         } else if (frameCount == 0) {
2173             frameCount = mNormalFrameCount;
2174         }
2175         if (notificationFrameCount != frameCount) {
2176             notificationFrameCount = frameCount;
2177         }
2178     } else if (sharedBuffer != 0) {
2179         // FIXME: Ensure client side memory buffers need
2180         // not have additional alignment beyond sample
2181         // (e.g. 16 bit stereo accessed as 32 bit frame).
2182         size_t alignment = audio_bytes_per_sample(format);
2183         if (alignment & 1) {
2184             // for AUDIO_FORMAT_PCM_24_BIT_PACKED (not exposed through Java).
2185             alignment = 1;
2186         }
2187         uint32_t channelCount = audio_channel_count_from_out_mask(channelMask);
2188         size_t frameSize = channelCount * audio_bytes_per_sample(format);
2189         if (channelCount > 1) {
2190             // More than 2 channels does not require stronger alignment than stereo
2191             alignment <<= 1;
2192         }
2193         if (((uintptr_t)sharedBuffer->unsecurePointer() & (alignment - 1)) != 0) {
2194             ALOGE("Invalid buffer alignment: address %p, channel count %u",
2195                   sharedBuffer->unsecurePointer(), channelCount);
2196             lStatus = BAD_VALUE;
2197             goto Exit;
2198         }
2199 
2200         // When initializing a shared buffer AudioTrack via constructors,
2201         // there's no frameCount parameter.
2202         // But when initializing a shared buffer AudioTrack via set(),
2203         // there _is_ a frameCount parameter.  We silently ignore it.
2204         frameCount = sharedBuffer->size() / frameSize;
2205     } else {
2206         size_t minFrameCount = 0;
2207         // For fast tracks we try to respect the application's request for notifications per buffer.
2208         if (*flags & AUDIO_OUTPUT_FLAG_FAST) {
2209             if (notificationsPerBuffer > 0) {
2210                 // Avoid possible arithmetic overflow during multiplication.
2211                 if (notificationsPerBuffer > SIZE_MAX / mFrameCount) {
2212                     ALOGE("Requested notificationPerBuffer=%u ignored for HAL frameCount=%zu",
2213                           notificationsPerBuffer, mFrameCount);
2214                 } else {
2215                     minFrameCount = mFrameCount * notificationsPerBuffer;
2216                 }
2217             }
2218         } else {
2219             // For normal PCM streaming tracks, update minimum frame count.
2220             // Buffer depth is forced to be at least 2 x the normal mixer frame count and
2221             // cover audio hardware latency.
2222             // This is probably too conservative, but legacy application code may depend on it.
2223             // If you change this calculation, also review the start threshold which is related.
2224             uint32_t latencyMs = latency_l();
2225             if (latencyMs == 0) {
2226                 ALOGE("Error when retrieving output stream latency");
2227                 lStatus = UNKNOWN_ERROR;
2228                 goto Exit;
2229             }
2230 
2231             minFrameCount = AudioSystem::calculateMinFrameCount(latencyMs, mNormalFrameCount,
2232                                 mSampleRate, sampleRate, speed /*, 0 mNotificationsPerBufferReq*/);
2233 
2234         }
2235         if (frameCount < minFrameCount) {
2236             frameCount = minFrameCount;
2237         }
2238     }
2239 
2240     // Make sure that application is notified with sufficient margin before underrun.
2241     // The client can divide the AudioTrack buffer into sub-buffers,
2242     // and expresses its desire to server as the notification frame count.
2243     if (sharedBuffer == 0 && audio_is_linear_pcm(format)) {
2244         size_t maxNotificationFrames;
2245         if (*flags & AUDIO_OUTPUT_FLAG_FAST) {
2246             // notify every HAL buffer, regardless of the size of the track buffer
2247             maxNotificationFrames = mFrameCount;
2248         } else {
2249             // Triple buffer the notification period for a triple buffered mixer period;
2250             // otherwise, double buffering for the notification period is fine.
2251             //
2252             // TODO: This should be moved to AudioTrack to modify the notification period
2253             // on AudioTrack::setBufferSizeInFrames() changes.
2254             const int nBuffering =
2255                     (uint64_t{frameCount} * mSampleRate)
2256                             / (uint64_t{mNormalFrameCount} * sampleRate) == 3 ? 3 : 2;
2257 
2258             maxNotificationFrames = frameCount / nBuffering;
2259             // If client requested a fast track but this was denied, then use the smaller maximum.
2260             if (requestedFlags & AUDIO_OUTPUT_FLAG_FAST) {
2261                 size_t maxNotificationFramesFastDenied = FMS_20 * sampleRate / 1000;
2262                 if (maxNotificationFrames > maxNotificationFramesFastDenied) {
2263                     maxNotificationFrames = maxNotificationFramesFastDenied;
2264                 }
2265             }
2266         }
2267         if (notificationFrameCount == 0 || notificationFrameCount > maxNotificationFrames) {
2268             if (notificationFrameCount == 0) {
2269                 ALOGD("Client defaulted notificationFrames to %zu for frameCount %zu",
2270                     maxNotificationFrames, frameCount);
2271             } else {
2272                 ALOGW("Client adjusted notificationFrames from %zu to %zu for frameCount %zu",
2273                       notificationFrameCount, maxNotificationFrames, frameCount);
2274             }
2275             notificationFrameCount = maxNotificationFrames;
2276         }
2277     }
2278 
2279     *pFrameCount = frameCount;
2280     *pNotificationFrameCount = notificationFrameCount;
2281 
2282     switch (mType) {
2283 
2284     case DIRECT:
2285         if (audio_is_linear_pcm(format)) { // TODO maybe use audio_has_proportional_frames()?
2286             if (sampleRate != mSampleRate || format != mFormat || channelMask != mChannelMask) {
2287                 ALOGE("createTrack_l() Bad parameter: sampleRate %u format %#x, channelMask 0x%08x "
2288                         "for output %p with format %#x",
2289                         sampleRate, format, channelMask, mOutput, mFormat);
2290                 lStatus = BAD_VALUE;
2291                 goto Exit;
2292             }
2293         }
2294         break;
2295 
2296     case OFFLOAD:
2297         if (sampleRate != mSampleRate || format != mFormat || channelMask != mChannelMask) {
2298             ALOGE("createTrack_l() Bad parameter: sampleRate %d format %#x, channelMask 0x%08x \""
2299                     "for output %p with format %#x",
2300                     sampleRate, format, channelMask, mOutput, mFormat);
2301             lStatus = BAD_VALUE;
2302             goto Exit;
2303         }
2304         break;
2305 
2306     default:
2307         if (!audio_is_linear_pcm(format)) {
2308                 ALOGE("createTrack_l() Bad parameter: format %#x \""
2309                         "for output %p with format %#x",
2310                         format, mOutput, mFormat);
2311                 lStatus = BAD_VALUE;
2312                 goto Exit;
2313         }
2314         if (sampleRate > mSampleRate * AUDIO_RESAMPLER_DOWN_RATIO_MAX) {
2315             ALOGE("Sample rate out of range: %u mSampleRate %u", sampleRate, mSampleRate);
2316             lStatus = BAD_VALUE;
2317             goto Exit;
2318         }
2319         break;
2320 
2321     }
2322 
2323     lStatus = initCheck();
2324     if (lStatus != NO_ERROR) {
2325         ALOGE("createTrack_l() audio driver not initialized");
2326         goto Exit;
2327     }
2328 
2329     { // scope for mLock
2330         Mutex::Autolock _l(mLock);
2331 
2332         // all tracks in same audio session must share the same routing strategy otherwise
2333         // conflicts will happen when tracks are moved from one output to another by audio policy
2334         // manager
2335         uint32_t strategy = AudioSystem::getStrategyForStream(streamType);
2336         for (size_t i = 0; i < mTracks.size(); ++i) {
2337             sp<Track> t = mTracks[i];
2338             if (t != 0 && t->isExternalTrack()) {
2339                 uint32_t actual = AudioSystem::getStrategyForStream(t->streamType());
2340                 if (sessionId == t->sessionId() && strategy != actual) {
2341                     ALOGE("createTrack_l() mismatched strategy; expected %u but found %u",
2342                             strategy, actual);
2343                     lStatus = BAD_VALUE;
2344                     goto Exit;
2345                 }
2346             }
2347         }
2348 
2349         track = new Track(this, client, streamType, attr, sampleRate, format,
2350                           channelMask, frameCount,
2351                           nullptr /* buffer */, (size_t)0 /* bufferSize */, sharedBuffer,
2352                           sessionId, creatorPid, uid, *flags, TrackBase::TYPE_DEFAULT, portId,
2353                           SIZE_MAX /*frameCountToBeReady*/, opPackageName);
2354 
2355         lStatus = track != 0 ? track->initCheck() : (status_t) NO_MEMORY;
2356         if (lStatus != NO_ERROR) {
2357             ALOGE("createTrack_l() initCheck failed %d; no control block?", lStatus);
2358             // track must be cleared from the caller as the caller has the AF lock
2359             goto Exit;
2360         }
2361         mTracks.add(track);
2362         {
2363             Mutex::Autolock _atCbL(mAudioTrackCbLock);
2364             if (callback.get() != nullptr) {
2365                 mAudioTrackCallbacks.emplace(track, callback);
2366             }
2367         }
2368 
2369         sp<EffectChain> chain = getEffectChain_l(sessionId);
2370         if (chain != 0) {
2371             ALOGV("createTrack_l() setting main buffer %p", chain->inBuffer());
2372             track->setMainBuffer(chain->inBuffer());
2373             chain->setStrategy(AudioSystem::getStrategyForStream(track->streamType()));
2374             chain->incTrackCnt();
2375         }
2376 
2377         if ((*flags & AUDIO_OUTPUT_FLAG_FAST) && (tid != -1)) {
2378             pid_t callingPid = IPCThreadState::self()->getCallingPid();
2379             // we don't have CAP_SYS_NICE, nor do we want to have it as it's too powerful,
2380             // so ask activity manager to do this on our behalf
2381             sendPrioConfigEvent_l(callingPid, tid, kPriorityAudioApp, true /*forApp*/);
2382         }
2383     }
2384 
2385     lStatus = NO_ERROR;
2386 
2387 Exit:
2388     *status = lStatus;
2389     return track;
2390 }
2391 
2392 template<typename T>
remove(const sp<T> & track)2393 ssize_t AudioFlinger::PlaybackThread::Tracks<T>::remove(const sp<T> &track)
2394 {
2395     const int trackId = track->id();
2396     const ssize_t index = mTracks.remove(track);
2397     if (index >= 0) {
2398         if (mSaveDeletedTrackIds) {
2399             // We can't directly access mAudioMixer since the caller may be outside of threadLoop.
2400             // Instead, we add to mDeletedTrackIds which is solely used for mAudioMixer update,
2401             // to be handled when MixerThread::prepareTracks_l() next changes mAudioMixer.
2402             mDeletedTrackIds.emplace(trackId);
2403         }
2404     }
2405     return index;
2406 }
2407 
correctLatency_l(uint32_t latency) const2408 uint32_t AudioFlinger::PlaybackThread::correctLatency_l(uint32_t latency) const
2409 {
2410     return latency;
2411 }
2412 
latency() const2413 uint32_t AudioFlinger::PlaybackThread::latency() const
2414 {
2415     Mutex::Autolock _l(mLock);
2416     return latency_l();
2417 }
latency_l() const2418 uint32_t AudioFlinger::PlaybackThread::latency_l() const
2419 {
2420     uint32_t latency;
2421     if (initCheck() == NO_ERROR && mOutput->stream->getLatency(&latency) == OK) {
2422         return correctLatency_l(latency);
2423     }
2424     return 0;
2425 }
2426 
setMasterVolume(float value)2427 void AudioFlinger::PlaybackThread::setMasterVolume(float value)
2428 {
2429     Mutex::Autolock _l(mLock);
2430     // Don't apply master volume in SW if our HAL can do it for us.
2431     if (mOutput && mOutput->audioHwDev &&
2432         mOutput->audioHwDev->canSetMasterVolume()) {
2433         mMasterVolume = 1.0;
2434     } else {
2435         mMasterVolume = value;
2436     }
2437 }
2438 
setMasterBalance(float balance)2439 void AudioFlinger::PlaybackThread::setMasterBalance(float balance)
2440 {
2441     mMasterBalance.store(balance);
2442 }
2443 
setMasterMute(bool muted)2444 void AudioFlinger::PlaybackThread::setMasterMute(bool muted)
2445 {
2446     if (isDuplicating()) {
2447         return;
2448     }
2449     Mutex::Autolock _l(mLock);
2450     // Don't apply master mute in SW if our HAL can do it for us.
2451     if (mOutput && mOutput->audioHwDev &&
2452         mOutput->audioHwDev->canSetMasterMute()) {
2453         mMasterMute = false;
2454     } else {
2455         mMasterMute = muted;
2456     }
2457 }
2458 
setStreamVolume(audio_stream_type_t stream,float value)2459 void AudioFlinger::PlaybackThread::setStreamVolume(audio_stream_type_t stream, float value)
2460 {
2461     Mutex::Autolock _l(mLock);
2462     mStreamTypes[stream].volume = value;
2463     broadcast_l();
2464 }
2465 
setStreamMute(audio_stream_type_t stream,bool muted)2466 void AudioFlinger::PlaybackThread::setStreamMute(audio_stream_type_t stream, bool muted)
2467 {
2468     Mutex::Autolock _l(mLock);
2469     mStreamTypes[stream].mute = muted;
2470     broadcast_l();
2471 }
2472 
streamVolume(audio_stream_type_t stream) const2473 float AudioFlinger::PlaybackThread::streamVolume(audio_stream_type_t stream) const
2474 {
2475     Mutex::Autolock _l(mLock);
2476     return mStreamTypes[stream].volume;
2477 }
2478 
setVolumeForOutput_l(float left,float right) const2479 void AudioFlinger::PlaybackThread::setVolumeForOutput_l(float left, float right) const
2480 {
2481     mOutput->stream->setVolume(left, right);
2482 }
2483 
2484 // addTrack_l() must be called with ThreadBase::mLock held
addTrack_l(const sp<Track> & track)2485 status_t AudioFlinger::PlaybackThread::addTrack_l(const sp<Track>& track)
2486 {
2487     status_t status = ALREADY_EXISTS;
2488 
2489     if (mActiveTracks.indexOf(track) < 0) {
2490         // the track is newly added, make sure it fills up all its
2491         // buffers before playing. This is to ensure the client will
2492         // effectively get the latency it requested.
2493         if (track->isExternalTrack()) {
2494             TrackBase::track_state state = track->mState;
2495             mLock.unlock();
2496             status = AudioSystem::startOutput(track->portId());
2497             mLock.lock();
2498             // abort track was stopped/paused while we released the lock
2499             if (state != track->mState) {
2500                 if (status == NO_ERROR) {
2501                     mLock.unlock();
2502                     AudioSystem::stopOutput(track->portId());
2503                     mLock.lock();
2504                 }
2505                 return INVALID_OPERATION;
2506             }
2507             // abort if start is rejected by audio policy manager
2508             if (status != NO_ERROR) {
2509                 return PERMISSION_DENIED;
2510             }
2511 #ifdef ADD_BATTERY_DATA
2512             // to track the speaker usage
2513             addBatteryData(IMediaPlayerService::kBatteryDataAudioFlingerStart);
2514 #endif
2515             sendIoConfigEvent_l(AUDIO_CLIENT_STARTED, track->creatorPid(), track->portId());
2516         }
2517 
2518         // set retry count for buffer fill
2519         if (track->isOffloaded()) {
2520             if (track->isStopping_1()) {
2521                 track->mRetryCount = kMaxTrackStopRetriesOffload;
2522             } else {
2523                 track->mRetryCount = kMaxTrackStartupRetriesOffload;
2524             }
2525             track->mFillingUpStatus = mStandby ? Track::FS_FILLING : Track::FS_FILLED;
2526         } else {
2527             track->mRetryCount = kMaxTrackStartupRetries;
2528             track->mFillingUpStatus =
2529                     track->sharedBuffer() != 0 ? Track::FS_FILLED : Track::FS_FILLING;
2530         }
2531 
2532         if ((track->channelMask() & AUDIO_CHANNEL_HAPTIC_ALL) != AUDIO_CHANNEL_NONE
2533                 && mHapticChannelMask != AUDIO_CHANNEL_NONE) {
2534             // Unlock due to VibratorService will lock for this call and will
2535             // call Tracks.mute/unmute which also require thread's lock.
2536             mLock.unlock();
2537             const int intensity = AudioFlinger::onExternalVibrationStart(
2538                     track->getExternalVibration());
2539             mLock.lock();
2540             track->setHapticIntensity(static_cast<AudioMixer::haptic_intensity_t>(intensity));
2541             // Haptic playback should be enabled by vibrator service.
2542             if (track->getHapticPlaybackEnabled()) {
2543                 // Disable haptic playback of all active track to ensure only
2544                 // one track playing haptic if current track should play haptic.
2545                 for (const auto &t : mActiveTracks) {
2546                     t->setHapticPlaybackEnabled(false);
2547                 }
2548             }
2549         }
2550 
2551         track->mResetDone = false;
2552         track->mPresentationCompleteFrames = 0;
2553         mActiveTracks.add(track);
2554         sp<EffectChain> chain = getEffectChain_l(track->sessionId());
2555         if (chain != 0) {
2556             ALOGV("addTrack_l() starting track on chain %p for session %d", chain.get(),
2557                     track->sessionId());
2558             chain->incActiveTrackCnt();
2559         }
2560 
2561         track->logBeginInterval(patchSinksToString(&mPatch)); // log to MediaMetrics
2562         status = NO_ERROR;
2563     }
2564 
2565     onAddNewTrack_l();
2566     return status;
2567 }
2568 
destroyTrack_l(const sp<Track> & track)2569 bool AudioFlinger::PlaybackThread::destroyTrack_l(const sp<Track>& track)
2570 {
2571     track->terminate();
2572     // active tracks are removed by threadLoop()
2573     bool trackActive = (mActiveTracks.indexOf(track) >= 0);
2574     track->mState = TrackBase::STOPPED;
2575     if (!trackActive) {
2576         removeTrack_l(track);
2577     } else if (track->isFastTrack() || track->isOffloaded() || track->isDirect()) {
2578         track->mState = TrackBase::STOPPING_1;
2579     }
2580 
2581     return trackActive;
2582 }
2583 
removeTrack_l(const sp<Track> & track)2584 void AudioFlinger::PlaybackThread::removeTrack_l(const sp<Track>& track)
2585 {
2586     track->triggerEvents(AudioSystem::SYNC_EVENT_PRESENTATION_COMPLETE);
2587 
2588     String8 result;
2589     track->appendDump(result, false /* active */);
2590     mLocalLog.log("removeTrack_l (%p) %s", track.get(), result.string());
2591 
2592     mTracks.remove(track);
2593     {
2594         Mutex::Autolock _atCbL(mAudioTrackCbLock);
2595         mAudioTrackCallbacks.erase(track);
2596     }
2597     if (track->isFastTrack()) {
2598         int index = track->mFastIndex;
2599         ALOG_ASSERT(0 < index && index < (int)FastMixerState::sMaxFastTracks);
2600         ALOG_ASSERT(!(mFastTrackAvailMask & (1 << index)));
2601         mFastTrackAvailMask |= 1 << index;
2602         // redundant as track is about to be destroyed, for dumpsys only
2603         track->mFastIndex = -1;
2604     }
2605     sp<EffectChain> chain = getEffectChain_l(track->sessionId());
2606     if (chain != 0) {
2607         chain->decTrackCnt();
2608     }
2609 }
2610 
getParameters(const String8 & keys)2611 String8 AudioFlinger::PlaybackThread::getParameters(const String8& keys)
2612 {
2613     Mutex::Autolock _l(mLock);
2614     String8 out_s8;
2615     if (initCheck() == NO_ERROR && mOutput->stream->getParameters(keys, &out_s8) == OK) {
2616         return out_s8;
2617     }
2618     return String8();
2619 }
2620 
selectPresentation(int presentationId,int programId)2621 status_t AudioFlinger::DirectOutputThread::selectPresentation(int presentationId, int programId) {
2622     Mutex::Autolock _l(mLock);
2623     if (mOutput == nullptr || mOutput->stream == nullptr) {
2624         return NO_INIT;
2625     }
2626     return mOutput->stream->selectPresentation(presentationId, programId);
2627 }
2628 
ioConfigChanged(audio_io_config_event event,pid_t pid,audio_port_handle_t portId)2629 void AudioFlinger::PlaybackThread::ioConfigChanged(audio_io_config_event event, pid_t pid,
2630                                                    audio_port_handle_t portId) {
2631     sp<AudioIoDescriptor> desc = new AudioIoDescriptor();
2632     ALOGV("PlaybackThread::ioConfigChanged, thread %p, event %d", this, event);
2633 
2634     desc->mIoHandle = mId;
2635 
2636     switch (event) {
2637     case AUDIO_OUTPUT_OPENED:
2638     case AUDIO_OUTPUT_REGISTERED:
2639     case AUDIO_OUTPUT_CONFIG_CHANGED:
2640         desc->mPatch = mPatch;
2641         desc->mChannelMask = mChannelMask;
2642         desc->mSamplingRate = mSampleRate;
2643         desc->mFormat = mFormat;
2644         desc->mFrameCount = mNormalFrameCount; // FIXME see
2645                                              // AudioFlinger::frameCount(audio_io_handle_t)
2646         desc->mFrameCountHAL = mFrameCount;
2647         desc->mLatency = latency_l();
2648         break;
2649     case AUDIO_CLIENT_STARTED:
2650         desc->mPatch = mPatch;
2651         desc->mPortId = portId;
2652         break;
2653     case AUDIO_OUTPUT_CLOSED:
2654     default:
2655         break;
2656     }
2657     mAudioFlinger->ioConfigChanged(event, desc, pid);
2658 }
2659 
onWriteReady()2660 void AudioFlinger::PlaybackThread::onWriteReady()
2661 {
2662     mCallbackThread->resetWriteBlocked();
2663 }
2664 
onDrainReady()2665 void AudioFlinger::PlaybackThread::onDrainReady()
2666 {
2667     mCallbackThread->resetDraining();
2668 }
2669 
onError()2670 void AudioFlinger::PlaybackThread::onError()
2671 {
2672     mCallbackThread->setAsyncError();
2673 }
2674 
onCodecFormatChanged(const std::basic_string<uint8_t> & metadataBs)2675 void AudioFlinger::PlaybackThread::onCodecFormatChanged(
2676         const std::basic_string<uint8_t>& metadataBs)
2677 {
2678     std::thread([this, metadataBs]() {
2679             audio_utils::metadata::Data metadata =
2680                     audio_utils::metadata::dataFromByteString(metadataBs);
2681             if (metadata.empty()) {
2682                 ALOGW("Can not transform the buffer to audio metadata, %s, %d",
2683                       reinterpret_cast<char*>(const_cast<uint8_t*>(metadataBs.data())),
2684                       (int)metadataBs.size());
2685                 return;
2686             }
2687 
2688             audio_utils::metadata::ByteString metaDataStr =
2689                     audio_utils::metadata::byteStringFromData(metadata);
2690             std::vector metadataVec(metaDataStr.begin(), metaDataStr.end());
2691             Mutex::Autolock _l(mAudioTrackCbLock);
2692             for (const auto& callbackPair : mAudioTrackCallbacks) {
2693                 callbackPair.second->onCodecFormatChanged(metadataVec);
2694             }
2695     }).detach();
2696 }
2697 
resetWriteBlocked(uint32_t sequence)2698 void AudioFlinger::PlaybackThread::resetWriteBlocked(uint32_t sequence)
2699 {
2700     Mutex::Autolock _l(mLock);
2701     // reject out of sequence requests
2702     if ((mWriteAckSequence & 1) && (sequence == mWriteAckSequence)) {
2703         mWriteAckSequence &= ~1;
2704         mWaitWorkCV.signal();
2705     }
2706 }
2707 
resetDraining(uint32_t sequence)2708 void AudioFlinger::PlaybackThread::resetDraining(uint32_t sequence)
2709 {
2710     Mutex::Autolock _l(mLock);
2711     // reject out of sequence requests
2712     if ((mDrainSequence & 1) && (sequence == mDrainSequence)) {
2713         // Register discontinuity when HW drain is completed because that can cause
2714         // the timestamp frame position to reset to 0 for direct and offload threads.
2715         // (Out of sequence requests are ignored, since the discontinuity would be handled
2716         // elsewhere, e.g. in flush).
2717         mTimestampVerifier.discontinuity();
2718         mDrainSequence &= ~1;
2719         mWaitWorkCV.signal();
2720     }
2721 }
2722 
readOutputParameters_l()2723 void AudioFlinger::PlaybackThread::readOutputParameters_l()
2724 {
2725     // unfortunately we have no way of recovering from errors here, hence the LOG_ALWAYS_FATAL
2726     mSampleRate = mOutput->getSampleRate();
2727     mChannelMask = mOutput->getChannelMask();
2728     if (!audio_is_output_channel(mChannelMask)) {
2729         LOG_ALWAYS_FATAL("HAL channel mask %#x not valid for output", mChannelMask);
2730     }
2731     if ((mType == MIXER || mType == DUPLICATING)
2732             && !isValidPcmSinkChannelMask(mChannelMask)) {
2733         LOG_ALWAYS_FATAL("HAL channel mask %#x not supported for mixed output",
2734                 mChannelMask);
2735     }
2736     mChannelCount = audio_channel_count_from_out_mask(mChannelMask);
2737     mBalance.setChannelMask(mChannelMask);
2738 
2739     // Get actual HAL format.
2740     status_t result = mOutput->stream->getFormat(&mHALFormat);
2741     LOG_ALWAYS_FATAL_IF(result != OK, "Error when retrieving output stream format: %d", result);
2742     // Get format from the shim, which will be different than the HAL format
2743     // if playing compressed audio over HDMI passthrough.
2744     mFormat = mOutput->getFormat();
2745     if (!audio_is_valid_format(mFormat)) {
2746         LOG_ALWAYS_FATAL("HAL format %#x not valid for output", mFormat);
2747     }
2748     if ((mType == MIXER || mType == DUPLICATING)
2749             && !isValidPcmSinkFormat(mFormat)) {
2750         LOG_FATAL("HAL format %#x not supported for mixed output",
2751                 mFormat);
2752     }
2753     mFrameSize = mOutput->getFrameSize();
2754     result = mOutput->stream->getBufferSize(&mBufferSize);
2755     LOG_ALWAYS_FATAL_IF(result != OK,
2756             "Error when retrieving output stream buffer size: %d", result);
2757     mFrameCount = mBufferSize / mFrameSize;
2758     if ((mType == MIXER || mType == DUPLICATING) && (mFrameCount & 15)) {
2759         ALOGW("HAL output buffer size is %zu frames but AudioMixer requires multiples of 16 frames",
2760                 mFrameCount);
2761     }
2762 
2763     if (mOutput->flags & AUDIO_OUTPUT_FLAG_NON_BLOCKING) {
2764         if (mOutput->stream->setCallback(this) == OK) {
2765             mUseAsyncWrite = true;
2766             mCallbackThread = new AudioFlinger::AsyncCallbackThread(this);
2767         }
2768     }
2769 
2770     mHwSupportsPause = false;
2771     if (mOutput->flags & AUDIO_OUTPUT_FLAG_DIRECT) {
2772         bool supportsPause = false, supportsResume = false;
2773         if (mOutput->stream->supportsPauseAndResume(&supportsPause, &supportsResume) == OK) {
2774             if (supportsPause && supportsResume) {
2775                 mHwSupportsPause = true;
2776             } else if (supportsPause) {
2777                 ALOGW("direct output implements pause but not resume");
2778             } else if (supportsResume) {
2779                 ALOGW("direct output implements resume but not pause");
2780             }
2781         }
2782     }
2783     if (!mHwSupportsPause && mOutput->flags & AUDIO_OUTPUT_FLAG_HW_AV_SYNC) {
2784         LOG_ALWAYS_FATAL("HW_AV_SYNC requested but HAL does not implement pause and resume");
2785     }
2786 
2787     if (mType == DUPLICATING && mMixerBufferEnabled && mEffectBufferEnabled) {
2788         // For best precision, we use float instead of the associated output
2789         // device format (typically PCM 16 bit).
2790 
2791         mFormat = AUDIO_FORMAT_PCM_FLOAT;
2792         mFrameSize = mChannelCount * audio_bytes_per_sample(mFormat);
2793         mBufferSize = mFrameSize * mFrameCount;
2794 
2795         // TODO: We currently use the associated output device channel mask and sample rate.
2796         // (1) Perhaps use the ORed channel mask of all downstream MixerThreads
2797         // (if a valid mask) to avoid premature downmix.
2798         // (2) Perhaps use the maximum sample rate of all downstream MixerThreads
2799         // instead of the output device sample rate to avoid loss of high frequency information.
2800         // This may need to be updated as MixerThread/OutputTracks are added and not here.
2801     }
2802 
2803     // Calculate size of normal sink buffer relative to the HAL output buffer size
2804     double multiplier = 1.0;
2805     if (mType == MIXER && (kUseFastMixer == FastMixer_Static ||
2806             kUseFastMixer == FastMixer_Dynamic)) {
2807         size_t minNormalFrameCount = (kMinNormalSinkBufferSizeMs * mSampleRate) / 1000;
2808         size_t maxNormalFrameCount = (kMaxNormalSinkBufferSizeMs * mSampleRate) / 1000;
2809 
2810         // round up minimum and round down maximum to nearest 16 frames to satisfy AudioMixer
2811         minNormalFrameCount = (minNormalFrameCount + 15) & ~15;
2812         maxNormalFrameCount = maxNormalFrameCount & ~15;
2813         if (maxNormalFrameCount < minNormalFrameCount) {
2814             maxNormalFrameCount = minNormalFrameCount;
2815         }
2816         multiplier = (double) minNormalFrameCount / (double) mFrameCount;
2817         if (multiplier <= 1.0) {
2818             multiplier = 1.0;
2819         } else if (multiplier <= 2.0) {
2820             if (2 * mFrameCount <= maxNormalFrameCount) {
2821                 multiplier = 2.0;
2822             } else {
2823                 multiplier = (double) maxNormalFrameCount / (double) mFrameCount;
2824             }
2825         } else {
2826             multiplier = floor(multiplier);
2827         }
2828     }
2829     mNormalFrameCount = multiplier * mFrameCount;
2830     // round up to nearest 16 frames to satisfy AudioMixer
2831     if (mType == MIXER || mType == DUPLICATING) {
2832         mNormalFrameCount = (mNormalFrameCount + 15) & ~15;
2833     }
2834     ALOGI("HAL output buffer size %zu frames, normal sink buffer size %zu frames", mFrameCount,
2835             mNormalFrameCount);
2836 
2837     // Check if we want to throttle the processing to no more than 2x normal rate
2838     mThreadThrottle = property_get_bool("af.thread.throttle", true /* default_value */);
2839     mThreadThrottleTimeMs = 0;
2840     mThreadThrottleEndMs = 0;
2841     mHalfBufferMs = mNormalFrameCount * 1000 / (2 * mSampleRate);
2842 
2843     // mSinkBuffer is the sink buffer.  Size is always multiple-of-16 frames.
2844     // Originally this was int16_t[] array, need to remove legacy implications.
2845     free(mSinkBuffer);
2846     mSinkBuffer = NULL;
2847     // For sink buffer size, we use the frame size from the downstream sink to avoid problems
2848     // with non PCM formats for compressed music, e.g. AAC, and Offload threads.
2849     const size_t sinkBufferSize = mNormalFrameCount * mFrameSize;
2850     (void)posix_memalign(&mSinkBuffer, 32, sinkBufferSize);
2851 
2852     // We resize the mMixerBuffer according to the requirements of the sink buffer which
2853     // drives the output.
2854     free(mMixerBuffer);
2855     mMixerBuffer = NULL;
2856     if (mMixerBufferEnabled) {
2857         mMixerBufferFormat = AUDIO_FORMAT_PCM_FLOAT; // no longer valid: AUDIO_FORMAT_PCM_16_BIT.
2858         mMixerBufferSize = mNormalFrameCount * mChannelCount
2859                 * audio_bytes_per_sample(mMixerBufferFormat);
2860         (void)posix_memalign(&mMixerBuffer, 32, mMixerBufferSize);
2861     }
2862     free(mEffectBuffer);
2863     mEffectBuffer = NULL;
2864     if (mEffectBufferEnabled) {
2865         mEffectBufferFormat = EFFECT_BUFFER_FORMAT;
2866         mEffectBufferSize = mNormalFrameCount * mChannelCount
2867                 * audio_bytes_per_sample(mEffectBufferFormat);
2868         (void)posix_memalign(&mEffectBuffer, 32, mEffectBufferSize);
2869     }
2870 
2871     mHapticChannelMask = mChannelMask & AUDIO_CHANNEL_HAPTIC_ALL;
2872     mChannelMask &= ~mHapticChannelMask;
2873     mHapticChannelCount = audio_channel_count_from_out_mask(mHapticChannelMask);
2874     mChannelCount -= mHapticChannelCount;
2875 
2876     // force reconfiguration of effect chains and engines to take new buffer size and audio
2877     // parameters into account
2878     // Note that mLock is not held when readOutputParameters_l() is called from the constructor
2879     // but in this case nothing is done below as no audio sessions have effect yet so it doesn't
2880     // matter.
2881     // create a copy of mEffectChains as calling moveEffectChain_l() can reorder some effect chains
2882     Vector< sp<EffectChain> > effectChains = mEffectChains;
2883     for (size_t i = 0; i < effectChains.size(); i ++) {
2884         mAudioFlinger->moveEffectChain_l(effectChains[i]->sessionId(),
2885             this/* srcThread */, this/* dstThread */);
2886     }
2887 
2888     audio_output_flags_t flags = mOutput->flags;
2889     mediametrics::LogItem item(mThreadMetrics.getMetricsId()); // TODO: method in ThreadMetrics?
2890     item.set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_READPARAMETERS)
2891         .set(AMEDIAMETRICS_PROP_ENCODING, formatToString(mFormat).c_str())
2892         .set(AMEDIAMETRICS_PROP_SAMPLERATE, (int32_t)mSampleRate)
2893         .set(AMEDIAMETRICS_PROP_CHANNELMASK, (int32_t)mChannelMask)
2894         .set(AMEDIAMETRICS_PROP_CHANNELCOUNT, (int32_t)mChannelCount)
2895         .set(AMEDIAMETRICS_PROP_FRAMECOUNT, (int32_t)mNormalFrameCount)
2896         .set(AMEDIAMETRICS_PROP_FLAGS, toString(flags).c_str())
2897         .set(AMEDIAMETRICS_PROP_PREFIX_HAPTIC AMEDIAMETRICS_PROP_CHANNELMASK,
2898                 (int32_t)mHapticChannelMask)
2899         .set(AMEDIAMETRICS_PROP_PREFIX_HAPTIC AMEDIAMETRICS_PROP_CHANNELCOUNT,
2900                 (int32_t)mHapticChannelCount)
2901         .set(AMEDIAMETRICS_PROP_PREFIX_HAL    AMEDIAMETRICS_PROP_ENCODING,
2902                 formatToString(mHALFormat).c_str())
2903         .set(AMEDIAMETRICS_PROP_PREFIX_HAL    AMEDIAMETRICS_PROP_FRAMECOUNT,
2904                 (int32_t)mFrameCount) // sic - added HAL
2905         ;
2906     uint32_t latencyMs;
2907     if (mOutput->stream->getLatency(&latencyMs) == NO_ERROR) {
2908         item.set(AMEDIAMETRICS_PROP_PREFIX_HAL AMEDIAMETRICS_PROP_LATENCYMS, (double)latencyMs);
2909     }
2910     item.record();
2911 }
2912 
updateMetadata_l()2913 void AudioFlinger::PlaybackThread::updateMetadata_l()
2914 {
2915     if (mOutput == nullptr || mOutput->stream == nullptr ) {
2916         return; // That should not happen
2917     }
2918     bool hasChanged = mActiveTracks.readAndClearHasChanged();
2919     for (const sp<Track> &track : mActiveTracks) {
2920         // Do not short-circuit as all hasChanged states must be reset
2921         // as all the metadata are going to be sent
2922         hasChanged |= track->readAndClearHasChanged();
2923     }
2924     if (!hasChanged) {
2925         return; // nothing to do
2926     }
2927     StreamOutHalInterface::SourceMetadata metadata;
2928     auto backInserter = std::back_inserter(metadata.tracks);
2929     for (const sp<Track> &track : mActiveTracks) {
2930         // No track is invalid as this is called after prepareTrack_l in the same critical section
2931         track->copyMetadataTo(backInserter);
2932     }
2933     sendMetadataToBackend_l(metadata);
2934 }
2935 
sendMetadataToBackend_l(const StreamOutHalInterface::SourceMetadata & metadata)2936 void AudioFlinger::PlaybackThread::sendMetadataToBackend_l(
2937         const StreamOutHalInterface::SourceMetadata& metadata)
2938 {
2939     mOutput->stream->updateSourceMetadata(metadata);
2940 };
2941 
getRenderPosition(uint32_t * halFrames,uint32_t * dspFrames)2942 status_t AudioFlinger::PlaybackThread::getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames)
2943 {
2944     if (halFrames == NULL || dspFrames == NULL) {
2945         return BAD_VALUE;
2946     }
2947     Mutex::Autolock _l(mLock);
2948     if (initCheck() != NO_ERROR) {
2949         return INVALID_OPERATION;
2950     }
2951     int64_t framesWritten = mBytesWritten / mFrameSize;
2952     *halFrames = framesWritten;
2953 
2954     if (isSuspended()) {
2955         // return an estimation of rendered frames when the output is suspended
2956         size_t latencyFrames = (latency_l() * mSampleRate) / 1000;
2957         *dspFrames = (uint32_t)
2958                 (framesWritten >= (int64_t)latencyFrames ? framesWritten - latencyFrames : 0);
2959         return NO_ERROR;
2960     } else {
2961         status_t status;
2962         uint32_t frames;
2963         status = mOutput->getRenderPosition(&frames);
2964         *dspFrames = (size_t)frames;
2965         return status;
2966     }
2967 }
2968 
getStrategyForSession_l(audio_session_t sessionId)2969 uint32_t AudioFlinger::PlaybackThread::getStrategyForSession_l(audio_session_t sessionId)
2970 {
2971     // session AUDIO_SESSION_OUTPUT_MIX is placed in same strategy as MUSIC stream so that
2972     // it is moved to correct output by audio policy manager when A2DP is connected or disconnected
2973     if (sessionId == AUDIO_SESSION_OUTPUT_MIX) {
2974         return AudioSystem::getStrategyForStream(AUDIO_STREAM_MUSIC);
2975     }
2976     for (size_t i = 0; i < mTracks.size(); i++) {
2977         sp<Track> track = mTracks[i];
2978         if (sessionId == track->sessionId() && !track->isInvalid()) {
2979             return AudioSystem::getStrategyForStream(track->streamType());
2980         }
2981     }
2982     return AudioSystem::getStrategyForStream(AUDIO_STREAM_MUSIC);
2983 }
2984 
2985 
getOutput() const2986 AudioStreamOut* AudioFlinger::PlaybackThread::getOutput() const
2987 {
2988     Mutex::Autolock _l(mLock);
2989     return mOutput;
2990 }
2991 
clearOutput()2992 AudioStreamOut* AudioFlinger::PlaybackThread::clearOutput()
2993 {
2994     Mutex::Autolock _l(mLock);
2995     AudioStreamOut *output = mOutput;
2996     mOutput = NULL;
2997     // FIXME FastMixer might also have a raw ptr to mOutputSink;
2998     //       must push a NULL and wait for ack
2999     mOutputSink.clear();
3000     mPipeSink.clear();
3001     mNormalSink.clear();
3002     return output;
3003 }
3004 
3005 // this method must always be called either with ThreadBase mLock held or inside the thread loop
stream() const3006 sp<StreamHalInterface> AudioFlinger::PlaybackThread::stream() const
3007 {
3008     if (mOutput == NULL) {
3009         return NULL;
3010     }
3011     return mOutput->stream;
3012 }
3013 
activeSleepTimeUs() const3014 uint32_t AudioFlinger::PlaybackThread::activeSleepTimeUs() const
3015 {
3016     return (uint32_t)((uint32_t)((mNormalFrameCount * 1000) / mSampleRate) * 1000);
3017 }
3018 
setSyncEvent(const sp<SyncEvent> & event)3019 status_t AudioFlinger::PlaybackThread::setSyncEvent(const sp<SyncEvent>& event)
3020 {
3021     if (!isValidSyncEvent(event)) {
3022         return BAD_VALUE;
3023     }
3024 
3025     Mutex::Autolock _l(mLock);
3026 
3027     for (size_t i = 0; i < mTracks.size(); ++i) {
3028         sp<Track> track = mTracks[i];
3029         if (event->triggerSession() == track->sessionId()) {
3030             (void) track->setSyncEvent(event);
3031             return NO_ERROR;
3032         }
3033     }
3034 
3035     return NAME_NOT_FOUND;
3036 }
3037 
isValidSyncEvent(const sp<SyncEvent> & event) const3038 bool AudioFlinger::PlaybackThread::isValidSyncEvent(const sp<SyncEvent>& event) const
3039 {
3040     return event->type() == AudioSystem::SYNC_EVENT_PRESENTATION_COMPLETE;
3041 }
3042 
threadLoop_removeTracks(const Vector<sp<Track>> & tracksToRemove)3043 void AudioFlinger::PlaybackThread::threadLoop_removeTracks(
3044         const Vector< sp<Track> >& tracksToRemove)
3045 {
3046     // Miscellaneous track cleanup when removed from the active list,
3047     // called without Thread lock but synchronized with threadLoop processing.
3048 #ifdef ADD_BATTERY_DATA
3049     for (const auto& track : tracksToRemove) {
3050         if (track->isExternalTrack()) {
3051             // to track the speaker usage
3052             addBatteryData(IMediaPlayerService::kBatteryDataAudioFlingerStop);
3053         }
3054     }
3055 #else
3056     (void)tracksToRemove; // suppress unused warning
3057 #endif
3058 }
3059 
checkSilentMode_l()3060 void AudioFlinger::PlaybackThread::checkSilentMode_l()
3061 {
3062     if (!mMasterMute) {
3063         char value[PROPERTY_VALUE_MAX];
3064         if (mOutDeviceTypeAddrs.empty()) {
3065             ALOGD("ro.audio.silent is ignored since no output device is set");
3066             return;
3067         }
3068         if (isSingleDeviceType(outDeviceTypes(), AUDIO_DEVICE_OUT_REMOTE_SUBMIX)) {
3069             ALOGD("ro.audio.silent will be ignored for threads on AUDIO_DEVICE_OUT_REMOTE_SUBMIX");
3070             return;
3071         }
3072         if (property_get("ro.audio.silent", value, "0") > 0) {
3073             char *endptr;
3074             unsigned long ul = strtoul(value, &endptr, 0);
3075             if (*endptr == '\0' && ul != 0) {
3076                 ALOGD("Silence is golden");
3077                 // The setprop command will not allow a property to be changed after
3078                 // the first time it is set, so we don't have to worry about un-muting.
3079                 setMasterMute_l(true);
3080             }
3081         }
3082     }
3083 }
3084 
3085 // shared by MIXER and DIRECT, overridden by DUPLICATING
threadLoop_write()3086 ssize_t AudioFlinger::PlaybackThread::threadLoop_write()
3087 {
3088     LOG_HIST_TS();
3089     mInWrite = true;
3090     ssize_t bytesWritten;
3091     const size_t offset = mCurrentWriteLength - mBytesRemaining;
3092 
3093     // If an NBAIO sink is present, use it to write the normal mixer's submix
3094     if (mNormalSink != 0) {
3095 
3096         const size_t count = mBytesRemaining / mFrameSize;
3097 
3098         ATRACE_BEGIN("write");
3099         // update the setpoint when AudioFlinger::mScreenState changes
3100         uint32_t screenState = AudioFlinger::mScreenState;
3101         if (screenState != mScreenState) {
3102             mScreenState = screenState;
3103             MonoPipe *pipe = (MonoPipe *)mPipeSink.get();
3104             if (pipe != NULL) {
3105                 pipe->setAvgFrames((mScreenState & 1) ?
3106                         (pipe->maxFrames() * 7) / 8 : mNormalFrameCount * 2);
3107             }
3108         }
3109         ssize_t framesWritten = mNormalSink->write((char *)mSinkBuffer + offset, count);
3110         ATRACE_END();
3111         if (framesWritten > 0) {
3112             bytesWritten = framesWritten * mFrameSize;
3113 #ifdef TEE_SINK
3114             mTee.write((char *)mSinkBuffer + offset, framesWritten);
3115 #endif
3116         } else {
3117             bytesWritten = framesWritten;
3118         }
3119     // otherwise use the HAL / AudioStreamOut directly
3120     } else {
3121         // Direct output and offload threads
3122 
3123         if (mUseAsyncWrite) {
3124             ALOGW_IF(mWriteAckSequence & 1, "threadLoop_write(): out of sequence write request");
3125             mWriteAckSequence += 2;
3126             mWriteAckSequence |= 1;
3127             ALOG_ASSERT(mCallbackThread != 0);
3128             mCallbackThread->setWriteBlocked(mWriteAckSequence);
3129         }
3130         ATRACE_BEGIN("write");
3131         // FIXME We should have an implementation of timestamps for direct output threads.
3132         // They are used e.g for multichannel PCM playback over HDMI.
3133         bytesWritten = mOutput->write((char *)mSinkBuffer + offset, mBytesRemaining);
3134         ATRACE_END();
3135 
3136         if (mUseAsyncWrite &&
3137                 ((bytesWritten < 0) || (bytesWritten == (ssize_t)mBytesRemaining))) {
3138             // do not wait for async callback in case of error of full write
3139             mWriteAckSequence &= ~1;
3140             ALOG_ASSERT(mCallbackThread != 0);
3141             mCallbackThread->setWriteBlocked(mWriteAckSequence);
3142         }
3143     }
3144 
3145     mNumWrites++;
3146     mInWrite = false;
3147     if (mStandby) {
3148         mThreadMetrics.logBeginInterval();
3149         mStandby = false;
3150     }
3151     return bytesWritten;
3152 }
3153 
threadLoop_drain()3154 void AudioFlinger::PlaybackThread::threadLoop_drain()
3155 {
3156     bool supportsDrain = false;
3157     if (mOutput->stream->supportsDrain(&supportsDrain) == OK && supportsDrain) {
3158         ALOGV("draining %s", (mMixerStatus == MIXER_DRAIN_TRACK) ? "early" : "full");
3159         if (mUseAsyncWrite) {
3160             ALOGW_IF(mDrainSequence & 1, "threadLoop_drain(): out of sequence drain request");
3161             mDrainSequence |= 1;
3162             ALOG_ASSERT(mCallbackThread != 0);
3163             mCallbackThread->setDraining(mDrainSequence);
3164         }
3165         status_t result = mOutput->stream->drain(mMixerStatus == MIXER_DRAIN_TRACK);
3166         ALOGE_IF(result != OK, "Error when draining stream: %d", result);
3167     }
3168 }
3169 
threadLoop_exit()3170 void AudioFlinger::PlaybackThread::threadLoop_exit()
3171 {
3172     {
3173         Mutex::Autolock _l(mLock);
3174         for (size_t i = 0; i < mTracks.size(); i++) {
3175             sp<Track> track = mTracks[i];
3176             track->invalidate();
3177         }
3178         // Clear ActiveTracks to update BatteryNotifier in case active tracks remain.
3179         // After we exit there are no more track changes sent to BatteryNotifier
3180         // because that requires an active threadLoop.
3181         // TODO: should we decActiveTrackCnt() of the cleared track effect chain?
3182         mActiveTracks.clear();
3183     }
3184 }
3185 
3186 /*
3187 The derived values that are cached:
3188  - mSinkBufferSize from frame count * frame size
3189  - mActiveSleepTimeUs from activeSleepTimeUs()
3190  - mIdleSleepTimeUs from idleSleepTimeUs()
3191  - mStandbyDelayNs from mActiveSleepTimeUs (DIRECT only) or forced to at least
3192    kDefaultStandbyTimeInNsecs when connected to an A2DP device.
3193  - maxPeriod from frame count and sample rate (MIXER only)
3194 
3195 The parameters that affect these derived values are:
3196  - frame count
3197  - frame size
3198  - sample rate
3199  - device type: A2DP or not
3200  - device latency
3201  - format: PCM or not
3202  - active sleep time
3203  - idle sleep time
3204 */
3205 
cacheParameters_l()3206 void AudioFlinger::PlaybackThread::cacheParameters_l()
3207 {
3208     mSinkBufferSize = mNormalFrameCount * mFrameSize;
3209     mActiveSleepTimeUs = activeSleepTimeUs();
3210     mIdleSleepTimeUs = idleSleepTimeUs();
3211 
3212     // make sure standby delay is not too short when connected to an A2DP sink to avoid
3213     // truncating audio when going to standby.
3214     mStandbyDelayNs = AudioFlinger::mStandbyTimeInNsecs;
3215     if (!Intersection(outDeviceTypes(),  getAudioDeviceOutAllA2dpSet()).empty()) {
3216         if (mStandbyDelayNs < kDefaultStandbyTimeInNsecs) {
3217             mStandbyDelayNs = kDefaultStandbyTimeInNsecs;
3218         }
3219     }
3220 }
3221 
invalidateTracks_l(audio_stream_type_t streamType)3222 bool AudioFlinger::PlaybackThread::invalidateTracks_l(audio_stream_type_t streamType)
3223 {
3224     ALOGV("MixerThread::invalidateTracks() mixer %p, streamType %d, mTracks.size %zu",
3225             this,  streamType, mTracks.size());
3226     bool trackMatch = false;
3227     size_t size = mTracks.size();
3228     for (size_t i = 0; i < size; i++) {
3229         sp<Track> t = mTracks[i];
3230         if (t->streamType() == streamType && t->isExternalTrack()) {
3231             t->invalidate();
3232             trackMatch = true;
3233         }
3234     }
3235     return trackMatch;
3236 }
3237 
invalidateTracks(audio_stream_type_t streamType)3238 void AudioFlinger::PlaybackThread::invalidateTracks(audio_stream_type_t streamType)
3239 {
3240     Mutex::Autolock _l(mLock);
3241     invalidateTracks_l(streamType);
3242 }
3243 
addEffectChain_l(const sp<EffectChain> & chain)3244 status_t AudioFlinger::PlaybackThread::addEffectChain_l(const sp<EffectChain>& chain)
3245 {
3246     audio_session_t session = chain->sessionId();
3247     sp<EffectBufferHalInterface> halInBuffer, halOutBuffer;
3248     status_t result = mAudioFlinger->mEffectsFactoryHal->mirrorBuffer(
3249             mEffectBufferEnabled ? mEffectBuffer : mSinkBuffer,
3250             mEffectBufferEnabled ? mEffectBufferSize : mSinkBufferSize,
3251             &halInBuffer);
3252     if (result != OK) return result;
3253     halOutBuffer = halInBuffer;
3254     effect_buffer_t *buffer = reinterpret_cast<effect_buffer_t*>(halInBuffer->externalData());
3255     ALOGV("addEffectChain_l() %p on thread %p for session %d", chain.get(), this, session);
3256     if (!audio_is_global_session(session)) {
3257         // Only one effect chain can be present in direct output thread and it uses
3258         // the sink buffer as input
3259         if (mType != DIRECT) {
3260             size_t numSamples = mNormalFrameCount * (mChannelCount + mHapticChannelCount);
3261             status_t result = mAudioFlinger->mEffectsFactoryHal->allocateBuffer(
3262                     numSamples * sizeof(effect_buffer_t),
3263                     &halInBuffer);
3264             if (result != OK) return result;
3265 #ifdef FLOAT_EFFECT_CHAIN
3266             buffer = halInBuffer->audioBuffer()->f32;
3267 #else
3268             buffer = halInBuffer->audioBuffer()->s16;
3269 #endif
3270             ALOGV("addEffectChain_l() creating new input buffer %p session %d",
3271                     buffer, session);
3272         }
3273 
3274         // Attach all tracks with same session ID to this chain.
3275         for (size_t i = 0; i < mTracks.size(); ++i) {
3276             sp<Track> track = mTracks[i];
3277             if (session == track->sessionId()) {
3278                 ALOGV("addEffectChain_l() track->setMainBuffer track %p buffer %p", track.get(),
3279                         buffer);
3280                 track->setMainBuffer(buffer);
3281                 chain->incTrackCnt();
3282             }
3283         }
3284 
3285         // indicate all active tracks in the chain
3286         for (const sp<Track> &track : mActiveTracks) {
3287             if (session == track->sessionId()) {
3288                 ALOGV("addEffectChain_l() activating track %p on session %d", track.get(), session);
3289                 chain->incActiveTrackCnt();
3290             }
3291         }
3292     }
3293     chain->setThread(this);
3294     chain->setInBuffer(halInBuffer);
3295     chain->setOutBuffer(halOutBuffer);
3296     // Effect chain for session AUDIO_SESSION_DEVICE is inserted at end of effect
3297     // chains list in order to be processed last as it contains output device effects.
3298     // Effect chain for session AUDIO_SESSION_OUTPUT_STAGE is inserted just before to apply post
3299     // processing effects specific to an output stream before effects applied to all streams
3300     // routed to a given device.
3301     // Effect chain for session AUDIO_SESSION_OUTPUT_MIX is inserted before
3302     // session AUDIO_SESSION_OUTPUT_STAGE to be processed
3303     // after track specific effects and before output stage.
3304     // It is therefore mandatory that AUDIO_SESSION_OUTPUT_MIX == 0 and
3305     // that AUDIO_SESSION_OUTPUT_STAGE < AUDIO_SESSION_OUTPUT_MIX.
3306     // Effect chain for other sessions are inserted at beginning of effect
3307     // chains list to be processed before output mix effects. Relative order between other
3308     // sessions is not important.
3309     static_assert(AUDIO_SESSION_OUTPUT_MIX == 0 &&
3310             AUDIO_SESSION_OUTPUT_STAGE < AUDIO_SESSION_OUTPUT_MIX &&
3311             AUDIO_SESSION_DEVICE < AUDIO_SESSION_OUTPUT_STAGE,
3312             "audio_session_t constants misdefined");
3313     size_t size = mEffectChains.size();
3314     size_t i = 0;
3315     for (i = 0; i < size; i++) {
3316         if (mEffectChains[i]->sessionId() < session) {
3317             break;
3318         }
3319     }
3320     mEffectChains.insertAt(chain, i);
3321     checkSuspendOnAddEffectChain_l(chain);
3322 
3323     return NO_ERROR;
3324 }
3325 
removeEffectChain_l(const sp<EffectChain> & chain)3326 size_t AudioFlinger::PlaybackThread::removeEffectChain_l(const sp<EffectChain>& chain)
3327 {
3328     audio_session_t session = chain->sessionId();
3329 
3330     ALOGV("removeEffectChain_l() %p from thread %p for session %d", chain.get(), this, session);
3331 
3332     for (size_t i = 0; i < mEffectChains.size(); i++) {
3333         if (chain == mEffectChains[i]) {
3334             mEffectChains.removeAt(i);
3335             // detach all active tracks from the chain
3336             for (const sp<Track> &track : mActiveTracks) {
3337                 if (session == track->sessionId()) {
3338                     ALOGV("removeEffectChain_l(): stopping track on chain %p for session Id: %d",
3339                             chain.get(), session);
3340                     chain->decActiveTrackCnt();
3341                 }
3342             }
3343 
3344             // detach all tracks with same session ID from this chain
3345             for (size_t i = 0; i < mTracks.size(); ++i) {
3346                 sp<Track> track = mTracks[i];
3347                 if (session == track->sessionId()) {
3348                     track->setMainBuffer(reinterpret_cast<effect_buffer_t*>(mSinkBuffer));
3349                     chain->decTrackCnt();
3350                 }
3351             }
3352             break;
3353         }
3354     }
3355     return mEffectChains.size();
3356 }
3357 
attachAuxEffect(const sp<AudioFlinger::PlaybackThread::Track> & track,int EffectId)3358 status_t AudioFlinger::PlaybackThread::attachAuxEffect(
3359         const sp<AudioFlinger::PlaybackThread::Track>& track, int EffectId)
3360 {
3361     Mutex::Autolock _l(mLock);
3362     return attachAuxEffect_l(track, EffectId);
3363 }
3364 
attachAuxEffect_l(const sp<AudioFlinger::PlaybackThread::Track> & track,int EffectId)3365 status_t AudioFlinger::PlaybackThread::attachAuxEffect_l(
3366         const sp<AudioFlinger::PlaybackThread::Track>& track, int EffectId)
3367 {
3368     status_t status = NO_ERROR;
3369 
3370     if (EffectId == 0) {
3371         track->setAuxBuffer(0, NULL);
3372     } else {
3373         // Auxiliary effects are always in audio session AUDIO_SESSION_OUTPUT_MIX
3374         sp<EffectModule> effect = getEffect_l(AUDIO_SESSION_OUTPUT_MIX, EffectId);
3375         if (effect != 0) {
3376             if ((effect->desc().flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
3377                 track->setAuxBuffer(EffectId, (int32_t *)effect->inBuffer());
3378             } else {
3379                 status = INVALID_OPERATION;
3380             }
3381         } else {
3382             status = BAD_VALUE;
3383         }
3384     }
3385     return status;
3386 }
3387 
detachAuxEffect_l(int effectId)3388 void AudioFlinger::PlaybackThread::detachAuxEffect_l(int effectId)
3389 {
3390     for (size_t i = 0; i < mTracks.size(); ++i) {
3391         sp<Track> track = mTracks[i];
3392         if (track->auxEffectId() == effectId) {
3393             attachAuxEffect_l(track, 0);
3394         }
3395     }
3396 }
3397 
threadLoop()3398 bool AudioFlinger::PlaybackThread::threadLoop()
3399 {
3400     tlNBLogWriter = mNBLogWriter.get();
3401 
3402     Vector< sp<Track> > tracksToRemove;
3403 
3404     mStandbyTimeNs = systemTime();
3405     int64_t lastLoopCountWritten = -2; // never matches "previous" loop, when loopCount = 0.
3406     int64_t lastFramesWritten = -1;    // track changes in timestamp server frames written
3407 
3408     // MIXER
3409     nsecs_t lastWarning = 0;
3410 
3411     // DUPLICATING
3412     // FIXME could this be made local to while loop?
3413     writeFrames = 0;
3414 
3415     cacheParameters_l();
3416     mSleepTimeUs = mIdleSleepTimeUs;
3417 
3418     if (mType == MIXER) {
3419         sleepTimeShift = 0;
3420     }
3421 
3422     CpuStats cpuStats;
3423     const String8 myName(String8::format("thread %p type %d TID %d", this, mType, gettid()));
3424 
3425     acquireWakeLock();
3426 
3427     // mNBLogWriter logging APIs can only be called by a single thread, typically the
3428     // thread associated with this PlaybackThread.
3429     // If you want to share the mNBLogWriter with other threads (for example, binder threads)
3430     // then all such threads must agree to hold a common mutex before logging.
3431     // So if you need to log when mutex is unlocked, set logString to a non-NULL string,
3432     // and then that string will be logged at the next convenient opportunity.
3433     // See reference to logString below.
3434     const char *logString = NULL;
3435 
3436     // Estimated time for next buffer to be written to hal. This is used only on
3437     // suspended mode (for now) to help schedule the wait time until next iteration.
3438     nsecs_t timeLoopNextNs = 0;
3439 
3440     checkSilentMode_l();
3441 
3442     // DIRECT and OFFLOAD threads should reset frame count to zero on stop/flush
3443     // TODO: add confirmation checks:
3444     // 1) DIRECT threads and linear PCM format really resets to 0?
3445     // 2) Is frame count really valid if not linear pcm?
3446     // 3) Are all 64 bits of position returned, not just lowest 32 bits?
3447     if (mType == OFFLOAD || mType == DIRECT) {
3448         mTimestampVerifier.setDiscontinuityMode(mTimestampVerifier.DISCONTINUITY_MODE_ZERO);
3449     }
3450     audio_patch_handle_t lastDownstreamPatchHandle = AUDIO_PATCH_HANDLE_NONE;
3451 
3452     // loopCount is used for statistics and diagnostics.
3453     for (int64_t loopCount = 0; !exitPending(); ++loopCount)
3454     {
3455         // Log merge requests are performed during AudioFlinger binder transactions, but
3456         // that does not cover audio playback. It's requested here for that reason.
3457         mAudioFlinger->requestLogMerge();
3458 
3459         cpuStats.sample(myName);
3460 
3461         Vector< sp<EffectChain> > effectChains;
3462         audio_session_t activeHapticSessionId = AUDIO_SESSION_NONE;
3463         std::vector<sp<Track>> activeTracks;
3464 
3465         // If the device is AUDIO_DEVICE_OUT_BUS, check for downstream latency.
3466         //
3467         // Note: we access outDeviceTypes() outside of mLock.
3468         if (isMsdDevice() && outDeviceTypes().count(AUDIO_DEVICE_OUT_BUS) != 0) {
3469             // Here, we try for the AF lock, but do not block on it as the latency
3470             // is more informational.
3471             if (mAudioFlinger->mLock.tryLock() == NO_ERROR) {
3472                 std::vector<PatchPanel::SoftwarePatch> swPatches;
3473                 double latencyMs;
3474                 status_t status = INVALID_OPERATION;
3475                 audio_patch_handle_t downstreamPatchHandle = AUDIO_PATCH_HANDLE_NONE;
3476                 if (mAudioFlinger->mPatchPanel.getDownstreamSoftwarePatches(id(), &swPatches) == OK
3477                         && swPatches.size() > 0) {
3478                         status = swPatches[0].getLatencyMs_l(&latencyMs);
3479                         downstreamPatchHandle = swPatches[0].getPatchHandle();
3480                 }
3481                 if (downstreamPatchHandle != lastDownstreamPatchHandle) {
3482                     mDownstreamLatencyStatMs.reset();
3483                     lastDownstreamPatchHandle = downstreamPatchHandle;
3484                 }
3485                 if (status == OK) {
3486                     // verify downstream latency (we assume a max reasonable
3487                     // latency of 5 seconds).
3488                     const double minLatency = 0., maxLatency = 5000.;
3489                     if (latencyMs >= minLatency && latencyMs <= maxLatency) {
3490                         ALOGV("new downstream latency %lf ms", latencyMs);
3491                     } else {
3492                         ALOGD("out of range downstream latency %lf ms", latencyMs);
3493                         if (latencyMs < minLatency) latencyMs = minLatency;
3494                         else if (latencyMs > maxLatency) latencyMs = maxLatency;
3495                     }
3496                     mDownstreamLatencyStatMs.add(latencyMs);
3497                 }
3498                 mAudioFlinger->mLock.unlock();
3499             }
3500         } else {
3501             if (lastDownstreamPatchHandle != AUDIO_PATCH_HANDLE_NONE) {
3502                 // our device is no longer AUDIO_DEVICE_OUT_BUS, reset patch handle and stats.
3503                 mDownstreamLatencyStatMs.reset();
3504                 lastDownstreamPatchHandle = AUDIO_PATCH_HANDLE_NONE;
3505             }
3506         }
3507 
3508         { // scope for mLock
3509 
3510             Mutex::Autolock _l(mLock);
3511 
3512             processConfigEvents_l();
3513 
3514             // See comment at declaration of logString for why this is done under mLock
3515             if (logString != NULL) {
3516                 mNBLogWriter->logTimestamp();
3517                 mNBLogWriter->log(logString);
3518                 logString = NULL;
3519             }
3520 
3521             // Collect timestamp statistics for the Playback Thread types that support it.
3522             if (mType == MIXER
3523                     || mType == DUPLICATING
3524                     || mType == DIRECT
3525                     || mType == OFFLOAD) { // no indentation
3526             // Gather the framesReleased counters for all active tracks,
3527             // and associate with the sink frames written out.  We need
3528             // this to convert the sink timestamp to the track timestamp.
3529             bool kernelLocationUpdate = false;
3530             ExtendedTimestamp timestamp; // use private copy to fetch
3531             if (mStandby) {
3532                 mTimestampVerifier.discontinuity();
3533             } else if (threadloop_getHalTimestamp_l(&timestamp) == OK) {
3534                 mTimestampVerifier.add(timestamp.mPosition[ExtendedTimestamp::LOCATION_KERNEL],
3535                         timestamp.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL],
3536                         mSampleRate);
3537 
3538                 if (isTimestampCorrectionEnabled()) {
3539                     ALOGV("TS_BEFORE: %d %lld %lld", id(),
3540                             (long long)timestamp.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL],
3541                             (long long)timestamp.mPosition[ExtendedTimestamp::LOCATION_KERNEL]);
3542                     auto correctedTimestamp = mTimestampVerifier.getLastCorrectedTimestamp();
3543                     timestamp.mPosition[ExtendedTimestamp::LOCATION_KERNEL]
3544                             = correctedTimestamp.mFrames;
3545                     timestamp.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL]
3546                             = correctedTimestamp.mTimeNs;
3547                     ALOGV("TS_AFTER: %d %lld %lld", id(),
3548                             (long long)timestamp.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL],
3549                             (long long)timestamp.mPosition[ExtendedTimestamp::LOCATION_KERNEL]);
3550 
3551                     // Note: Downstream latency only added if timestamp correction enabled.
3552                     if (mDownstreamLatencyStatMs.getN() > 0) { // we have latency info.
3553                         const int64_t newPosition =
3554                                 timestamp.mPosition[ExtendedTimestamp::LOCATION_KERNEL]
3555                                 - int64_t(mDownstreamLatencyStatMs.getMean() * mSampleRate * 1e-3);
3556                         // prevent retrograde
3557                         timestamp.mPosition[ExtendedTimestamp::LOCATION_KERNEL] = max(
3558                                 newPosition,
3559                                 (mTimestamp.mPosition[ExtendedTimestamp::LOCATION_KERNEL]
3560                                         - mSuspendedFrames));
3561                     }
3562                 }
3563 
3564                 // We always fetch the timestamp here because often the downstream
3565                 // sink will block while writing.
3566 
3567                 // We keep track of the last valid kernel position in case we are in underrun
3568                 // and the normal mixer period is the same as the fast mixer period, or there
3569                 // is some error from the HAL.
3570                 if (mTimestamp.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL] >= 0) {
3571                     mTimestamp.mPosition[ExtendedTimestamp::LOCATION_KERNEL_LASTKERNELOK] =
3572                             mTimestamp.mPosition[ExtendedTimestamp::LOCATION_KERNEL];
3573                     mTimestamp.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL_LASTKERNELOK] =
3574                             mTimestamp.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL];
3575 
3576                     mTimestamp.mPosition[ExtendedTimestamp::LOCATION_SERVER_LASTKERNELOK] =
3577                             mTimestamp.mPosition[ExtendedTimestamp::LOCATION_SERVER];
3578                     mTimestamp.mTimeNs[ExtendedTimestamp::LOCATION_SERVER_LASTKERNELOK] =
3579                             mTimestamp.mTimeNs[ExtendedTimestamp::LOCATION_SERVER];
3580                 }
3581 
3582                 if (timestamp.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL] >= 0) {
3583                     kernelLocationUpdate = true;
3584                 } else {
3585                     ALOGVV("getTimestamp error - no valid kernel position");
3586                 }
3587 
3588                 // copy over kernel info
3589                 mTimestamp.mPosition[ExtendedTimestamp::LOCATION_KERNEL] =
3590                         timestamp.mPosition[ExtendedTimestamp::LOCATION_KERNEL]
3591                         + mSuspendedFrames; // add frames discarded when suspended
3592                 mTimestamp.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL] =
3593                         timestamp.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL];
3594             } else {
3595                 mTimestampVerifier.error();
3596             }
3597 
3598             // mFramesWritten for non-offloaded tracks are contiguous
3599             // even after standby() is called. This is useful for the track frame
3600             // to sink frame mapping.
3601             bool serverLocationUpdate = false;
3602             if (mFramesWritten != lastFramesWritten) {
3603                 serverLocationUpdate = true;
3604                 lastFramesWritten = mFramesWritten;
3605             }
3606             // Only update timestamps if there is a meaningful change.
3607             // Either the kernel timestamp must be valid or we have written something.
3608             if (kernelLocationUpdate || serverLocationUpdate) {
3609                 if (serverLocationUpdate) {
3610                     // use the time before we called the HAL write - it is a bit more accurate
3611                     // to when the server last read data than the current time here.
3612                     //
3613                     // If we haven't written anything, mLastIoBeginNs will be -1
3614                     // and we use systemTime().
3615                     mTimestamp.mPosition[ExtendedTimestamp::LOCATION_SERVER] = mFramesWritten;
3616                     mTimestamp.mTimeNs[ExtendedTimestamp::LOCATION_SERVER] = mLastIoBeginNs == -1
3617                             ? systemTime() : mLastIoBeginNs;
3618                 }
3619 
3620                 for (const sp<Track> &t : mActiveTracks) {
3621                     if (!t->isFastTrack()) {
3622                         t->updateTrackFrameInfo(
3623                                 t->mAudioTrackServerProxy->framesReleased(),
3624                                 mFramesWritten,
3625                                 mSampleRate,
3626                                 mTimestamp);
3627                     }
3628                 }
3629             }
3630 
3631             if (audio_has_proportional_frames(mFormat)) {
3632                 const double latencyMs = mTimestamp.getOutputServerLatencyMs(mSampleRate);
3633                 if (latencyMs != 0.) { // note 0. means timestamp is empty.
3634                     mLatencyMs.add(latencyMs);
3635                 }
3636             }
3637 
3638             } // if (mType ... ) { // no indentation
3639 #if 0
3640             // logFormat example
3641             if (z % 100 == 0) {
3642                 timespec ts;
3643                 clock_gettime(CLOCK_MONOTONIC, &ts);
3644                 LOGT("This is an integer %d, this is a float %f, this is my "
3645                     "pid %p %% %s %t", 42, 3.14, "and this is a timestamp", ts);
3646                 LOGT("A deceptive null-terminated string %\0");
3647             }
3648             ++z;
3649 #endif
3650             saveOutputTracks();
3651             if (mSignalPending) {
3652                 // A signal was raised while we were unlocked
3653                 mSignalPending = false;
3654             } else if (waitingAsyncCallback_l()) {
3655                 if (exitPending()) {
3656                     break;
3657                 }
3658                 bool released = false;
3659                 if (!keepWakeLock()) {
3660                     releaseWakeLock_l();
3661                     released = true;
3662                 }
3663 
3664                 const int64_t waitNs = computeWaitTimeNs_l();
3665                 ALOGV("wait async completion (wait time: %lld)", (long long)waitNs);
3666                 status_t status = mWaitWorkCV.waitRelative(mLock, waitNs);
3667                 if (status == TIMED_OUT) {
3668                     mSignalPending = true; // if timeout recheck everything
3669                 }
3670                 ALOGV("async completion/wake");
3671                 if (released) {
3672                     acquireWakeLock_l();
3673                 }
3674                 mStandbyTimeNs = systemTime() + mStandbyDelayNs;
3675                 mSleepTimeUs = 0;
3676 
3677                 continue;
3678             }
3679             if ((mActiveTracks.isEmpty() && systemTime() > mStandbyTimeNs) ||
3680                                    isSuspended()) {
3681                 // put audio hardware into standby after short delay
3682                 if (shouldStandby_l()) {
3683 
3684                     threadLoop_standby();
3685 
3686                     // This is where we go into standby
3687                     if (!mStandby) {
3688                         LOG_AUDIO_STATE();
3689                         mThreadMetrics.logEndInterval();
3690                         mStandby = true;
3691                     }
3692                     sendStatistics(false /* force */);
3693                 }
3694 
3695                 if (mActiveTracks.isEmpty() && mConfigEvents.isEmpty()) {
3696                     // we're about to wait, flush the binder command buffer
3697                     IPCThreadState::self()->flushCommands();
3698 
3699                     clearOutputTracks();
3700 
3701                     if (exitPending()) {
3702                         break;
3703                     }
3704 
3705                     releaseWakeLock_l();
3706                     // wait until we have something to do...
3707                     ALOGV("%s going to sleep", myName.string());
3708                     mWaitWorkCV.wait(mLock);
3709                     ALOGV("%s waking up", myName.string());
3710                     acquireWakeLock_l();
3711 
3712                     mMixerStatus = MIXER_IDLE;
3713                     mMixerStatusIgnoringFastTracks = MIXER_IDLE;
3714                     mBytesWritten = 0;
3715                     mBytesRemaining = 0;
3716                     checkSilentMode_l();
3717 
3718                     mStandbyTimeNs = systemTime() + mStandbyDelayNs;
3719                     mSleepTimeUs = mIdleSleepTimeUs;
3720                     if (mType == MIXER) {
3721                         sleepTimeShift = 0;
3722                     }
3723 
3724                     continue;
3725                 }
3726             }
3727             // mMixerStatusIgnoringFastTracks is also updated internally
3728             mMixerStatus = prepareTracks_l(&tracksToRemove);
3729 
3730             mActiveTracks.updatePowerState(this);
3731 
3732             updateMetadata_l();
3733 
3734             // prevent any changes in effect chain list and in each effect chain
3735             // during mixing and effect process as the audio buffers could be deleted
3736             // or modified if an effect is created or deleted
3737             lockEffectChains_l(effectChains);
3738 
3739             // Determine which session to pick up haptic data.
3740             // This must be done under the same lock as prepareTracks_l().
3741             // TODO: Write haptic data directly to sink buffer when mixing.
3742             if (mHapticChannelCount > 0 && effectChains.size() > 0) {
3743                 for (const auto& track : mActiveTracks) {
3744                     if (track->getHapticPlaybackEnabled()) {
3745                         activeHapticSessionId = track->sessionId();
3746                         break;
3747                     }
3748                 }
3749             }
3750 
3751             // Acquire a local copy of active tracks with lock (release w/o lock).
3752             //
3753             // Control methods on the track acquire the ThreadBase lock (e.g. start()
3754             // stop(), pause(), etc.), but the threadLoop is entitled to call audio
3755             // data / buffer methods on tracks from activeTracks without the ThreadBase lock.
3756             activeTracks.insert(activeTracks.end(), mActiveTracks.begin(), mActiveTracks.end());
3757         } // mLock scope ends
3758 
3759         if (mBytesRemaining == 0) {
3760             mCurrentWriteLength = 0;
3761             if (mMixerStatus == MIXER_TRACKS_READY) {
3762                 // threadLoop_mix() sets mCurrentWriteLength
3763                 threadLoop_mix();
3764             } else if ((mMixerStatus != MIXER_DRAIN_TRACK)
3765                         && (mMixerStatus != MIXER_DRAIN_ALL)) {
3766                 // threadLoop_sleepTime sets mSleepTimeUs to 0 if data
3767                 // must be written to HAL
3768                 threadLoop_sleepTime();
3769                 if (mSleepTimeUs == 0) {
3770                     mCurrentWriteLength = mSinkBufferSize;
3771 
3772                     // Tally underrun frames as we are inserting 0s here.
3773                     for (const auto& track : activeTracks) {
3774                         if (track->mFillingUpStatus == Track::FS_ACTIVE
3775                                 && !track->isStopped()
3776                                 && !track->isPaused()
3777                                 && !track->isTerminated()) {
3778                             ALOGV("%s: track(%d) %s underrun due to thread sleep of %zu frames",
3779                                     __func__, track->id(), track->getTrackStateAsString(),
3780                                     mNormalFrameCount);
3781                             track->mAudioTrackServerProxy->tallyUnderrunFrames(mNormalFrameCount);
3782                         }
3783                     }
3784                 }
3785             }
3786             // Either threadLoop_mix() or threadLoop_sleepTime() should have set
3787             // mMixerBuffer with data if mMixerBufferValid is true and mSleepTimeUs == 0.
3788             // Merge mMixerBuffer data into mEffectBuffer (if any effects are valid)
3789             // or mSinkBuffer (if there are no effects).
3790             //
3791             // This is done pre-effects computation; if effects change to
3792             // support higher precision, this needs to move.
3793             //
3794             // mMixerBufferValid is only set true by MixerThread::prepareTracks_l().
3795             // TODO use mSleepTimeUs == 0 as an additional condition.
3796             if (mMixerBufferValid) {
3797                 void *buffer = mEffectBufferValid ? mEffectBuffer : mSinkBuffer;
3798                 audio_format_t format = mEffectBufferValid ? mEffectBufferFormat : mFormat;
3799 
3800                 // mono blend occurs for mixer threads only (not direct or offloaded)
3801                 // and is handled here if we're going directly to the sink.
3802                 if (requireMonoBlend() && !mEffectBufferValid) {
3803                     mono_blend(mMixerBuffer, mMixerBufferFormat, mChannelCount, mNormalFrameCount,
3804                                true /*limit*/);
3805                 }
3806 
3807                 if (!hasFastMixer()) {
3808                     // Balance must take effect after mono conversion.
3809                     // We do it here if there is no FastMixer.
3810                     // mBalance detects zero balance within the class for speed (not needed here).
3811                     mBalance.setBalance(mMasterBalance.load());
3812                     mBalance.process((float *)mMixerBuffer, mNormalFrameCount);
3813                 }
3814 
3815                 memcpy_by_audio_format(buffer, format, mMixerBuffer, mMixerBufferFormat,
3816                         mNormalFrameCount * (mChannelCount + mHapticChannelCount));
3817 
3818                 // If we're going directly to the sink and there are haptic channels,
3819                 // we should adjust channels as the sample data is partially interleaved
3820                 // in this case.
3821                 if (!mEffectBufferValid && mHapticChannelCount > 0) {
3822                     adjust_channels_non_destructive(buffer, mChannelCount, buffer,
3823                             mChannelCount + mHapticChannelCount,
3824                             audio_bytes_per_sample(format),
3825                             audio_bytes_per_frame(mChannelCount, format) * mNormalFrameCount);
3826                 }
3827             }
3828 
3829             mBytesRemaining = mCurrentWriteLength;
3830             if (isSuspended()) {
3831                 // Simulate write to HAL when suspended (e.g. BT SCO phone call).
3832                 mSleepTimeUs = suspendSleepTimeUs(); // assumes full buffer.
3833                 const size_t framesRemaining = mBytesRemaining / mFrameSize;
3834                 mBytesWritten += mBytesRemaining;
3835                 mFramesWritten += framesRemaining;
3836                 mSuspendedFrames += framesRemaining; // to adjust kernel HAL position
3837                 mBytesRemaining = 0;
3838             }
3839 
3840             // only process effects if we're going to write
3841             if (mSleepTimeUs == 0 && mType != OFFLOAD) {
3842                 for (size_t i = 0; i < effectChains.size(); i ++) {
3843                     effectChains[i]->process_l();
3844                     // TODO: Write haptic data directly to sink buffer when mixing.
3845                     if (activeHapticSessionId != AUDIO_SESSION_NONE
3846                             && activeHapticSessionId == effectChains[i]->sessionId()) {
3847                         // Haptic data is active in this case, copy it directly from
3848                         // in buffer to out buffer.
3849                         const size_t audioBufferSize = mNormalFrameCount
3850                                 * audio_bytes_per_frame(mChannelCount, EFFECT_BUFFER_FORMAT);
3851                         memcpy_by_audio_format(
3852                                 (uint8_t*)effectChains[i]->outBuffer() + audioBufferSize,
3853                                 EFFECT_BUFFER_FORMAT,
3854                                 (const uint8_t*)effectChains[i]->inBuffer() + audioBufferSize,
3855                                 EFFECT_BUFFER_FORMAT, mNormalFrameCount * mHapticChannelCount);
3856                     }
3857                 }
3858             }
3859         }
3860         // Process effect chains for offloaded thread even if no audio
3861         // was read from audio track: process only updates effect state
3862         // and thus does have to be synchronized with audio writes but may have
3863         // to be called while waiting for async write callback
3864         if (mType == OFFLOAD) {
3865             for (size_t i = 0; i < effectChains.size(); i ++) {
3866                 effectChains[i]->process_l();
3867             }
3868         }
3869 
3870         // Only if the Effects buffer is enabled and there is data in the
3871         // Effects buffer (buffer valid), we need to
3872         // copy into the sink buffer.
3873         // TODO use mSleepTimeUs == 0 as an additional condition.
3874         if (mEffectBufferValid) {
3875             //ALOGV("writing effect buffer to sink buffer format %#x", mFormat);
3876 
3877             if (requireMonoBlend()) {
3878                 mono_blend(mEffectBuffer, mEffectBufferFormat, mChannelCount, mNormalFrameCount,
3879                            true /*limit*/);
3880             }
3881 
3882             if (!hasFastMixer()) {
3883                 // Balance must take effect after mono conversion.
3884                 // We do it here if there is no FastMixer.
3885                 // mBalance detects zero balance within the class for speed (not needed here).
3886                 mBalance.setBalance(mMasterBalance.load());
3887                 mBalance.process((float *)mEffectBuffer, mNormalFrameCount);
3888             }
3889 
3890             memcpy_by_audio_format(mSinkBuffer, mFormat, mEffectBuffer, mEffectBufferFormat,
3891                     mNormalFrameCount * (mChannelCount + mHapticChannelCount));
3892             // The sample data is partially interleaved when haptic channels exist,
3893             // we need to adjust channels here.
3894             if (mHapticChannelCount > 0) {
3895                 adjust_channels_non_destructive(mSinkBuffer, mChannelCount, mSinkBuffer,
3896                         mChannelCount + mHapticChannelCount,
3897                         audio_bytes_per_sample(mFormat),
3898                         audio_bytes_per_frame(mChannelCount, mFormat) * mNormalFrameCount);
3899             }
3900         }
3901 
3902         // enable changes in effect chain
3903         unlockEffectChains(effectChains);
3904 
3905         if (!waitingAsyncCallback()) {
3906             // mSleepTimeUs == 0 means we must write to audio hardware
3907             if (mSleepTimeUs == 0) {
3908                 ssize_t ret = 0;
3909                 // writePeriodNs is updated >= 0 when ret > 0.
3910                 int64_t writePeriodNs = -1;
3911                 if (mBytesRemaining) {
3912                     // FIXME rewrite to reduce number of system calls
3913                     const int64_t lastIoBeginNs = systemTime();
3914                     ret = threadLoop_write();
3915                     const int64_t lastIoEndNs = systemTime();
3916                     if (ret < 0) {
3917                         mBytesRemaining = 0;
3918                     } else if (ret > 0) {
3919                         mBytesWritten += ret;
3920                         mBytesRemaining -= ret;
3921                         const int64_t frames = ret / mFrameSize;
3922                         mFramesWritten += frames;
3923 
3924                         writePeriodNs = lastIoEndNs - mLastIoEndNs;
3925                         // process information relating to write time.
3926                         if (audio_has_proportional_frames(mFormat)) {
3927                             // we are in a continuous mixing cycle
3928                             if (mMixerStatus == MIXER_TRACKS_READY &&
3929                                     loopCount == lastLoopCountWritten + 1) {
3930 
3931                                 const double jitterMs =
3932                                         TimestampVerifier<int64_t, int64_t>::computeJitterMs(
3933                                                 {frames, writePeriodNs},
3934                                                 {0, 0} /* lastTimestamp */, mSampleRate);
3935                                 const double processMs =
3936                                        (lastIoBeginNs - mLastIoEndNs) * 1e-6;
3937 
3938                                 Mutex::Autolock _l(mLock);
3939                                 mIoJitterMs.add(jitterMs);
3940                                 mProcessTimeMs.add(processMs);
3941                             }
3942 
3943                             // write blocked detection
3944                             const int64_t deltaWriteNs = lastIoEndNs - lastIoBeginNs;
3945                             if (mType == MIXER && deltaWriteNs > maxPeriod) {
3946                                 mNumDelayedWrites++;
3947                                 if ((lastIoEndNs - lastWarning) > kWarningThrottleNs) {
3948                                     ATRACE_NAME("underrun");
3949                                     ALOGW("write blocked for %lld msecs, "
3950                                             "%d delayed writes, thread %d",
3951                                             (long long)deltaWriteNs / NANOS_PER_MILLISECOND,
3952                                             mNumDelayedWrites, mId);
3953                                     lastWarning = lastIoEndNs;
3954                                 }
3955                             }
3956                         }
3957                         // update timing info.
3958                         mLastIoBeginNs = lastIoBeginNs;
3959                         mLastIoEndNs = lastIoEndNs;
3960                         lastLoopCountWritten = loopCount;
3961                     }
3962                 } else if ((mMixerStatus == MIXER_DRAIN_TRACK) ||
3963                         (mMixerStatus == MIXER_DRAIN_ALL)) {
3964                     threadLoop_drain();
3965                 }
3966                 if (mType == MIXER && !mStandby) {
3967 
3968                     if (mThreadThrottle
3969                             && mMixerStatus == MIXER_TRACKS_READY // we are mixing (active tracks)
3970                             && writePeriodNs > 0) {               // we have write period info
3971                         // Limit MixerThread data processing to no more than twice the
3972                         // expected processing rate.
3973                         //
3974                         // This helps prevent underruns with NuPlayer and other applications
3975                         // which may set up buffers that are close to the minimum size, or use
3976                         // deep buffers, and rely on a double-buffering sleep strategy to fill.
3977                         //
3978                         // The throttle smooths out sudden large data drains from the device,
3979                         // e.g. when it comes out of standby, which often causes problems with
3980                         // (1) mixer threads without a fast mixer (which has its own warm-up)
3981                         // (2) minimum buffer sized tracks (even if the track is full,
3982                         //     the app won't fill fast enough to handle the sudden draw).
3983                         //
3984                         // Total time spent in last processing cycle equals time spent in
3985                         // 1. threadLoop_write, as well as time spent in
3986                         // 2. threadLoop_mix (significant for heavy mixing, especially
3987                         //                    on low tier processors)
3988 
3989                         // it's OK if deltaMs is an overestimate.
3990 
3991                         const int32_t deltaMs = writePeriodNs / NANOS_PER_MILLISECOND;
3992 
3993                         const int32_t throttleMs = (int32_t)mHalfBufferMs - deltaMs;
3994                         if ((signed)mHalfBufferMs >= throttleMs && throttleMs > 0) {
3995                             mThreadMetrics.logThrottleMs((double)throttleMs);
3996 
3997                             usleep(throttleMs * 1000);
3998                             // notify of throttle start on verbose log
3999                             ALOGV_IF(mThreadThrottleEndMs == mThreadThrottleTimeMs,
4000                                     "mixer(%p) throttle begin:"
4001                                     " ret(%zd) deltaMs(%d) requires sleep %d ms",
4002                                     this, ret, deltaMs, throttleMs);
4003                             mThreadThrottleTimeMs += throttleMs;
4004                             // Throttle must be attributed to the previous mixer loop's write time
4005                             // to allow back-to-back throttling.
4006                             // This also ensures proper timing statistics.
4007                             mLastIoEndNs = systemTime();  // we fetch the write end time again.
4008                         } else {
4009                             uint32_t diff = mThreadThrottleTimeMs - mThreadThrottleEndMs;
4010                             if (diff > 0) {
4011                                 // notify of throttle end on debug log
4012                                 // but prevent spamming for bluetooth
4013                                 ALOGD_IF(!isSingleDeviceType(
4014                                                  outDeviceTypes(), audio_is_a2dp_out_device) &&
4015                                          !isSingleDeviceType(
4016                                                  outDeviceTypes(), audio_is_hearing_aid_out_device),
4017                                         "mixer(%p) throttle end: throttle time(%u)", this, diff);
4018                                 mThreadThrottleEndMs = mThreadThrottleTimeMs;
4019                             }
4020                         }
4021                     }
4022                 }
4023 
4024             } else {
4025                 ATRACE_BEGIN("sleep");
4026                 Mutex::Autolock _l(mLock);
4027                 // suspended requires accurate metering of sleep time.
4028                 if (isSuspended()) {
4029                     // advance by expected sleepTime
4030                     timeLoopNextNs += microseconds((nsecs_t)mSleepTimeUs);
4031                     const nsecs_t nowNs = systemTime();
4032 
4033                     // compute expected next time vs current time.
4034                     // (negative deltas are treated as delays).
4035                     nsecs_t deltaNs = timeLoopNextNs - nowNs;
4036                     if (deltaNs < -kMaxNextBufferDelayNs) {
4037                         // Delays longer than the max allowed trigger a reset.
4038                         ALOGV("DelayNs: %lld, resetting timeLoopNextNs", (long long) deltaNs);
4039                         deltaNs = microseconds((nsecs_t)mSleepTimeUs);
4040                         timeLoopNextNs = nowNs + deltaNs;
4041                     } else if (deltaNs < 0) {
4042                         // Delays within the max delay allowed: zero the delta/sleepTime
4043                         // to help the system catch up in the next iteration(s)
4044                         ALOGV("DelayNs: %lld, catching-up", (long long) deltaNs);
4045                         deltaNs = 0;
4046                     }
4047                     // update sleep time (which is >= 0)
4048                     mSleepTimeUs = deltaNs / 1000;
4049                 }
4050                 if (!mSignalPending && mConfigEvents.isEmpty() && !exitPending()) {
4051                     mWaitWorkCV.waitRelative(mLock, microseconds((nsecs_t)mSleepTimeUs));
4052                 }
4053                 ATRACE_END();
4054             }
4055         }
4056 
4057         // Finally let go of removed track(s), without the lock held
4058         // since we can't guarantee the destructors won't acquire that
4059         // same lock.  This will also mutate and push a new fast mixer state.
4060         threadLoop_removeTracks(tracksToRemove);
4061         tracksToRemove.clear();
4062 
4063         // FIXME I don't understand the need for this here;
4064         //       it was in the original code but maybe the
4065         //       assignment in saveOutputTracks() makes this unnecessary?
4066         clearOutputTracks();
4067 
4068         // Effect chains will be actually deleted here if they were removed from
4069         // mEffectChains list during mixing or effects processing
4070         effectChains.clear();
4071 
4072         // FIXME Note that the above .clear() is no longer necessary since effectChains
4073         // is now local to this block, but will keep it for now (at least until merge done).
4074     }
4075 
4076     threadLoop_exit();
4077 
4078     if (!mStandby) {
4079         threadLoop_standby();
4080         mStandby = true;
4081     }
4082 
4083     releaseWakeLock();
4084 
4085     ALOGV("Thread %p type %d exiting", this, mType);
4086     return false;
4087 }
4088 
4089 // removeTracks_l() must be called with ThreadBase::mLock held
removeTracks_l(const Vector<sp<Track>> & tracksToRemove)4090 void AudioFlinger::PlaybackThread::removeTracks_l(const Vector< sp<Track> >& tracksToRemove)
4091 {
4092     for (const auto& track : tracksToRemove) {
4093         mActiveTracks.remove(track);
4094         ALOGV("%s(%d): removing track on session %d", __func__, track->id(), track->sessionId());
4095         sp<EffectChain> chain = getEffectChain_l(track->sessionId());
4096         if (chain != 0) {
4097             ALOGV("%s(%d): stopping track on chain %p for session Id: %d",
4098                     __func__, track->id(), chain.get(), track->sessionId());
4099             chain->decActiveTrackCnt();
4100         }
4101         // If an external client track, inform APM we're no longer active, and remove if needed.
4102         // We do this under lock so that the state is consistent if the Track is destroyed.
4103         if (track->isExternalTrack()) {
4104             AudioSystem::stopOutput(track->portId());
4105             if (track->isTerminated()) {
4106                 AudioSystem::releaseOutput(track->portId());
4107             }
4108         }
4109         if (track->isTerminated()) {
4110             // remove from our tracks vector
4111             removeTrack_l(track);
4112         }
4113         if ((track->channelMask() & AUDIO_CHANNEL_HAPTIC_ALL) != AUDIO_CHANNEL_NONE
4114                 && mHapticChannelCount > 0) {
4115             mLock.unlock();
4116             // Unlock due to VibratorService will lock for this call and will
4117             // call Tracks.mute/unmute which also require thread's lock.
4118             AudioFlinger::onExternalVibrationStop(track->getExternalVibration());
4119             mLock.lock();
4120         }
4121     }
4122 }
4123 
getTimestamp_l(AudioTimestamp & timestamp)4124 status_t AudioFlinger::PlaybackThread::getTimestamp_l(AudioTimestamp& timestamp)
4125 {
4126     if (mNormalSink != 0) {
4127         ExtendedTimestamp ets;
4128         status_t status = mNormalSink->getTimestamp(ets);
4129         if (status == NO_ERROR) {
4130             status = ets.getBestTimestamp(&timestamp);
4131         }
4132         return status;
4133     }
4134     if ((mType == OFFLOAD || mType == DIRECT) && mOutput != NULL) {
4135         uint64_t position64;
4136         if (mOutput->getPresentationPosition(&position64, &timestamp.mTime) == OK) {
4137             timestamp.mPosition = (uint32_t)position64;
4138             if (mDownstreamLatencyStatMs.getN() > 0) {
4139                 const uint32_t positionOffset =
4140                     (uint32_t)(mDownstreamLatencyStatMs.getMean() * mSampleRate * 1e-3);
4141                 if (positionOffset > timestamp.mPosition) {
4142                     timestamp.mPosition = 0;
4143                 } else {
4144                     timestamp.mPosition -= positionOffset;
4145                 }
4146             }
4147             return NO_ERROR;
4148         }
4149     }
4150     return INVALID_OPERATION;
4151 }
4152 
4153 // For dedicated VoIP outputs, let the HAL apply the stream volume. Track volume is
4154 // still applied by the mixer.
4155 // All tracks attached to a mixer with flag VOIP_RX are tied to the same
4156 // stream type STREAM_VOICE_CALL so this will only change the HAL volume once even
4157 // if more than one track are active
handleVoipVolume_l(float * volume)4158 status_t AudioFlinger::PlaybackThread::handleVoipVolume_l(float *volume)
4159 {
4160     status_t result = NO_ERROR;
4161     if ((mOutput->flags & AUDIO_OUTPUT_FLAG_VOIP_RX) != 0) {
4162         if (*volume != mLeftVolFloat) {
4163             result = mOutput->stream->setVolume(*volume, *volume);
4164             ALOGE_IF(result != OK,
4165                      "Error when setting output stream volume: %d", result);
4166             if (result == NO_ERROR) {
4167                 mLeftVolFloat = *volume;
4168             }
4169         }
4170         // if stream volume was successfully sent to the HAL, mLeftVolFloat == v here and we
4171         // remove stream volume contribution from software volume.
4172         if (mLeftVolFloat == *volume) {
4173             *volume = 1.0f;
4174         }
4175     }
4176     return result;
4177 }
4178 
createAudioPatch_l(const struct audio_patch * patch,audio_patch_handle_t * handle)4179 status_t AudioFlinger::MixerThread::createAudioPatch_l(const struct audio_patch *patch,
4180                                                           audio_patch_handle_t *handle)
4181 {
4182     status_t status;
4183     if (property_get_bool("af.patch_park", false /* default_value */)) {
4184         // Park FastMixer to avoid potential DOS issues with writing to the HAL
4185         // or if HAL does not properly lock against access.
4186         AutoPark<FastMixer> park(mFastMixer);
4187         status = PlaybackThread::createAudioPatch_l(patch, handle);
4188     } else {
4189         status = PlaybackThread::createAudioPatch_l(patch, handle);
4190     }
4191     return status;
4192 }
4193 
createAudioPatch_l(const struct audio_patch * patch,audio_patch_handle_t * handle)4194 status_t AudioFlinger::PlaybackThread::createAudioPatch_l(const struct audio_patch *patch,
4195                                                           audio_patch_handle_t *handle)
4196 {
4197     status_t status = NO_ERROR;
4198 
4199     // store new device and send to effects
4200     audio_devices_t type = AUDIO_DEVICE_NONE;
4201     AudioDeviceTypeAddrVector deviceTypeAddrs;
4202     for (unsigned int i = 0; i < patch->num_sinks; i++) {
4203         LOG_ALWAYS_FATAL_IF(popcount(patch->sinks[i].ext.device.type) > 1
4204                             && !mOutput->audioHwDev->supportsAudioPatches(),
4205                             "Enumerated device type(%#x) must not be used "
4206                             "as it does not support audio patches",
4207                             patch->sinks[i].ext.device.type);
4208         type |= patch->sinks[i].ext.device.type;
4209         deviceTypeAddrs.push_back(AudioDeviceTypeAddr(patch->sinks[i].ext.device.type,
4210                 patch->sinks[i].ext.device.address));
4211     }
4212 
4213     audio_port_handle_t sinkPortId = patch->sinks[0].id;
4214 #ifdef ADD_BATTERY_DATA
4215     // when changing the audio output device, call addBatteryData to notify
4216     // the change
4217     if (outDeviceTypes() != deviceTypes) {
4218         uint32_t params = 0;
4219         // check whether speaker is on
4220         if (deviceTypes.count(AUDIO_DEVICE_OUT_SPEAKER) > 0) {
4221             params |= IMediaPlayerService::kBatteryDataSpeakerOn;
4222         }
4223 
4224         // check if any other device (except speaker) is on
4225         if (!isSingleDeviceType(deviceTypes, AUDIO_DEVICE_OUT_SPEAKER)) {
4226             params |= IMediaPlayerService::kBatteryDataOtherAudioDeviceOn;
4227         }
4228 
4229         if (params != 0) {
4230             addBatteryData(params);
4231         }
4232     }
4233 #endif
4234 
4235     for (size_t i = 0; i < mEffectChains.size(); i++) {
4236         mEffectChains[i]->setDevices_l(deviceTypeAddrs);
4237     }
4238 
4239     // mPatch.num_sinks is not set when the thread is created so that
4240     // the first patch creation triggers an ioConfigChanged callback
4241     bool configChanged = (mPatch.num_sinks == 0) ||
4242                          (mPatch.sinks[0].id != sinkPortId);
4243     mPatch = *patch;
4244     mOutDeviceTypeAddrs = deviceTypeAddrs;
4245     checkSilentMode_l();
4246 
4247     if (mOutput->audioHwDev->supportsAudioPatches()) {
4248         sp<DeviceHalInterface> hwDevice = mOutput->audioHwDev->hwDevice();
4249         status = hwDevice->createAudioPatch(patch->num_sources,
4250                                             patch->sources,
4251                                             patch->num_sinks,
4252                                             patch->sinks,
4253                                             handle);
4254     } else {
4255         char *address;
4256         if (strcmp(patch->sinks[0].ext.device.address, "") != 0) {
4257             //FIXME: we only support address on first sink with HAL version < 3.0
4258             address = audio_device_address_to_parameter(
4259                                                         patch->sinks[0].ext.device.type,
4260                                                         patch->sinks[0].ext.device.address);
4261         } else {
4262             address = (char *)calloc(1, 1);
4263         }
4264         AudioParameter param = AudioParameter(String8(address));
4265         free(address);
4266         param.addInt(String8(AudioParameter::keyRouting), (int)type);
4267         status = mOutput->stream->setParameters(param.toString());
4268         *handle = AUDIO_PATCH_HANDLE_NONE;
4269     }
4270     const std::string patchSinksAsString = patchSinksToString(patch);
4271 
4272     mThreadMetrics.logEndInterval();
4273     mThreadMetrics.logCreatePatch(/* inDevices */ {}, patchSinksAsString);
4274     mThreadMetrics.logBeginInterval();
4275     // also dispatch to active AudioTracks for MediaMetrics
4276     for (const auto &track : mActiveTracks) {
4277         track->logEndInterval();
4278         track->logBeginInterval(patchSinksAsString);
4279     }
4280 
4281     if (configChanged) {
4282         sendIoConfigEvent_l(AUDIO_OUTPUT_CONFIG_CHANGED);
4283     }
4284     return status;
4285 }
4286 
releaseAudioPatch_l(const audio_patch_handle_t handle)4287 status_t AudioFlinger::MixerThread::releaseAudioPatch_l(const audio_patch_handle_t handle)
4288 {
4289     status_t status;
4290     if (property_get_bool("af.patch_park", false /* default_value */)) {
4291         // Park FastMixer to avoid potential DOS issues with writing to the HAL
4292         // or if HAL does not properly lock against access.
4293         AutoPark<FastMixer> park(mFastMixer);
4294         status = PlaybackThread::releaseAudioPatch_l(handle);
4295     } else {
4296         status = PlaybackThread::releaseAudioPatch_l(handle);
4297     }
4298     return status;
4299 }
4300 
releaseAudioPatch_l(const audio_patch_handle_t handle)4301 status_t AudioFlinger::PlaybackThread::releaseAudioPatch_l(const audio_patch_handle_t handle)
4302 {
4303     status_t status = NO_ERROR;
4304 
4305     mPatch = audio_patch{};
4306     mOutDeviceTypeAddrs.clear();
4307 
4308     if (mOutput->audioHwDev->supportsAudioPatches()) {
4309         sp<DeviceHalInterface> hwDevice = mOutput->audioHwDev->hwDevice();
4310         status = hwDevice->releaseAudioPatch(handle);
4311     } else {
4312         AudioParameter param;
4313         param.addInt(String8(AudioParameter::keyRouting), 0);
4314         status = mOutput->stream->setParameters(param.toString());
4315     }
4316     return status;
4317 }
4318 
addPatchTrack(const sp<PatchTrack> & track)4319 void AudioFlinger::PlaybackThread::addPatchTrack(const sp<PatchTrack>& track)
4320 {
4321     Mutex::Autolock _l(mLock);
4322     mTracks.add(track);
4323 }
4324 
deletePatchTrack(const sp<PatchTrack> & track)4325 void AudioFlinger::PlaybackThread::deletePatchTrack(const sp<PatchTrack>& track)
4326 {
4327     Mutex::Autolock _l(mLock);
4328     destroyTrack_l(track);
4329 }
4330 
toAudioPortConfig(struct audio_port_config * config)4331 void AudioFlinger::PlaybackThread::toAudioPortConfig(struct audio_port_config *config)
4332 {
4333     ThreadBase::toAudioPortConfig(config);
4334     config->role = AUDIO_PORT_ROLE_SOURCE;
4335     config->ext.mix.hw_module = mOutput->audioHwDev->handle();
4336     config->ext.mix.usecase.stream = AUDIO_STREAM_DEFAULT;
4337     if (mOutput && mOutput->flags != AUDIO_OUTPUT_FLAG_NONE) {
4338         config->config_mask |= AUDIO_PORT_CONFIG_FLAGS;
4339         config->flags.output = mOutput->flags;
4340     }
4341 }
4342 
4343 // ----------------------------------------------------------------------------
4344 
MixerThread(const sp<AudioFlinger> & audioFlinger,AudioStreamOut * output,audio_io_handle_t id,bool systemReady,type_t type)4345 AudioFlinger::MixerThread::MixerThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output,
4346         audio_io_handle_t id, bool systemReady, type_t type)
4347     :   PlaybackThread(audioFlinger, output, id, type, systemReady),
4348         // mAudioMixer below
4349         // mFastMixer below
4350         mFastMixerFutex(0),
4351         mMasterMono(false)
4352         // mOutputSink below
4353         // mPipeSink below
4354         // mNormalSink below
4355 {
4356     setMasterBalance(audioFlinger->getMasterBalance_l());
4357     ALOGV("MixerThread() id=%d type=%d", id, type);
4358     ALOGV("mSampleRate=%u, mChannelMask=%#x, mChannelCount=%u, mFormat=%#x, mFrameSize=%zu, "
4359             "mFrameCount=%zu, mNormalFrameCount=%zu",
4360             mSampleRate, mChannelMask, mChannelCount, mFormat, mFrameSize, mFrameCount,
4361             mNormalFrameCount);
4362     mAudioMixer = new AudioMixer(mNormalFrameCount, mSampleRate);
4363 
4364     if (type == DUPLICATING) {
4365         // The Duplicating thread uses the AudioMixer and delivers data to OutputTracks
4366         // (downstream MixerThreads) in DuplicatingThread::threadLoop_write().
4367         // Do not create or use mFastMixer, mOutputSink, mPipeSink, or mNormalSink.
4368         return;
4369     }
4370     // create an NBAIO sink for the HAL output stream, and negotiate
4371     mOutputSink = new AudioStreamOutSink(output->stream);
4372     size_t numCounterOffers = 0;
4373     const NBAIO_Format offers[1] = {Format_from_SR_C(
4374             mSampleRate, mChannelCount + mHapticChannelCount, mFormat)};
4375 #if !LOG_NDEBUG
4376     ssize_t index =
4377 #else
4378     (void)
4379 #endif
4380             mOutputSink->negotiate(offers, 1, NULL, numCounterOffers);
4381     ALOG_ASSERT(index == 0);
4382 
4383     // initialize fast mixer depending on configuration
4384     bool initFastMixer;
4385     switch (kUseFastMixer) {
4386     case FastMixer_Never:
4387         initFastMixer = false;
4388         break;
4389     case FastMixer_Always:
4390         initFastMixer = true;
4391         break;
4392     case FastMixer_Static:
4393     case FastMixer_Dynamic:
4394         // FastMixer was designed to operate with a HAL that pulls at a regular rate,
4395         // where the period is less than an experimentally determined threshold that can be
4396         // scheduled reliably with CFS. However, the BT A2DP HAL is
4397         // bursty (does not pull at a regular rate) and so cannot operate with FastMixer.
4398         initFastMixer = mFrameCount < mNormalFrameCount
4399                 && Intersection(outDeviceTypes(), getAudioDeviceOutAllA2dpSet()).empty();
4400         break;
4401     }
4402     ALOGW_IF(initFastMixer == false && mFrameCount < mNormalFrameCount,
4403             "FastMixer is preferred for this sink as frameCount %zu is less than threshold %zu",
4404             mFrameCount, mNormalFrameCount);
4405     if (initFastMixer) {
4406         audio_format_t fastMixerFormat;
4407         if (mMixerBufferEnabled && mEffectBufferEnabled) {
4408             fastMixerFormat = AUDIO_FORMAT_PCM_FLOAT;
4409         } else {
4410             fastMixerFormat = AUDIO_FORMAT_PCM_16_BIT;
4411         }
4412         if (mFormat != fastMixerFormat) {
4413             // change our Sink format to accept our intermediate precision
4414             mFormat = fastMixerFormat;
4415             free(mSinkBuffer);
4416             mFrameSize = audio_bytes_per_frame(mChannelCount + mHapticChannelCount, mFormat);
4417             const size_t sinkBufferSize = mNormalFrameCount * mFrameSize;
4418             (void)posix_memalign(&mSinkBuffer, 32, sinkBufferSize);
4419         }
4420 
4421         // create a MonoPipe to connect our submix to FastMixer
4422         NBAIO_Format format = mOutputSink->format();
4423 
4424         // adjust format to match that of the Fast Mixer
4425         ALOGV("format changed from %#x to %#x", format.mFormat, fastMixerFormat);
4426         format.mFormat = fastMixerFormat;
4427         format.mFrameSize = audio_bytes_per_sample(format.mFormat) * format.mChannelCount;
4428 
4429         // This pipe depth compensates for scheduling latency of the normal mixer thread.
4430         // When it wakes up after a maximum latency, it runs a few cycles quickly before
4431         // finally blocking.  Note the pipe implementation rounds up the request to a power of 2.
4432         MonoPipe *monoPipe = new MonoPipe(mNormalFrameCount * 4, format, true /*writeCanBlock*/);
4433         const NBAIO_Format offers[1] = {format};
4434         size_t numCounterOffers = 0;
4435 #if !LOG_NDEBUG
4436         ssize_t index =
4437 #else
4438         (void)
4439 #endif
4440                 monoPipe->negotiate(offers, 1, NULL, numCounterOffers);
4441         ALOG_ASSERT(index == 0);
4442         monoPipe->setAvgFrames((mScreenState & 1) ?
4443                 (monoPipe->maxFrames() * 7) / 8 : mNormalFrameCount * 2);
4444         mPipeSink = monoPipe;
4445 
4446         // create fast mixer and configure it initially with just one fast track for our submix
4447         mFastMixer = new FastMixer(mId);
4448         FastMixerStateQueue *sq = mFastMixer->sq();
4449 #ifdef STATE_QUEUE_DUMP
4450         sq->setObserverDump(&mStateQueueObserverDump);
4451         sq->setMutatorDump(&mStateQueueMutatorDump);
4452 #endif
4453         FastMixerState *state = sq->begin();
4454         FastTrack *fastTrack = &state->mFastTracks[0];
4455         // wrap the source side of the MonoPipe to make it an AudioBufferProvider
4456         fastTrack->mBufferProvider = new SourceAudioBufferProvider(new MonoPipeReader(monoPipe));
4457         fastTrack->mVolumeProvider = NULL;
4458         fastTrack->mChannelMask = mChannelMask | mHapticChannelMask; // mPipeSink channel mask for
4459                                                                      // audio to FastMixer
4460         fastTrack->mFormat = mFormat; // mPipeSink format for audio to FastMixer
4461         fastTrack->mHapticPlaybackEnabled = mHapticChannelMask != AUDIO_CHANNEL_NONE;
4462         fastTrack->mHapticIntensity = AudioMixer::HAPTIC_SCALE_NONE;
4463         fastTrack->mGeneration++;
4464         state->mFastTracksGen++;
4465         state->mTrackMask = 1;
4466         // fast mixer will use the HAL output sink
4467         state->mOutputSink = mOutputSink.get();
4468         state->mOutputSinkGen++;
4469         state->mFrameCount = mFrameCount;
4470         // specify sink channel mask when haptic channel mask present as it can not
4471         // be calculated directly from channel count
4472         state->mSinkChannelMask = mHapticChannelMask == AUDIO_CHANNEL_NONE
4473                 ? AUDIO_CHANNEL_NONE : mChannelMask | mHapticChannelMask;
4474         state->mCommand = FastMixerState::COLD_IDLE;
4475         // already done in constructor initialization list
4476         //mFastMixerFutex = 0;
4477         state->mColdFutexAddr = &mFastMixerFutex;
4478         state->mColdGen++;
4479         state->mDumpState = &mFastMixerDumpState;
4480         mFastMixerNBLogWriter = audioFlinger->newWriter_l(kFastMixerLogSize, "FastMixer");
4481         state->mNBLogWriter = mFastMixerNBLogWriter.get();
4482         sq->end();
4483         sq->push(FastMixerStateQueue::BLOCK_UNTIL_PUSHED);
4484 
4485         NBLog::thread_info_t info;
4486         info.id = mId;
4487         info.type = NBLog::FASTMIXER;
4488         mFastMixerNBLogWriter->log<NBLog::EVENT_THREAD_INFO>(info);
4489 
4490         // start the fast mixer
4491         mFastMixer->run("FastMixer", PRIORITY_URGENT_AUDIO);
4492         pid_t tid = mFastMixer->getTid();
4493         sendPrioConfigEvent(getpid(), tid, kPriorityFastMixer, false /*forApp*/);
4494         stream()->setHalThreadPriority(kPriorityFastMixer);
4495 
4496 #ifdef AUDIO_WATCHDOG
4497         // create and start the watchdog
4498         mAudioWatchdog = new AudioWatchdog();
4499         mAudioWatchdog->setDump(&mAudioWatchdogDump);
4500         mAudioWatchdog->run("AudioWatchdog", PRIORITY_URGENT_AUDIO);
4501         tid = mAudioWatchdog->getTid();
4502         sendPrioConfigEvent(getpid(), tid, kPriorityFastMixer, false /*forApp*/);
4503 #endif
4504     } else {
4505 #ifdef TEE_SINK
4506         // Only use the MixerThread tee if there is no FastMixer.
4507         mTee.set(mOutputSink->format(), NBAIO_Tee::TEE_FLAG_OUTPUT_THREAD);
4508         mTee.setId(std::string("_") + std::to_string(mId) + "_M");
4509 #endif
4510     }
4511 
4512     switch (kUseFastMixer) {
4513     case FastMixer_Never:
4514     case FastMixer_Dynamic:
4515         mNormalSink = mOutputSink;
4516         break;
4517     case FastMixer_Always:
4518         mNormalSink = mPipeSink;
4519         break;
4520     case FastMixer_Static:
4521         mNormalSink = initFastMixer ? mPipeSink : mOutputSink;
4522         break;
4523     }
4524 }
4525 
~MixerThread()4526 AudioFlinger::MixerThread::~MixerThread()
4527 {
4528     if (mFastMixer != 0) {
4529         FastMixerStateQueue *sq = mFastMixer->sq();
4530         FastMixerState *state = sq->begin();
4531         if (state->mCommand == FastMixerState::COLD_IDLE) {
4532             int32_t old = android_atomic_inc(&mFastMixerFutex);
4533             if (old == -1) {
4534                 (void) syscall(__NR_futex, &mFastMixerFutex, FUTEX_WAKE_PRIVATE, 1);
4535             }
4536         }
4537         state->mCommand = FastMixerState::EXIT;
4538         sq->end();
4539         sq->push(FastMixerStateQueue::BLOCK_UNTIL_PUSHED);
4540         mFastMixer->join();
4541         // Though the fast mixer thread has exited, it's state queue is still valid.
4542         // We'll use that extract the final state which contains one remaining fast track
4543         // corresponding to our sub-mix.
4544         state = sq->begin();
4545         ALOG_ASSERT(state->mTrackMask == 1);
4546         FastTrack *fastTrack = &state->mFastTracks[0];
4547         ALOG_ASSERT(fastTrack->mBufferProvider != NULL);
4548         delete fastTrack->mBufferProvider;
4549         sq->end(false /*didModify*/);
4550         mFastMixer.clear();
4551 #ifdef AUDIO_WATCHDOG
4552         if (mAudioWatchdog != 0) {
4553             mAudioWatchdog->requestExit();
4554             mAudioWatchdog->requestExitAndWait();
4555             mAudioWatchdog.clear();
4556         }
4557 #endif
4558     }
4559     mAudioFlinger->unregisterWriter(mFastMixerNBLogWriter);
4560     delete mAudioMixer;
4561 }
4562 
4563 
correctLatency_l(uint32_t latency) const4564 uint32_t AudioFlinger::MixerThread::correctLatency_l(uint32_t latency) const
4565 {
4566     if (mFastMixer != 0) {
4567         MonoPipe *pipe = (MonoPipe *)mPipeSink.get();
4568         latency += (pipe->getAvgFrames() * 1000) / mSampleRate;
4569     }
4570     return latency;
4571 }
4572 
threadLoop_write()4573 ssize_t AudioFlinger::MixerThread::threadLoop_write()
4574 {
4575     // FIXME we should only do one push per cycle; confirm this is true
4576     // Start the fast mixer if it's not already running
4577     if (mFastMixer != 0) {
4578         FastMixerStateQueue *sq = mFastMixer->sq();
4579         FastMixerState *state = sq->begin();
4580         if (state->mCommand != FastMixerState::MIX_WRITE &&
4581                 (kUseFastMixer != FastMixer_Dynamic || state->mTrackMask > 1)) {
4582             if (state->mCommand == FastMixerState::COLD_IDLE) {
4583 
4584                 // FIXME workaround for first HAL write being CPU bound on some devices
4585                 ATRACE_BEGIN("write");
4586                 mOutput->write((char *)mSinkBuffer, 0);
4587                 ATRACE_END();
4588 
4589                 int32_t old = android_atomic_inc(&mFastMixerFutex);
4590                 if (old == -1) {
4591                     (void) syscall(__NR_futex, &mFastMixerFutex, FUTEX_WAKE_PRIVATE, 1);
4592                 }
4593 #ifdef AUDIO_WATCHDOG
4594                 if (mAudioWatchdog != 0) {
4595                     mAudioWatchdog->resume();
4596                 }
4597 #endif
4598             }
4599             state->mCommand = FastMixerState::MIX_WRITE;
4600 #ifdef FAST_THREAD_STATISTICS
4601             mFastMixerDumpState.increaseSamplingN(mAudioFlinger->isLowRamDevice() ?
4602                 FastThreadDumpState::kSamplingNforLowRamDevice : FastThreadDumpState::kSamplingN);
4603 #endif
4604             sq->end();
4605             sq->push(FastMixerStateQueue::BLOCK_UNTIL_PUSHED);
4606             if (kUseFastMixer == FastMixer_Dynamic) {
4607                 mNormalSink = mPipeSink;
4608             }
4609         } else {
4610             sq->end(false /*didModify*/);
4611         }
4612     }
4613     return PlaybackThread::threadLoop_write();
4614 }
4615 
threadLoop_standby()4616 void AudioFlinger::MixerThread::threadLoop_standby()
4617 {
4618     // Idle the fast mixer if it's currently running
4619     if (mFastMixer != 0) {
4620         FastMixerStateQueue *sq = mFastMixer->sq();
4621         FastMixerState *state = sq->begin();
4622         if (!(state->mCommand & FastMixerState::IDLE)) {
4623             // Report any frames trapped in the Monopipe
4624             MonoPipe *monoPipe = (MonoPipe *)mPipeSink.get();
4625             const long long pipeFrames = monoPipe->maxFrames() - monoPipe->availableToWrite();
4626             mLocalLog.log("threadLoop_standby: framesWritten:%lld  suspendedFrames:%lld  "
4627                     "monoPipeWritten:%lld  monoPipeLeft:%lld",
4628                     (long long)mFramesWritten, (long long)mSuspendedFrames,
4629                     (long long)mPipeSink->framesWritten(), pipeFrames);
4630             mLocalLog.log("threadLoop_standby: %s", mTimestamp.toString().c_str());
4631 
4632             state->mCommand = FastMixerState::COLD_IDLE;
4633             state->mColdFutexAddr = &mFastMixerFutex;
4634             state->mColdGen++;
4635             mFastMixerFutex = 0;
4636             sq->end();
4637             // BLOCK_UNTIL_PUSHED would be insufficient, as we need it to stop doing I/O now
4638             sq->push(FastMixerStateQueue::BLOCK_UNTIL_ACKED);
4639             if (kUseFastMixer == FastMixer_Dynamic) {
4640                 mNormalSink = mOutputSink;
4641             }
4642 #ifdef AUDIO_WATCHDOG
4643             if (mAudioWatchdog != 0) {
4644                 mAudioWatchdog->pause();
4645             }
4646 #endif
4647         } else {
4648             sq->end(false /*didModify*/);
4649         }
4650     }
4651     PlaybackThread::threadLoop_standby();
4652 }
4653 
waitingAsyncCallback_l()4654 bool AudioFlinger::PlaybackThread::waitingAsyncCallback_l()
4655 {
4656     return false;
4657 }
4658 
shouldStandby_l()4659 bool AudioFlinger::PlaybackThread::shouldStandby_l()
4660 {
4661     return !mStandby;
4662 }
4663 
waitingAsyncCallback()4664 bool AudioFlinger::PlaybackThread::waitingAsyncCallback()
4665 {
4666     Mutex::Autolock _l(mLock);
4667     return waitingAsyncCallback_l();
4668 }
4669 
4670 // shared by MIXER and DIRECT, overridden by DUPLICATING
threadLoop_standby()4671 void AudioFlinger::PlaybackThread::threadLoop_standby()
4672 {
4673     ALOGV("Audio hardware entering standby, mixer %p, suspend count %d", this, mSuspended);
4674     mOutput->standby();
4675     if (mUseAsyncWrite != 0) {
4676         // discard any pending drain or write ack by incrementing sequence
4677         mWriteAckSequence = (mWriteAckSequence + 2) & ~1;
4678         mDrainSequence = (mDrainSequence + 2) & ~1;
4679         ALOG_ASSERT(mCallbackThread != 0);
4680         mCallbackThread->setWriteBlocked(mWriteAckSequence);
4681         mCallbackThread->setDraining(mDrainSequence);
4682     }
4683     mHwPaused = false;
4684 }
4685 
onAddNewTrack_l()4686 void AudioFlinger::PlaybackThread::onAddNewTrack_l()
4687 {
4688     ALOGV("signal playback thread");
4689     broadcast_l();
4690 }
4691 
onAsyncError()4692 void AudioFlinger::PlaybackThread::onAsyncError()
4693 {
4694     for (int i = AUDIO_STREAM_SYSTEM; i < (int)AUDIO_STREAM_CNT; i++) {
4695         invalidateTracks((audio_stream_type_t)i);
4696     }
4697 }
4698 
threadLoop_mix()4699 void AudioFlinger::MixerThread::threadLoop_mix()
4700 {
4701     // mix buffers...
4702     mAudioMixer->process();
4703     mCurrentWriteLength = mSinkBufferSize;
4704     // increase sleep time progressively when application underrun condition clears.
4705     // Only increase sleep time if the mixer is ready for two consecutive times to avoid
4706     // that a steady state of alternating ready/not ready conditions keeps the sleep time
4707     // such that we would underrun the audio HAL.
4708     if ((mSleepTimeUs == 0) && (sleepTimeShift > 0)) {
4709         sleepTimeShift--;
4710     }
4711     mSleepTimeUs = 0;
4712     mStandbyTimeNs = systemTime() + mStandbyDelayNs;
4713     //TODO: delay standby when effects have a tail
4714 
4715 }
4716 
threadLoop_sleepTime()4717 void AudioFlinger::MixerThread::threadLoop_sleepTime()
4718 {
4719     // If no tracks are ready, sleep once for the duration of an output
4720     // buffer size, then write 0s to the output
4721     if (mSleepTimeUs == 0) {
4722         if (mMixerStatus == MIXER_TRACKS_ENABLED) {
4723             if (mPipeSink.get() != nullptr && mPipeSink == mNormalSink) {
4724                 // Using the Monopipe availableToWrite, we estimate the
4725                 // sleep time to retry for more data (before we underrun).
4726                 MonoPipe *monoPipe = static_cast<MonoPipe *>(mPipeSink.get());
4727                 const ssize_t availableToWrite = mPipeSink->availableToWrite();
4728                 const size_t pipeFrames = monoPipe->maxFrames();
4729                 const size_t framesLeft = pipeFrames - max(availableToWrite, 0);
4730                 // HAL_framecount <= framesDelay ~ framesLeft / 2 <= Normal_Mixer_framecount
4731                 const size_t framesDelay = std::min(
4732                         mNormalFrameCount, max(framesLeft / 2, mFrameCount));
4733                 ALOGV("pipeFrames:%zu framesLeft:%zu framesDelay:%zu",
4734                         pipeFrames, framesLeft, framesDelay);
4735                 mSleepTimeUs = framesDelay * MICROS_PER_SECOND / mSampleRate;
4736             } else {
4737                 mSleepTimeUs = mActiveSleepTimeUs >> sleepTimeShift;
4738                 if (mSleepTimeUs < kMinThreadSleepTimeUs) {
4739                     mSleepTimeUs = kMinThreadSleepTimeUs;
4740                 }
4741                 // reduce sleep time in case of consecutive application underruns to avoid
4742                 // starving the audio HAL. As activeSleepTimeUs() is larger than a buffer
4743                 // duration we would end up writing less data than needed by the audio HAL if
4744                 // the condition persists.
4745                 if (sleepTimeShift < kMaxThreadSleepTimeShift) {
4746                     sleepTimeShift++;
4747                 }
4748             }
4749         } else {
4750             mSleepTimeUs = mIdleSleepTimeUs;
4751         }
4752     } else if (mBytesWritten != 0 || (mMixerStatus == MIXER_TRACKS_ENABLED)) {
4753         // clear out mMixerBuffer or mSinkBuffer, to ensure buffers are cleared
4754         // before effects processing or output.
4755         if (mMixerBufferValid) {
4756             memset(mMixerBuffer, 0, mMixerBufferSize);
4757         } else {
4758             memset(mSinkBuffer, 0, mSinkBufferSize);
4759         }
4760         mSleepTimeUs = 0;
4761         ALOGV_IF(mBytesWritten == 0 && (mMixerStatus == MIXER_TRACKS_ENABLED),
4762                 "anticipated start");
4763     }
4764     // TODO add standby time extension fct of effect tail
4765 }
4766 
4767 // prepareTracks_l() must be called with ThreadBase::mLock held
prepareTracks_l(Vector<sp<Track>> * tracksToRemove)4768 AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTracks_l(
4769         Vector< sp<Track> > *tracksToRemove)
4770 {
4771     // clean up deleted track ids in AudioMixer before allocating new tracks
4772     (void)mTracks.processDeletedTrackIds([this](int trackId) {
4773         // for each trackId, destroy it in the AudioMixer
4774         if (mAudioMixer->exists(trackId)) {
4775             mAudioMixer->destroy(trackId);
4776         }
4777     });
4778     mTracks.clearDeletedTrackIds();
4779 
4780     mixer_state mixerStatus = MIXER_IDLE;
4781     // find out which tracks need to be processed
4782     size_t count = mActiveTracks.size();
4783     size_t mixedTracks = 0;
4784     size_t tracksWithEffect = 0;
4785     // counts only _active_ fast tracks
4786     size_t fastTracks = 0;
4787     uint32_t resetMask = 0; // bit mask of fast tracks that need to be reset
4788 
4789     float masterVolume = mMasterVolume;
4790     bool masterMute = mMasterMute;
4791 
4792     if (masterMute) {
4793         masterVolume = 0;
4794     }
4795     // Delegate master volume control to effect in output mix effect chain if needed
4796     sp<EffectChain> chain = getEffectChain_l(AUDIO_SESSION_OUTPUT_MIX);
4797     if (chain != 0) {
4798         uint32_t v = (uint32_t)(masterVolume * (1 << 24));
4799         chain->setVolume_l(&v, &v);
4800         masterVolume = (float)((v + (1 << 23)) >> 24);
4801         chain.clear();
4802     }
4803 
4804     // prepare a new state to push
4805     FastMixerStateQueue *sq = NULL;
4806     FastMixerState *state = NULL;
4807     bool didModify = false;
4808     FastMixerStateQueue::block_t block = FastMixerStateQueue::BLOCK_UNTIL_PUSHED;
4809     bool coldIdle = false;
4810     if (mFastMixer != 0) {
4811         sq = mFastMixer->sq();
4812         state = sq->begin();
4813         coldIdle = state->mCommand == FastMixerState::COLD_IDLE;
4814     }
4815 
4816     mMixerBufferValid = false;  // mMixerBuffer has no valid data until appropriate tracks found.
4817     mEffectBufferValid = false; // mEffectBuffer has no valid data until tracks found.
4818 
4819     // DeferredOperations handles statistics after setting mixerStatus.
4820     class DeferredOperations {
4821     public:
4822         DeferredOperations(mixer_state *mixerStatus, ThreadMetrics *threadMetrics)
4823             : mMixerStatus(mixerStatus)
4824             , mThreadMetrics(threadMetrics) {}
4825 
4826         // when leaving scope, tally frames properly.
4827         ~DeferredOperations() {
4828             // Tally underrun frames only if we are actually mixing (MIXER_TRACKS_READY)
4829             // because that is when the underrun occurs.
4830             // We do not distinguish between FastTracks and NormalTracks here.
4831             size_t maxUnderrunFrames = 0;
4832             if (*mMixerStatus == MIXER_TRACKS_READY && mUnderrunFrames.size() > 0) {
4833                 for (const auto &underrun : mUnderrunFrames) {
4834                     underrun.first->tallyUnderrunFrames(underrun.second);
4835                     maxUnderrunFrames = max(underrun.second, maxUnderrunFrames);
4836                 }
4837             }
4838             // send the max underrun frames for this mixer period
4839             mThreadMetrics->logUnderrunFrames(maxUnderrunFrames);
4840         }
4841 
4842         // tallyUnderrunFrames() is called to update the track counters
4843         // with the number of underrun frames for a particular mixer period.
4844         // We defer tallying until we know the final mixer status.
4845         void tallyUnderrunFrames(sp<Track> track, size_t underrunFrames) {
4846             mUnderrunFrames.emplace_back(track, underrunFrames);
4847         }
4848 
4849     private:
4850         const mixer_state * const mMixerStatus;
4851         ThreadMetrics * const mThreadMetrics;
4852         std::vector<std::pair<sp<Track>, size_t>> mUnderrunFrames;
4853     } deferredOperations(&mixerStatus, &mThreadMetrics);
4854     // implicit nested scope for variable capture
4855 
4856     bool noFastHapticTrack = true;
4857     for (size_t i=0 ; i<count ; i++) {
4858         const sp<Track> t = mActiveTracks[i];
4859 
4860         // this const just means the local variable doesn't change
4861         Track* const track = t.get();
4862 
4863         // process fast tracks
4864         if (track->isFastTrack()) {
4865             LOG_ALWAYS_FATAL_IF(mFastMixer.get() == nullptr,
4866                     "%s(%d): FastTrack(%d) present without FastMixer",
4867                      __func__, id(), track->id());
4868 
4869             if (track->getHapticPlaybackEnabled()) {
4870                 noFastHapticTrack = false;
4871             }
4872 
4873             // It's theoretically possible (though unlikely) for a fast track to be created
4874             // and then removed within the same normal mix cycle.  This is not a problem, as
4875             // the track never becomes active so it's fast mixer slot is never touched.
4876             // The converse, of removing an (active) track and then creating a new track
4877             // at the identical fast mixer slot within the same normal mix cycle,
4878             // is impossible because the slot isn't marked available until the end of each cycle.
4879             int j = track->mFastIndex;
4880             ALOG_ASSERT(0 < j && j < (int)FastMixerState::sMaxFastTracks);
4881             ALOG_ASSERT(!(mFastTrackAvailMask & (1 << j)));
4882             FastTrack *fastTrack = &state->mFastTracks[j];
4883 
4884             // Determine whether the track is currently in underrun condition,
4885             // and whether it had a recent underrun.
4886             FastTrackDump *ftDump = &mFastMixerDumpState.mTracks[j];
4887             FastTrackUnderruns underruns = ftDump->mUnderruns;
4888             uint32_t recentFull = (underruns.mBitFields.mFull -
4889                     track->mObservedUnderruns.mBitFields.mFull) & UNDERRUN_MASK;
4890             uint32_t recentPartial = (underruns.mBitFields.mPartial -
4891                     track->mObservedUnderruns.mBitFields.mPartial) & UNDERRUN_MASK;
4892             uint32_t recentEmpty = (underruns.mBitFields.mEmpty -
4893                     track->mObservedUnderruns.mBitFields.mEmpty) & UNDERRUN_MASK;
4894             uint32_t recentUnderruns = recentPartial + recentEmpty;
4895             track->mObservedUnderruns = underruns;
4896             // don't count underruns that occur while stopping or pausing
4897             // or stopped which can occur when flush() is called while active
4898             size_t underrunFrames = 0;
4899             if (!(track->isStopping() || track->isPausing() || track->isStopped()) &&
4900                     recentUnderruns > 0) {
4901                 // FIXME fast mixer will pull & mix partial buffers, but we count as a full underrun
4902                 underrunFrames = recentUnderruns * mFrameCount;
4903             }
4904             // Immediately account for FastTrack underruns.
4905             track->mAudioTrackServerProxy->tallyUnderrunFrames(underrunFrames);
4906 
4907             // This is similar to the state machine for normal tracks,
4908             // with a few modifications for fast tracks.
4909             bool isActive = true;
4910             switch (track->mState) {
4911             case TrackBase::STOPPING_1:
4912                 // track stays active in STOPPING_1 state until first underrun
4913                 if (recentUnderruns > 0 || track->isTerminated()) {
4914                     track->mState = TrackBase::STOPPING_2;
4915                 }
4916                 break;
4917             case TrackBase::PAUSING:
4918                 // ramp down is not yet implemented
4919                 track->setPaused();
4920                 break;
4921             case TrackBase::RESUMING:
4922                 // ramp up is not yet implemented
4923                 track->mState = TrackBase::ACTIVE;
4924                 break;
4925             case TrackBase::ACTIVE:
4926                 if (recentFull > 0 || recentPartial > 0) {
4927                     // track has provided at least some frames recently: reset retry count
4928                     track->mRetryCount = kMaxTrackRetries;
4929                 }
4930                 if (recentUnderruns == 0) {
4931                     // no recent underruns: stay active
4932                     break;
4933                 }
4934                 // there has recently been an underrun of some kind
4935                 if (track->sharedBuffer() == 0) {
4936                     // were any of the recent underruns "empty" (no frames available)?
4937                     if (recentEmpty == 0) {
4938                         // no, then ignore the partial underruns as they are allowed indefinitely
4939                         break;
4940                     }
4941                     // there has recently been an "empty" underrun: decrement the retry counter
4942                     if (--(track->mRetryCount) > 0) {
4943                         break;
4944                     }
4945                     // indicate to client process that the track was disabled because of underrun;
4946                     // it will then automatically call start() when data is available
4947                     track->disable();
4948                     // remove from active list, but state remains ACTIVE [confusing but true]
4949                     isActive = false;
4950                     break;
4951                 }
4952                 FALLTHROUGH_INTENDED;
4953             case TrackBase::STOPPING_2:
4954             case TrackBase::PAUSED:
4955             case TrackBase::STOPPED:
4956             case TrackBase::FLUSHED:   // flush() while active
4957                 // Check for presentation complete if track is inactive
4958                 // We have consumed all the buffers of this track.
4959                 // This would be incomplete if we auto-paused on underrun
4960                 {
4961                     uint32_t latency = 0;
4962                     status_t result = mOutput->stream->getLatency(&latency);
4963                     ALOGE_IF(result != OK,
4964                             "Error when retrieving output stream latency: %d", result);
4965                     size_t audioHALFrames = (latency * mSampleRate) / 1000;
4966                     int64_t framesWritten = mBytesWritten / mFrameSize;
4967                     if (!(mStandby || track->presentationComplete(framesWritten, audioHALFrames))) {
4968                         // track stays in active list until presentation is complete
4969                         break;
4970                     }
4971                 }
4972                 if (track->isStopping_2()) {
4973                     track->mState = TrackBase::STOPPED;
4974                 }
4975                 if (track->isStopped()) {
4976                     // Can't reset directly, as fast mixer is still polling this track
4977                     //   track->reset();
4978                     // So instead mark this track as needing to be reset after push with ack
4979                     resetMask |= 1 << i;
4980                 }
4981                 isActive = false;
4982                 break;
4983             case TrackBase::IDLE:
4984             default:
4985                 LOG_ALWAYS_FATAL("unexpected track state %d", track->mState);
4986             }
4987 
4988             if (isActive) {
4989                 // was it previously inactive?
4990                 if (!(state->mTrackMask & (1 << j))) {
4991                     ExtendedAudioBufferProvider *eabp = track;
4992                     VolumeProvider *vp = track;
4993                     fastTrack->mBufferProvider = eabp;
4994                     fastTrack->mVolumeProvider = vp;
4995                     fastTrack->mChannelMask = track->mChannelMask;
4996                     fastTrack->mFormat = track->mFormat;
4997                     fastTrack->mHapticPlaybackEnabled = track->getHapticPlaybackEnabled();
4998                     fastTrack->mHapticIntensity = track->getHapticIntensity();
4999                     fastTrack->mGeneration++;
5000                     state->mTrackMask |= 1 << j;
5001                     didModify = true;
5002                     // no acknowledgement required for newly active tracks
5003                 }
5004                 sp<AudioTrackServerProxy> proxy = track->mAudioTrackServerProxy;
5005                 float volume;
5006                 if (track->isPlaybackRestricted() || mStreamTypes[track->streamType()].mute) {
5007                     volume = 0.f;
5008                 } else {
5009                     volume = masterVolume * mStreamTypes[track->streamType()].volume;
5010                 }
5011 
5012                 handleVoipVolume_l(&volume);
5013 
5014                 // cache the combined master volume and stream type volume for fast mixer; this
5015                 // lacks any synchronization or barrier so VolumeProvider may read a stale value
5016                 const float vh = track->getVolumeHandler()->getVolume(
5017                     proxy->framesReleased()).first;
5018                 volume *= vh;
5019                 track->mCachedVolume = volume;
5020                 gain_minifloat_packed_t vlr = proxy->getVolumeLR();
5021                 float vlf = volume * float_from_gain(gain_minifloat_unpack_left(vlr));
5022                 float vrf = volume * float_from_gain(gain_minifloat_unpack_right(vlr));
5023 
5024                 track->setFinalVolume((vlf + vrf) / 2.f);
5025                 ++fastTracks;
5026             } else {
5027                 // was it previously active?
5028                 if (state->mTrackMask & (1 << j)) {
5029                     fastTrack->mBufferProvider = NULL;
5030                     fastTrack->mGeneration++;
5031                     state->mTrackMask &= ~(1 << j);
5032                     didModify = true;
5033                     // If any fast tracks were removed, we must wait for acknowledgement
5034                     // because we're about to decrement the last sp<> on those tracks.
5035                     block = FastMixerStateQueue::BLOCK_UNTIL_ACKED;
5036                 } else {
5037                     // ALOGW rather than LOG_ALWAYS_FATAL because it seems there are cases where an
5038                     // AudioTrack may start (which may not be with a start() but with a write()
5039                     // after underrun) and immediately paused or released.  In that case the
5040                     // FastTrack state hasn't had time to update.
5041                     // TODO Remove the ALOGW when this theory is confirmed.
5042                     ALOGW("fast track %d should have been active; "
5043                             "mState=%d, mTrackMask=%#x, recentUnderruns=%u, isShared=%d",
5044                             j, track->mState, state->mTrackMask, recentUnderruns,
5045                             track->sharedBuffer() != 0);
5046                     // Since the FastMixer state already has the track inactive, do nothing here.
5047                 }
5048                 tracksToRemove->add(track);
5049                 // Avoids a misleading display in dumpsys
5050                 track->mObservedUnderruns.mBitFields.mMostRecent = UNDERRUN_FULL;
5051             }
5052             if (fastTrack->mHapticPlaybackEnabled != track->getHapticPlaybackEnabled()) {
5053                 fastTrack->mHapticPlaybackEnabled = track->getHapticPlaybackEnabled();
5054                 didModify = true;
5055             }
5056             continue;
5057         }
5058 
5059         {   // local variable scope to avoid goto warning
5060 
5061         audio_track_cblk_t* cblk = track->cblk();
5062 
5063         // The first time a track is added we wait
5064         // for all its buffers to be filled before processing it
5065         const int trackId = track->id();
5066 
5067         // if an active track doesn't exist in the AudioMixer, create it.
5068         // use the trackId as the AudioMixer name.
5069         if (!mAudioMixer->exists(trackId)) {
5070             status_t status = mAudioMixer->create(
5071                     trackId,
5072                     track->mChannelMask,
5073                     track->mFormat,
5074                     track->mSessionId);
5075             if (status != OK) {
5076                 ALOGW("%s(): AudioMixer cannot create track(%d)"
5077                         " mask %#x, format %#x, sessionId %d",
5078                         __func__, trackId,
5079                         track->mChannelMask, track->mFormat, track->mSessionId);
5080                 tracksToRemove->add(track);
5081                 track->invalidate(); // consider it dead.
5082                 continue;
5083             }
5084         }
5085 
5086         // make sure that we have enough frames to mix one full buffer.
5087         // enforce this condition only once to enable draining the buffer in case the client
5088         // app does not call stop() and relies on underrun to stop:
5089         // hence the test on (mMixerStatus == MIXER_TRACKS_READY) meaning the track was mixed
5090         // during last round
5091         size_t desiredFrames;
5092         const uint32_t sampleRate = track->mAudioTrackServerProxy->getSampleRate();
5093         AudioPlaybackRate playbackRate = track->mAudioTrackServerProxy->getPlaybackRate();
5094 
5095         desiredFrames = sourceFramesNeededWithTimestretch(
5096                 sampleRate, mNormalFrameCount, mSampleRate, playbackRate.mSpeed);
5097         // TODO: ONLY USED FOR LEGACY RESAMPLERS, remove when they are removed.
5098         // add frames already consumed but not yet released by the resampler
5099         // because mAudioTrackServerProxy->framesReady() will include these frames
5100         desiredFrames += mAudioMixer->getUnreleasedFrames(trackId);
5101 
5102         uint32_t minFrames = 1;
5103         if ((track->sharedBuffer() == 0) && !track->isStopped() && !track->isPausing() &&
5104                 (mMixerStatusIgnoringFastTracks == MIXER_TRACKS_READY)) {
5105             minFrames = desiredFrames;
5106         }
5107 
5108         size_t framesReady = track->framesReady();
5109         if (ATRACE_ENABLED()) {
5110             // I wish we had formatted trace names
5111             std::string traceName("nRdy");
5112             traceName += std::to_string(trackId);
5113             ATRACE_INT(traceName.c_str(), framesReady);
5114         }
5115         if ((framesReady >= minFrames) && track->isReady() &&
5116                 !track->isPaused() && !track->isTerminated())
5117         {
5118             ALOGVV("track(%d) s=%08x [OK] on thread %p", trackId, cblk->mServer, this);
5119 
5120             mixedTracks++;
5121 
5122             // track->mainBuffer() != mSinkBuffer or mMixerBuffer means
5123             // there is an effect chain connected to the track
5124             chain.clear();
5125             if (track->mainBuffer() != mSinkBuffer &&
5126                     track->mainBuffer() != mMixerBuffer) {
5127                 if (mEffectBufferEnabled) {
5128                     mEffectBufferValid = true; // Later can set directly.
5129                 }
5130                 chain = getEffectChain_l(track->sessionId());
5131                 // Delegate volume control to effect in track effect chain if needed
5132                 if (chain != 0) {
5133                     tracksWithEffect++;
5134                 } else {
5135                     ALOGW("prepareTracks_l(): track(%d) attached to effect but no chain found on "
5136                             "session %d",
5137                             trackId, track->sessionId());
5138                 }
5139             }
5140 
5141 
5142             int param = AudioMixer::VOLUME;
5143             if (track->mFillingUpStatus == Track::FS_FILLED) {
5144                 // no ramp for the first volume setting
5145                 track->mFillingUpStatus = Track::FS_ACTIVE;
5146                 if (track->mState == TrackBase::RESUMING) {
5147                     track->mState = TrackBase::ACTIVE;
5148                     // If a new track is paused immediately after start, do not ramp on resume.
5149                     if (cblk->mServer != 0) {
5150                         param = AudioMixer::RAMP_VOLUME;
5151                     }
5152                 }
5153                 mAudioMixer->setParameter(trackId, AudioMixer::RESAMPLE, AudioMixer::RESET, NULL);
5154                 mLeftVolFloat = -1.0;
5155             // FIXME should not make a decision based on mServer
5156             } else if (cblk->mServer != 0) {
5157                 // If the track is stopped before the first frame was mixed,
5158                 // do not apply ramp
5159                 param = AudioMixer::RAMP_VOLUME;
5160             }
5161 
5162             // compute volume for this track
5163             uint32_t vl, vr;       // in U8.24 integer format
5164             float vlf, vrf, vaf;   // in [0.0, 1.0] float format
5165             // read original volumes with volume control
5166             float v = masterVolume * mStreamTypes[track->streamType()].volume;
5167             // Always fetch volumeshaper volume to ensure state is updated.
5168             const sp<AudioTrackServerProxy> proxy = track->mAudioTrackServerProxy;
5169             const float vh = track->getVolumeHandler()->getVolume(
5170                     track->mAudioTrackServerProxy->framesReleased()).first;
5171 
5172             if (mStreamTypes[track->streamType()].mute || track->isPlaybackRestricted()) {
5173                 v = 0;
5174             }
5175 
5176             handleVoipVolume_l(&v);
5177 
5178             if (track->isPausing()) {
5179                 vl = vr = 0;
5180                 vlf = vrf = vaf = 0.;
5181                 track->setPaused();
5182             } else {
5183                 gain_minifloat_packed_t vlr = proxy->getVolumeLR();
5184                 vlf = float_from_gain(gain_minifloat_unpack_left(vlr));
5185                 vrf = float_from_gain(gain_minifloat_unpack_right(vlr));
5186                 // track volumes come from shared memory, so can't be trusted and must be clamped
5187                 if (vlf > GAIN_FLOAT_UNITY) {
5188                     ALOGV("Track left volume out of range: %.3g", vlf);
5189                     vlf = GAIN_FLOAT_UNITY;
5190                 }
5191                 if (vrf > GAIN_FLOAT_UNITY) {
5192                     ALOGV("Track right volume out of range: %.3g", vrf);
5193                     vrf = GAIN_FLOAT_UNITY;
5194                 }
5195                 // now apply the master volume and stream type volume and shaper volume
5196                 vlf *= v * vh;
5197                 vrf *= v * vh;
5198                 // assuming master volume and stream type volume each go up to 1.0,
5199                 // then derive vl and vr as U8.24 versions for the effect chain
5200                 const float scaleto8_24 = MAX_GAIN_INT * MAX_GAIN_INT;
5201                 vl = (uint32_t) (scaleto8_24 * vlf);
5202                 vr = (uint32_t) (scaleto8_24 * vrf);
5203                 // vl and vr are now in U8.24 format
5204                 uint16_t sendLevel = proxy->getSendLevel_U4_12();
5205                 // send level comes from shared memory and so may be corrupt
5206                 if (sendLevel > MAX_GAIN_INT) {
5207                     ALOGV("Track send level out of range: %04X", sendLevel);
5208                     sendLevel = MAX_GAIN_INT;
5209                 }
5210                 // vaf is represented as [0.0, 1.0] float by rescaling sendLevel
5211                 vaf = v * sendLevel * (1. / MAX_GAIN_INT);
5212             }
5213 
5214             track->setFinalVolume((vrf + vlf) / 2.f);
5215 
5216             // Delegate volume control to effect in track effect chain if needed
5217             if (chain != 0 && chain->setVolume_l(&vl, &vr)) {
5218                 // Do not ramp volume if volume is controlled by effect
5219                 param = AudioMixer::VOLUME;
5220                 // Update remaining floating point volume levels
5221                 vlf = (float)vl / (1 << 24);
5222                 vrf = (float)vr / (1 << 24);
5223                 track->mHasVolumeController = true;
5224             } else {
5225                 // force no volume ramp when volume controller was just disabled or removed
5226                 // from effect chain to avoid volume spike
5227                 if (track->mHasVolumeController) {
5228                     param = AudioMixer::VOLUME;
5229                 }
5230                 track->mHasVolumeController = false;
5231             }
5232 
5233             // XXX: these things DON'T need to be done each time
5234             mAudioMixer->setBufferProvider(trackId, track);
5235             mAudioMixer->enable(trackId);
5236 
5237             mAudioMixer->setParameter(trackId, param, AudioMixer::VOLUME0, &vlf);
5238             mAudioMixer->setParameter(trackId, param, AudioMixer::VOLUME1, &vrf);
5239             mAudioMixer->setParameter(trackId, param, AudioMixer::AUXLEVEL, &vaf);
5240             mAudioMixer->setParameter(
5241                 trackId,
5242                 AudioMixer::TRACK,
5243                 AudioMixer::FORMAT, (void *)track->format());
5244             mAudioMixer->setParameter(
5245                 trackId,
5246                 AudioMixer::TRACK,
5247                 AudioMixer::CHANNEL_MASK, (void *)(uintptr_t)track->channelMask());
5248             mAudioMixer->setParameter(
5249                 trackId,
5250                 AudioMixer::TRACK,
5251                 AudioMixer::MIXER_CHANNEL_MASK,
5252                 (void *)(uintptr_t)(mChannelMask | mHapticChannelMask));
5253             // limit track sample rate to 2 x output sample rate, which changes at re-configuration
5254             uint32_t maxSampleRate = mSampleRate * AUDIO_RESAMPLER_DOWN_RATIO_MAX;
5255             uint32_t reqSampleRate = proxy->getSampleRate();
5256             if (reqSampleRate == 0) {
5257                 reqSampleRate = mSampleRate;
5258             } else if (reqSampleRate > maxSampleRate) {
5259                 reqSampleRate = maxSampleRate;
5260             }
5261             mAudioMixer->setParameter(
5262                 trackId,
5263                 AudioMixer::RESAMPLE,
5264                 AudioMixer::SAMPLE_RATE,
5265                 (void *)(uintptr_t)reqSampleRate);
5266 
5267             AudioPlaybackRate playbackRate = proxy->getPlaybackRate();
5268             mAudioMixer->setParameter(
5269                 trackId,
5270                 AudioMixer::TIMESTRETCH,
5271                 AudioMixer::PLAYBACK_RATE,
5272                 &playbackRate);
5273 
5274             /*
5275              * Select the appropriate output buffer for the track.
5276              *
5277              * Tracks with effects go into their own effects chain buffer
5278              * and from there into either mEffectBuffer or mSinkBuffer.
5279              *
5280              * Other tracks can use mMixerBuffer for higher precision
5281              * channel accumulation.  If this buffer is enabled
5282              * (mMixerBufferEnabled true), then selected tracks will accumulate
5283              * into it.
5284              *
5285              */
5286             if (mMixerBufferEnabled
5287                     && (track->mainBuffer() == mSinkBuffer
5288                             || track->mainBuffer() == mMixerBuffer)) {
5289                 mAudioMixer->setParameter(
5290                         trackId,
5291                         AudioMixer::TRACK,
5292                         AudioMixer::MIXER_FORMAT, (void *)mMixerBufferFormat);
5293                 mAudioMixer->setParameter(
5294                         trackId,
5295                         AudioMixer::TRACK,
5296                         AudioMixer::MAIN_BUFFER, (void *)mMixerBuffer);
5297                 // TODO: override track->mainBuffer()?
5298                 mMixerBufferValid = true;
5299             } else {
5300                 mAudioMixer->setParameter(
5301                         trackId,
5302                         AudioMixer::TRACK,
5303                         AudioMixer::MIXER_FORMAT, (void *)EFFECT_BUFFER_FORMAT);
5304                 mAudioMixer->setParameter(
5305                         trackId,
5306                         AudioMixer::TRACK,
5307                         AudioMixer::MAIN_BUFFER, (void *)track->mainBuffer());
5308             }
5309             mAudioMixer->setParameter(
5310                 trackId,
5311                 AudioMixer::TRACK,
5312                 AudioMixer::AUX_BUFFER, (void *)track->auxBuffer());
5313             mAudioMixer->setParameter(
5314                 trackId,
5315                 AudioMixer::TRACK,
5316                 AudioMixer::HAPTIC_ENABLED, (void *)(uintptr_t)track->getHapticPlaybackEnabled());
5317             mAudioMixer->setParameter(
5318                 trackId,
5319                 AudioMixer::TRACK,
5320                 AudioMixer::HAPTIC_INTENSITY, (void *)(uintptr_t)track->getHapticIntensity());
5321 
5322             // reset retry count
5323             track->mRetryCount = kMaxTrackRetries;
5324 
5325             // If one track is ready, set the mixer ready if:
5326             //  - the mixer was not ready during previous round OR
5327             //  - no other track is not ready
5328             if (mMixerStatusIgnoringFastTracks != MIXER_TRACKS_READY ||
5329                     mixerStatus != MIXER_TRACKS_ENABLED) {
5330                 mixerStatus = MIXER_TRACKS_READY;
5331             }
5332 
5333             // Enable the next few lines to instrument a test for underrun log handling.
5334             // TODO: Remove when we have a better way of testing the underrun log.
5335 #if 0
5336             static int i;
5337             if ((++i & 0xf) == 0) {
5338                 deferredOperations.tallyUnderrunFrames(track, 10 /* underrunFrames */);
5339             }
5340 #endif
5341         } else {
5342             size_t underrunFrames = 0;
5343             if (framesReady < desiredFrames && !track->isStopped() && !track->isPaused()) {
5344                 ALOGV("track(%d) underrun, track state %s  framesReady(%zu) < framesDesired(%zd)",
5345                         trackId, track->getTrackStateAsString(), framesReady, desiredFrames);
5346                 underrunFrames = desiredFrames;
5347             }
5348             deferredOperations.tallyUnderrunFrames(track, underrunFrames);
5349 
5350             // clear effect chain input buffer if an active track underruns to avoid sending
5351             // previous audio buffer again to effects
5352             chain = getEffectChain_l(track->sessionId());
5353             if (chain != 0) {
5354                 chain->clearInputBuffer();
5355             }
5356 
5357             ALOGVV("track(%d) s=%08x [NOT READY] on thread %p", trackId, cblk->mServer, this);
5358             if ((track->sharedBuffer() != 0) || track->isTerminated() ||
5359                     track->isStopped() || track->isPaused()) {
5360                 // We have consumed all the buffers of this track.
5361                 // Remove it from the list of active tracks.
5362                 // TODO: use actual buffer filling status instead of latency when available from
5363                 // audio HAL
5364                 size_t audioHALFrames = (latency_l() * mSampleRate) / 1000;
5365                 int64_t framesWritten = mBytesWritten / mFrameSize;
5366                 if (mStandby || track->presentationComplete(framesWritten, audioHALFrames)) {
5367                     if (track->isStopped()) {
5368                         track->reset();
5369                     }
5370                     tracksToRemove->add(track);
5371                 }
5372             } else {
5373                 // No buffers for this track. Give it a few chances to
5374                 // fill a buffer, then remove it from active list.
5375                 if (--(track->mRetryCount) <= 0) {
5376                     ALOGI("BUFFER TIMEOUT: remove(%d) from active list on thread %p",
5377                             trackId, this);
5378                     tracksToRemove->add(track);
5379                     // indicate to client process that the track was disabled because of underrun;
5380                     // it will then automatically call start() when data is available
5381                     track->disable();
5382                 // If one track is not ready, mark the mixer also not ready if:
5383                 //  - the mixer was ready during previous round OR
5384                 //  - no other track is ready
5385                 } else if (mMixerStatusIgnoringFastTracks == MIXER_TRACKS_READY ||
5386                                 mixerStatus != MIXER_TRACKS_READY) {
5387                     mixerStatus = MIXER_TRACKS_ENABLED;
5388                 }
5389             }
5390             mAudioMixer->disable(trackId);
5391         }
5392 
5393         }   // local variable scope to avoid goto warning
5394 
5395     }
5396 
5397     if (mHapticChannelMask != AUDIO_CHANNEL_NONE && sq != NULL) {
5398         // When there is no fast track playing haptic and FastMixer exists,
5399         // enabling the first FastTrack, which provides mixed data from normal
5400         // tracks, to play haptic data.
5401         FastTrack *fastTrack = &state->mFastTracks[0];
5402         if (fastTrack->mHapticPlaybackEnabled != noFastHapticTrack) {
5403             fastTrack->mHapticPlaybackEnabled = noFastHapticTrack;
5404             didModify = true;
5405         }
5406     }
5407 
5408     // Push the new FastMixer state if necessary
5409     bool pauseAudioWatchdog = false;
5410     if (didModify) {
5411         state->mFastTracksGen++;
5412         // if the fast mixer was active, but now there are no fast tracks, then put it in cold idle
5413         if (kUseFastMixer == FastMixer_Dynamic &&
5414                 state->mCommand == FastMixerState::MIX_WRITE && state->mTrackMask <= 1) {
5415             state->mCommand = FastMixerState::COLD_IDLE;
5416             state->mColdFutexAddr = &mFastMixerFutex;
5417             state->mColdGen++;
5418             mFastMixerFutex = 0;
5419             if (kUseFastMixer == FastMixer_Dynamic) {
5420                 mNormalSink = mOutputSink;
5421             }
5422             // If we go into cold idle, need to wait for acknowledgement
5423             // so that fast mixer stops doing I/O.
5424             block = FastMixerStateQueue::BLOCK_UNTIL_ACKED;
5425             pauseAudioWatchdog = true;
5426         }
5427     }
5428     if (sq != NULL) {
5429         sq->end(didModify);
5430         // No need to block if the FastMixer is in COLD_IDLE as the FastThread
5431         // is not active. (We BLOCK_UNTIL_ACKED when entering COLD_IDLE
5432         // when bringing the output sink into standby.)
5433         //
5434         // We will get the latest FastMixer state when we come out of COLD_IDLE.
5435         //
5436         // This occurs with BT suspend when we idle the FastMixer with
5437         // active tracks, which may be added or removed.
5438         sq->push(coldIdle ? FastMixerStateQueue::BLOCK_NEVER : block);
5439     }
5440 #ifdef AUDIO_WATCHDOG
5441     if (pauseAudioWatchdog && mAudioWatchdog != 0) {
5442         mAudioWatchdog->pause();
5443     }
5444 #endif
5445 
5446     // Now perform the deferred reset on fast tracks that have stopped
5447     while (resetMask != 0) {
5448         size_t i = __builtin_ctz(resetMask);
5449         ALOG_ASSERT(i < count);
5450         resetMask &= ~(1 << i);
5451         sp<Track> track = mActiveTracks[i];
5452         ALOG_ASSERT(track->isFastTrack() && track->isStopped());
5453         track->reset();
5454     }
5455 
5456     // Track destruction may occur outside of threadLoop once it is removed from active tracks.
5457     // Ensure the AudioMixer doesn't have a raw "buffer provider" pointer to the track if
5458     // it ceases to be active, to allow safe removal from the AudioMixer at the start
5459     // of prepareTracks_l(); this releases any outstanding buffer back to the track.
5460     // See also the implementation of destroyTrack_l().
5461     for (const auto &track : *tracksToRemove) {
5462         const int trackId = track->id();
5463         if (mAudioMixer->exists(trackId)) { // Normal tracks here, fast tracks in FastMixer.
5464             mAudioMixer->setBufferProvider(trackId, nullptr /* bufferProvider */);
5465         }
5466     }
5467 
5468     // remove all the tracks that need to be...
5469     removeTracks_l(*tracksToRemove);
5470 
5471     if (getEffectChain_l(AUDIO_SESSION_OUTPUT_MIX) != 0) {
5472         mEffectBufferValid = true;
5473     }
5474 
5475     if (mEffectBufferValid) {
5476         // as long as there are effects we should clear the effects buffer, to avoid
5477         // passing a non-clean buffer to the effect chain
5478         memset(mEffectBuffer, 0, mEffectBufferSize);
5479     }
5480     // sink or mix buffer must be cleared if all tracks are connected to an
5481     // effect chain as in this case the mixer will not write to the sink or mix buffer
5482     // and track effects will accumulate into it
5483     if ((mBytesRemaining == 0) && ((mixedTracks != 0 && mixedTracks == tracksWithEffect) ||
5484             (mixedTracks == 0 && fastTracks > 0))) {
5485         // FIXME as a performance optimization, should remember previous zero status
5486         if (mMixerBufferValid) {
5487             memset(mMixerBuffer, 0, mMixerBufferSize);
5488             // TODO: In testing, mSinkBuffer below need not be cleared because
5489             // the PlaybackThread::threadLoop() copies mMixerBuffer into mSinkBuffer
5490             // after mixing.
5491             //
5492             // To enforce this guarantee:
5493             // ((mixedTracks != 0 && mixedTracks == tracksWithEffect) ||
5494             // (mixedTracks == 0 && fastTracks > 0))
5495             // must imply MIXER_TRACKS_READY.
5496             // Later, we may clear buffers regardless, and skip much of this logic.
5497         }
5498         // FIXME as a performance optimization, should remember previous zero status
5499         memset(mSinkBuffer, 0, mNormalFrameCount * mFrameSize);
5500     }
5501 
5502     // if any fast tracks, then status is ready
5503     mMixerStatusIgnoringFastTracks = mixerStatus;
5504     if (fastTracks > 0) {
5505         mixerStatus = MIXER_TRACKS_READY;
5506     }
5507     return mixerStatus;
5508 }
5509 
5510 // trackCountForUid_l() must be called with ThreadBase::mLock held
trackCountForUid_l(uid_t uid) const5511 uint32_t AudioFlinger::PlaybackThread::trackCountForUid_l(uid_t uid) const
5512 {
5513     uint32_t trackCount = 0;
5514     for (size_t i = 0; i < mTracks.size() ; i++) {
5515         if (mTracks[i]->uid() == uid) {
5516             trackCount++;
5517         }
5518     }
5519     return trackCount;
5520 }
5521 
5522 // isTrackAllowed_l() must be called with ThreadBase::mLock held
isTrackAllowed_l(audio_channel_mask_t channelMask,audio_format_t format,audio_session_t sessionId,uid_t uid) const5523 bool AudioFlinger::MixerThread::isTrackAllowed_l(
5524         audio_channel_mask_t channelMask, audio_format_t format,
5525         audio_session_t sessionId, uid_t uid) const
5526 {
5527     if (!PlaybackThread::isTrackAllowed_l(channelMask, format, sessionId, uid)) {
5528         return false;
5529     }
5530     // Check validity as we don't call AudioMixer::create() here.
5531     if (!mAudioMixer->isValidFormat(format)) {
5532         ALOGW("%s: invalid format: %#x", __func__, format);
5533         return false;
5534     }
5535     if (!mAudioMixer->isValidChannelMask(channelMask)) {
5536         ALOGW("%s: invalid channelMask: %#x", __func__, channelMask);
5537         return false;
5538     }
5539     return true;
5540 }
5541 
5542 // checkForNewParameter_l() must be called with ThreadBase::mLock held
checkForNewParameter_l(const String8 & keyValuePair,status_t & status)5543 bool AudioFlinger::MixerThread::checkForNewParameter_l(const String8& keyValuePair,
5544                                                        status_t& status)
5545 {
5546     bool reconfig = false;
5547     bool a2dpDeviceChanged = false;
5548 
5549     status = NO_ERROR;
5550 
5551     AutoPark<FastMixer> park(mFastMixer);
5552 
5553     AudioParameter param = AudioParameter(keyValuePair);
5554     int value;
5555     if (param.getInt(String8(AudioParameter::keySamplingRate), value) == NO_ERROR) {
5556         reconfig = true;
5557     }
5558     if (param.getInt(String8(AudioParameter::keyFormat), value) == NO_ERROR) {
5559         if (!isValidPcmSinkFormat((audio_format_t) value)) {
5560             status = BAD_VALUE;
5561         } else {
5562             // no need to save value, since it's constant
5563             reconfig = true;
5564         }
5565     }
5566     if (param.getInt(String8(AudioParameter::keyChannels), value) == NO_ERROR) {
5567         if (!isValidPcmSinkChannelMask((audio_channel_mask_t) value)) {
5568             status = BAD_VALUE;
5569         } else {
5570             // no need to save value, since it's constant
5571             reconfig = true;
5572         }
5573     }
5574     if (param.getInt(String8(AudioParameter::keyFrameCount), value) == NO_ERROR) {
5575         // do not accept frame count changes if tracks are open as the track buffer
5576         // size depends on frame count and correct behavior would not be guaranteed
5577         // if frame count is changed after track creation
5578         if (!mTracks.isEmpty()) {
5579             status = INVALID_OPERATION;
5580         } else {
5581             reconfig = true;
5582         }
5583     }
5584     if (param.getInt(String8(AudioParameter::keyRouting), value) == NO_ERROR) {
5585         LOG_FATAL("Should not set routing device in MixerThread");
5586     }
5587 
5588     if (status == NO_ERROR) {
5589         status = mOutput->stream->setParameters(keyValuePair);
5590         if (!mStandby && status == INVALID_OPERATION) {
5591             mOutput->standby();
5592             if (!mStandby) {
5593                 mThreadMetrics.logEndInterval();
5594                 mStandby = true;
5595             }
5596             mBytesWritten = 0;
5597             status = mOutput->stream->setParameters(keyValuePair);
5598         }
5599         if (status == NO_ERROR && reconfig) {
5600             readOutputParameters_l();
5601             delete mAudioMixer;
5602             mAudioMixer = new AudioMixer(mNormalFrameCount, mSampleRate);
5603             for (const auto &track : mTracks) {
5604                 const int trackId = track->id();
5605                 status_t status = mAudioMixer->create(
5606                         trackId,
5607                         track->mChannelMask,
5608                         track->mFormat,
5609                         track->mSessionId);
5610                 ALOGW_IF(status != NO_ERROR,
5611                         "%s(): AudioMixer cannot create track(%d)"
5612                         " mask %#x, format %#x, sessionId %d",
5613                         __func__,
5614                         trackId, track->mChannelMask, track->mFormat, track->mSessionId);
5615             }
5616             sendIoConfigEvent_l(AUDIO_OUTPUT_CONFIG_CHANGED);
5617         }
5618     }
5619 
5620     return reconfig || a2dpDeviceChanged;
5621 }
5622 
5623 
dumpInternals_l(int fd,const Vector<String16> & args)5624 void AudioFlinger::MixerThread::dumpInternals_l(int fd, const Vector<String16>& args)
5625 {
5626     PlaybackThread::dumpInternals_l(fd, args);
5627     dprintf(fd, "  Thread throttle time (msecs): %u\n", mThreadThrottleTimeMs);
5628     dprintf(fd, "  AudioMixer tracks: %s\n", mAudioMixer->trackNames().c_str());
5629     dprintf(fd, "  Master mono: %s\n", mMasterMono ? "on" : "off");
5630     dprintf(fd, "  Master balance: %f (%s)\n", mMasterBalance.load(),
5631             (hasFastMixer() ? std::to_string(mFastMixer->getMasterBalance())
5632                             : mBalance.toString()).c_str());
5633     if (hasFastMixer()) {
5634         dprintf(fd, "  FastMixer thread %p tid=%d", mFastMixer.get(), mFastMixer->getTid());
5635 
5636         // Make a non-atomic copy of fast mixer dump state so it won't change underneath us
5637         // while we are dumping it.  It may be inconsistent, but it won't mutate!
5638         // This is a large object so we place it on the heap.
5639         // FIXME 25972958: Need an intelligent copy constructor that does not touch unused pages.
5640         const std::unique_ptr<FastMixerDumpState> copy =
5641                 std::make_unique<FastMixerDumpState>(mFastMixerDumpState);
5642         copy->dump(fd);
5643 
5644 #ifdef STATE_QUEUE_DUMP
5645         // Similar for state queue
5646         StateQueueObserverDump observerCopy = mStateQueueObserverDump;
5647         observerCopy.dump(fd);
5648         StateQueueMutatorDump mutatorCopy = mStateQueueMutatorDump;
5649         mutatorCopy.dump(fd);
5650 #endif
5651 
5652 #ifdef AUDIO_WATCHDOG
5653         if (mAudioWatchdog != 0) {
5654             // Make a non-atomic copy of audio watchdog dump so it won't change underneath us
5655             AudioWatchdogDump wdCopy = mAudioWatchdogDump;
5656             wdCopy.dump(fd);
5657         }
5658 #endif
5659 
5660     } else {
5661         dprintf(fd, "  No FastMixer\n");
5662     }
5663 }
5664 
idleSleepTimeUs() const5665 uint32_t AudioFlinger::MixerThread::idleSleepTimeUs() const
5666 {
5667     return (uint32_t)(((mNormalFrameCount * 1000) / mSampleRate) * 1000) / 2;
5668 }
5669 
suspendSleepTimeUs() const5670 uint32_t AudioFlinger::MixerThread::suspendSleepTimeUs() const
5671 {
5672     return (uint32_t)(((mNormalFrameCount * 1000) / mSampleRate) * 1000);
5673 }
5674 
cacheParameters_l()5675 void AudioFlinger::MixerThread::cacheParameters_l()
5676 {
5677     PlaybackThread::cacheParameters_l();
5678 
5679     // FIXME: Relaxed timing because of a certain device that can't meet latency
5680     // Should be reduced to 2x after the vendor fixes the driver issue
5681     // increase threshold again due to low power audio mode. The way this warning
5682     // threshold is calculated and its usefulness should be reconsidered anyway.
5683     maxPeriod = seconds(mNormalFrameCount) / mSampleRate * 15;
5684 }
5685 
5686 // ----------------------------------------------------------------------------
5687 
DirectOutputThread(const sp<AudioFlinger> & audioFlinger,AudioStreamOut * output,audio_io_handle_t id,ThreadBase::type_t type,bool systemReady)5688 AudioFlinger::DirectOutputThread::DirectOutputThread(const sp<AudioFlinger>& audioFlinger,
5689         AudioStreamOut* output, audio_io_handle_t id, ThreadBase::type_t type, bool systemReady)
5690     :   PlaybackThread(audioFlinger, output, id, type, systemReady)
5691 {
5692     setMasterBalance(audioFlinger->getMasterBalance_l());
5693 }
5694 
~DirectOutputThread()5695 AudioFlinger::DirectOutputThread::~DirectOutputThread()
5696 {
5697 }
5698 
dumpInternals_l(int fd,const Vector<String16> & args)5699 void AudioFlinger::DirectOutputThread::dumpInternals_l(int fd, const Vector<String16>& args)
5700 {
5701     PlaybackThread::dumpInternals_l(fd, args);
5702     dprintf(fd, "  Master balance: %f  Left: %f  Right: %f\n",
5703             mMasterBalance.load(), mMasterBalanceLeft, mMasterBalanceRight);
5704 }
5705 
setMasterBalance(float balance)5706 void AudioFlinger::DirectOutputThread::setMasterBalance(float balance)
5707 {
5708     Mutex::Autolock _l(mLock);
5709     if (mMasterBalance != balance) {
5710         mMasterBalance.store(balance);
5711         mBalance.computeStereoBalance(balance, &mMasterBalanceLeft, &mMasterBalanceRight);
5712         broadcast_l();
5713     }
5714 }
5715 
processVolume_l(Track * track,bool lastTrack)5716 void AudioFlinger::DirectOutputThread::processVolume_l(Track *track, bool lastTrack)
5717 {
5718     float left, right;
5719 
5720     // Ensure volumeshaper state always advances even when muted.
5721     const sp<AudioTrackServerProxy> proxy = track->mAudioTrackServerProxy;
5722     const auto [shaperVolume, shaperActive] = track->getVolumeHandler()->getVolume(
5723             proxy->framesReleased());
5724     mVolumeShaperActive = shaperActive;
5725 
5726     if (mMasterMute || mStreamTypes[track->streamType()].mute || track->isPlaybackRestricted()) {
5727         left = right = 0;
5728     } else {
5729         float typeVolume = mStreamTypes[track->streamType()].volume;
5730         const float v = mMasterVolume * typeVolume * shaperVolume;
5731 
5732         gain_minifloat_packed_t vlr = proxy->getVolumeLR();
5733         left = float_from_gain(gain_minifloat_unpack_left(vlr));
5734         if (left > GAIN_FLOAT_UNITY) {
5735             left = GAIN_FLOAT_UNITY;
5736         }
5737         left *= v * mMasterBalanceLeft; // DirectOutputThread balance applied as track volume
5738         right = float_from_gain(gain_minifloat_unpack_right(vlr));
5739         if (right > GAIN_FLOAT_UNITY) {
5740             right = GAIN_FLOAT_UNITY;
5741         }
5742         right *= v * mMasterBalanceRight;
5743     }
5744 
5745     if (lastTrack) {
5746         track->setFinalVolume((left + right) / 2.f);
5747         if (left != mLeftVolFloat || right != mRightVolFloat) {
5748             mLeftVolFloat = left;
5749             mRightVolFloat = right;
5750 
5751             // Delegate volume control to effect in track effect chain if needed
5752             // only one effect chain can be present on DirectOutputThread, so if
5753             // there is one, the track is connected to it
5754             if (!mEffectChains.isEmpty()) {
5755                 // if effect chain exists, volume is handled by it.
5756                 // Convert volumes from float to 8.24
5757                 uint32_t vl = (uint32_t)(left * (1 << 24));
5758                 uint32_t vr = (uint32_t)(right * (1 << 24));
5759                 // Direct/Offload effect chains set output volume in setVolume_l().
5760                 (void)mEffectChains[0]->setVolume_l(&vl, &vr);
5761             } else {
5762                 // otherwise we directly set the volume.
5763                 setVolumeForOutput_l(left, right);
5764             }
5765         }
5766     }
5767 }
5768 
onAddNewTrack_l()5769 void AudioFlinger::DirectOutputThread::onAddNewTrack_l()
5770 {
5771     sp<Track> previousTrack = mPreviousTrack.promote();
5772     sp<Track> latestTrack = mActiveTracks.getLatest();
5773 
5774     if (previousTrack != 0 && latestTrack != 0) {
5775         if (mType == DIRECT) {
5776             if (previousTrack.get() != latestTrack.get()) {
5777                 mFlushPending = true;
5778             }
5779         } else /* mType == OFFLOAD */ {
5780             if (previousTrack->sessionId() != latestTrack->sessionId()) {
5781                 mFlushPending = true;
5782             }
5783         }
5784     } else if (previousTrack == 0) {
5785         // there could be an old track added back during track transition for direct
5786         // output, so always issues flush to flush data of the previous track if it
5787         // was already destroyed with HAL paused, then flush can resume the playback
5788         mFlushPending = true;
5789     }
5790     PlaybackThread::onAddNewTrack_l();
5791 }
5792 
prepareTracks_l(Vector<sp<Track>> * tracksToRemove)5793 AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prepareTracks_l(
5794     Vector< sp<Track> > *tracksToRemove
5795 )
5796 {
5797     size_t count = mActiveTracks.size();
5798     mixer_state mixerStatus = MIXER_IDLE;
5799     bool doHwPause = false;
5800     bool doHwResume = false;
5801 
5802     // find out which tracks need to be processed
5803     for (const sp<Track> &t : mActiveTracks) {
5804         if (t->isInvalid()) {
5805             ALOGW("An invalidated track shouldn't be in active list");
5806             tracksToRemove->add(t);
5807             continue;
5808         }
5809 
5810         Track* const track = t.get();
5811 #ifdef VERY_VERY_VERBOSE_LOGGING
5812         audio_track_cblk_t* cblk = track->cblk();
5813 #endif
5814         // Only consider last track started for volume and mixer state control.
5815         // In theory an older track could underrun and restart after the new one starts
5816         // but as we only care about the transition phase between two tracks on a
5817         // direct output, it is not a problem to ignore the underrun case.
5818         sp<Track> l = mActiveTracks.getLatest();
5819         bool last = l.get() == track;
5820 
5821         if (track->isPausing()) {
5822             track->setPaused();
5823             if (mHwSupportsPause && last && !mHwPaused) {
5824                 doHwPause = true;
5825                 mHwPaused = true;
5826             }
5827         } else if (track->isFlushPending()) {
5828             track->flushAck();
5829             if (last) {
5830                 mFlushPending = true;
5831             }
5832         } else if (track->isResumePending()) {
5833             track->resumeAck();
5834             if (last) {
5835                 mLeftVolFloat = mRightVolFloat = -1.0;
5836                 if (mHwPaused) {
5837                     doHwResume = true;
5838                     mHwPaused = false;
5839                 }
5840             }
5841         }
5842 
5843         // The first time a track is added we wait
5844         // for all its buffers to be filled before processing it.
5845         // Allow draining the buffer in case the client
5846         // app does not call stop() and relies on underrun to stop:
5847         // hence the test on (track->mRetryCount > 1).
5848         // If retryCount<=1 then track is about to underrun and be removed.
5849         // Do not use a high threshold for compressed audio.
5850         uint32_t minFrames;
5851         if ((track->sharedBuffer() == 0) && !track->isStopping_1() && !track->isPausing()
5852             && (track->mRetryCount > 1) && audio_has_proportional_frames(mFormat)) {
5853             minFrames = mNormalFrameCount;
5854         } else {
5855             minFrames = 1;
5856         }
5857 
5858         const size_t framesReady = track->framesReady();
5859         const int trackId = track->id();
5860         if (ATRACE_ENABLED()) {
5861             std::string traceName("nRdy");
5862             traceName += std::to_string(trackId);
5863             ATRACE_INT(traceName.c_str(), framesReady);
5864         }
5865         if ((framesReady >= minFrames) && track->isReady() && !track->isPaused() &&
5866                 !track->isStopping_2() && !track->isStopped())
5867         {
5868             ALOGVV("track(%d) s=%08x [OK]", trackId, cblk->mServer);
5869 
5870             if (track->mFillingUpStatus == Track::FS_FILLED) {
5871                 track->mFillingUpStatus = Track::FS_ACTIVE;
5872                 if (last) {
5873                     // make sure processVolume_l() will apply new volume even if 0
5874                     mLeftVolFloat = mRightVolFloat = -1.0;
5875                 }
5876                 if (!mHwSupportsPause) {
5877                     track->resumeAck();
5878                 }
5879             }
5880 
5881             // compute volume for this track
5882             processVolume_l(track, last);
5883             if (last) {
5884                 sp<Track> previousTrack = mPreviousTrack.promote();
5885                 if (previousTrack != 0) {
5886                     if (track != previousTrack.get()) {
5887                         // Flush any data still being written from last track
5888                         mBytesRemaining = 0;
5889                         // Invalidate previous track to force a seek when resuming.
5890                         previousTrack->invalidate();
5891                     }
5892                 }
5893                 mPreviousTrack = track;
5894 
5895                 // reset retry count
5896                 track->mRetryCount = kMaxTrackRetriesDirect;
5897                 mActiveTrack = t;
5898                 mixerStatus = MIXER_TRACKS_READY;
5899                 if (mHwPaused) {
5900                     doHwResume = true;
5901                     mHwPaused = false;
5902                 }
5903             }
5904         } else {
5905             // clear effect chain input buffer if the last active track started underruns
5906             // to avoid sending previous audio buffer again to effects
5907             if (!mEffectChains.isEmpty() && last) {
5908                 mEffectChains[0]->clearInputBuffer();
5909             }
5910             if (track->isStopping_1()) {
5911                 track->mState = TrackBase::STOPPING_2;
5912                 if (last && mHwPaused) {
5913                      doHwResume = true;
5914                      mHwPaused = false;
5915                  }
5916             }
5917             if ((track->sharedBuffer() != 0) || track->isStopped() ||
5918                     track->isStopping_2() || track->isPaused()) {
5919                 // We have consumed all the buffers of this track.
5920                 // Remove it from the list of active tracks.
5921                 size_t audioHALFrames;
5922                 if (audio_has_proportional_frames(mFormat)) {
5923                     audioHALFrames = (latency_l() * mSampleRate) / 1000;
5924                 } else {
5925                     audioHALFrames = 0;
5926                 }
5927 
5928                 int64_t framesWritten = mBytesWritten / mFrameSize;
5929                 if (mStandby || !last ||
5930                         track->presentationComplete(framesWritten, audioHALFrames) ||
5931                         track->isPaused() || mHwPaused) {
5932                     if (track->isStopping_2()) {
5933                         track->mState = TrackBase::STOPPED;
5934                     }
5935                     if (track->isStopped()) {
5936                         track->reset();
5937                     }
5938                     tracksToRemove->add(track);
5939                 }
5940             } else {
5941                 // No buffers for this track. Give it a few chances to
5942                 // fill a buffer, then remove it from active list.
5943                 // Only consider last track started for mixer state control
5944                 if (--(track->mRetryCount) <= 0) {
5945                     ALOGV("BUFFER TIMEOUT: remove track(%d) from active list", trackId);
5946                     tracksToRemove->add(track);
5947                     // indicate to client process that the track was disabled because of underrun;
5948                     // it will then automatically call start() when data is available
5949                     track->disable();
5950                 } else if (last) {
5951                     ALOGW("pause because of UNDERRUN, framesReady = %zu,"
5952                             "minFrames = %u, mFormat = %#x",
5953                             framesReady, minFrames, mFormat);
5954                     mixerStatus = MIXER_TRACKS_ENABLED;
5955                     if (mHwSupportsPause && !mHwPaused && !mStandby) {
5956                         doHwPause = true;
5957                         mHwPaused = true;
5958                     }
5959                 }
5960             }
5961         }
5962     }
5963 
5964     // if an active track did not command a flush, check for pending flush on stopped tracks
5965     if (!mFlushPending) {
5966         for (size_t i = 0; i < mTracks.size(); i++) {
5967             if (mTracks[i]->isFlushPending()) {
5968                 mTracks[i]->flushAck();
5969                 mFlushPending = true;
5970             }
5971         }
5972     }
5973 
5974     // make sure the pause/flush/resume sequence is executed in the right order.
5975     // If a flush is pending and a track is active but the HW is not paused, force a HW pause
5976     // before flush and then resume HW. This can happen in case of pause/flush/resume
5977     // if resume is received before pause is executed.
5978     if (mHwSupportsPause && !mStandby &&
5979             (doHwPause || (mFlushPending && !mHwPaused && (count != 0)))) {
5980         status_t result = mOutput->stream->pause();
5981         ALOGE_IF(result != OK, "Error when pausing output stream: %d", result);
5982     }
5983     if (mFlushPending) {
5984         flushHw_l();
5985     }
5986     if (mHwSupportsPause && !mStandby && doHwResume) {
5987         status_t result = mOutput->stream->resume();
5988         ALOGE_IF(result != OK, "Error when resuming output stream: %d", result);
5989     }
5990     // remove all the tracks that need to be...
5991     removeTracks_l(*tracksToRemove);
5992 
5993     return mixerStatus;
5994 }
5995 
threadLoop_mix()5996 void AudioFlinger::DirectOutputThread::threadLoop_mix()
5997 {
5998     size_t frameCount = mFrameCount;
5999     int8_t *curBuf = (int8_t *)mSinkBuffer;
6000     // output audio to hardware
6001     while (frameCount) {
6002         AudioBufferProvider::Buffer buffer;
6003         buffer.frameCount = frameCount;
6004         status_t status = mActiveTrack->getNextBuffer(&buffer);
6005         if (status != NO_ERROR || buffer.raw == NULL) {
6006             // no need to pad with 0 for compressed audio
6007             if (audio_has_proportional_frames(mFormat)) {
6008                 memset(curBuf, 0, frameCount * mFrameSize);
6009             }
6010             break;
6011         }
6012         memcpy(curBuf, buffer.raw, buffer.frameCount * mFrameSize);
6013         frameCount -= buffer.frameCount;
6014         curBuf += buffer.frameCount * mFrameSize;
6015         mActiveTrack->releaseBuffer(&buffer);
6016     }
6017     mCurrentWriteLength = curBuf - (int8_t *)mSinkBuffer;
6018     mSleepTimeUs = 0;
6019     mStandbyTimeNs = systemTime() + mStandbyDelayNs;
6020     mActiveTrack.clear();
6021 }
6022 
threadLoop_sleepTime()6023 void AudioFlinger::DirectOutputThread::threadLoop_sleepTime()
6024 {
6025     // do not write to HAL when paused
6026     if (mHwPaused || (usesHwAvSync() && mStandby)) {
6027         mSleepTimeUs = mIdleSleepTimeUs;
6028         return;
6029     }
6030     if (mSleepTimeUs == 0) {
6031         if (mMixerStatus == MIXER_TRACKS_ENABLED) {
6032             mSleepTimeUs = mActiveSleepTimeUs;
6033         } else {
6034             mSleepTimeUs = mIdleSleepTimeUs;
6035         }
6036     } else if (mBytesWritten != 0 && audio_has_proportional_frames(mFormat)) {
6037         memset(mSinkBuffer, 0, mFrameCount * mFrameSize);
6038         mSleepTimeUs = 0;
6039     }
6040 }
6041 
threadLoop_exit()6042 void AudioFlinger::DirectOutputThread::threadLoop_exit()
6043 {
6044     {
6045         Mutex::Autolock _l(mLock);
6046         for (size_t i = 0; i < mTracks.size(); i++) {
6047             if (mTracks[i]->isFlushPending()) {
6048                 mTracks[i]->flushAck();
6049                 mFlushPending = true;
6050             }
6051         }
6052         if (mFlushPending) {
6053             flushHw_l();
6054         }
6055     }
6056     PlaybackThread::threadLoop_exit();
6057 }
6058 
6059 // must be called with thread mutex locked
shouldStandby_l()6060 bool AudioFlinger::DirectOutputThread::shouldStandby_l()
6061 {
6062     bool trackPaused = false;
6063     bool trackStopped = false;
6064 
6065     // do not put the HAL in standby when paused. AwesomePlayer clear the offloaded AudioTrack
6066     // after a timeout and we will enter standby then.
6067     if (mTracks.size() > 0) {
6068         trackPaused = mTracks[mTracks.size() - 1]->isPaused();
6069         trackStopped = mTracks[mTracks.size() - 1]->isStopped() ||
6070                            mTracks[mTracks.size() - 1]->mState == TrackBase::IDLE;
6071     }
6072 
6073     return !mStandby && !(trackPaused || (mHwPaused && !trackStopped));
6074 }
6075 
6076 // checkForNewParameter_l() must be called with ThreadBase::mLock held
checkForNewParameter_l(const String8 & keyValuePair,status_t & status)6077 bool AudioFlinger::DirectOutputThread::checkForNewParameter_l(const String8& keyValuePair,
6078                                                               status_t& status)
6079 {
6080     bool reconfig = false;
6081     bool a2dpDeviceChanged = false;
6082 
6083     status = NO_ERROR;
6084 
6085     AudioParameter param = AudioParameter(keyValuePair);
6086     int value;
6087     if (param.getInt(String8(AudioParameter::keyRouting), value) == NO_ERROR) {
6088         LOG_FATAL("Should not set routing device in DirectOutputThread");
6089     }
6090     if (param.getInt(String8(AudioParameter::keyFrameCount), value) == NO_ERROR) {
6091         // do not accept frame count changes if tracks are open as the track buffer
6092         // size depends on frame count and correct behavior would not be garantied
6093         // if frame count is changed after track creation
6094         if (!mTracks.isEmpty()) {
6095             status = INVALID_OPERATION;
6096         } else {
6097             reconfig = true;
6098         }
6099     }
6100     if (status == NO_ERROR) {
6101         status = mOutput->stream->setParameters(keyValuePair);
6102         if (!mStandby && status == INVALID_OPERATION) {
6103             mOutput->standby();
6104             if (!mStandby) {
6105                 mThreadMetrics.logEndInterval();
6106                 mStandby = true;
6107             }
6108             mBytesWritten = 0;
6109             status = mOutput->stream->setParameters(keyValuePair);
6110         }
6111         if (status == NO_ERROR && reconfig) {
6112             readOutputParameters_l();
6113             sendIoConfigEvent_l(AUDIO_OUTPUT_CONFIG_CHANGED);
6114         }
6115     }
6116 
6117     return reconfig || a2dpDeviceChanged;
6118 }
6119 
activeSleepTimeUs() const6120 uint32_t AudioFlinger::DirectOutputThread::activeSleepTimeUs() const
6121 {
6122     uint32_t time;
6123     if (audio_has_proportional_frames(mFormat)) {
6124         time = PlaybackThread::activeSleepTimeUs();
6125     } else {
6126         time = kDirectMinSleepTimeUs;
6127     }
6128     return time;
6129 }
6130 
idleSleepTimeUs() const6131 uint32_t AudioFlinger::DirectOutputThread::idleSleepTimeUs() const
6132 {
6133     uint32_t time;
6134     if (audio_has_proportional_frames(mFormat)) {
6135         time = (uint32_t)(((mFrameCount * 1000) / mSampleRate) * 1000) / 2;
6136     } else {
6137         time = kDirectMinSleepTimeUs;
6138     }
6139     return time;
6140 }
6141 
suspendSleepTimeUs() const6142 uint32_t AudioFlinger::DirectOutputThread::suspendSleepTimeUs() const
6143 {
6144     uint32_t time;
6145     if (audio_has_proportional_frames(mFormat)) {
6146         time = (uint32_t)(((mFrameCount * 1000) / mSampleRate) * 1000);
6147     } else {
6148         time = kDirectMinSleepTimeUs;
6149     }
6150     return time;
6151 }
6152 
cacheParameters_l()6153 void AudioFlinger::DirectOutputThread::cacheParameters_l()
6154 {
6155     PlaybackThread::cacheParameters_l();
6156 
6157     // use shorter standby delay as on normal output to release
6158     // hardware resources as soon as possible
6159     // no delay on outputs with HW A/V sync
6160     if (usesHwAvSync()) {
6161         mStandbyDelayNs = 0;
6162     } else if ((mType == OFFLOAD) && !audio_has_proportional_frames(mFormat)) {
6163         mStandbyDelayNs = kOffloadStandbyDelayNs;
6164     } else {
6165         mStandbyDelayNs = microseconds(mActiveSleepTimeUs*2);
6166     }
6167 }
6168 
flushHw_l()6169 void AudioFlinger::DirectOutputThread::flushHw_l()
6170 {
6171     mOutput->flush();
6172     mHwPaused = false;
6173     mFlushPending = false;
6174     mTimestampVerifier.discontinuity(); // DIRECT and OFFLOADED flush resets frame count.
6175     mTimestamp.clear();
6176 }
6177 
computeWaitTimeNs_l() const6178 int64_t AudioFlinger::DirectOutputThread::computeWaitTimeNs_l() const {
6179     // If a VolumeShaper is active, we must wake up periodically to update volume.
6180     const int64_t NS_PER_MS = 1000000;
6181     return mVolumeShaperActive ?
6182             kMinNormalSinkBufferSizeMs * NS_PER_MS : PlaybackThread::computeWaitTimeNs_l();
6183 }
6184 
6185 // ----------------------------------------------------------------------------
6186 
AsyncCallbackThread(const wp<AudioFlinger::PlaybackThread> & playbackThread)6187 AudioFlinger::AsyncCallbackThread::AsyncCallbackThread(
6188         const wp<AudioFlinger::PlaybackThread>& playbackThread)
6189     :   Thread(false /*canCallJava*/),
6190         mPlaybackThread(playbackThread),
6191         mWriteAckSequence(0),
6192         mDrainSequence(0),
6193         mAsyncError(false)
6194 {
6195 }
6196 
~AsyncCallbackThread()6197 AudioFlinger::AsyncCallbackThread::~AsyncCallbackThread()
6198 {
6199 }
6200 
onFirstRef()6201 void AudioFlinger::AsyncCallbackThread::onFirstRef()
6202 {
6203     run("Offload Cbk", ANDROID_PRIORITY_URGENT_AUDIO);
6204 }
6205 
threadLoop()6206 bool AudioFlinger::AsyncCallbackThread::threadLoop()
6207 {
6208     while (!exitPending()) {
6209         uint32_t writeAckSequence;
6210         uint32_t drainSequence;
6211         bool asyncError;
6212 
6213         {
6214             Mutex::Autolock _l(mLock);
6215             while (!((mWriteAckSequence & 1) ||
6216                      (mDrainSequence & 1) ||
6217                      mAsyncError ||
6218                      exitPending())) {
6219                 mWaitWorkCV.wait(mLock);
6220             }
6221 
6222             if (exitPending()) {
6223                 break;
6224             }
6225             ALOGV("AsyncCallbackThread mWriteAckSequence %d mDrainSequence %d",
6226                   mWriteAckSequence, mDrainSequence);
6227             writeAckSequence = mWriteAckSequence;
6228             mWriteAckSequence &= ~1;
6229             drainSequence = mDrainSequence;
6230             mDrainSequence &= ~1;
6231             asyncError = mAsyncError;
6232             mAsyncError = false;
6233         }
6234         {
6235             sp<AudioFlinger::PlaybackThread> playbackThread = mPlaybackThread.promote();
6236             if (playbackThread != 0) {
6237                 if (writeAckSequence & 1) {
6238                     playbackThread->resetWriteBlocked(writeAckSequence >> 1);
6239                 }
6240                 if (drainSequence & 1) {
6241                     playbackThread->resetDraining(drainSequence >> 1);
6242                 }
6243                 if (asyncError) {
6244                     playbackThread->onAsyncError();
6245                 }
6246             }
6247         }
6248     }
6249     return false;
6250 }
6251 
exit()6252 void AudioFlinger::AsyncCallbackThread::exit()
6253 {
6254     ALOGV("AsyncCallbackThread::exit");
6255     Mutex::Autolock _l(mLock);
6256     requestExit();
6257     mWaitWorkCV.broadcast();
6258 }
6259 
setWriteBlocked(uint32_t sequence)6260 void AudioFlinger::AsyncCallbackThread::setWriteBlocked(uint32_t sequence)
6261 {
6262     Mutex::Autolock _l(mLock);
6263     // bit 0 is cleared
6264     mWriteAckSequence = sequence << 1;
6265 }
6266 
resetWriteBlocked()6267 void AudioFlinger::AsyncCallbackThread::resetWriteBlocked()
6268 {
6269     Mutex::Autolock _l(mLock);
6270     // ignore unexpected callbacks
6271     if (mWriteAckSequence & 2) {
6272         mWriteAckSequence |= 1;
6273         mWaitWorkCV.signal();
6274     }
6275 }
6276 
setDraining(uint32_t sequence)6277 void AudioFlinger::AsyncCallbackThread::setDraining(uint32_t sequence)
6278 {
6279     Mutex::Autolock _l(mLock);
6280     // bit 0 is cleared
6281     mDrainSequence = sequence << 1;
6282 }
6283 
resetDraining()6284 void AudioFlinger::AsyncCallbackThread::resetDraining()
6285 {
6286     Mutex::Autolock _l(mLock);
6287     // ignore unexpected callbacks
6288     if (mDrainSequence & 2) {
6289         mDrainSequence |= 1;
6290         mWaitWorkCV.signal();
6291     }
6292 }
6293 
setAsyncError()6294 void AudioFlinger::AsyncCallbackThread::setAsyncError()
6295 {
6296     Mutex::Autolock _l(mLock);
6297     mAsyncError = true;
6298     mWaitWorkCV.signal();
6299 }
6300 
6301 
6302 // ----------------------------------------------------------------------------
OffloadThread(const sp<AudioFlinger> & audioFlinger,AudioStreamOut * output,audio_io_handle_t id,bool systemReady)6303 AudioFlinger::OffloadThread::OffloadThread(const sp<AudioFlinger>& audioFlinger,
6304         AudioStreamOut* output, audio_io_handle_t id, bool systemReady)
6305     :   DirectOutputThread(audioFlinger, output, id, OFFLOAD, systemReady),
6306         mPausedWriteLength(0), mPausedBytesRemaining(0), mKeepWakeLock(true),
6307         mOffloadUnderrunPosition(~0LL)
6308 {
6309     //FIXME: mStandby should be set to true by ThreadBase constructo
6310     mStandby = true;
6311     mKeepWakeLock = property_get_bool("ro.audio.offload_wakelock", true /* default_value */);
6312 }
6313 
threadLoop_exit()6314 void AudioFlinger::OffloadThread::threadLoop_exit()
6315 {
6316     if (mFlushPending || mHwPaused) {
6317         // If a flush is pending or track was paused, just discard buffered data
6318         flushHw_l();
6319     } else {
6320         mMixerStatus = MIXER_DRAIN_ALL;
6321         threadLoop_drain();
6322     }
6323     if (mUseAsyncWrite) {
6324         ALOG_ASSERT(mCallbackThread != 0);
6325         mCallbackThread->exit();
6326     }
6327     PlaybackThread::threadLoop_exit();
6328 }
6329 
prepareTracks_l(Vector<sp<Track>> * tracksToRemove)6330 AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTracks_l(
6331     Vector< sp<Track> > *tracksToRemove
6332 )
6333 {
6334     size_t count = mActiveTracks.size();
6335 
6336     mixer_state mixerStatus = MIXER_IDLE;
6337     bool doHwPause = false;
6338     bool doHwResume = false;
6339 
6340     ALOGV("OffloadThread::prepareTracks_l active tracks %zu", count);
6341 
6342     // find out which tracks need to be processed
6343     for (const sp<Track> &t : mActiveTracks) {
6344         Track* const track = t.get();
6345 #ifdef VERY_VERY_VERBOSE_LOGGING
6346         audio_track_cblk_t* cblk = track->cblk();
6347 #endif
6348         // Only consider last track started for volume and mixer state control.
6349         // In theory an older track could underrun and restart after the new one starts
6350         // but as we only care about the transition phase between two tracks on a
6351         // direct output, it is not a problem to ignore the underrun case.
6352         sp<Track> l = mActiveTracks.getLatest();
6353         bool last = l.get() == track;
6354 
6355         if (track->isInvalid()) {
6356             ALOGW("An invalidated track shouldn't be in active list");
6357             tracksToRemove->add(track);
6358             continue;
6359         }
6360 
6361         if (track->mState == TrackBase::IDLE) {
6362             ALOGW("An idle track shouldn't be in active list");
6363             continue;
6364         }
6365 
6366         if (track->isPausing()) {
6367             track->setPaused();
6368             if (last) {
6369                 if (mHwSupportsPause && !mHwPaused) {
6370                     doHwPause = true;
6371                     mHwPaused = true;
6372                 }
6373                 // If we were part way through writing the mixbuffer to
6374                 // the HAL we must save this until we resume
6375                 // BUG - this will be wrong if a different track is made active,
6376                 // in that case we want to discard the pending data in the
6377                 // mixbuffer and tell the client to present it again when the
6378                 // track is resumed
6379                 mPausedWriteLength = mCurrentWriteLength;
6380                 mPausedBytesRemaining = mBytesRemaining;
6381                 mBytesRemaining = 0;    // stop writing
6382             }
6383             tracksToRemove->add(track);
6384         } else if (track->isFlushPending()) {
6385             if (track->isStopping_1()) {
6386                 track->mRetryCount = kMaxTrackStopRetriesOffload;
6387             } else {
6388                 track->mRetryCount = kMaxTrackRetriesOffload;
6389             }
6390             track->flushAck();
6391             if (last) {
6392                 mFlushPending = true;
6393             }
6394         } else if (track->isResumePending()){
6395             track->resumeAck();
6396             if (last) {
6397                 if (mPausedBytesRemaining) {
6398                     // Need to continue write that was interrupted
6399                     mCurrentWriteLength = mPausedWriteLength;
6400                     mBytesRemaining = mPausedBytesRemaining;
6401                     mPausedBytesRemaining = 0;
6402                 }
6403                 if (mHwPaused) {
6404                     doHwResume = true;
6405                     mHwPaused = false;
6406                     // threadLoop_mix() will handle the case that we need to
6407                     // resume an interrupted write
6408                 }
6409                 // enable write to audio HAL
6410                 mSleepTimeUs = 0;
6411 
6412                 mLeftVolFloat = mRightVolFloat = -1.0;
6413 
6414                 // Do not handle new data in this iteration even if track->framesReady()
6415                 mixerStatus = MIXER_TRACKS_ENABLED;
6416             }
6417         }  else if (track->framesReady() && track->isReady() &&
6418                 !track->isPaused() && !track->isTerminated() && !track->isStopping_2()) {
6419             ALOGVV("OffloadThread: track(%d) s=%08x [OK]", track->id(), cblk->mServer);
6420             if (track->mFillingUpStatus == Track::FS_FILLED) {
6421                 track->mFillingUpStatus = Track::FS_ACTIVE;
6422                 if (last) {
6423                     // make sure processVolume_l() will apply new volume even if 0
6424                     mLeftVolFloat = mRightVolFloat = -1.0;
6425                 }
6426             }
6427 
6428             if (last) {
6429                 sp<Track> previousTrack = mPreviousTrack.promote();
6430                 if (previousTrack != 0) {
6431                     if (track != previousTrack.get()) {
6432                         // Flush any data still being written from last track
6433                         mBytesRemaining = 0;
6434                         if (mPausedBytesRemaining) {
6435                             // Last track was paused so we also need to flush saved
6436                             // mixbuffer state and invalidate track so that it will
6437                             // re-submit that unwritten data when it is next resumed
6438                             mPausedBytesRemaining = 0;
6439                             // Invalidate is a bit drastic - would be more efficient
6440                             // to have a flag to tell client that some of the
6441                             // previously written data was lost
6442                             previousTrack->invalidate();
6443                         }
6444                         // flush data already sent to the DSP if changing audio session as audio
6445                         // comes from a different source. Also invalidate previous track to force a
6446                         // seek when resuming.
6447                         if (previousTrack->sessionId() != track->sessionId()) {
6448                             previousTrack->invalidate();
6449                         }
6450                     }
6451                 }
6452                 mPreviousTrack = track;
6453                 // reset retry count
6454                 if (track->isStopping_1()) {
6455                     track->mRetryCount = kMaxTrackStopRetriesOffload;
6456                 } else {
6457                     track->mRetryCount = kMaxTrackRetriesOffload;
6458                 }
6459                 mActiveTrack = t;
6460                 mixerStatus = MIXER_TRACKS_READY;
6461             }
6462         } else {
6463             ALOGVV("OffloadThread: track(%d) s=%08x [NOT READY]", track->id(), cblk->mServer);
6464             if (track->isStopping_1()) {
6465                 if (--(track->mRetryCount) <= 0) {
6466                     // Hardware buffer can hold a large amount of audio so we must
6467                     // wait for all current track's data to drain before we say
6468                     // that the track is stopped.
6469                     if (mBytesRemaining == 0) {
6470                         // Only start draining when all data in mixbuffer
6471                         // has been written
6472                         ALOGV("OffloadThread: underrun and STOPPING_1 -> draining, STOPPING_2");
6473                         track->mState = TrackBase::STOPPING_2; // so presentation completes after
6474                         // drain do not drain if no data was ever sent to HAL (mStandby == true)
6475                         if (last && !mStandby) {
6476                             // do not modify drain sequence if we are already draining. This happens
6477                             // when resuming from pause after drain.
6478                             if ((mDrainSequence & 1) == 0) {
6479                                 mSleepTimeUs = 0;
6480                                 mStandbyTimeNs = systemTime() + mStandbyDelayNs;
6481                                 mixerStatus = MIXER_DRAIN_TRACK;
6482                                 mDrainSequence += 2;
6483                             }
6484                             if (mHwPaused) {
6485                                 // It is possible to move from PAUSED to STOPPING_1 without
6486                                 // a resume so we must ensure hardware is running
6487                                 doHwResume = true;
6488                                 mHwPaused = false;
6489                             }
6490                         }
6491                     }
6492                 } else if (last) {
6493                     ALOGV("stopping1 underrun retries left %d", track->mRetryCount);
6494                     mixerStatus = MIXER_TRACKS_ENABLED;
6495                 }
6496             } else if (track->isStopping_2()) {
6497                 // Drain has completed or we are in standby, signal presentation complete
6498                 if (!(mDrainSequence & 1) || !last || mStandby) {
6499                     track->mState = TrackBase::STOPPED;
6500                     uint32_t latency = 0;
6501                     status_t result = mOutput->stream->getLatency(&latency);
6502                     ALOGE_IF(result != OK,
6503                             "Error when retrieving output stream latency: %d", result);
6504                     size_t audioHALFrames = (latency * mSampleRate) / 1000;
6505                     int64_t framesWritten =
6506                             mBytesWritten / mOutput->getFrameSize();
6507                     track->presentationComplete(framesWritten, audioHALFrames);
6508                     track->reset();
6509                     tracksToRemove->add(track);
6510                     // DIRECT and OFFLOADED stop resets frame counts.
6511                     if (!mUseAsyncWrite) {
6512                         // If we don't get explicit drain notification we must
6513                         // register discontinuity regardless of whether this is
6514                         // the previous (!last) or the upcoming (last) track
6515                         // to avoid skipping the discontinuity.
6516                         mTimestampVerifier.discontinuity();
6517                     }
6518                 }
6519             } else {
6520                 // No buffers for this track. Give it a few chances to
6521                 // fill a buffer, then remove it from active list.
6522                 if (--(track->mRetryCount) <= 0) {
6523                     bool running = false;
6524                     uint64_t position = 0;
6525                     struct timespec unused;
6526                     // The running check restarts the retry counter at least once.
6527                     status_t ret = mOutput->stream->getPresentationPosition(&position, &unused);
6528                     if (ret == NO_ERROR && position != mOffloadUnderrunPosition) {
6529                         running = true;
6530                         mOffloadUnderrunPosition = position;
6531                     }
6532                     if (ret == NO_ERROR) {
6533                         ALOGVV("underrun counter, running(%d): %lld vs %lld", running,
6534                                 (long long)position, (long long)mOffloadUnderrunPosition);
6535                     }
6536                     if (running) { // still running, give us more time.
6537                         track->mRetryCount = kMaxTrackRetriesOffload;
6538                     } else {
6539                         ALOGV("OffloadThread: BUFFER TIMEOUT: remove track(%d) from active list",
6540                                 track->id());
6541                         tracksToRemove->add(track);
6542                         // tell client process that the track was disabled because of underrun;
6543                         // it will then automatically call start() when data is available
6544                         track->disable();
6545                     }
6546                 } else if (last){
6547                     mixerStatus = MIXER_TRACKS_ENABLED;
6548                 }
6549             }
6550         }
6551         // compute volume for this track
6552         if (track->isReady()) {  // check ready to prevent premature start.
6553             processVolume_l(track, last);
6554         }
6555     }
6556 
6557     // make sure the pause/flush/resume sequence is executed in the right order.
6558     // If a flush is pending and a track is active but the HW is not paused, force a HW pause
6559     // before flush and then resume HW. This can happen in case of pause/flush/resume
6560     // if resume is received before pause is executed.
6561     if (!mStandby && (doHwPause || (mFlushPending && !mHwPaused && (count != 0)))) {
6562         status_t result = mOutput->stream->pause();
6563         ALOGE_IF(result != OK, "Error when pausing output stream: %d", result);
6564     }
6565     if (mFlushPending) {
6566         flushHw_l();
6567     }
6568     if (!mStandby && doHwResume) {
6569         status_t result = mOutput->stream->resume();
6570         ALOGE_IF(result != OK, "Error when resuming output stream: %d", result);
6571     }
6572 
6573     // remove all the tracks that need to be...
6574     removeTracks_l(*tracksToRemove);
6575 
6576     return mixerStatus;
6577 }
6578 
6579 // must be called with thread mutex locked
waitingAsyncCallback_l()6580 bool AudioFlinger::OffloadThread::waitingAsyncCallback_l()
6581 {
6582     ALOGVV("waitingAsyncCallback_l mWriteAckSequence %d mDrainSequence %d",
6583           mWriteAckSequence, mDrainSequence);
6584     if (mUseAsyncWrite && ((mWriteAckSequence & 1) || (mDrainSequence & 1))) {
6585         return true;
6586     }
6587     return false;
6588 }
6589 
waitingAsyncCallback()6590 bool AudioFlinger::OffloadThread::waitingAsyncCallback()
6591 {
6592     Mutex::Autolock _l(mLock);
6593     return waitingAsyncCallback_l();
6594 }
6595 
flushHw_l()6596 void AudioFlinger::OffloadThread::flushHw_l()
6597 {
6598     DirectOutputThread::flushHw_l();
6599     // Flush anything still waiting in the mixbuffer
6600     mCurrentWriteLength = 0;
6601     mBytesRemaining = 0;
6602     mPausedWriteLength = 0;
6603     mPausedBytesRemaining = 0;
6604     // reset bytes written count to reflect that DSP buffers are empty after flush.
6605     mBytesWritten = 0;
6606     mOffloadUnderrunPosition = ~0LL;
6607 
6608     if (mUseAsyncWrite) {
6609         // discard any pending drain or write ack by incrementing sequence
6610         mWriteAckSequence = (mWriteAckSequence + 2) & ~1;
6611         mDrainSequence = (mDrainSequence + 2) & ~1;
6612         ALOG_ASSERT(mCallbackThread != 0);
6613         mCallbackThread->setWriteBlocked(mWriteAckSequence);
6614         mCallbackThread->setDraining(mDrainSequence);
6615     }
6616 }
6617 
invalidateTracks(audio_stream_type_t streamType)6618 void AudioFlinger::OffloadThread::invalidateTracks(audio_stream_type_t streamType)
6619 {
6620     Mutex::Autolock _l(mLock);
6621     if (PlaybackThread::invalidateTracks_l(streamType)) {
6622         mFlushPending = true;
6623     }
6624 }
6625 
6626 // ----------------------------------------------------------------------------
6627 
DuplicatingThread(const sp<AudioFlinger> & audioFlinger,AudioFlinger::MixerThread * mainThread,audio_io_handle_t id,bool systemReady)6628 AudioFlinger::DuplicatingThread::DuplicatingThread(const sp<AudioFlinger>& audioFlinger,
6629         AudioFlinger::MixerThread* mainThread, audio_io_handle_t id, bool systemReady)
6630     :   MixerThread(audioFlinger, mainThread->getOutput(), id,
6631                     systemReady, DUPLICATING),
6632         mWaitTimeMs(UINT_MAX)
6633 {
6634     addOutputTrack(mainThread);
6635 }
6636 
~DuplicatingThread()6637 AudioFlinger::DuplicatingThread::~DuplicatingThread()
6638 {
6639     for (size_t i = 0; i < mOutputTracks.size(); i++) {
6640         mOutputTracks[i]->destroy();
6641     }
6642 }
6643 
threadLoop_mix()6644 void AudioFlinger::DuplicatingThread::threadLoop_mix()
6645 {
6646     // mix buffers...
6647     if (outputsReady(outputTracks)) {
6648         mAudioMixer->process();
6649     } else {
6650         if (mMixerBufferValid) {
6651             memset(mMixerBuffer, 0, mMixerBufferSize);
6652         } else {
6653             memset(mSinkBuffer, 0, mSinkBufferSize);
6654         }
6655     }
6656     mSleepTimeUs = 0;
6657     writeFrames = mNormalFrameCount;
6658     mCurrentWriteLength = mSinkBufferSize;
6659     mStandbyTimeNs = systemTime() + mStandbyDelayNs;
6660 }
6661 
threadLoop_sleepTime()6662 void AudioFlinger::DuplicatingThread::threadLoop_sleepTime()
6663 {
6664     if (mSleepTimeUs == 0) {
6665         if (mMixerStatus == MIXER_TRACKS_ENABLED) {
6666             mSleepTimeUs = mActiveSleepTimeUs;
6667         } else {
6668             mSleepTimeUs = mIdleSleepTimeUs;
6669         }
6670     } else if (mBytesWritten != 0) {
6671         if (mMixerStatus == MIXER_TRACKS_ENABLED) {
6672             writeFrames = mNormalFrameCount;
6673             memset(mSinkBuffer, 0, mSinkBufferSize);
6674         } else {
6675             // flush remaining overflow buffers in output tracks
6676             writeFrames = 0;
6677         }
6678         mSleepTimeUs = 0;
6679     }
6680 }
6681 
threadLoop_write()6682 ssize_t AudioFlinger::DuplicatingThread::threadLoop_write()
6683 {
6684     for (size_t i = 0; i < outputTracks.size(); i++) {
6685         const ssize_t actualWritten = outputTracks[i]->write(mSinkBuffer, writeFrames);
6686 
6687         // Consider the first OutputTrack for timestamp and frame counting.
6688 
6689         // The threadLoop() generally assumes writing a full sink buffer size at a time.
6690         // Here, we correct for writeFrames of 0 (a stop) or underruns because
6691         // we always claim success.
6692         if (i == 0) {
6693             const ssize_t correction = mSinkBufferSize / mFrameSize - actualWritten;
6694             ALOGD_IF(correction != 0 && writeFrames != 0,
6695                     "%s: writeFrames:%u  actualWritten:%zd  correction:%zd  mFramesWritten:%lld",
6696                     __func__, writeFrames, actualWritten, correction, (long long)mFramesWritten);
6697             mFramesWritten -= correction;
6698         }
6699 
6700         // TODO: Report correction for the other output tracks and show in the dump.
6701     }
6702     if (mStandby) {
6703         mThreadMetrics.logBeginInterval();
6704         mStandby = false;
6705     }
6706     return (ssize_t)mSinkBufferSize;
6707 }
6708 
threadLoop_standby()6709 void AudioFlinger::DuplicatingThread::threadLoop_standby()
6710 {
6711     // DuplicatingThread implements standby by stopping all tracks
6712     for (size_t i = 0; i < outputTracks.size(); i++) {
6713         outputTracks[i]->stop();
6714     }
6715 }
6716 
dumpInternals_l(int fd,const Vector<String16> & args __unused)6717 void AudioFlinger::DuplicatingThread::dumpInternals_l(int fd, const Vector<String16>& args __unused)
6718 {
6719     MixerThread::dumpInternals_l(fd, args);
6720 
6721     std::stringstream ss;
6722     const size_t numTracks = mOutputTracks.size();
6723     ss << "  " << numTracks << " OutputTracks";
6724     if (numTracks > 0) {
6725         ss << ":";
6726         for (const auto &track : mOutputTracks) {
6727             const sp<ThreadBase> thread = track->thread().promote();
6728             ss << " (" << track->id() << " : ";
6729             if (thread.get() != nullptr) {
6730                 ss << thread.get() << ", " << thread->id();
6731             } else {
6732                 ss << "null";
6733             }
6734             ss << ")";
6735         }
6736     }
6737     ss << "\n";
6738     std::string result = ss.str();
6739     write(fd, result.c_str(), result.size());
6740 }
6741 
saveOutputTracks()6742 void AudioFlinger::DuplicatingThread::saveOutputTracks()
6743 {
6744     outputTracks = mOutputTracks;
6745 }
6746 
clearOutputTracks()6747 void AudioFlinger::DuplicatingThread::clearOutputTracks()
6748 {
6749     outputTracks.clear();
6750 }
6751 
addOutputTrack(MixerThread * thread)6752 void AudioFlinger::DuplicatingThread::addOutputTrack(MixerThread *thread)
6753 {
6754     Mutex::Autolock _l(mLock);
6755     // The downstream MixerThread consumes thread->frameCount() amount of frames per mix pass.
6756     // Adjust for thread->sampleRate() to determine minimum buffer frame count.
6757     // Then triple buffer because Threads do not run synchronously and may not be clock locked.
6758     const size_t frameCount =
6759             3 * sourceFramesNeeded(mSampleRate, thread->frameCount(), thread->sampleRate());
6760     // TODO: Consider asynchronous sample rate conversion to handle clock disparity
6761     // from different OutputTracks and their associated MixerThreads (e.g. one may
6762     // nearly empty and the other may be dropping data).
6763 
6764     sp<OutputTrack> outputTrack = new OutputTrack(thread,
6765                                             this,
6766                                             mSampleRate,
6767                                             mFormat,
6768                                             mChannelMask,
6769                                             frameCount,
6770                                             IPCThreadState::self()->getCallingUid());
6771     status_t status = outputTrack != 0 ? outputTrack->initCheck() : (status_t) NO_MEMORY;
6772     if (status != NO_ERROR) {
6773         ALOGE("addOutputTrack() initCheck failed %d", status);
6774         return;
6775     }
6776     thread->setStreamVolume(AUDIO_STREAM_PATCH, 1.0f);
6777     mOutputTracks.add(outputTrack);
6778     ALOGV("addOutputTrack() track %p, on thread %p", outputTrack.get(), thread);
6779     updateWaitTime_l();
6780 }
6781 
removeOutputTrack(MixerThread * thread)6782 void AudioFlinger::DuplicatingThread::removeOutputTrack(MixerThread *thread)
6783 {
6784     Mutex::Autolock _l(mLock);
6785     for (size_t i = 0; i < mOutputTracks.size(); i++) {
6786         if (mOutputTracks[i]->thread() == thread) {
6787             mOutputTracks[i]->destroy();
6788             mOutputTracks.removeAt(i);
6789             updateWaitTime_l();
6790             if (thread->getOutput() == mOutput) {
6791                 mOutput = NULL;
6792             }
6793             return;
6794         }
6795     }
6796     ALOGV("removeOutputTrack(): unknown thread: %p", thread);
6797 }
6798 
6799 // caller must hold mLock
updateWaitTime_l()6800 void AudioFlinger::DuplicatingThread::updateWaitTime_l()
6801 {
6802     mWaitTimeMs = UINT_MAX;
6803     for (size_t i = 0; i < mOutputTracks.size(); i++) {
6804         sp<ThreadBase> strong = mOutputTracks[i]->thread().promote();
6805         if (strong != 0) {
6806             uint32_t waitTimeMs = (strong->frameCount() * 2 * 1000) / strong->sampleRate();
6807             if (waitTimeMs < mWaitTimeMs) {
6808                 mWaitTimeMs = waitTimeMs;
6809             }
6810         }
6811     }
6812 }
6813 
6814 
outputsReady(const SortedVector<sp<OutputTrack>> & outputTracks)6815 bool AudioFlinger::DuplicatingThread::outputsReady(
6816         const SortedVector< sp<OutputTrack> > &outputTracks)
6817 {
6818     for (size_t i = 0; i < outputTracks.size(); i++) {
6819         sp<ThreadBase> thread = outputTracks[i]->thread().promote();
6820         if (thread == 0) {
6821             ALOGW("DuplicatingThread::outputsReady() could not promote thread on output track %p",
6822                     outputTracks[i].get());
6823             return false;
6824         }
6825         PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
6826         // see note at standby() declaration
6827         if (playbackThread->standby() && !playbackThread->isSuspended()) {
6828             ALOGV("DuplicatingThread output track %p on thread %p Not Ready", outputTracks[i].get(),
6829                     thread.get());
6830             return false;
6831         }
6832     }
6833     return true;
6834 }
6835 
sendMetadataToBackend_l(const StreamOutHalInterface::SourceMetadata & metadata)6836 void AudioFlinger::DuplicatingThread::sendMetadataToBackend_l(
6837         const StreamOutHalInterface::SourceMetadata& metadata)
6838 {
6839     for (auto& outputTrack : outputTracks) { // not mOutputTracks
6840         outputTrack->setMetadatas(metadata.tracks);
6841     }
6842 }
6843 
activeSleepTimeUs() const6844 uint32_t AudioFlinger::DuplicatingThread::activeSleepTimeUs() const
6845 {
6846     return (mWaitTimeMs * 1000) / 2;
6847 }
6848 
cacheParameters_l()6849 void AudioFlinger::DuplicatingThread::cacheParameters_l()
6850 {
6851     // updateWaitTime_l() sets mWaitTimeMs, which affects activeSleepTimeUs(), so call it first
6852     updateWaitTime_l();
6853 
6854     MixerThread::cacheParameters_l();
6855 }
6856 
6857 
6858 // ----------------------------------------------------------------------------
6859 //      Record
6860 // ----------------------------------------------------------------------------
6861 
RecordThread(const sp<AudioFlinger> & audioFlinger,AudioStreamIn * input,audio_io_handle_t id,bool systemReady)6862 AudioFlinger::RecordThread::RecordThread(const sp<AudioFlinger>& audioFlinger,
6863                                          AudioStreamIn *input,
6864                                          audio_io_handle_t id,
6865                                          bool systemReady
6866                                          ) :
6867     ThreadBase(audioFlinger, id, RECORD, systemReady, false /* isOut */),
6868     mInput(input),
6869     mSource(mInput),
6870     mActiveTracks(&this->mLocalLog),
6871     mRsmpInBuffer(NULL),
6872     // mRsmpInFrames, mRsmpInFramesP2, and mRsmpInFramesOA are set by readInputParameters_l()
6873     mRsmpInRear(0)
6874     , mReadOnlyHeap(new MemoryDealer(kRecordThreadReadOnlyHeapSize,
6875             "RecordThreadRO", MemoryHeapBase::READ_ONLY))
6876     // mFastCapture below
6877     , mFastCaptureFutex(0)
6878     // mInputSource
6879     // mPipeSink
6880     // mPipeSource
6881     , mPipeFramesP2(0)
6882     // mPipeMemory
6883     // mFastCaptureNBLogWriter
6884     , mFastTrackAvail(false)
6885     , mBtNrecSuspended(false)
6886 {
6887     snprintf(mThreadName, kThreadNameLength, "AudioIn_%X", id);
6888     mNBLogWriter = audioFlinger->newWriter_l(kLogSize, mThreadName);
6889 
6890     if (mInput != nullptr && mInput->audioHwDev != nullptr) {
6891         mIsMsdDevice = strcmp(
6892                 mInput->audioHwDev->moduleName(), AUDIO_HARDWARE_MODULE_ID_MSD) == 0;
6893     }
6894 
6895     readInputParameters_l();
6896 
6897     // TODO: We may also match on address as well as device type for
6898     // AUDIO_DEVICE_IN_BUS, AUDIO_DEVICE_IN_BLUETOOTH_A2DP, AUDIO_DEVICE_IN_REMOTE_SUBMIX
6899     // TODO: This property should be ensure that only contains one single device type.
6900     mTimestampCorrectedDevice = (audio_devices_t)property_get_int64(
6901             "audio.timestamp.corrected_input_device",
6902             (int64_t)(mIsMsdDevice ? AUDIO_DEVICE_IN_BUS // turn on by default for MSD
6903                                    : AUDIO_DEVICE_NONE));
6904 
6905     // create an NBAIO source for the HAL input stream, and negotiate
6906     mInputSource = new AudioStreamInSource(input->stream);
6907     size_t numCounterOffers = 0;
6908     const NBAIO_Format offers[1] = {Format_from_SR_C(mSampleRate, mChannelCount, mFormat)};
6909 #if !LOG_NDEBUG
6910     ssize_t index =
6911 #else
6912     (void)
6913 #endif
6914             mInputSource->negotiate(offers, 1, NULL, numCounterOffers);
6915     ALOG_ASSERT(index == 0);
6916 
6917     // initialize fast capture depending on configuration
6918     bool initFastCapture;
6919     switch (kUseFastCapture) {
6920     case FastCapture_Never:
6921         initFastCapture = false;
6922         ALOGV("%p kUseFastCapture = Never, initFastCapture = false", this);
6923         break;
6924     case FastCapture_Always:
6925         initFastCapture = true;
6926         ALOGV("%p kUseFastCapture = Always, initFastCapture = true", this);
6927         break;
6928     case FastCapture_Static:
6929         initFastCapture = (mFrameCount * 1000) / mSampleRate < kMinNormalCaptureBufferSizeMs;
6930         ALOGV("%p kUseFastCapture = Static, (%lld * 1000) / %u vs %u, initFastCapture = %d",
6931                 this, (long long)mFrameCount, mSampleRate, kMinNormalCaptureBufferSizeMs,
6932                 initFastCapture);
6933         break;
6934     // case FastCapture_Dynamic:
6935     }
6936 
6937     if (initFastCapture) {
6938         // create a Pipe for FastCapture to write to, and for us and fast tracks to read from
6939         NBAIO_Format format = mInputSource->format();
6940         // quadruple-buffering of 20 ms each; this ensures we can sleep for 20ms in RecordThread
6941         size_t pipeFramesP2 = roundup(4 * FMS_20 * mSampleRate / 1000);
6942         size_t pipeSize = pipeFramesP2 * Format_frameSize(format);
6943         void *pipeBuffer = nullptr;
6944         const sp<MemoryDealer> roHeap(readOnlyHeap());
6945         sp<IMemory> pipeMemory;
6946         if ((roHeap == 0) ||
6947                 (pipeMemory = roHeap->allocate(pipeSize)) == 0 ||
6948                 (pipeBuffer = pipeMemory->unsecurePointer()) == nullptr) {
6949             ALOGE("not enough memory for pipe buffer size=%zu; "
6950                     "roHeap=%p, pipeMemory=%p, pipeBuffer=%p; roHeapSize: %lld",
6951                     pipeSize, roHeap.get(), pipeMemory.get(), pipeBuffer,
6952                     (long long)kRecordThreadReadOnlyHeapSize);
6953             goto failed;
6954         }
6955         // pipe will be shared directly with fast clients, so clear to avoid leaking old information
6956         memset(pipeBuffer, 0, pipeSize);
6957         Pipe *pipe = new Pipe(pipeFramesP2, format, pipeBuffer);
6958         const NBAIO_Format offers[1] = {format};
6959         size_t numCounterOffers = 0;
6960         ssize_t index = pipe->negotiate(offers, 1, NULL, numCounterOffers);
6961         ALOG_ASSERT(index == 0);
6962         mPipeSink = pipe;
6963         PipeReader *pipeReader = new PipeReader(*pipe);
6964         numCounterOffers = 0;
6965         index = pipeReader->negotiate(offers, 1, NULL, numCounterOffers);
6966         ALOG_ASSERT(index == 0);
6967         mPipeSource = pipeReader;
6968         mPipeFramesP2 = pipeFramesP2;
6969         mPipeMemory = pipeMemory;
6970 
6971         // create fast capture
6972         mFastCapture = new FastCapture();
6973         FastCaptureStateQueue *sq = mFastCapture->sq();
6974 #ifdef STATE_QUEUE_DUMP
6975         // FIXME
6976 #endif
6977         FastCaptureState *state = sq->begin();
6978         state->mCblk = NULL;
6979         state->mInputSource = mInputSource.get();
6980         state->mInputSourceGen++;
6981         state->mPipeSink = pipe;
6982         state->mPipeSinkGen++;
6983         state->mFrameCount = mFrameCount;
6984         state->mCommand = FastCaptureState::COLD_IDLE;
6985         // already done in constructor initialization list
6986         //mFastCaptureFutex = 0;
6987         state->mColdFutexAddr = &mFastCaptureFutex;
6988         state->mColdGen++;
6989         state->mDumpState = &mFastCaptureDumpState;
6990 #ifdef TEE_SINK
6991         // FIXME
6992 #endif
6993         mFastCaptureNBLogWriter = audioFlinger->newWriter_l(kFastCaptureLogSize, "FastCapture");
6994         state->mNBLogWriter = mFastCaptureNBLogWriter.get();
6995         sq->end();
6996         sq->push(FastCaptureStateQueue::BLOCK_UNTIL_PUSHED);
6997 
6998         // start the fast capture
6999         mFastCapture->run("FastCapture", ANDROID_PRIORITY_URGENT_AUDIO);
7000         pid_t tid = mFastCapture->getTid();
7001         sendPrioConfigEvent(getpid(), tid, kPriorityFastCapture, false /*forApp*/);
7002         stream()->setHalThreadPriority(kPriorityFastCapture);
7003 #ifdef AUDIO_WATCHDOG
7004         // FIXME
7005 #endif
7006 
7007         mFastTrackAvail = true;
7008     }
7009 #ifdef TEE_SINK
7010     mTee.set(mInputSource->format(), NBAIO_Tee::TEE_FLAG_INPUT_THREAD);
7011     mTee.setId(std::string("_") + std::to_string(mId) + "_C");
7012 #endif
7013 failed: ;
7014 
7015     // FIXME mNormalSource
7016 }
7017 
~RecordThread()7018 AudioFlinger::RecordThread::~RecordThread()
7019 {
7020     if (mFastCapture != 0) {
7021         FastCaptureStateQueue *sq = mFastCapture->sq();
7022         FastCaptureState *state = sq->begin();
7023         if (state->mCommand == FastCaptureState::COLD_IDLE) {
7024             int32_t old = android_atomic_inc(&mFastCaptureFutex);
7025             if (old == -1) {
7026                 (void) syscall(__NR_futex, &mFastCaptureFutex, FUTEX_WAKE_PRIVATE, 1);
7027             }
7028         }
7029         state->mCommand = FastCaptureState::EXIT;
7030         sq->end();
7031         sq->push(FastCaptureStateQueue::BLOCK_UNTIL_PUSHED);
7032         mFastCapture->join();
7033         mFastCapture.clear();
7034     }
7035     mAudioFlinger->unregisterWriter(mFastCaptureNBLogWriter);
7036     mAudioFlinger->unregisterWriter(mNBLogWriter);
7037     free(mRsmpInBuffer);
7038 }
7039 
onFirstRef()7040 void AudioFlinger::RecordThread::onFirstRef()
7041 {
7042     run(mThreadName, PRIORITY_URGENT_AUDIO);
7043 }
7044 
preExit()7045 void AudioFlinger::RecordThread::preExit()
7046 {
7047     ALOGV("  preExit()");
7048     Mutex::Autolock _l(mLock);
7049     for (size_t i = 0; i < mTracks.size(); i++) {
7050         sp<RecordTrack> track = mTracks[i];
7051         track->invalidate();
7052     }
7053     mActiveTracks.clear();
7054     mStartStopCond.broadcast();
7055 }
7056 
threadLoop()7057 bool AudioFlinger::RecordThread::threadLoop()
7058 {
7059     nsecs_t lastWarning = 0;
7060 
7061     inputStandBy();
7062 
7063 reacquire_wakelock:
7064     sp<RecordTrack> activeTrack;
7065     {
7066         Mutex::Autolock _l(mLock);
7067         acquireWakeLock_l();
7068     }
7069 
7070     // used to request a deferred sleep, to be executed later while mutex is unlocked
7071     uint32_t sleepUs = 0;
7072 
7073     int64_t lastLoopCountRead = -2;  // never matches "previous" loop, when loopCount = 0.
7074 
7075     // loop while there is work to do
7076     for (int64_t loopCount = 0;; ++loopCount) {  // loopCount used for statistics tracking
7077         Vector< sp<EffectChain> > effectChains;
7078 
7079         // activeTracks accumulates a copy of a subset of mActiveTracks
7080         Vector< sp<RecordTrack> > activeTracks;
7081 
7082         // reference to the (first and only) active fast track
7083         sp<RecordTrack> fastTrack;
7084 
7085         // reference to a fast track which is about to be removed
7086         sp<RecordTrack> fastTrackToRemove;
7087 
7088         bool silenceFastCapture = false;
7089 
7090         { // scope for mLock
7091             Mutex::Autolock _l(mLock);
7092 
7093             processConfigEvents_l();
7094 
7095             // check exitPending here because checkForNewParameters_l() and
7096             // checkForNewParameters_l() can temporarily release mLock
7097             if (exitPending()) {
7098                 break;
7099             }
7100 
7101             // sleep with mutex unlocked
7102             if (sleepUs > 0) {
7103                 ATRACE_BEGIN("sleepC");
7104                 mWaitWorkCV.waitRelative(mLock, microseconds((nsecs_t)sleepUs));
7105                 ATRACE_END();
7106                 sleepUs = 0;
7107                 continue;
7108             }
7109 
7110             // if no active track(s), then standby and release wakelock
7111             size_t size = mActiveTracks.size();
7112             if (size == 0) {
7113                 standbyIfNotAlreadyInStandby();
7114                 // exitPending() can't become true here
7115                 releaseWakeLock_l();
7116                 ALOGV("RecordThread: loop stopping");
7117                 // go to sleep
7118                 mWaitWorkCV.wait(mLock);
7119                 ALOGV("RecordThread: loop starting");
7120                 goto reacquire_wakelock;
7121             }
7122 
7123             bool doBroadcast = false;
7124             bool allStopped = true;
7125             for (size_t i = 0; i < size; ) {
7126 
7127                 activeTrack = mActiveTracks[i];
7128                 if (activeTrack->isTerminated()) {
7129                     if (activeTrack->isFastTrack()) {
7130                         ALOG_ASSERT(fastTrackToRemove == 0);
7131                         fastTrackToRemove = activeTrack;
7132                     }
7133                     removeTrack_l(activeTrack);
7134                     mActiveTracks.remove(activeTrack);
7135                     size--;
7136                     continue;
7137                 }
7138 
7139                 TrackBase::track_state activeTrackState = activeTrack->mState;
7140                 switch (activeTrackState) {
7141 
7142                 case TrackBase::PAUSING:
7143                     mActiveTracks.remove(activeTrack);
7144                     activeTrack->mState = TrackBase::PAUSED;
7145                     doBroadcast = true;
7146                     size--;
7147                     continue;
7148 
7149                 case TrackBase::STARTING_1:
7150                     sleepUs = 10000;
7151                     i++;
7152                     allStopped = false;
7153                     continue;
7154 
7155                 case TrackBase::STARTING_2:
7156                     doBroadcast = true;
7157                     if (mStandby) {
7158                         mThreadMetrics.logBeginInterval();
7159                         mStandby = false;
7160                     }
7161                     activeTrack->mState = TrackBase::ACTIVE;
7162                     allStopped = false;
7163                     break;
7164 
7165                 case TrackBase::ACTIVE:
7166                     allStopped = false;
7167                     break;
7168 
7169                 case TrackBase::IDLE:    // cannot be on ActiveTracks if idle
7170                 case TrackBase::PAUSED:  // cannot be on ActiveTracks if paused
7171                 case TrackBase::STOPPED: // cannot be on ActiveTracks if destroyed/terminated
7172                 default:
7173                     LOG_ALWAYS_FATAL("%s: Unexpected active track state:%d, id:%d, tracks:%zu",
7174                             __func__, activeTrackState, activeTrack->id(), size);
7175                 }
7176 
7177                 if (activeTrack->isFastTrack()) {
7178                     ALOG_ASSERT(!mFastTrackAvail);
7179                     ALOG_ASSERT(fastTrack == 0);
7180                     // if the active fast track is silenced either:
7181                     // 1) silence the whole capture from fast capture buffer if this is
7182                     //    the only active track
7183                     // 2) invalidate this track: this will cause the client to reconnect and possibly
7184                     //    be invalidated again until unsilenced
7185                     if (activeTrack->isSilenced()) {
7186                         if (size > 1) {
7187                             activeTrack->invalidate();
7188                             ALOG_ASSERT(fastTrackToRemove == 0);
7189                             fastTrackToRemove = activeTrack;
7190                             removeTrack_l(activeTrack);
7191                             mActiveTracks.remove(activeTrack);
7192                             size--;
7193                             continue;
7194                         } else {
7195                             silenceFastCapture = true;
7196                         }
7197                     }
7198                     fastTrack = activeTrack;
7199                 }
7200 
7201                 activeTracks.add(activeTrack);
7202                 i++;
7203 
7204             }
7205 
7206             mActiveTracks.updatePowerState(this);
7207 
7208             updateMetadata_l();
7209 
7210             if (allStopped) {
7211                 standbyIfNotAlreadyInStandby();
7212             }
7213             if (doBroadcast) {
7214                 mStartStopCond.broadcast();
7215             }
7216 
7217             // sleep if there are no active tracks to process
7218             if (activeTracks.isEmpty()) {
7219                 if (sleepUs == 0) {
7220                     sleepUs = kRecordThreadSleepUs;
7221                 }
7222                 continue;
7223             }
7224             sleepUs = 0;
7225 
7226             lockEffectChains_l(effectChains);
7227         }
7228 
7229         // thread mutex is now unlocked, mActiveTracks unknown, activeTracks.size() > 0
7230 
7231         size_t size = effectChains.size();
7232         for (size_t i = 0; i < size; i++) {
7233             // thread mutex is not locked, but effect chain is locked
7234             effectChains[i]->process_l();
7235         }
7236 
7237         // Push a new fast capture state if fast capture is not already running, or cblk change
7238         if (mFastCapture != 0) {
7239             FastCaptureStateQueue *sq = mFastCapture->sq();
7240             FastCaptureState *state = sq->begin();
7241             bool didModify = false;
7242             FastCaptureStateQueue::block_t block = FastCaptureStateQueue::BLOCK_UNTIL_PUSHED;
7243             if (state->mCommand != FastCaptureState::READ_WRITE /* FIXME &&
7244                     (kUseFastMixer != FastMixer_Dynamic || state->mTrackMask > 1)*/) {
7245                 if (state->mCommand == FastCaptureState::COLD_IDLE) {
7246                     int32_t old = android_atomic_inc(&mFastCaptureFutex);
7247                     if (old == -1) {
7248                         (void) syscall(__NR_futex, &mFastCaptureFutex, FUTEX_WAKE_PRIVATE, 1);
7249                     }
7250                 }
7251                 state->mCommand = FastCaptureState::READ_WRITE;
7252 #if 0   // FIXME
7253                 mFastCaptureDumpState.increaseSamplingN(mAudioFlinger->isLowRamDevice() ?
7254                         FastThreadDumpState::kSamplingNforLowRamDevice :
7255                         FastThreadDumpState::kSamplingN);
7256 #endif
7257                 didModify = true;
7258             }
7259             audio_track_cblk_t *cblkOld = state->mCblk;
7260             audio_track_cblk_t *cblkNew = fastTrack != 0 ? fastTrack->cblk() : NULL;
7261             if (cblkNew != cblkOld) {
7262                 state->mCblk = cblkNew;
7263                 // block until acked if removing a fast track
7264                 if (cblkOld != NULL) {
7265                     block = FastCaptureStateQueue::BLOCK_UNTIL_ACKED;
7266                 }
7267                 didModify = true;
7268             }
7269             AudioBufferProvider* abp = (fastTrack != 0 && fastTrack->isPatchTrack()) ?
7270                     reinterpret_cast<AudioBufferProvider*>(fastTrack.get()) : nullptr;
7271             if (state->mFastPatchRecordBufferProvider != abp) {
7272                 state->mFastPatchRecordBufferProvider = abp;
7273                 state->mFastPatchRecordFormat = fastTrack == 0 ?
7274                         AUDIO_FORMAT_INVALID : fastTrack->format();
7275                 didModify = true;
7276             }
7277             if (state->mSilenceCapture != silenceFastCapture) {
7278                 state->mSilenceCapture = silenceFastCapture;
7279                 didModify = true;
7280             }
7281             sq->end(didModify);
7282             if (didModify) {
7283                 sq->push(block);
7284 #if 0
7285                 if (kUseFastCapture == FastCapture_Dynamic) {
7286                     mNormalSource = mPipeSource;
7287                 }
7288 #endif
7289             }
7290         }
7291 
7292         // now run the fast track destructor with thread mutex unlocked
7293         fastTrackToRemove.clear();
7294 
7295         // Read from HAL to keep up with fastest client if multiple active tracks, not slowest one.
7296         // Only the client(s) that are too slow will overrun. But if even the fastest client is too
7297         // slow, then this RecordThread will overrun by not calling HAL read often enough.
7298         // If destination is non-contiguous, first read past the nominal end of buffer, then
7299         // copy to the right place.  Permitted because mRsmpInBuffer was over-allocated.
7300 
7301         int32_t rear = mRsmpInRear & (mRsmpInFramesP2 - 1);
7302         ssize_t framesRead;
7303         const int64_t lastIoBeginNs = systemTime(); // start IO timing
7304 
7305         // If an NBAIO source is present, use it to read the normal capture's data
7306         if (mPipeSource != 0) {
7307             size_t framesToRead = min(mRsmpInFramesOA - rear, mRsmpInFramesP2 / 2);
7308 
7309             // The audio fifo read() returns OVERRUN on overflow, and advances the read pointer
7310             // to the full buffer point (clearing the overflow condition).  Upon OVERRUN error,
7311             // we immediately retry the read() to get data and prevent another overflow.
7312             for (int retries = 0; retries <= 2; ++retries) {
7313                 ALOGW_IF(retries > 0, "overrun on read from pipe, retry #%d", retries);
7314                 framesRead = mPipeSource->read((uint8_t*)mRsmpInBuffer + rear * mFrameSize,
7315                         framesToRead);
7316                 if (framesRead != OVERRUN) break;
7317             }
7318 
7319             const ssize_t availableToRead = mPipeSource->availableToRead();
7320             if (availableToRead >= 0) {
7321                 // PipeSource is the master clock.  It is up to the AudioRecord client to keep up.
7322                 LOG_ALWAYS_FATAL_IF((size_t)availableToRead > mPipeFramesP2,
7323                         "more frames to read than fifo size, %zd > %zu",
7324                         availableToRead, mPipeFramesP2);
7325                 const size_t pipeFramesFree = mPipeFramesP2 - availableToRead;
7326                 const size_t sleepFrames = min(pipeFramesFree, mRsmpInFramesP2) / 2;
7327                 ALOGVV("mPipeFramesP2:%zu mRsmpInFramesP2:%zu sleepFrames:%zu availableToRead:%zd",
7328                         mPipeFramesP2, mRsmpInFramesP2, sleepFrames, availableToRead);
7329                 sleepUs = (sleepFrames * 1000000LL) / mSampleRate;
7330             }
7331             if (framesRead < 0) {
7332                 status_t status = (status_t) framesRead;
7333                 switch (status) {
7334                 case OVERRUN:
7335                     ALOGW("overrun on read from pipe");
7336                     framesRead = 0;
7337                     break;
7338                 case NEGOTIATE:
7339                     ALOGE("re-negotiation is needed");
7340                     framesRead = -1;  // Will cause an attempt to recover.
7341                     break;
7342                 default:
7343                     ALOGE("unknown error %d on read from pipe", status);
7344                     break;
7345                 }
7346             }
7347         // otherwise use the HAL / AudioStreamIn directly
7348         } else {
7349             ATRACE_BEGIN("read");
7350             size_t bytesRead;
7351             status_t result = mSource->read(
7352                     (uint8_t*)mRsmpInBuffer + rear * mFrameSize, mBufferSize, &bytesRead);
7353             ATRACE_END();
7354             if (result < 0) {
7355                 framesRead = result;
7356             } else {
7357                 framesRead = bytesRead / mFrameSize;
7358             }
7359         }
7360 
7361         const int64_t lastIoEndNs = systemTime(); // end IO timing
7362 
7363         // Update server timestamp with server stats
7364         // systemTime() is optional if the hardware supports timestamps.
7365         if (framesRead >= 0) {
7366             mTimestamp.mPosition[ExtendedTimestamp::LOCATION_SERVER] += framesRead;
7367             mTimestamp.mTimeNs[ExtendedTimestamp::LOCATION_SERVER] = lastIoEndNs;
7368         }
7369 
7370         // Update server timestamp with kernel stats
7371         if (mPipeSource.get() == nullptr /* don't obtain for FastCapture, could block */) {
7372             int64_t position, time;
7373             if (mStandby) {
7374                 mTimestampVerifier.discontinuity();
7375             } else if (mSource->getCapturePosition(&position, &time) == NO_ERROR
7376                     && time > mTimestamp.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL]) {
7377 
7378                 mTimestampVerifier.add(position, time, mSampleRate);
7379 
7380                 // Correct timestamps
7381                 if (isTimestampCorrectionEnabled()) {
7382                     ALOGV("TS_BEFORE: %d %lld %lld",
7383                             id(), (long long)time, (long long)position);
7384                     auto correctedTimestamp = mTimestampVerifier.getLastCorrectedTimestamp();
7385                     position = correctedTimestamp.mFrames;
7386                     time = correctedTimestamp.mTimeNs;
7387                     ALOGV("TS_AFTER: %d %lld %lld",
7388                             id(), (long long)time, (long long)position);
7389                 }
7390 
7391                 mTimestamp.mPosition[ExtendedTimestamp::LOCATION_KERNEL] = position;
7392                 mTimestamp.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL] = time;
7393                 // Note: In general record buffers should tend to be empty in
7394                 // a properly running pipeline.
7395                 //
7396                 // Also, it is not advantageous to call get_presentation_position during the read
7397                 // as the read obtains a lock, preventing the timestamp call from executing.
7398             } else {
7399                 mTimestampVerifier.error();
7400             }
7401         }
7402 
7403         // From the timestamp, input read latency is negative output write latency.
7404         const audio_input_flags_t flags = mInput != NULL ? mInput->flags : AUDIO_INPUT_FLAG_NONE;
7405         const double latencyMs = RecordTrack::checkServerLatencySupported(mFormat, flags)
7406                 ? - mTimestamp.getOutputServerLatencyMs(mSampleRate) : 0.;
7407         if (latencyMs != 0.) { // note 0. means timestamp is empty.
7408             mLatencyMs.add(latencyMs);
7409         }
7410 
7411         // Use this to track timestamp information
7412         // ALOGD("%s", mTimestamp.toString().c_str());
7413 
7414         if (framesRead < 0 || (framesRead == 0 && mPipeSource == 0)) {
7415             ALOGE("read failed: framesRead=%zd", framesRead);
7416             // Force input into standby so that it tries to recover at next read attempt
7417             inputStandBy();
7418             sleepUs = kRecordThreadSleepUs;
7419         }
7420         if (framesRead <= 0) {
7421             goto unlock;
7422         }
7423         ALOG_ASSERT(framesRead > 0);
7424         mFramesRead += framesRead;
7425 
7426 #ifdef TEE_SINK
7427         (void)mTee.write((uint8_t*)mRsmpInBuffer + rear * mFrameSize, framesRead);
7428 #endif
7429         // If destination is non-contiguous, we now correct for reading past end of buffer.
7430         {
7431             size_t part1 = mRsmpInFramesP2 - rear;
7432             if ((size_t) framesRead > part1) {
7433                 memcpy(mRsmpInBuffer, (uint8_t*)mRsmpInBuffer + mRsmpInFramesP2 * mFrameSize,
7434                         (framesRead - part1) * mFrameSize);
7435             }
7436         }
7437         rear = mRsmpInRear += framesRead;
7438 
7439         size = activeTracks.size();
7440 
7441         // loop over each active track
7442         for (size_t i = 0; i < size; i++) {
7443             activeTrack = activeTracks[i];
7444 
7445             // skip fast tracks, as those are handled directly by FastCapture
7446             if (activeTrack->isFastTrack()) {
7447                 continue;
7448             }
7449 
7450             // TODO: This code probably should be moved to RecordTrack.
7451             // TODO: Update the activeTrack buffer converter in case of reconfigure.
7452 
7453             enum {
7454                 OVERRUN_UNKNOWN,
7455                 OVERRUN_TRUE,
7456                 OVERRUN_FALSE
7457             } overrun = OVERRUN_UNKNOWN;
7458 
7459             // loop over getNextBuffer to handle circular sink
7460             for (;;) {
7461 
7462                 activeTrack->mSink.frameCount = ~0;
7463                 status_t status = activeTrack->getNextBuffer(&activeTrack->mSink);
7464                 size_t framesOut = activeTrack->mSink.frameCount;
7465                 LOG_ALWAYS_FATAL_IF((status == OK) != (framesOut > 0));
7466 
7467                 // check available frames and handle overrun conditions
7468                 // if the record track isn't draining fast enough.
7469                 bool hasOverrun;
7470                 size_t framesIn;
7471                 activeTrack->mResamplerBufferProvider->sync(&framesIn, &hasOverrun);
7472                 if (hasOverrun) {
7473                     overrun = OVERRUN_TRUE;
7474                 }
7475                 if (framesOut == 0 || framesIn == 0) {
7476                     break;
7477                 }
7478 
7479                 // Don't allow framesOut to be larger than what is possible with resampling
7480                 // from framesIn.
7481                 // This isn't strictly necessary but helps limit buffer resizing in
7482                 // RecordBufferConverter.  TODO: remove when no longer needed.
7483                 framesOut = min(framesOut,
7484                         destinationFramesPossible(
7485                                 framesIn, mSampleRate, activeTrack->mSampleRate));
7486 
7487                 if (activeTrack->isDirect()) {
7488                     // No RecordBufferConverter used for direct streams. Pass
7489                     // straight from RecordThread buffer to RecordTrack buffer.
7490                     AudioBufferProvider::Buffer buffer;
7491                     buffer.frameCount = framesOut;
7492                     status_t status = activeTrack->mResamplerBufferProvider->getNextBuffer(&buffer);
7493                     if (status == OK && buffer.frameCount != 0) {
7494                         ALOGV_IF(buffer.frameCount != framesOut,
7495                                 "%s() read less than expected (%zu vs %zu)",
7496                                 __func__, buffer.frameCount, framesOut);
7497                         framesOut = buffer.frameCount;
7498                         memcpy(activeTrack->mSink.raw, buffer.raw, buffer.frameCount * mFrameSize);
7499                         activeTrack->mResamplerBufferProvider->releaseBuffer(&buffer);
7500                     } else {
7501                         framesOut = 0;
7502                         ALOGE("%s() cannot fill request, status: %d, frameCount: %zu",
7503                             __func__, status, buffer.frameCount);
7504                     }
7505                 } else {
7506                     // process frames from the RecordThread buffer provider to the RecordTrack
7507                     // buffer
7508                     framesOut = activeTrack->mRecordBufferConverter->convert(
7509                             activeTrack->mSink.raw,
7510                             activeTrack->mResamplerBufferProvider,
7511                             framesOut);
7512                 }
7513 
7514                 if (framesOut > 0 && (overrun == OVERRUN_UNKNOWN)) {
7515                     overrun = OVERRUN_FALSE;
7516                 }
7517 
7518                 if (activeTrack->mFramesToDrop == 0) {
7519                     if (framesOut > 0) {
7520                         activeTrack->mSink.frameCount = framesOut;
7521                         // Sanitize before releasing if the track has no access to the source data
7522                         // An idle UID receives silence from non virtual devices until active
7523                         if (activeTrack->isSilenced()) {
7524                             memset(activeTrack->mSink.raw, 0, framesOut * activeTrack->frameSize());
7525                         }
7526                         activeTrack->releaseBuffer(&activeTrack->mSink);
7527                     }
7528                 } else {
7529                     // FIXME could do a partial drop of framesOut
7530                     if (activeTrack->mFramesToDrop > 0) {
7531                         activeTrack->mFramesToDrop -= (ssize_t)framesOut;
7532                         if (activeTrack->mFramesToDrop <= 0) {
7533                             activeTrack->clearSyncStartEvent();
7534                         }
7535                     } else {
7536                         activeTrack->mFramesToDrop += framesOut;
7537                         if (activeTrack->mFramesToDrop >= 0 || activeTrack->mSyncStartEvent == 0 ||
7538                                 activeTrack->mSyncStartEvent->isCancelled()) {
7539                             ALOGW("Synced record %s, session %d, trigger session %d",
7540                                   (activeTrack->mFramesToDrop >= 0) ? "timed out" : "cancelled",
7541                                   activeTrack->sessionId(),
7542                                   (activeTrack->mSyncStartEvent != 0) ?
7543                                           activeTrack->mSyncStartEvent->triggerSession() :
7544                                           AUDIO_SESSION_NONE);
7545                             activeTrack->clearSyncStartEvent();
7546                         }
7547                     }
7548                 }
7549 
7550                 if (framesOut == 0) {
7551                     break;
7552                 }
7553             }
7554 
7555             switch (overrun) {
7556             case OVERRUN_TRUE:
7557                 // client isn't retrieving buffers fast enough
7558                 if (!activeTrack->setOverflow()) {
7559                     nsecs_t now = systemTime();
7560                     // FIXME should lastWarning per track?
7561                     if ((now - lastWarning) > kWarningThrottleNs) {
7562                         ALOGW("RecordThread: buffer overflow");
7563                         lastWarning = now;
7564                     }
7565                 }
7566                 break;
7567             case OVERRUN_FALSE:
7568                 activeTrack->clearOverflow();
7569                 break;
7570             case OVERRUN_UNKNOWN:
7571                 break;
7572             }
7573 
7574             // update frame information and push timestamp out
7575             activeTrack->updateTrackFrameInfo(
7576                     activeTrack->mServerProxy->framesReleased(),
7577                     mTimestamp.mPosition[ExtendedTimestamp::LOCATION_SERVER],
7578                     mSampleRate, mTimestamp);
7579         }
7580 
7581 unlock:
7582         // enable changes in effect chain
7583         unlockEffectChains(effectChains);
7584         // effectChains doesn't need to be cleared, since it is cleared by destructor at scope end
7585         if (audio_has_proportional_frames(mFormat)
7586             && loopCount == lastLoopCountRead + 1) {
7587             const int64_t readPeriodNs = lastIoEndNs - mLastIoEndNs;
7588             const double jitterMs =
7589                 TimestampVerifier<int64_t, int64_t>::computeJitterMs(
7590                     {framesRead, readPeriodNs},
7591                     {0, 0} /* lastTimestamp */, mSampleRate);
7592             const double processMs = (lastIoBeginNs - mLastIoEndNs) * 1e-6;
7593 
7594             Mutex::Autolock _l(mLock);
7595             mIoJitterMs.add(jitterMs);
7596             mProcessTimeMs.add(processMs);
7597         }
7598         // update timing info.
7599         mLastIoBeginNs = lastIoBeginNs;
7600         mLastIoEndNs = lastIoEndNs;
7601         lastLoopCountRead = loopCount;
7602     }
7603 
7604     standbyIfNotAlreadyInStandby();
7605 
7606     {
7607         Mutex::Autolock _l(mLock);
7608         for (size_t i = 0; i < mTracks.size(); i++) {
7609             sp<RecordTrack> track = mTracks[i];
7610             track->invalidate();
7611         }
7612         mActiveTracks.clear();
7613         mStartStopCond.broadcast();
7614     }
7615 
7616     releaseWakeLock();
7617 
7618     ALOGV("RecordThread %p exiting", this);
7619     return false;
7620 }
7621 
standbyIfNotAlreadyInStandby()7622 void AudioFlinger::RecordThread::standbyIfNotAlreadyInStandby()
7623 {
7624     if (!mStandby) {
7625         inputStandBy();
7626         mThreadMetrics.logEndInterval();
7627         mStandby = true;
7628     }
7629 }
7630 
inputStandBy()7631 void AudioFlinger::RecordThread::inputStandBy()
7632 {
7633     // Idle the fast capture if it's currently running
7634     if (mFastCapture != 0) {
7635         FastCaptureStateQueue *sq = mFastCapture->sq();
7636         FastCaptureState *state = sq->begin();
7637         if (!(state->mCommand & FastCaptureState::IDLE)) {
7638             state->mCommand = FastCaptureState::COLD_IDLE;
7639             state->mColdFutexAddr = &mFastCaptureFutex;
7640             state->mColdGen++;
7641             mFastCaptureFutex = 0;
7642             sq->end();
7643             // BLOCK_UNTIL_PUSHED would be insufficient, as we need it to stop doing I/O now
7644             sq->push(FastCaptureStateQueue::BLOCK_UNTIL_ACKED);
7645 #if 0
7646             if (kUseFastCapture == FastCapture_Dynamic) {
7647                 // FIXME
7648             }
7649 #endif
7650 #ifdef AUDIO_WATCHDOG
7651             // FIXME
7652 #endif
7653         } else {
7654             sq->end(false /*didModify*/);
7655         }
7656     }
7657     status_t result = mSource->standby();
7658     ALOGE_IF(result != OK, "Error when putting input stream into standby: %d", result);
7659 
7660     // If going into standby, flush the pipe source.
7661     if (mPipeSource.get() != nullptr) {
7662         const ssize_t flushed = mPipeSource->flush();
7663         if (flushed > 0) {
7664             ALOGV("Input standby flushed PipeSource %zd frames", flushed);
7665             mTimestamp.mPosition[ExtendedTimestamp::LOCATION_SERVER] += flushed;
7666             mTimestamp.mTimeNs[ExtendedTimestamp::LOCATION_SERVER] = systemTime();
7667         }
7668     }
7669 }
7670 
7671 // RecordThread::createRecordTrack_l() must be called with AudioFlinger::mLock held
createRecordTrack_l(const sp<AudioFlinger::Client> & client,const audio_attributes_t & attr,uint32_t * pSampleRate,audio_format_t format,audio_channel_mask_t channelMask,size_t * pFrameCount,audio_session_t sessionId,size_t * pNotificationFrameCount,pid_t creatorPid,uid_t uid,audio_input_flags_t * flags,pid_t tid,status_t * status,audio_port_handle_t portId,const String16 & opPackageName)7672 sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createRecordTrack_l(
7673         const sp<AudioFlinger::Client>& client,
7674         const audio_attributes_t& attr,
7675         uint32_t *pSampleRate,
7676         audio_format_t format,
7677         audio_channel_mask_t channelMask,
7678         size_t *pFrameCount,
7679         audio_session_t sessionId,
7680         size_t *pNotificationFrameCount,
7681         pid_t creatorPid,
7682         uid_t uid,
7683         audio_input_flags_t *flags,
7684         pid_t tid,
7685         status_t *status,
7686         audio_port_handle_t portId,
7687         const String16& opPackageName)
7688 {
7689     size_t frameCount = *pFrameCount;
7690     size_t notificationFrameCount = *pNotificationFrameCount;
7691     sp<RecordTrack> track;
7692     status_t lStatus;
7693     audio_input_flags_t inputFlags = mInput->flags;
7694     audio_input_flags_t requestedFlags = *flags;
7695     uint32_t sampleRate;
7696 
7697     lStatus = initCheck();
7698     if (lStatus != NO_ERROR) {
7699         ALOGE("createRecordTrack_l() audio driver not initialized");
7700         goto Exit;
7701     }
7702 
7703     if (!audio_is_linear_pcm(mFormat) && (*flags & AUDIO_INPUT_FLAG_DIRECT) == 0) {
7704         ALOGE("createRecordTrack_l() on an encoded stream requires AUDIO_INPUT_FLAG_DIRECT");
7705         lStatus = BAD_VALUE;
7706         goto Exit;
7707     }
7708 
7709     if (*pSampleRate == 0) {
7710         *pSampleRate = mSampleRate;
7711     }
7712     sampleRate = *pSampleRate;
7713 
7714     // special case for FAST flag considered OK if fast capture is present
7715     if (hasFastCapture()) {
7716         inputFlags = (audio_input_flags_t)(inputFlags | AUDIO_INPUT_FLAG_FAST);
7717     }
7718 
7719     // Check if requested flags are compatible with input stream flags
7720     if ((*flags & inputFlags) != *flags) {
7721         ALOGW("createRecordTrack_l(): mismatch between requested flags (%08x) and"
7722                 " input flags (%08x)",
7723               *flags, inputFlags);
7724         *flags = (audio_input_flags_t)(*flags & inputFlags);
7725     }
7726 
7727     // client expresses a preference for FAST, but we get the final say
7728     if (*flags & AUDIO_INPUT_FLAG_FAST) {
7729       if (
7730             // we formerly checked for a callback handler (non-0 tid),
7731             // but that is no longer required for TRANSFER_OBTAIN mode
7732             //
7733             // Frame count is not specified (0), or is less than or equal the pipe depth.
7734             // It is OK to provide a higher capacity than requested.
7735             // We will force it to mPipeFramesP2 below.
7736             (frameCount <= mPipeFramesP2) &&
7737             // PCM data
7738             audio_is_linear_pcm(format) &&
7739             // hardware format
7740             (format == mFormat) &&
7741             // hardware channel mask
7742             (channelMask == mChannelMask) &&
7743             // hardware sample rate
7744             (sampleRate == mSampleRate) &&
7745             // record thread has an associated fast capture
7746             hasFastCapture() &&
7747             // there are sufficient fast track slots available
7748             mFastTrackAvail
7749         ) {
7750           // check compatibility with audio effects.
7751           Mutex::Autolock _l(mLock);
7752           // Do not accept FAST flag if the session has software effects
7753           sp<EffectChain> chain = getEffectChain_l(sessionId);
7754           if (chain != 0) {
7755               audio_input_flags_t old = *flags;
7756               chain->checkInputFlagCompatibility(flags);
7757               if (old != *flags) {
7758                   ALOGV("%p AUDIO_INPUT_FLAGS denied by effect old=%#x new=%#x",
7759                           this, (int)old, (int)*flags);
7760               }
7761           }
7762           ALOGV_IF((*flags & AUDIO_INPUT_FLAG_FAST) != 0,
7763                    "%p AUDIO_INPUT_FLAG_FAST accepted: frameCount=%zu mFrameCount=%zu",
7764                    this, frameCount, mFrameCount);
7765       } else {
7766         ALOGV("%p AUDIO_INPUT_FLAG_FAST denied: frameCount=%zu mFrameCount=%zu mPipeFramesP2=%zu "
7767                 "format=%#x isLinear=%d mFormat=%#x channelMask=%#x sampleRate=%u mSampleRate=%u "
7768                 "hasFastCapture=%d tid=%d mFastTrackAvail=%d",
7769                 this, frameCount, mFrameCount, mPipeFramesP2,
7770                 format, audio_is_linear_pcm(format), mFormat, channelMask, sampleRate, mSampleRate,
7771                 hasFastCapture(), tid, mFastTrackAvail);
7772         *flags = (audio_input_flags_t)(*flags & ~AUDIO_INPUT_FLAG_FAST);
7773       }
7774     }
7775 
7776     // If FAST or RAW flags were corrected, ask caller to request new input from audio policy
7777     if ((*flags & AUDIO_INPUT_FLAG_FAST) !=
7778             (requestedFlags & AUDIO_INPUT_FLAG_FAST)) {
7779         *flags = (audio_input_flags_t) (*flags & ~(AUDIO_INPUT_FLAG_FAST | AUDIO_INPUT_FLAG_RAW));
7780         lStatus = BAD_TYPE;
7781         goto Exit;
7782     }
7783 
7784     // compute track buffer size in frames, and suggest the notification frame count
7785     if (*flags & AUDIO_INPUT_FLAG_FAST) {
7786         // fast track: frame count is exactly the pipe depth
7787         frameCount = mPipeFramesP2;
7788         // ignore requested notificationFrames, and always notify exactly once every HAL buffer
7789         notificationFrameCount = mFrameCount;
7790     } else {
7791         // not fast track: max notification period is resampled equivalent of one HAL buffer time
7792         //                 or 20 ms if there is a fast capture
7793         // TODO This could be a roundupRatio inline, and const
7794         size_t maxNotificationFrames = ((int64_t) (hasFastCapture() ? mSampleRate/50 : mFrameCount)
7795                 * sampleRate + mSampleRate - 1) / mSampleRate;
7796         // minimum number of notification periods is at least kMinNotifications,
7797         // and at least kMinMs rounded up to a whole notification period (minNotificationsByMs)
7798         static const size_t kMinNotifications = 3;
7799         static const uint32_t kMinMs = 30;
7800         // TODO This could be a roundupRatio inline
7801         const size_t minFramesByMs = (sampleRate * kMinMs + 1000 - 1) / 1000;
7802         // TODO This could be a roundupRatio inline
7803         const size_t minNotificationsByMs = (minFramesByMs + maxNotificationFrames - 1) /
7804                 maxNotificationFrames;
7805         const size_t minFrameCount = maxNotificationFrames *
7806                 max(kMinNotifications, minNotificationsByMs);
7807         frameCount = max(frameCount, minFrameCount);
7808         if (notificationFrameCount == 0 || notificationFrameCount > maxNotificationFrames) {
7809             notificationFrameCount = maxNotificationFrames;
7810         }
7811     }
7812     *pFrameCount = frameCount;
7813     *pNotificationFrameCount = notificationFrameCount;
7814 
7815     { // scope for mLock
7816         Mutex::Autolock _l(mLock);
7817 
7818         track = new RecordTrack(this, client, attr, sampleRate,
7819                       format, channelMask, frameCount,
7820                       nullptr /* buffer */, (size_t)0 /* bufferSize */, sessionId, creatorPid, uid,
7821                       *flags, TrackBase::TYPE_DEFAULT, opPackageName, portId);
7822 
7823         lStatus = track->initCheck();
7824         if (lStatus != NO_ERROR) {
7825             ALOGE("createRecordTrack_l() initCheck failed %d; no control block?", lStatus);
7826             // track must be cleared from the caller as the caller has the AF lock
7827             goto Exit;
7828         }
7829         mTracks.add(track);
7830 
7831         if ((*flags & AUDIO_INPUT_FLAG_FAST) && (tid != -1)) {
7832             pid_t callingPid = IPCThreadState::self()->getCallingPid();
7833             // we don't have CAP_SYS_NICE, nor do we want to have it as it's too powerful,
7834             // so ask activity manager to do this on our behalf
7835             sendPrioConfigEvent_l(callingPid, tid, kPriorityAudioApp, true /*forApp*/);
7836         }
7837     }
7838 
7839     lStatus = NO_ERROR;
7840 
7841 Exit:
7842     *status = lStatus;
7843     return track;
7844 }
7845 
start(RecordThread::RecordTrack * recordTrack,AudioSystem::sync_event_t event,audio_session_t triggerSession)7846 status_t AudioFlinger::RecordThread::start(RecordThread::RecordTrack* recordTrack,
7847                                            AudioSystem::sync_event_t event,
7848                                            audio_session_t triggerSession)
7849 {
7850     ALOGV("RecordThread::start event %d, triggerSession %d", event, triggerSession);
7851     sp<ThreadBase> strongMe = this;
7852     status_t status = NO_ERROR;
7853 
7854     if (event == AudioSystem::SYNC_EVENT_NONE) {
7855         recordTrack->clearSyncStartEvent();
7856     } else if (event != AudioSystem::SYNC_EVENT_SAME) {
7857         recordTrack->mSyncStartEvent = mAudioFlinger->createSyncEvent(event,
7858                                        triggerSession,
7859                                        recordTrack->sessionId(),
7860                                        syncStartEventCallback,
7861                                        recordTrack);
7862         // Sync event can be cancelled by the trigger session if the track is not in a
7863         // compatible state in which case we start record immediately
7864         if (recordTrack->mSyncStartEvent->isCancelled()) {
7865             recordTrack->clearSyncStartEvent();
7866         } else {
7867             // do not wait for the event for more than AudioSystem::kSyncRecordStartTimeOutMs
7868             recordTrack->mFramesToDrop = -(ssize_t)
7869                     ((AudioSystem::kSyncRecordStartTimeOutMs * recordTrack->mSampleRate) / 1000);
7870         }
7871     }
7872 
7873     {
7874         // This section is a rendezvous between binder thread executing start() and RecordThread
7875         AutoMutex lock(mLock);
7876         if (recordTrack->isInvalid()) {
7877             recordTrack->clearSyncStartEvent();
7878             ALOGW("%s track %d: invalidated before startInput", __func__, recordTrack->portId());
7879             return DEAD_OBJECT;
7880         }
7881         if (mActiveTracks.indexOf(recordTrack) >= 0) {
7882             if (recordTrack->mState == TrackBase::PAUSING) {
7883                 // We haven't stopped yet (moved to PAUSED and not in mActiveTracks)
7884                 // so no need to startInput().
7885                 ALOGV("active record track PAUSING -> ACTIVE");
7886                 recordTrack->mState = TrackBase::ACTIVE;
7887             } else {
7888                 ALOGV("active record track state %d", recordTrack->mState);
7889             }
7890             return status;
7891         }
7892 
7893         // TODO consider other ways of handling this, such as changing the state to :STARTING and
7894         //      adding the track to mActiveTracks after returning from AudioSystem::startInput(),
7895         //      or using a separate command thread
7896         recordTrack->mState = TrackBase::STARTING_1;
7897         mActiveTracks.add(recordTrack);
7898         status_t status = NO_ERROR;
7899         if (recordTrack->isExternalTrack()) {
7900             mLock.unlock();
7901             status = AudioSystem::startInput(recordTrack->portId());
7902             mLock.lock();
7903             if (recordTrack->isInvalid()) {
7904                 recordTrack->clearSyncStartEvent();
7905                 if (status == NO_ERROR && recordTrack->mState == TrackBase::STARTING_1) {
7906                     recordTrack->mState = TrackBase::STARTING_2;
7907                     // STARTING_2 forces destroy to call stopInput.
7908                 }
7909                 ALOGW("%s track %d: invalidated after startInput", __func__, recordTrack->portId());
7910                 return DEAD_OBJECT;
7911             }
7912             if (recordTrack->mState != TrackBase::STARTING_1) {
7913                 ALOGW("%s(%d): unsynchronized mState:%d change",
7914                     __func__, recordTrack->id(), recordTrack->mState);
7915                 // Someone else has changed state, let them take over,
7916                 // leave mState in the new state.
7917                 recordTrack->clearSyncStartEvent();
7918                 return INVALID_OPERATION;
7919             }
7920             // we're ok, but perhaps startInput has failed
7921             if (status != NO_ERROR) {
7922                 ALOGW("%s(%d): startInput failed, status %d",
7923                     __func__, recordTrack->id(), status);
7924                 // We are in ActiveTracks if STARTING_1 and valid, so remove from ActiveTracks,
7925                 // leave in STARTING_1, so destroy() will not call stopInput.
7926                 mActiveTracks.remove(recordTrack);
7927                 recordTrack->clearSyncStartEvent();
7928                 return status;
7929             }
7930             sendIoConfigEvent_l(
7931                 AUDIO_CLIENT_STARTED, recordTrack->creatorPid(), recordTrack->portId());
7932         }
7933 
7934         recordTrack->logBeginInterval(patchSourcesToString(&mPatch)); // log to MediaMetrics
7935 
7936         // Catch up with current buffer indices if thread is already running.
7937         // This is what makes a new client discard all buffered data.  If the track's mRsmpInFront
7938         // was initialized to some value closer to the thread's mRsmpInFront, then the track could
7939         // see previously buffered data before it called start(), but with greater risk of overrun.
7940 
7941         recordTrack->mResamplerBufferProvider->reset();
7942         if (!recordTrack->isDirect()) {
7943             // clear any converter state as new data will be discontinuous
7944             recordTrack->mRecordBufferConverter->reset();
7945         }
7946         recordTrack->mState = TrackBase::STARTING_2;
7947         // signal thread to start
7948         mWaitWorkCV.broadcast();
7949         return status;
7950     }
7951 }
7952 
syncStartEventCallback(const wp<SyncEvent> & event)7953 void AudioFlinger::RecordThread::syncStartEventCallback(const wp<SyncEvent>& event)
7954 {
7955     sp<SyncEvent> strongEvent = event.promote();
7956 
7957     if (strongEvent != 0) {
7958         sp<RefBase> ptr = strongEvent->cookie().promote();
7959         if (ptr != 0) {
7960             RecordTrack *recordTrack = (RecordTrack *)ptr.get();
7961             recordTrack->handleSyncStartEvent(strongEvent);
7962         }
7963     }
7964 }
7965 
stop(RecordThread::RecordTrack * recordTrack)7966 bool AudioFlinger::RecordThread::stop(RecordThread::RecordTrack* recordTrack) {
7967     ALOGV("RecordThread::stop");
7968     AutoMutex _l(mLock);
7969     // if we're invalid, we can't be on the ActiveTracks.
7970     if (mActiveTracks.indexOf(recordTrack) < 0 || recordTrack->mState == TrackBase::PAUSING) {
7971         return false;
7972     }
7973     // note that threadLoop may still be processing the track at this point [without lock]
7974     recordTrack->mState = TrackBase::PAUSING;
7975 
7976     // NOTE: Waiting here is important to keep stop synchronous.
7977     // This is needed for proper patchRecord peer release.
7978     while (recordTrack->mState == TrackBase::PAUSING && !recordTrack->isInvalid()) {
7979         mWaitWorkCV.broadcast(); // signal thread to stop
7980         mStartStopCond.wait(mLock);
7981     }
7982 
7983     if (recordTrack->mState == TrackBase::PAUSED) { // successful stop
7984         ALOGV("Record stopped OK");
7985         return true;
7986     }
7987 
7988     // don't handle anything - we've been invalidated or restarted and in a different state
7989     ALOGW_IF("%s(%d): unsynchronized stop, state: %d",
7990             __func__, recordTrack->id(), recordTrack->mState);
7991     return false;
7992 }
7993 
isValidSyncEvent(const sp<SyncEvent> & event __unused) const7994 bool AudioFlinger::RecordThread::isValidSyncEvent(const sp<SyncEvent>& event __unused) const
7995 {
7996     return false;
7997 }
7998 
setSyncEvent(const sp<SyncEvent> & event __unused)7999 status_t AudioFlinger::RecordThread::setSyncEvent(const sp<SyncEvent>& event __unused)
8000 {
8001 #if 0   // This branch is currently dead code, but is preserved in case it will be needed in future
8002     if (!isValidSyncEvent(event)) {
8003         return BAD_VALUE;
8004     }
8005 
8006     audio_session_t eventSession = event->triggerSession();
8007     status_t ret = NAME_NOT_FOUND;
8008 
8009     Mutex::Autolock _l(mLock);
8010 
8011     for (size_t i = 0; i < mTracks.size(); i++) {
8012         sp<RecordTrack> track = mTracks[i];
8013         if (eventSession == track->sessionId()) {
8014             (void) track->setSyncEvent(event);
8015             ret = NO_ERROR;
8016         }
8017     }
8018     return ret;
8019 #else
8020     return BAD_VALUE;
8021 #endif
8022 }
8023 
getActiveMicrophones(std::vector<media::MicrophoneInfo> * activeMicrophones)8024 status_t AudioFlinger::RecordThread::getActiveMicrophones(
8025         std::vector<media::MicrophoneInfo>* activeMicrophones)
8026 {
8027     ALOGV("RecordThread::getActiveMicrophones");
8028     AutoMutex _l(mLock);
8029     status_t status = mInput->stream->getActiveMicrophones(activeMicrophones);
8030     return status;
8031 }
8032 
setPreferredMicrophoneDirection(audio_microphone_direction_t direction)8033 status_t AudioFlinger::RecordThread::setPreferredMicrophoneDirection(
8034             audio_microphone_direction_t direction)
8035 {
8036     ALOGV("setPreferredMicrophoneDirection(%d)", direction);
8037     AutoMutex _l(mLock);
8038     return mInput->stream->setPreferredMicrophoneDirection(direction);
8039 }
8040 
setPreferredMicrophoneFieldDimension(float zoom)8041 status_t AudioFlinger::RecordThread::setPreferredMicrophoneFieldDimension(float zoom)
8042 {
8043     ALOGV("setPreferredMicrophoneFieldDimension(%f)", zoom);
8044     AutoMutex _l(mLock);
8045     return mInput->stream->setPreferredMicrophoneFieldDimension(zoom);
8046 }
8047 
updateMetadata_l()8048 void AudioFlinger::RecordThread::updateMetadata_l()
8049 {
8050     if (mInput == nullptr || mInput->stream == nullptr ||
8051             !mActiveTracks.readAndClearHasChanged()) {
8052         return;
8053     }
8054     StreamInHalInterface::SinkMetadata metadata;
8055     for (const sp<RecordTrack> &track : mActiveTracks) {
8056         // No track is invalid as this is called after prepareTrack_l in the same critical section
8057         metadata.tracks.push_back({
8058                 .source = track->attributes().source,
8059                 .gain = 1, // capture tracks do not have volumes
8060         });
8061     }
8062     mInput->stream->updateSinkMetadata(metadata);
8063 }
8064 
8065 // destroyTrack_l() must be called with ThreadBase::mLock held
destroyTrack_l(const sp<RecordTrack> & track)8066 void AudioFlinger::RecordThread::destroyTrack_l(const sp<RecordTrack>& track)
8067 {
8068     track->terminate();
8069     track->mState = TrackBase::STOPPED;
8070     // active tracks are removed by threadLoop()
8071     if (mActiveTracks.indexOf(track) < 0) {
8072         removeTrack_l(track);
8073     }
8074 }
8075 
removeTrack_l(const sp<RecordTrack> & track)8076 void AudioFlinger::RecordThread::removeTrack_l(const sp<RecordTrack>& track)
8077 {
8078     String8 result;
8079     track->appendDump(result, false /* active */);
8080     mLocalLog.log("removeTrack_l (%p) %s", track.get(), result.string());
8081 
8082     mTracks.remove(track);
8083     // need anything related to effects here?
8084     if (track->isFastTrack()) {
8085         ALOG_ASSERT(!mFastTrackAvail);
8086         mFastTrackAvail = true;
8087     }
8088 }
8089 
dumpInternals_l(int fd,const Vector<String16> & args __unused)8090 void AudioFlinger::RecordThread::dumpInternals_l(int fd, const Vector<String16>& args __unused)
8091 {
8092     AudioStreamIn *input = mInput;
8093     audio_input_flags_t flags = input != NULL ? input->flags : AUDIO_INPUT_FLAG_NONE;
8094     dprintf(fd, "  AudioStreamIn: %p flags %#x (%s)\n",
8095             input, flags, toString(flags).c_str());
8096     dprintf(fd, "  Frames read: %lld\n", (long long)mFramesRead);
8097     if (mActiveTracks.isEmpty()) {
8098         dprintf(fd, "  No active record clients\n");
8099     }
8100 
8101     if (input != nullptr) {
8102         dprintf(fd, "  Hal stream dump:\n");
8103         (void)input->stream->dump(fd);
8104     }
8105 
8106     dprintf(fd, "  Fast capture thread: %s\n", hasFastCapture() ? "yes" : "no");
8107     dprintf(fd, "  Fast track available: %s\n", mFastTrackAvail ? "yes" : "no");
8108 
8109     // Make a non-atomic copy of fast capture dump state so it won't change underneath us
8110     // while we are dumping it.  It may be inconsistent, but it won't mutate!
8111     // This is a large object so we place it on the heap.
8112     // FIXME 25972958: Need an intelligent copy constructor that does not touch unused pages.
8113     const std::unique_ptr<FastCaptureDumpState> copy =
8114             std::make_unique<FastCaptureDumpState>(mFastCaptureDumpState);
8115     copy->dump(fd);
8116 }
8117 
dumpTracks_l(int fd,const Vector<String16> & args __unused)8118 void AudioFlinger::RecordThread::dumpTracks_l(int fd, const Vector<String16>& args __unused)
8119 {
8120     String8 result;
8121     size_t numtracks = mTracks.size();
8122     size_t numactive = mActiveTracks.size();
8123     size_t numactiveseen = 0;
8124     dprintf(fd, "  %zu Tracks", numtracks);
8125     const char *prefix = "    ";
8126     if (numtracks) {
8127         dprintf(fd, " of which %zu are active\n", numactive);
8128         result.append(prefix);
8129         mTracks[0]->appendDumpHeader(result);
8130         for (size_t i = 0; i < numtracks ; ++i) {
8131             sp<RecordTrack> track = mTracks[i];
8132             if (track != 0) {
8133                 bool active = mActiveTracks.indexOf(track) >= 0;
8134                 if (active) {
8135                     numactiveseen++;
8136                 }
8137                 result.append(prefix);
8138                 track->appendDump(result, active);
8139             }
8140         }
8141     } else {
8142         dprintf(fd, "\n");
8143     }
8144 
8145     if (numactiveseen != numactive) {
8146         result.append("  The following tracks are in the active list but"
8147                 " not in the track list\n");
8148         result.append(prefix);
8149         mActiveTracks[0]->appendDumpHeader(result);
8150         for (size_t i = 0; i < numactive; ++i) {
8151             sp<RecordTrack> track = mActiveTracks[i];
8152             if (mTracks.indexOf(track) < 0) {
8153                 result.append(prefix);
8154                 track->appendDump(result, true /* active */);
8155             }
8156         }
8157 
8158     }
8159     write(fd, result.string(), result.size());
8160 }
8161 
setRecordSilenced(audio_port_handle_t portId,bool silenced)8162 void AudioFlinger::RecordThread::setRecordSilenced(audio_port_handle_t portId, bool silenced)
8163 {
8164     Mutex::Autolock _l(mLock);
8165     for (size_t i = 0; i < mTracks.size() ; i++) {
8166         sp<RecordTrack> track = mTracks[i];
8167         if (track != 0 && track->portId() == portId) {
8168             track->setSilenced(silenced);
8169         }
8170     }
8171 }
8172 
reset()8173 void AudioFlinger::RecordThread::ResamplerBufferProvider::reset()
8174 {
8175     sp<ThreadBase> threadBase = mRecordTrack->mThread.promote();
8176     RecordThread *recordThread = (RecordThread *) threadBase.get();
8177     mRsmpInFront = recordThread->mRsmpInRear;
8178     mRsmpInUnrel = 0;
8179 }
8180 
sync(size_t * framesAvailable,bool * hasOverrun)8181 void AudioFlinger::RecordThread::ResamplerBufferProvider::sync(
8182         size_t *framesAvailable, bool *hasOverrun)
8183 {
8184     sp<ThreadBase> threadBase = mRecordTrack->mThread.promote();
8185     RecordThread *recordThread = (RecordThread *) threadBase.get();
8186     const int32_t rear = recordThread->mRsmpInRear;
8187     const int32_t front = mRsmpInFront;
8188     const ssize_t filled = audio_utils::safe_sub_overflow(rear, front);
8189 
8190     size_t framesIn;
8191     bool overrun = false;
8192     if (filled < 0) {
8193         // should not happen, but treat like a massive overrun and re-sync
8194         framesIn = 0;
8195         mRsmpInFront = rear;
8196         overrun = true;
8197     } else if ((size_t) filled <= recordThread->mRsmpInFrames) {
8198         framesIn = (size_t) filled;
8199     } else {
8200         // client is not keeping up with server, but give it latest data
8201         framesIn = recordThread->mRsmpInFrames;
8202         mRsmpInFront = /* front = */ audio_utils::safe_sub_overflow(
8203                 rear, static_cast<int32_t>(framesIn));
8204         overrun = true;
8205     }
8206     if (framesAvailable != NULL) {
8207         *framesAvailable = framesIn;
8208     }
8209     if (hasOverrun != NULL) {
8210         *hasOverrun = overrun;
8211     }
8212 }
8213 
8214 // AudioBufferProvider interface
getNextBuffer(AudioBufferProvider::Buffer * buffer)8215 status_t AudioFlinger::RecordThread::ResamplerBufferProvider::getNextBuffer(
8216         AudioBufferProvider::Buffer* buffer)
8217 {
8218     sp<ThreadBase> threadBase = mRecordTrack->mThread.promote();
8219     if (threadBase == 0) {
8220         buffer->frameCount = 0;
8221         buffer->raw = NULL;
8222         return NOT_ENOUGH_DATA;
8223     }
8224     RecordThread *recordThread = (RecordThread *) threadBase.get();
8225     int32_t rear = recordThread->mRsmpInRear;
8226     int32_t front = mRsmpInFront;
8227     ssize_t filled = audio_utils::safe_sub_overflow(rear, front);
8228     // FIXME should not be P2 (don't want to increase latency)
8229     // FIXME if client not keeping up, discard
8230     LOG_ALWAYS_FATAL_IF(!(0 <= filled && (size_t) filled <= recordThread->mRsmpInFrames));
8231     // 'filled' may be non-contiguous, so return only the first contiguous chunk
8232     front &= recordThread->mRsmpInFramesP2 - 1;
8233     size_t part1 = recordThread->mRsmpInFramesP2 - front;
8234     if (part1 > (size_t) filled) {
8235         part1 = filled;
8236     }
8237     size_t ask = buffer->frameCount;
8238     ALOG_ASSERT(ask > 0);
8239     if (part1 > ask) {
8240         part1 = ask;
8241     }
8242     if (part1 == 0) {
8243         // out of data is fine since the resampler will return a short-count.
8244         buffer->raw = NULL;
8245         buffer->frameCount = 0;
8246         mRsmpInUnrel = 0;
8247         return NOT_ENOUGH_DATA;
8248     }
8249 
8250     buffer->raw = (uint8_t*)recordThread->mRsmpInBuffer + front * recordThread->mFrameSize;
8251     buffer->frameCount = part1;
8252     mRsmpInUnrel = part1;
8253     return NO_ERROR;
8254 }
8255 
8256 // AudioBufferProvider interface
releaseBuffer(AudioBufferProvider::Buffer * buffer)8257 void AudioFlinger::RecordThread::ResamplerBufferProvider::releaseBuffer(
8258         AudioBufferProvider::Buffer* buffer)
8259 {
8260     int32_t stepCount = static_cast<int32_t>(buffer->frameCount);
8261     if (stepCount == 0) {
8262         return;
8263     }
8264     ALOG_ASSERT(stepCount <= mRsmpInUnrel);
8265     mRsmpInUnrel -= stepCount;
8266     mRsmpInFront = audio_utils::safe_add_overflow(mRsmpInFront, stepCount);
8267     buffer->raw = NULL;
8268     buffer->frameCount = 0;
8269 }
8270 
checkBtNrec()8271 void AudioFlinger::RecordThread::checkBtNrec()
8272 {
8273     Mutex::Autolock _l(mLock);
8274     checkBtNrec_l();
8275 }
8276 
checkBtNrec_l()8277 void AudioFlinger::RecordThread::checkBtNrec_l()
8278 {
8279     // disable AEC and NS if the device is a BT SCO headset supporting those
8280     // pre processings
8281     bool suspend = audio_is_bluetooth_sco_device(inDeviceType()) &&
8282                         mAudioFlinger->btNrecIsOff();
8283     if (mBtNrecSuspended.exchange(suspend) != suspend) {
8284         for (size_t i = 0; i < mEffectChains.size(); i++) {
8285             setEffectSuspended_l(FX_IID_AEC, suspend, mEffectChains[i]->sessionId());
8286             setEffectSuspended_l(FX_IID_NS, suspend, mEffectChains[i]->sessionId());
8287         }
8288     }
8289 }
8290 
8291 
checkForNewParameter_l(const String8 & keyValuePair,status_t & status)8292 bool AudioFlinger::RecordThread::checkForNewParameter_l(const String8& keyValuePair,
8293                                                         status_t& status)
8294 {
8295     bool reconfig = false;
8296 
8297     status = NO_ERROR;
8298 
8299     audio_format_t reqFormat = mFormat;
8300     uint32_t samplingRate = mSampleRate;
8301     // TODO this may change if we want to support capture from HDMI PCM multi channel (e.g on TVs).
8302     audio_channel_mask_t channelMask = audio_channel_in_mask_from_count(mChannelCount);
8303 
8304     AudioParameter param = AudioParameter(keyValuePair);
8305     int value;
8306 
8307     // scope for AutoPark extends to end of method
8308     AutoPark<FastCapture> park(mFastCapture);
8309 
8310     // TODO Investigate when this code runs. Check with audio policy when a sample rate and
8311     //      channel count change can be requested. Do we mandate the first client defines the
8312     //      HAL sampling rate and channel count or do we allow changes on the fly?
8313     if (param.getInt(String8(AudioParameter::keySamplingRate), value) == NO_ERROR) {
8314         samplingRate = value;
8315         reconfig = true;
8316     }
8317     if (param.getInt(String8(AudioParameter::keyFormat), value) == NO_ERROR) {
8318         if (!audio_is_linear_pcm((audio_format_t) value)) {
8319             status = BAD_VALUE;
8320         } else {
8321             reqFormat = (audio_format_t) value;
8322             reconfig = true;
8323         }
8324     }
8325     if (param.getInt(String8(AudioParameter::keyChannels), value) == NO_ERROR) {
8326         audio_channel_mask_t mask = (audio_channel_mask_t) value;
8327         if (!audio_is_input_channel(mask) ||
8328                 audio_channel_count_from_in_mask(mask) > FCC_8) {
8329             status = BAD_VALUE;
8330         } else {
8331             channelMask = mask;
8332             reconfig = true;
8333         }
8334     }
8335     if (param.getInt(String8(AudioParameter::keyFrameCount), value) == NO_ERROR) {
8336         // do not accept frame count changes if tracks are open as the track buffer
8337         // size depends on frame count and correct behavior would not be guaranteed
8338         // if frame count is changed after track creation
8339         if (mActiveTracks.size() > 0) {
8340             status = INVALID_OPERATION;
8341         } else {
8342             reconfig = true;
8343         }
8344     }
8345     if (param.getInt(String8(AudioParameter::keyRouting), value) == NO_ERROR) {
8346         LOG_FATAL("Should not set routing device in RecordThread");
8347     }
8348     if (param.getInt(String8(AudioParameter::keyInputSource), value) == NO_ERROR &&
8349             mAudioSource != (audio_source_t)value) {
8350         LOG_FATAL("Should not set audio source in RecordThread");
8351     }
8352 
8353     if (status == NO_ERROR) {
8354         status = mInput->stream->setParameters(keyValuePair);
8355         if (status == INVALID_OPERATION) {
8356             inputStandBy();
8357             status = mInput->stream->setParameters(keyValuePair);
8358         }
8359         if (reconfig) {
8360             if (status == BAD_VALUE) {
8361                 uint32_t sRate;
8362                 audio_channel_mask_t channelMask;
8363                 audio_format_t format;
8364                 if (mInput->stream->getAudioProperties(&sRate, &channelMask, &format) == OK &&
8365                         audio_is_linear_pcm(format) && audio_is_linear_pcm(reqFormat) &&
8366                         sRate <= (AUDIO_RESAMPLER_DOWN_RATIO_MAX * samplingRate) &&
8367                         audio_channel_count_from_in_mask(channelMask) <= FCC_8) {
8368                     status = NO_ERROR;
8369                 }
8370             }
8371             if (status == NO_ERROR) {
8372                 readInputParameters_l();
8373                 sendIoConfigEvent_l(AUDIO_INPUT_CONFIG_CHANGED);
8374             }
8375         }
8376     }
8377 
8378     return reconfig;
8379 }
8380 
getParameters(const String8 & keys)8381 String8 AudioFlinger::RecordThread::getParameters(const String8& keys)
8382 {
8383     Mutex::Autolock _l(mLock);
8384     if (initCheck() == NO_ERROR) {
8385         String8 out_s8;
8386         if (mInput->stream->getParameters(keys, &out_s8) == OK) {
8387             return out_s8;
8388         }
8389     }
8390     return String8();
8391 }
8392 
ioConfigChanged(audio_io_config_event event,pid_t pid,audio_port_handle_t portId)8393 void AudioFlinger::RecordThread::ioConfigChanged(audio_io_config_event event, pid_t pid,
8394                                                  audio_port_handle_t portId) {
8395     sp<AudioIoDescriptor> desc = new AudioIoDescriptor();
8396 
8397     desc->mIoHandle = mId;
8398 
8399     switch (event) {
8400     case AUDIO_INPUT_OPENED:
8401     case AUDIO_INPUT_REGISTERED:
8402     case AUDIO_INPUT_CONFIG_CHANGED:
8403         desc->mPatch = mPatch;
8404         desc->mChannelMask = mChannelMask;
8405         desc->mSamplingRate = mSampleRate;
8406         desc->mFormat = mFormat;
8407         desc->mFrameCount = mFrameCount;
8408         desc->mFrameCountHAL = mFrameCount;
8409         desc->mLatency = 0;
8410         break;
8411     case AUDIO_CLIENT_STARTED:
8412         desc->mPatch = mPatch;
8413         desc->mPortId = portId;
8414         break;
8415     case AUDIO_INPUT_CLOSED:
8416     default:
8417         break;
8418     }
8419     mAudioFlinger->ioConfigChanged(event, desc, pid);
8420 }
8421 
readInputParameters_l()8422 void AudioFlinger::RecordThread::readInputParameters_l()
8423 {
8424     status_t result = mInput->stream->getAudioProperties(&mSampleRate, &mChannelMask, &mHALFormat);
8425     LOG_ALWAYS_FATAL_IF(result != OK, "Error retrieving audio properties from HAL: %d", result);
8426     mFormat = mHALFormat;
8427     mChannelCount = audio_channel_count_from_in_mask(mChannelMask);
8428     if (audio_is_linear_pcm(mFormat)) {
8429         LOG_ALWAYS_FATAL_IF(mChannelCount > FCC_8, "HAL channel count %d > %d",
8430                 mChannelCount, FCC_8);
8431     } else {
8432         // Can have more that FCC_8 channels in encoded streams.
8433         ALOGI("HAL format %#x is not linear pcm", mFormat);
8434     }
8435     result = mInput->stream->getFrameSize(&mFrameSize);
8436     LOG_ALWAYS_FATAL_IF(result != OK, "Error retrieving frame size from HAL: %d", result);
8437     LOG_ALWAYS_FATAL_IF(mFrameSize <= 0, "Error frame size was %zu but must be greater than zero",
8438             mFrameSize);
8439     result = mInput->stream->getBufferSize(&mBufferSize);
8440     LOG_ALWAYS_FATAL_IF(result != OK, "Error retrieving buffer size from HAL: %d", result);
8441     mFrameCount = mBufferSize / mFrameSize;
8442     ALOGV("%p RecordThread params: mChannelCount=%u, mFormat=%#x, mFrameSize=%zu, "
8443             "mBufferSize=%zu, mFrameCount=%zu",
8444             this, mChannelCount, mFormat, mFrameSize, mBufferSize, mFrameCount);
8445     // This is the formula for calculating the temporary buffer size.
8446     // With 7 HAL buffers, we can guarantee ability to down-sample the input by ratio of 6:1 to
8447     // 1 full output buffer, regardless of the alignment of the available input.
8448     // The value is somewhat arbitrary, and could probably be even larger.
8449     // A larger value should allow more old data to be read after a track calls start(),
8450     // without increasing latency.
8451     //
8452     // Note this is independent of the maximum downsampling ratio permitted for capture.
8453     mRsmpInFrames = mFrameCount * 7;
8454     mRsmpInFramesP2 = roundup(mRsmpInFrames);
8455     free(mRsmpInBuffer);
8456     mRsmpInBuffer = NULL;
8457 
8458     // TODO optimize audio capture buffer sizes ...
8459     // Here we calculate the size of the sliding buffer used as a source
8460     // for resampling.  mRsmpInFramesP2 is currently roundup(mFrameCount * 7).
8461     // For current HAL frame counts, this is usually 2048 = 40 ms.  It would
8462     // be better to have it derived from the pipe depth in the long term.
8463     // The current value is higher than necessary.  However it should not add to latency.
8464 
8465     // Over-allocate beyond mRsmpInFramesP2 to permit a HAL read past end of buffer
8466     mRsmpInFramesOA = mRsmpInFramesP2 + mFrameCount - 1;
8467     (void)posix_memalign(&mRsmpInBuffer, 32, mRsmpInFramesOA * mFrameSize);
8468     // if posix_memalign fails, will segv here.
8469     memset(mRsmpInBuffer, 0, mRsmpInFramesOA * mFrameSize);
8470 
8471     // AudioRecord mSampleRate and mChannelCount are constant due to AudioRecord API constraints.
8472     // But if thread's mSampleRate or mChannelCount changes, how will that affect active tracks?
8473 
8474     audio_input_flags_t flags = mInput->flags;
8475     mediametrics::LogItem item(mThreadMetrics.getMetricsId());
8476     item.set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_READPARAMETERS)
8477         .set(AMEDIAMETRICS_PROP_ENCODING, formatToString(mFormat).c_str())
8478         .set(AMEDIAMETRICS_PROP_FLAGS, toString(flags).c_str())
8479         .set(AMEDIAMETRICS_PROP_SAMPLERATE, (int32_t)mSampleRate)
8480         .set(AMEDIAMETRICS_PROP_CHANNELMASK, (int32_t)mChannelMask)
8481         .set(AMEDIAMETRICS_PROP_CHANNELCOUNT, (int32_t)mChannelCount)
8482         .set(AMEDIAMETRICS_PROP_FRAMECOUNT, (int32_t)mFrameCount)
8483         .record();
8484 }
8485 
getInputFramesLost()8486 uint32_t AudioFlinger::RecordThread::getInputFramesLost()
8487 {
8488     Mutex::Autolock _l(mLock);
8489     uint32_t result;
8490     if (initCheck() == NO_ERROR && mInput->stream->getInputFramesLost(&result) == OK) {
8491         return result;
8492     }
8493     return 0;
8494 }
8495 
sessionIds() const8496 KeyedVector<audio_session_t, bool> AudioFlinger::RecordThread::sessionIds() const
8497 {
8498     KeyedVector<audio_session_t, bool> ids;
8499     Mutex::Autolock _l(mLock);
8500     for (size_t j = 0; j < mTracks.size(); ++j) {
8501         sp<RecordThread::RecordTrack> track = mTracks[j];
8502         audio_session_t sessionId = track->sessionId();
8503         if (ids.indexOfKey(sessionId) < 0) {
8504             ids.add(sessionId, true);
8505         }
8506     }
8507     return ids;
8508 }
8509 
clearInput()8510 AudioFlinger::AudioStreamIn* AudioFlinger::RecordThread::clearInput()
8511 {
8512     Mutex::Autolock _l(mLock);
8513     AudioStreamIn *input = mInput;
8514     mInput = NULL;
8515     return input;
8516 }
8517 
8518 // this method must always be called either with ThreadBase mLock held or inside the thread loop
stream() const8519 sp<StreamHalInterface> AudioFlinger::RecordThread::stream() const
8520 {
8521     if (mInput == NULL) {
8522         return NULL;
8523     }
8524     return mInput->stream;
8525 }
8526 
addEffectChain_l(const sp<EffectChain> & chain)8527 status_t AudioFlinger::RecordThread::addEffectChain_l(const sp<EffectChain>& chain)
8528 {
8529     ALOGV("addEffectChain_l() %p on thread %p", chain.get(), this);
8530     chain->setThread(this);
8531     chain->setInBuffer(NULL);
8532     chain->setOutBuffer(NULL);
8533 
8534     checkSuspendOnAddEffectChain_l(chain);
8535 
8536     // make sure enabled pre processing effects state is communicated to the HAL as we
8537     // just moved them to a new input stream.
8538     chain->syncHalEffectsState();
8539 
8540     mEffectChains.add(chain);
8541 
8542     return NO_ERROR;
8543 }
8544 
removeEffectChain_l(const sp<EffectChain> & chain)8545 size_t AudioFlinger::RecordThread::removeEffectChain_l(const sp<EffectChain>& chain)
8546 {
8547     ALOGV("removeEffectChain_l() %p from thread %p", chain.get(), this);
8548 
8549     for (size_t i = 0; i < mEffectChains.size(); i++) {
8550         if (chain == mEffectChains[i]) {
8551             mEffectChains.removeAt(i);
8552             break;
8553         }
8554     }
8555     return mEffectChains.size();
8556 }
8557 
createAudioPatch_l(const struct audio_patch * patch,audio_patch_handle_t * handle)8558 status_t AudioFlinger::RecordThread::createAudioPatch_l(const struct audio_patch *patch,
8559                                                           audio_patch_handle_t *handle)
8560 {
8561     status_t status = NO_ERROR;
8562 
8563     // store new device and send to effects
8564     mInDeviceTypeAddr.mType = patch->sources[0].ext.device.type;
8565     mInDeviceTypeAddr.mAddress = patch->sources[0].ext.device.address;
8566     audio_port_handle_t deviceId = patch->sources[0].id;
8567     for (size_t i = 0; i < mEffectChains.size(); i++) {
8568         mEffectChains[i]->setInputDevice_l(inDeviceTypeAddr());
8569     }
8570 
8571     checkBtNrec_l();
8572 
8573     // store new source and send to effects
8574     if (mAudioSource != patch->sinks[0].ext.mix.usecase.source) {
8575         mAudioSource = patch->sinks[0].ext.mix.usecase.source;
8576         for (size_t i = 0; i < mEffectChains.size(); i++) {
8577             mEffectChains[i]->setAudioSource_l(mAudioSource);
8578         }
8579     }
8580 
8581     if (mInput->audioHwDev->supportsAudioPatches()) {
8582         sp<DeviceHalInterface> hwDevice = mInput->audioHwDev->hwDevice();
8583         status = hwDevice->createAudioPatch(patch->num_sources,
8584                                             patch->sources,
8585                                             patch->num_sinks,
8586                                             patch->sinks,
8587                                             handle);
8588     } else {
8589         char *address;
8590         if (strcmp(patch->sources[0].ext.device.address, "") != 0) {
8591             address = audio_device_address_to_parameter(
8592                                                 patch->sources[0].ext.device.type,
8593                                                 patch->sources[0].ext.device.address);
8594         } else {
8595             address = (char *)calloc(1, 1);
8596         }
8597         AudioParameter param = AudioParameter(String8(address));
8598         free(address);
8599         param.addInt(String8(AudioParameter::keyRouting),
8600                      (int)patch->sources[0].ext.device.type);
8601         param.addInt(String8(AudioParameter::keyInputSource),
8602                                          (int)patch->sinks[0].ext.mix.usecase.source);
8603         status = mInput->stream->setParameters(param.toString());
8604         *handle = AUDIO_PATCH_HANDLE_NONE;
8605     }
8606 
8607     if ((mPatch.num_sources == 0) || (mPatch.sources[0].id != deviceId)) {
8608         sendIoConfigEvent_l(AUDIO_INPUT_CONFIG_CHANGED);
8609         mPatch = *patch;
8610     }
8611 
8612     const std::string pathSourcesAsString = patchSourcesToString(patch);
8613     mThreadMetrics.logEndInterval();
8614     mThreadMetrics.logCreatePatch(pathSourcesAsString, /* outDevices */ {});
8615     mThreadMetrics.logBeginInterval();
8616     // also dispatch to active AudioRecords
8617     for (const auto &track : mActiveTracks) {
8618         track->logEndInterval();
8619         track->logBeginInterval(pathSourcesAsString);
8620     }
8621     return status;
8622 }
8623 
releaseAudioPatch_l(const audio_patch_handle_t handle)8624 status_t AudioFlinger::RecordThread::releaseAudioPatch_l(const audio_patch_handle_t handle)
8625 {
8626     status_t status = NO_ERROR;
8627 
8628     mPatch = audio_patch{};
8629     mInDeviceTypeAddr.reset();
8630 
8631     if (mInput->audioHwDev->supportsAudioPatches()) {
8632         sp<DeviceHalInterface> hwDevice = mInput->audioHwDev->hwDevice();
8633         status = hwDevice->releaseAudioPatch(handle);
8634     } else {
8635         AudioParameter param;
8636         param.addInt(String8(AudioParameter::keyRouting), 0);
8637         status = mInput->stream->setParameters(param.toString());
8638     }
8639     return status;
8640 }
8641 
updateOutDevices(const DeviceDescriptorBaseVector & outDevices)8642 void AudioFlinger::RecordThread::updateOutDevices(const DeviceDescriptorBaseVector& outDevices)
8643 {
8644     mOutDevices = outDevices;
8645     mOutDeviceTypeAddrs = deviceTypeAddrsFromDescriptors(mOutDevices);
8646     for (size_t i = 0; i < mEffectChains.size(); i++) {
8647         mEffectChains[i]->setDevices_l(outDeviceTypeAddrs());
8648     }
8649 }
8650 
addPatchTrack(const sp<PatchRecord> & record)8651 void AudioFlinger::RecordThread::addPatchTrack(const sp<PatchRecord>& record)
8652 {
8653     Mutex::Autolock _l(mLock);
8654     mTracks.add(record);
8655     if (record->getSource()) {
8656         mSource = record->getSource();
8657     }
8658 }
8659 
deletePatchTrack(const sp<PatchRecord> & record)8660 void AudioFlinger::RecordThread::deletePatchTrack(const sp<PatchRecord>& record)
8661 {
8662     Mutex::Autolock _l(mLock);
8663     if (mSource == record->getSource()) {
8664         mSource = mInput;
8665     }
8666     destroyTrack_l(record);
8667 }
8668 
toAudioPortConfig(struct audio_port_config * config)8669 void AudioFlinger::RecordThread::toAudioPortConfig(struct audio_port_config *config)
8670 {
8671     ThreadBase::toAudioPortConfig(config);
8672     config->role = AUDIO_PORT_ROLE_SINK;
8673     config->ext.mix.hw_module = mInput->audioHwDev->handle();
8674     config->ext.mix.usecase.source = mAudioSource;
8675     if (mInput && mInput->flags != AUDIO_INPUT_FLAG_NONE) {
8676         config->config_mask |= AUDIO_PORT_CONFIG_FLAGS;
8677         config->flags.input = mInput->flags;
8678     }
8679 }
8680 
8681 // ----------------------------------------------------------------------------
8682 //      Mmap
8683 // ----------------------------------------------------------------------------
8684 
MmapThreadHandle(const sp<MmapThread> & thread)8685 AudioFlinger::MmapThreadHandle::MmapThreadHandle(const sp<MmapThread>& thread)
8686     : mThread(thread)
8687 {
8688     assert(thread != 0); // thread must start non-null and stay non-null
8689 }
8690 
~MmapThreadHandle()8691 AudioFlinger::MmapThreadHandle::~MmapThreadHandle()
8692 {
8693     mThread->disconnect();
8694 }
8695 
createMmapBuffer(int32_t minSizeFrames,struct audio_mmap_buffer_info * info)8696 status_t AudioFlinger::MmapThreadHandle::createMmapBuffer(int32_t minSizeFrames,
8697                                   struct audio_mmap_buffer_info *info)
8698 {
8699     return mThread->createMmapBuffer(minSizeFrames, info);
8700 }
8701 
getMmapPosition(struct audio_mmap_position * position)8702 status_t AudioFlinger::MmapThreadHandle::getMmapPosition(struct audio_mmap_position *position)
8703 {
8704     return mThread->getMmapPosition(position);
8705 }
8706 
start(const AudioClient & client,const audio_attributes_t * attr,audio_port_handle_t * handle)8707 status_t AudioFlinger::MmapThreadHandle::start(const AudioClient& client,
8708         const audio_attributes_t *attr, audio_port_handle_t *handle)
8709 
8710 {
8711     return mThread->start(client, attr, handle);
8712 }
8713 
stop(audio_port_handle_t handle)8714 status_t AudioFlinger::MmapThreadHandle::stop(audio_port_handle_t handle)
8715 {
8716     return mThread->stop(handle);
8717 }
8718 
standby()8719 status_t AudioFlinger::MmapThreadHandle::standby()
8720 {
8721     return mThread->standby();
8722 }
8723 
8724 
MmapThread(const sp<AudioFlinger> & audioFlinger,audio_io_handle_t id,AudioHwDevice * hwDev,sp<StreamHalInterface> stream,bool systemReady,bool isOut)8725 AudioFlinger::MmapThread::MmapThread(
8726         const sp<AudioFlinger>& audioFlinger, audio_io_handle_t id,
8727         AudioHwDevice *hwDev, sp<StreamHalInterface> stream, bool systemReady, bool isOut)
8728     : ThreadBase(audioFlinger, id, (isOut ? MMAP_PLAYBACK : MMAP_CAPTURE), systemReady, isOut),
8729       mSessionId(AUDIO_SESSION_NONE),
8730       mPortId(AUDIO_PORT_HANDLE_NONE),
8731       mHalStream(stream), mHalDevice(hwDev->hwDevice()), mAudioHwDev(hwDev),
8732       mActiveTracks(&this->mLocalLog),
8733       mHalVolFloat(-1.0f), // Initialize to illegal value so it always gets set properly later.
8734       mNoCallbackWarningCount(0)
8735 {
8736     mStandby = true;
8737     readHalParameters_l();
8738 }
8739 
~MmapThread()8740 AudioFlinger::MmapThread::~MmapThread()
8741 {
8742     releaseWakeLock_l();
8743 }
8744 
onFirstRef()8745 void AudioFlinger::MmapThread::onFirstRef()
8746 {
8747     run(mThreadName, ANDROID_PRIORITY_URGENT_AUDIO);
8748 }
8749 
disconnect()8750 void AudioFlinger::MmapThread::disconnect()
8751 {
8752     ActiveTracks<MmapTrack> activeTracks;
8753     {
8754         Mutex::Autolock _l(mLock);
8755         for (const sp<MmapTrack> &t : mActiveTracks) {
8756             activeTracks.add(t);
8757         }
8758     }
8759     for (const sp<MmapTrack> &t : activeTracks) {
8760         stop(t->portId());
8761     }
8762     // This will decrement references and may cause the destruction of this thread.
8763     if (isOutput()) {
8764         AudioSystem::releaseOutput(mPortId);
8765     } else {
8766         AudioSystem::releaseInput(mPortId);
8767     }
8768 }
8769 
8770 
configure(const audio_attributes_t * attr,audio_stream_type_t streamType __unused,audio_session_t sessionId,const sp<MmapStreamCallback> & callback,audio_port_handle_t deviceId,audio_port_handle_t portId)8771 void AudioFlinger::MmapThread::configure(const audio_attributes_t *attr,
8772                                                 audio_stream_type_t streamType __unused,
8773                                                 audio_session_t sessionId,
8774                                                 const sp<MmapStreamCallback>& callback,
8775                                                 audio_port_handle_t deviceId,
8776                                                 audio_port_handle_t portId)
8777 {
8778     mAttr = *attr;
8779     mSessionId = sessionId;
8780     mCallback = callback;
8781     mDeviceId = deviceId;
8782     mPortId = portId;
8783 }
8784 
createMmapBuffer(int32_t minSizeFrames,struct audio_mmap_buffer_info * info)8785 status_t AudioFlinger::MmapThread::createMmapBuffer(int32_t minSizeFrames,
8786                                   struct audio_mmap_buffer_info *info)
8787 {
8788     if (mHalStream == 0) {
8789         return NO_INIT;
8790     }
8791     mStandby = true;
8792     acquireWakeLock();
8793     return mHalStream->createMmapBuffer(minSizeFrames, info);
8794 }
8795 
getMmapPosition(struct audio_mmap_position * position)8796 status_t AudioFlinger::MmapThread::getMmapPosition(struct audio_mmap_position *position)
8797 {
8798     if (mHalStream == 0) {
8799         return NO_INIT;
8800     }
8801     return mHalStream->getMmapPosition(position);
8802 }
8803 
exitStandby()8804 status_t AudioFlinger::MmapThread::exitStandby()
8805 {
8806     status_t ret = mHalStream->start();
8807     if (ret != NO_ERROR) {
8808         ALOGE("%s: error mHalStream->start() = %d for first track", __FUNCTION__, ret);
8809         return ret;
8810     }
8811     if (mStandby) {
8812         mThreadMetrics.logBeginInterval();
8813         mStandby = false;
8814     }
8815     return NO_ERROR;
8816 }
8817 
start(const AudioClient & client,const audio_attributes_t * attr,audio_port_handle_t * handle)8818 status_t AudioFlinger::MmapThread::start(const AudioClient& client,
8819                                          const audio_attributes_t *attr,
8820                                          audio_port_handle_t *handle)
8821 {
8822     ALOGV("%s clientUid %d mStandby %d mPortId %d *handle %d", __FUNCTION__,
8823           client.clientUid, mStandby, mPortId, *handle);
8824     if (mHalStream == 0) {
8825         return NO_INIT;
8826     }
8827 
8828     status_t ret;
8829 
8830     if (*handle == mPortId) {
8831         // for the first track, reuse portId and session allocated when the stream was opened
8832         return exitStandby();
8833     }
8834 
8835     audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
8836 
8837     audio_io_handle_t io = mId;
8838     if (isOutput()) {
8839         audio_config_t config = AUDIO_CONFIG_INITIALIZER;
8840         config.sample_rate = mSampleRate;
8841         config.channel_mask = mChannelMask;
8842         config.format = mFormat;
8843         audio_stream_type_t stream = streamType();
8844         audio_output_flags_t flags =
8845                 (audio_output_flags_t)(AUDIO_OUTPUT_FLAG_MMAP_NOIRQ | AUDIO_OUTPUT_FLAG_DIRECT);
8846         audio_port_handle_t deviceId = mDeviceId;
8847         std::vector<audio_io_handle_t> secondaryOutputs;
8848         ret = AudioSystem::getOutputForAttr(&mAttr, &io,
8849                                             mSessionId,
8850                                             &stream,
8851                                             client.clientPid,
8852                                             client.clientUid,
8853                                             &config,
8854                                             flags,
8855                                             &deviceId,
8856                                             &portId,
8857                                             &secondaryOutputs);
8858         ALOGD_IF(!secondaryOutputs.empty(),
8859                  "MmapThread::start does not support secondary outputs, ignoring them");
8860     } else {
8861         audio_config_base_t config;
8862         config.sample_rate = mSampleRate;
8863         config.channel_mask = mChannelMask;
8864         config.format = mFormat;
8865         audio_port_handle_t deviceId = mDeviceId;
8866         ret = AudioSystem::getInputForAttr(&mAttr, &io,
8867                                               RECORD_RIID_INVALID,
8868                                               mSessionId,
8869                                               client.clientPid,
8870                                               client.clientUid,
8871                                               client.packageName,
8872                                               &config,
8873                                               AUDIO_INPUT_FLAG_MMAP_NOIRQ,
8874                                               &deviceId,
8875                                               &portId);
8876     }
8877     // APM should not chose a different input or output stream for the same set of attributes
8878     // and audo configuration
8879     if (ret != NO_ERROR || io != mId) {
8880         ALOGE("%s: error getting output or input from APM (error %d, io %d expected io %d)",
8881               __FUNCTION__, ret, io, mId);
8882         return BAD_VALUE;
8883     }
8884 
8885     if (isOutput()) {
8886         ret = AudioSystem::startOutput(portId);
8887     } else {
8888         ret = AudioSystem::startInput(portId);
8889     }
8890 
8891     Mutex::Autolock _l(mLock);
8892     // abort if start is rejected by audio policy manager
8893     if (ret != NO_ERROR) {
8894         ALOGE("%s: error start rejected by AudioPolicyManager = %d", __FUNCTION__, ret);
8895         if (!mActiveTracks.isEmpty()) {
8896             mLock.unlock();
8897             if (isOutput()) {
8898                 AudioSystem::releaseOutput(portId);
8899             } else {
8900                 AudioSystem::releaseInput(portId);
8901             }
8902             mLock.lock();
8903         } else {
8904             mHalStream->stop();
8905         }
8906         return PERMISSION_DENIED;
8907     }
8908 
8909     // Given that MmapThread::mAttr is mutable, should a MmapTrack have attributes ?
8910     sp<MmapTrack> track = new MmapTrack(this, attr == nullptr ? mAttr : *attr, mSampleRate, mFormat,
8911                                         mChannelMask, mSessionId, isOutput(), client.clientUid,
8912                                         client.clientPid, IPCThreadState::self()->getCallingPid(),
8913                                         portId);
8914 
8915     if (isOutput()) {
8916         // force volume update when a new track is added
8917         mHalVolFloat = -1.0f;
8918     } else if (!track->isSilenced_l()) {
8919         for (const sp<MmapTrack> &t : mActiveTracks) {
8920             if (t->isSilenced_l() && t->uid() != client.clientUid)
8921                 t->invalidate();
8922         }
8923     }
8924 
8925 
8926     mActiveTracks.add(track);
8927     sp<EffectChain> chain = getEffectChain_l(mSessionId);
8928     if (chain != 0) {
8929         chain->setStrategy(AudioSystem::getStrategyForStream(streamType()));
8930         chain->incTrackCnt();
8931         chain->incActiveTrackCnt();
8932     }
8933 
8934     track->logBeginInterval(patchSinksToString(&mPatch)); // log to MediaMetrics
8935     *handle = portId;
8936     broadcast_l();
8937 
8938     ALOGV("%s DONE handle %d stream %p", __FUNCTION__, *handle, mHalStream.get());
8939 
8940     return NO_ERROR;
8941 }
8942 
stop(audio_port_handle_t handle)8943 status_t AudioFlinger::MmapThread::stop(audio_port_handle_t handle)
8944 {
8945     ALOGV("%s handle %d", __FUNCTION__, handle);
8946 
8947     if (mHalStream == 0) {
8948         return NO_INIT;
8949     }
8950 
8951     if (handle == mPortId) {
8952         mHalStream->stop();
8953         return NO_ERROR;
8954     }
8955 
8956     Mutex::Autolock _l(mLock);
8957 
8958     sp<MmapTrack> track;
8959     for (const sp<MmapTrack> &t : mActiveTracks) {
8960         if (handle == t->portId()) {
8961             track = t;
8962             break;
8963         }
8964     }
8965     if (track == 0) {
8966         return BAD_VALUE;
8967     }
8968 
8969     mActiveTracks.remove(track);
8970 
8971     mLock.unlock();
8972     if (isOutput()) {
8973         AudioSystem::stopOutput(track->portId());
8974         AudioSystem::releaseOutput(track->portId());
8975     } else {
8976         AudioSystem::stopInput(track->portId());
8977         AudioSystem::releaseInput(track->portId());
8978     }
8979     mLock.lock();
8980 
8981     sp<EffectChain> chain = getEffectChain_l(track->sessionId());
8982     if (chain != 0) {
8983         chain->decActiveTrackCnt();
8984         chain->decTrackCnt();
8985     }
8986 
8987     broadcast_l();
8988 
8989     return NO_ERROR;
8990 }
8991 
standby()8992 status_t AudioFlinger::MmapThread::standby()
8993 {
8994     ALOGV("%s", __FUNCTION__);
8995 
8996     if (mHalStream == 0) {
8997         return NO_INIT;
8998     }
8999     if (!mActiveTracks.isEmpty()) {
9000         return INVALID_OPERATION;
9001     }
9002     mHalStream->standby();
9003     if (!mStandby) {
9004         mThreadMetrics.logEndInterval();
9005         mStandby = true;
9006     }
9007     releaseWakeLock();
9008     return NO_ERROR;
9009 }
9010 
9011 
readHalParameters_l()9012 void AudioFlinger::MmapThread::readHalParameters_l()
9013 {
9014     status_t result = mHalStream->getAudioProperties(&mSampleRate, &mChannelMask, &mHALFormat);
9015     LOG_ALWAYS_FATAL_IF(result != OK, "Error retrieving audio properties from HAL: %d", result);
9016     mFormat = mHALFormat;
9017     LOG_ALWAYS_FATAL_IF(!audio_is_linear_pcm(mFormat), "HAL format %#x is not linear pcm", mFormat);
9018     result = mHalStream->getFrameSize(&mFrameSize);
9019     LOG_ALWAYS_FATAL_IF(result != OK, "Error retrieving frame size from HAL: %d", result);
9020     LOG_ALWAYS_FATAL_IF(mFrameSize <= 0, "Error frame size was %zu but must be greater than zero",
9021             mFrameSize);
9022     result = mHalStream->getBufferSize(&mBufferSize);
9023     LOG_ALWAYS_FATAL_IF(result != OK, "Error retrieving buffer size from HAL: %d", result);
9024     mFrameCount = mBufferSize / mFrameSize;
9025 
9026     // TODO: make a readHalParameters call?
9027     mediametrics::LogItem item(mThreadMetrics.getMetricsId());
9028     item.set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_READPARAMETERS)
9029         .set(AMEDIAMETRICS_PROP_ENCODING, formatToString(mFormat).c_str())
9030         .set(AMEDIAMETRICS_PROP_SAMPLERATE, (int32_t)mSampleRate)
9031         .set(AMEDIAMETRICS_PROP_CHANNELMASK, (int32_t)mChannelMask)
9032         .set(AMEDIAMETRICS_PROP_CHANNELCOUNT, (int32_t)mChannelCount)
9033         .set(AMEDIAMETRICS_PROP_FRAMECOUNT, (int32_t)mFrameCount)
9034         /*
9035         .set(AMEDIAMETRICS_PROP_FLAGS, toString(flags).c_str())
9036         .set(AMEDIAMETRICS_PROP_PREFIX_HAPTIC AMEDIAMETRICS_PROP_CHANNELMASK,
9037                 (int32_t)mHapticChannelMask)
9038         .set(AMEDIAMETRICS_PROP_PREFIX_HAPTIC AMEDIAMETRICS_PROP_CHANNELCOUNT,
9039                 (int32_t)mHapticChannelCount)
9040         */
9041         .set(AMEDIAMETRICS_PROP_PREFIX_HAL    AMEDIAMETRICS_PROP_ENCODING,
9042                 formatToString(mHALFormat).c_str())
9043         .set(AMEDIAMETRICS_PROP_PREFIX_HAL    AMEDIAMETRICS_PROP_FRAMECOUNT,
9044                 (int32_t)mFrameCount) // sic - added HAL
9045         .record();
9046 }
9047 
threadLoop()9048 bool AudioFlinger::MmapThread::threadLoop()
9049 {
9050     checkSilentMode_l();
9051 
9052     const String8 myName(String8::format("thread %p type %d TID %d", this, mType, gettid()));
9053 
9054     while (!exitPending())
9055     {
9056         Vector< sp<EffectChain> > effectChains;
9057 
9058         { // under Thread lock
9059         Mutex::Autolock _l(mLock);
9060 
9061         if (mSignalPending) {
9062             // A signal was raised while we were unlocked
9063             mSignalPending = false;
9064         } else {
9065             if (mConfigEvents.isEmpty()) {
9066                 // we're about to wait, flush the binder command buffer
9067                 IPCThreadState::self()->flushCommands();
9068 
9069                 if (exitPending()) {
9070                     break;
9071                 }
9072 
9073                 // wait until we have something to do...
9074                 ALOGV("%s going to sleep", myName.string());
9075                 mWaitWorkCV.wait(mLock);
9076                 ALOGV("%s waking up", myName.string());
9077 
9078                 checkSilentMode_l();
9079 
9080                 continue;
9081             }
9082         }
9083 
9084         processConfigEvents_l();
9085 
9086         processVolume_l();
9087 
9088         checkInvalidTracks_l();
9089 
9090         mActiveTracks.updatePowerState(this);
9091 
9092         updateMetadata_l();
9093 
9094         lockEffectChains_l(effectChains);
9095         } // release Thread lock
9096 
9097         for (size_t i = 0; i < effectChains.size(); i ++) {
9098             effectChains[i]->process_l(); // Thread is not locked, but effect chain is locked
9099         }
9100 
9101         // enable changes in effect chain, including moving to another thread.
9102         unlockEffectChains(effectChains);
9103         // Effect chains will be actually deleted here if they were removed from
9104         // mEffectChains list during mixing or effects processing
9105     }
9106 
9107     threadLoop_exit();
9108 
9109     if (!mStandby) {
9110         threadLoop_standby();
9111         mStandby = true;
9112     }
9113 
9114     ALOGV("Thread %p type %d exiting", this, mType);
9115     return false;
9116 }
9117 
9118 // checkForNewParameter_l() must be called with ThreadBase::mLock held
checkForNewParameter_l(const String8 & keyValuePair,status_t & status)9119 bool AudioFlinger::MmapThread::checkForNewParameter_l(const String8& keyValuePair,
9120                                                               status_t& status)
9121 {
9122     AudioParameter param = AudioParameter(keyValuePair);
9123     int value;
9124     bool sendToHal = true;
9125     if (param.getInt(String8(AudioParameter::keyRouting), value) == NO_ERROR) {
9126         LOG_FATAL("Should not happen set routing device in MmapThread");
9127     }
9128     if (sendToHal) {
9129         status = mHalStream->setParameters(keyValuePair);
9130     } else {
9131         status = NO_ERROR;
9132     }
9133 
9134     return false;
9135 }
9136 
getParameters(const String8 & keys)9137 String8 AudioFlinger::MmapThread::getParameters(const String8& keys)
9138 {
9139     Mutex::Autolock _l(mLock);
9140     String8 out_s8;
9141     if (initCheck() == NO_ERROR && mHalStream->getParameters(keys, &out_s8) == OK) {
9142         return out_s8;
9143     }
9144     return String8();
9145 }
9146 
ioConfigChanged(audio_io_config_event event,pid_t pid,audio_port_handle_t portId __unused)9147 void AudioFlinger::MmapThread::ioConfigChanged(audio_io_config_event event, pid_t pid,
9148                                                audio_port_handle_t portId __unused) {
9149     sp<AudioIoDescriptor> desc = new AudioIoDescriptor();
9150 
9151     desc->mIoHandle = mId;
9152 
9153     switch (event) {
9154     case AUDIO_INPUT_OPENED:
9155     case AUDIO_INPUT_REGISTERED:
9156     case AUDIO_INPUT_CONFIG_CHANGED:
9157     case AUDIO_OUTPUT_OPENED:
9158     case AUDIO_OUTPUT_REGISTERED:
9159     case AUDIO_OUTPUT_CONFIG_CHANGED:
9160         desc->mPatch = mPatch;
9161         desc->mChannelMask = mChannelMask;
9162         desc->mSamplingRate = mSampleRate;
9163         desc->mFormat = mFormat;
9164         desc->mFrameCount = mFrameCount;
9165         desc->mFrameCountHAL = mFrameCount;
9166         desc->mLatency = 0;
9167         break;
9168 
9169     case AUDIO_INPUT_CLOSED:
9170     case AUDIO_OUTPUT_CLOSED:
9171     default:
9172         break;
9173     }
9174     mAudioFlinger->ioConfigChanged(event, desc, pid);
9175 }
9176 
createAudioPatch_l(const struct audio_patch * patch,audio_patch_handle_t * handle)9177 status_t AudioFlinger::MmapThread::createAudioPatch_l(const struct audio_patch *patch,
9178                                                           audio_patch_handle_t *handle)
9179 {
9180     status_t status = NO_ERROR;
9181 
9182     // store new device and send to effects
9183     audio_devices_t type = AUDIO_DEVICE_NONE;
9184     audio_port_handle_t deviceId;
9185     AudioDeviceTypeAddrVector sinkDeviceTypeAddrs;
9186     AudioDeviceTypeAddr sourceDeviceTypeAddr;
9187     uint32_t numDevices = 0;
9188     if (isOutput()) {
9189         for (unsigned int i = 0; i < patch->num_sinks; i++) {
9190             LOG_ALWAYS_FATAL_IF(popcount(patch->sinks[i].ext.device.type) > 1
9191                                 && !mAudioHwDev->supportsAudioPatches(),
9192                                 "Enumerated device type(%#x) must not be used "
9193                                 "as it does not support audio patches",
9194                                 patch->sinks[i].ext.device.type);
9195             type |= patch->sinks[i].ext.device.type;
9196             sinkDeviceTypeAddrs.push_back(AudioDeviceTypeAddr(patch->sinks[i].ext.device.type,
9197                     patch->sinks[i].ext.device.address));
9198         }
9199         deviceId = patch->sinks[0].id;
9200         numDevices = mPatch.num_sinks;
9201     } else {
9202         type = patch->sources[0].ext.device.type;
9203         deviceId = patch->sources[0].id;
9204         numDevices = mPatch.num_sources;
9205         sourceDeviceTypeAddr.mType = patch->sources[0].ext.device.type;
9206         sourceDeviceTypeAddr.mAddress = patch->sources[0].ext.device.address;
9207     }
9208 
9209     for (size_t i = 0; i < mEffectChains.size(); i++) {
9210         if (isOutput()) {
9211             mEffectChains[i]->setDevices_l(sinkDeviceTypeAddrs);
9212         } else {
9213             mEffectChains[i]->setInputDevice_l(sourceDeviceTypeAddr);
9214         }
9215     }
9216 
9217     if (!isOutput()) {
9218         // store new source and send to effects
9219         if (mAudioSource != patch->sinks[0].ext.mix.usecase.source) {
9220             mAudioSource = patch->sinks[0].ext.mix.usecase.source;
9221             for (size_t i = 0; i < mEffectChains.size(); i++) {
9222                 mEffectChains[i]->setAudioSource_l(mAudioSource);
9223             }
9224         }
9225     }
9226 
9227     if (mAudioHwDev->supportsAudioPatches()) {
9228         status = mHalDevice->createAudioPatch(patch->num_sources,
9229                                             patch->sources,
9230                                             patch->num_sinks,
9231                                             patch->sinks,
9232                                             handle);
9233     } else {
9234         char *address;
9235         if (strcmp(patch->sinks[0].ext.device.address, "") != 0) {
9236             //FIXME: we only support address on first sink with HAL version < 3.0
9237             address = audio_device_address_to_parameter(
9238                                                         patch->sinks[0].ext.device.type,
9239                                                         patch->sinks[0].ext.device.address);
9240         } else {
9241             address = (char *)calloc(1, 1);
9242         }
9243         AudioParameter param = AudioParameter(String8(address));
9244         free(address);
9245         param.addInt(String8(AudioParameter::keyRouting), (int)type);
9246         if (!isOutput()) {
9247             param.addInt(String8(AudioParameter::keyInputSource),
9248                                          (int)patch->sinks[0].ext.mix.usecase.source);
9249         }
9250         status = mHalStream->setParameters(param.toString());
9251         *handle = AUDIO_PATCH_HANDLE_NONE;
9252     }
9253 
9254     if (numDevices == 0 || mDeviceId != deviceId) {
9255         if (isOutput()) {
9256             sendIoConfigEvent_l(AUDIO_OUTPUT_CONFIG_CHANGED);
9257             mOutDeviceTypeAddrs = sinkDeviceTypeAddrs;
9258             checkSilentMode_l();
9259         } else {
9260             sendIoConfigEvent_l(AUDIO_INPUT_CONFIG_CHANGED);
9261             mInDeviceTypeAddr = sourceDeviceTypeAddr;
9262         }
9263         sp<MmapStreamCallback> callback = mCallback.promote();
9264         if (mDeviceId != deviceId && callback != 0) {
9265             mLock.unlock();
9266             callback->onRoutingChanged(deviceId);
9267             mLock.lock();
9268         }
9269         mPatch = *patch;
9270         mDeviceId = deviceId;
9271     }
9272     return status;
9273 }
9274 
releaseAudioPatch_l(const audio_patch_handle_t handle)9275 status_t AudioFlinger::MmapThread::releaseAudioPatch_l(const audio_patch_handle_t handle)
9276 {
9277     status_t status = NO_ERROR;
9278 
9279     mPatch = audio_patch{};
9280     mOutDeviceTypeAddrs.clear();
9281     mInDeviceTypeAddr.reset();
9282 
9283     bool supportsAudioPatches = mHalDevice->supportsAudioPatches(&supportsAudioPatches) == OK ?
9284                                         supportsAudioPatches : false;
9285 
9286     if (supportsAudioPatches) {
9287         status = mHalDevice->releaseAudioPatch(handle);
9288     } else {
9289         AudioParameter param;
9290         param.addInt(String8(AudioParameter::keyRouting), 0);
9291         status = mHalStream->setParameters(param.toString());
9292     }
9293     return status;
9294 }
9295 
toAudioPortConfig(struct audio_port_config * config)9296 void AudioFlinger::MmapThread::toAudioPortConfig(struct audio_port_config *config)
9297 {
9298     ThreadBase::toAudioPortConfig(config);
9299     if (isOutput()) {
9300         config->role = AUDIO_PORT_ROLE_SOURCE;
9301         config->ext.mix.hw_module = mAudioHwDev->handle();
9302         config->ext.mix.usecase.stream = AUDIO_STREAM_DEFAULT;
9303     } else {
9304         config->role = AUDIO_PORT_ROLE_SINK;
9305         config->ext.mix.hw_module = mAudioHwDev->handle();
9306         config->ext.mix.usecase.source = mAudioSource;
9307     }
9308 }
9309 
addEffectChain_l(const sp<EffectChain> & chain)9310 status_t AudioFlinger::MmapThread::addEffectChain_l(const sp<EffectChain>& chain)
9311 {
9312     audio_session_t session = chain->sessionId();
9313 
9314     ALOGV("addEffectChain_l() %p on thread %p for session %d", chain.get(), this, session);
9315     // Attach all tracks with same session ID to this chain.
9316     // indicate all active tracks in the chain
9317     for (const sp<MmapTrack> &track : mActiveTracks) {
9318         if (session == track->sessionId()) {
9319             chain->incTrackCnt();
9320             chain->incActiveTrackCnt();
9321         }
9322     }
9323 
9324     chain->setThread(this);
9325     chain->setInBuffer(nullptr);
9326     chain->setOutBuffer(nullptr);
9327     chain->syncHalEffectsState();
9328 
9329     mEffectChains.add(chain);
9330     checkSuspendOnAddEffectChain_l(chain);
9331     return NO_ERROR;
9332 }
9333 
removeEffectChain_l(const sp<EffectChain> & chain)9334 size_t AudioFlinger::MmapThread::removeEffectChain_l(const sp<EffectChain>& chain)
9335 {
9336     audio_session_t session = chain->sessionId();
9337 
9338     ALOGV("removeEffectChain_l() %p from thread %p for session %d", chain.get(), this, session);
9339 
9340     for (size_t i = 0; i < mEffectChains.size(); i++) {
9341         if (chain == mEffectChains[i]) {
9342             mEffectChains.removeAt(i);
9343             // detach all active tracks from the chain
9344             // detach all tracks with same session ID from this chain
9345             for (const sp<MmapTrack> &track : mActiveTracks) {
9346                 if (session == track->sessionId()) {
9347                     chain->decActiveTrackCnt();
9348                     chain->decTrackCnt();
9349                 }
9350             }
9351             break;
9352         }
9353     }
9354     return mEffectChains.size();
9355 }
9356 
threadLoop_standby()9357 void AudioFlinger::MmapThread::threadLoop_standby()
9358 {
9359     mHalStream->standby();
9360 }
9361 
threadLoop_exit()9362 void AudioFlinger::MmapThread::threadLoop_exit()
9363 {
9364     // Do not call callback->onTearDown() because it is redundant for thread exit
9365     // and because it can cause a recursive mutex lock on stop().
9366 }
9367 
setSyncEvent(const sp<SyncEvent> & event __unused)9368 status_t AudioFlinger::MmapThread::setSyncEvent(const sp<SyncEvent>& event __unused)
9369 {
9370     return BAD_VALUE;
9371 }
9372 
isValidSyncEvent(const sp<SyncEvent> & event __unused) const9373 bool AudioFlinger::MmapThread::isValidSyncEvent(const sp<SyncEvent>& event __unused) const
9374 {
9375     return false;
9376 }
9377 
checkEffectCompatibility_l(const effect_descriptor_t * desc,audio_session_t sessionId)9378 status_t AudioFlinger::MmapThread::checkEffectCompatibility_l(
9379         const effect_descriptor_t *desc, audio_session_t sessionId)
9380 {
9381     // No global effect sessions on mmap threads
9382     if (audio_is_global_session(sessionId)) {
9383         ALOGW("checkEffectCompatibility_l(): global effect %s on MMAP thread %s",
9384                 desc->name, mThreadName);
9385         return BAD_VALUE;
9386     }
9387 
9388     if (!isOutput() && ((desc->flags & EFFECT_FLAG_TYPE_MASK) != EFFECT_FLAG_TYPE_PRE_PROC)) {
9389         ALOGW("checkEffectCompatibility_l(): non pre processing effect %s on capture mmap thread",
9390                 desc->name);
9391         return BAD_VALUE;
9392     }
9393     if (isOutput() && ((desc->flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_PRE_PROC)) {
9394         ALOGW("checkEffectCompatibility_l(): pre processing effect %s created on playback mmap "
9395               "thread", desc->name);
9396         return BAD_VALUE;
9397     }
9398 
9399     // Only allow effects without processing load or latency
9400     if ((desc->flags & EFFECT_FLAG_NO_PROCESS_MASK) != EFFECT_FLAG_NO_PROCESS) {
9401         return BAD_VALUE;
9402     }
9403 
9404     return NO_ERROR;
9405 }
9406 
checkInvalidTracks_l()9407 void AudioFlinger::MmapThread::checkInvalidTracks_l()
9408 {
9409     for (const sp<MmapTrack> &track : mActiveTracks) {
9410         if (track->isInvalid()) {
9411             sp<MmapStreamCallback> callback = mCallback.promote();
9412             if (callback != 0) {
9413                 mLock.unlock();
9414                 callback->onTearDown(track->portId());
9415                 mLock.lock();
9416             } else if (mNoCallbackWarningCount < kMaxNoCallbackWarnings) {
9417                 ALOGW("Could not notify MMAP stream tear down: no onTearDown callback!");
9418                 mNoCallbackWarningCount++;
9419             }
9420         }
9421     }
9422 }
9423 
dumpInternals_l(int fd,const Vector<String16> & args __unused)9424 void AudioFlinger::MmapThread::dumpInternals_l(int fd, const Vector<String16>& args __unused)
9425 {
9426     dprintf(fd, "  Attributes: content type %d usage %d source %d\n",
9427             mAttr.content_type, mAttr.usage, mAttr.source);
9428     dprintf(fd, "  Session: %d port Id: %d\n", mSessionId, mPortId);
9429     if (mActiveTracks.isEmpty()) {
9430         dprintf(fd, "  No active clients\n");
9431     }
9432 }
9433 
dumpTracks_l(int fd,const Vector<String16> & args __unused)9434 void AudioFlinger::MmapThread::dumpTracks_l(int fd, const Vector<String16>& args __unused)
9435 {
9436     String8 result;
9437     size_t numtracks = mActiveTracks.size();
9438     dprintf(fd, "  %zu Tracks\n", numtracks);
9439     const char *prefix = "    ";
9440     if (numtracks) {
9441         result.append(prefix);
9442         mActiveTracks[0]->appendDumpHeader(result);
9443         for (size_t i = 0; i < numtracks ; ++i) {
9444             sp<MmapTrack> track = mActiveTracks[i];
9445             result.append(prefix);
9446             track->appendDump(result, true /* active */);
9447         }
9448     } else {
9449         dprintf(fd, "\n");
9450     }
9451     write(fd, result.string(), result.size());
9452 }
9453 
MmapPlaybackThread(const sp<AudioFlinger> & audioFlinger,audio_io_handle_t id,AudioHwDevice * hwDev,AudioStreamOut * output,bool systemReady)9454 AudioFlinger::MmapPlaybackThread::MmapPlaybackThread(
9455         const sp<AudioFlinger>& audioFlinger, audio_io_handle_t id,
9456         AudioHwDevice *hwDev,  AudioStreamOut *output, bool systemReady)
9457     : MmapThread(audioFlinger, id, hwDev, output->stream, systemReady, true /* isOut */),
9458       mStreamType(AUDIO_STREAM_MUSIC),
9459       mStreamVolume(1.0),
9460       mStreamMute(false),
9461       mOutput(output)
9462 {
9463     snprintf(mThreadName, kThreadNameLength, "AudioMmapOut_%X", id);
9464     mChannelCount = audio_channel_count_from_out_mask(mChannelMask);
9465     mMasterVolume = audioFlinger->masterVolume_l();
9466     mMasterMute = audioFlinger->masterMute_l();
9467     if (mAudioHwDev) {
9468         if (mAudioHwDev->canSetMasterVolume()) {
9469             mMasterVolume = 1.0;
9470         }
9471 
9472         if (mAudioHwDev->canSetMasterMute()) {
9473             mMasterMute = false;
9474         }
9475     }
9476 }
9477 
configure(const audio_attributes_t * attr,audio_stream_type_t streamType,audio_session_t sessionId,const sp<MmapStreamCallback> & callback,audio_port_handle_t deviceId,audio_port_handle_t portId)9478 void AudioFlinger::MmapPlaybackThread::configure(const audio_attributes_t *attr,
9479                                                 audio_stream_type_t streamType,
9480                                                 audio_session_t sessionId,
9481                                                 const sp<MmapStreamCallback>& callback,
9482                                                 audio_port_handle_t deviceId,
9483                                                 audio_port_handle_t portId)
9484 {
9485     MmapThread::configure(attr, streamType, sessionId, callback, deviceId, portId);
9486     mStreamType = streamType;
9487 }
9488 
clearOutput()9489 AudioStreamOut* AudioFlinger::MmapPlaybackThread::clearOutput()
9490 {
9491     Mutex::Autolock _l(mLock);
9492     AudioStreamOut *output = mOutput;
9493     mOutput = NULL;
9494     return output;
9495 }
9496 
setMasterVolume(float value)9497 void AudioFlinger::MmapPlaybackThread::setMasterVolume(float value)
9498 {
9499     Mutex::Autolock _l(mLock);
9500     // Don't apply master volume in SW if our HAL can do it for us.
9501     if (mAudioHwDev &&
9502             mAudioHwDev->canSetMasterVolume()) {
9503         mMasterVolume = 1.0;
9504     } else {
9505         mMasterVolume = value;
9506     }
9507 }
9508 
setMasterMute(bool muted)9509 void AudioFlinger::MmapPlaybackThread::setMasterMute(bool muted)
9510 {
9511     Mutex::Autolock _l(mLock);
9512     // Don't apply master mute in SW if our HAL can do it for us.
9513     if (mAudioHwDev && mAudioHwDev->canSetMasterMute()) {
9514         mMasterMute = false;
9515     } else {
9516         mMasterMute = muted;
9517     }
9518 }
9519 
setStreamVolume(audio_stream_type_t stream,float value)9520 void AudioFlinger::MmapPlaybackThread::setStreamVolume(audio_stream_type_t stream, float value)
9521 {
9522     Mutex::Autolock _l(mLock);
9523     if (stream == mStreamType) {
9524         mStreamVolume = value;
9525         broadcast_l();
9526     }
9527 }
9528 
streamVolume(audio_stream_type_t stream) const9529 float AudioFlinger::MmapPlaybackThread::streamVolume(audio_stream_type_t stream) const
9530 {
9531     Mutex::Autolock _l(mLock);
9532     if (stream == mStreamType) {
9533         return mStreamVolume;
9534     }
9535     return 0.0f;
9536 }
9537 
setStreamMute(audio_stream_type_t stream,bool muted)9538 void AudioFlinger::MmapPlaybackThread::setStreamMute(audio_stream_type_t stream, bool muted)
9539 {
9540     Mutex::Autolock _l(mLock);
9541     if (stream == mStreamType) {
9542         mStreamMute= muted;
9543         broadcast_l();
9544     }
9545 }
9546 
invalidateTracks(audio_stream_type_t streamType)9547 void AudioFlinger::MmapPlaybackThread::invalidateTracks(audio_stream_type_t streamType)
9548 {
9549     Mutex::Autolock _l(mLock);
9550     if (streamType == mStreamType) {
9551         for (const sp<MmapTrack> &track : mActiveTracks) {
9552             track->invalidate();
9553         }
9554         broadcast_l();
9555     }
9556 }
9557 
processVolume_l()9558 void AudioFlinger::MmapPlaybackThread::processVolume_l()
9559 {
9560     float volume;
9561 
9562     if (mMasterMute || mStreamMute) {
9563         volume = 0;
9564     } else {
9565         volume = mMasterVolume * mStreamVolume;
9566     }
9567 
9568     if (volume != mHalVolFloat) {
9569 
9570         // Convert volumes from float to 8.24
9571         uint32_t vol = (uint32_t)(volume * (1 << 24));
9572 
9573         // Delegate volume control to effect in track effect chain if needed
9574         // only one effect chain can be present on DirectOutputThread, so if
9575         // there is one, the track is connected to it
9576         if (!mEffectChains.isEmpty()) {
9577             mEffectChains[0]->setVolume_l(&vol, &vol);
9578             volume = (float)vol / (1 << 24);
9579         }
9580         // Try to use HW volume control and fall back to SW control if not implemented
9581         if (mOutput->stream->setVolume(volume, volume) == NO_ERROR) {
9582             mHalVolFloat = volume; // HW volume control worked, so update value.
9583             mNoCallbackWarningCount = 0;
9584         } else {
9585             sp<MmapStreamCallback> callback = mCallback.promote();
9586             if (callback != 0) {
9587                 int channelCount;
9588                 if (isOutput()) {
9589                     channelCount = audio_channel_count_from_out_mask(mChannelMask);
9590                 } else {
9591                     channelCount = audio_channel_count_from_in_mask(mChannelMask);
9592                 }
9593                 Vector<float> values;
9594                 for (int i = 0; i < channelCount; i++) {
9595                     values.add(volume);
9596                 }
9597                 mHalVolFloat = volume; // SW volume control worked, so update value.
9598                 mNoCallbackWarningCount = 0;
9599                 mLock.unlock();
9600                 callback->onVolumeChanged(mChannelMask, values);
9601                 mLock.lock();
9602             } else {
9603                 if (mNoCallbackWarningCount < kMaxNoCallbackWarnings) {
9604                     ALOGW("Could not set MMAP stream volume: no volume callback!");
9605                     mNoCallbackWarningCount++;
9606                 }
9607             }
9608         }
9609     }
9610 }
9611 
updateMetadata_l()9612 void AudioFlinger::MmapPlaybackThread::updateMetadata_l()
9613 {
9614     if (mOutput == nullptr || mOutput->stream == nullptr ||
9615             !mActiveTracks.readAndClearHasChanged()) {
9616         return;
9617     }
9618     StreamOutHalInterface::SourceMetadata metadata;
9619     for (const sp<MmapTrack> &track : mActiveTracks) {
9620         // No track is invalid as this is called after prepareTrack_l in the same critical section
9621         metadata.tracks.push_back({
9622                 .usage = track->attributes().usage,
9623                 .content_type = track->attributes().content_type,
9624                 .gain = mHalVolFloat, // TODO: propagate from aaudio pre-mix volume
9625         });
9626     }
9627     mOutput->stream->updateSourceMetadata(metadata);
9628 }
9629 
checkSilentMode_l()9630 void AudioFlinger::MmapPlaybackThread::checkSilentMode_l()
9631 {
9632     if (!mMasterMute) {
9633         char value[PROPERTY_VALUE_MAX];
9634         if (property_get("ro.audio.silent", value, "0") > 0) {
9635             char *endptr;
9636             unsigned long ul = strtoul(value, &endptr, 0);
9637             if (*endptr == '\0' && ul != 0) {
9638                 ALOGD("Silence is golden");
9639                 // The setprop command will not allow a property to be changed after
9640                 // the first time it is set, so we don't have to worry about un-muting.
9641                 setMasterMute_l(true);
9642             }
9643         }
9644     }
9645 }
9646 
toAudioPortConfig(struct audio_port_config * config)9647 void AudioFlinger::MmapPlaybackThread::toAudioPortConfig(struct audio_port_config *config)
9648 {
9649     MmapThread::toAudioPortConfig(config);
9650     if (mOutput && mOutput->flags != AUDIO_OUTPUT_FLAG_NONE) {
9651         config->config_mask |= AUDIO_PORT_CONFIG_FLAGS;
9652         config->flags.output = mOutput->flags;
9653     }
9654 }
9655 
dumpInternals_l(int fd,const Vector<String16> & args)9656 void AudioFlinger::MmapPlaybackThread::dumpInternals_l(int fd, const Vector<String16>& args)
9657 {
9658     MmapThread::dumpInternals_l(fd, args);
9659 
9660     dprintf(fd, "  Stream type: %d Stream volume: %f HAL volume: %f Stream mute %d\n",
9661             mStreamType, mStreamVolume, mHalVolFloat, mStreamMute);
9662     dprintf(fd, "  Master volume: %f Master mute %d\n", mMasterVolume, mMasterMute);
9663 }
9664 
MmapCaptureThread(const sp<AudioFlinger> & audioFlinger,audio_io_handle_t id,AudioHwDevice * hwDev,AudioStreamIn * input,bool systemReady)9665 AudioFlinger::MmapCaptureThread::MmapCaptureThread(
9666         const sp<AudioFlinger>& audioFlinger, audio_io_handle_t id,
9667         AudioHwDevice *hwDev,  AudioStreamIn *input, bool systemReady)
9668     : MmapThread(audioFlinger, id, hwDev, input->stream, systemReady, false /* isOut */),
9669       mInput(input)
9670 {
9671     snprintf(mThreadName, kThreadNameLength, "AudioMmapIn_%X", id);
9672     mChannelCount = audio_channel_count_from_in_mask(mChannelMask);
9673 }
9674 
exitStandby()9675 status_t AudioFlinger::MmapCaptureThread::exitStandby()
9676 {
9677     {
9678         // mInput might have been cleared by clearInput()
9679         Mutex::Autolock _l(mLock);
9680         if (mInput != nullptr && mInput->stream != nullptr) {
9681             mInput->stream->setGain(1.0f);
9682         }
9683     }
9684     return MmapThread::exitStandby();
9685 }
9686 
clearInput()9687 AudioFlinger::AudioStreamIn* AudioFlinger::MmapCaptureThread::clearInput()
9688 {
9689     Mutex::Autolock _l(mLock);
9690     AudioStreamIn *input = mInput;
9691     mInput = NULL;
9692     return input;
9693 }
9694 
9695 
processVolume_l()9696 void AudioFlinger::MmapCaptureThread::processVolume_l()
9697 {
9698     bool changed = false;
9699     bool silenced = false;
9700 
9701     sp<MmapStreamCallback> callback = mCallback.promote();
9702     if (callback == 0) {
9703         if (mNoCallbackWarningCount < kMaxNoCallbackWarnings) {
9704             ALOGW("Could not set MMAP stream silenced: no onStreamSilenced callback!");
9705             mNoCallbackWarningCount++;
9706         }
9707     }
9708 
9709     // After a change occurred in track silenced state, mute capture in audio DSP if at least one
9710     // track is silenced and unmute otherwise
9711     for (size_t i = 0; i < mActiveTracks.size() && !silenced; i++) {
9712         if (!mActiveTracks[i]->getAndSetSilencedNotified_l()) {
9713             changed = true;
9714             silenced = mActiveTracks[i]->isSilenced_l();
9715         }
9716     }
9717 
9718     if (changed) {
9719         mInput->stream->setGain(silenced ? 0.0f: 1.0f);
9720     }
9721 }
9722 
updateMetadata_l()9723 void AudioFlinger::MmapCaptureThread::updateMetadata_l()
9724 {
9725     if (mInput == nullptr || mInput->stream == nullptr ||
9726             !mActiveTracks.readAndClearHasChanged()) {
9727         return;
9728     }
9729     StreamInHalInterface::SinkMetadata metadata;
9730     for (const sp<MmapTrack> &track : mActiveTracks) {
9731         // No track is invalid as this is called after prepareTrack_l in the same critical section
9732         metadata.tracks.push_back({
9733                 .source = track->attributes().source,
9734                 .gain = 1, // capture tracks do not have volumes
9735         });
9736     }
9737     mInput->stream->updateSinkMetadata(metadata);
9738 }
9739 
setRecordSilenced(audio_port_handle_t portId,bool silenced)9740 void AudioFlinger::MmapCaptureThread::setRecordSilenced(audio_port_handle_t portId, bool silenced)
9741 {
9742     Mutex::Autolock _l(mLock);
9743     for (size_t i = 0; i < mActiveTracks.size() ; i++) {
9744         if (mActiveTracks[i]->portId() == portId) {
9745             mActiveTracks[i]->setSilenced_l(silenced);
9746             broadcast_l();
9747         }
9748     }
9749 }
9750 
toAudioPortConfig(struct audio_port_config * config)9751 void AudioFlinger::MmapCaptureThread::toAudioPortConfig(struct audio_port_config *config)
9752 {
9753     MmapThread::toAudioPortConfig(config);
9754     if (mInput && mInput->flags != AUDIO_INPUT_FLAG_NONE) {
9755         config->config_mask |= AUDIO_PORT_CONFIG_FLAGS;
9756         config->flags.input = mInput->flags;
9757     }
9758 }
9759 
9760 } // namespace android
9761