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