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 <sys/stat.h>
     27 #include <cutils/properties.h>
     28 #include <media/AudioParameter.h>
     29 #include <media/AudioResamplerPublic.h>
     30 #include <utils/Log.h>
     31 #include <utils/Trace.h>
     32 
     33 #include <private/media/AudioTrackShared.h>
     34 #include <hardware/audio.h>
     35 #include <audio_effects/effect_ns.h>
     36 #include <audio_effects/effect_aec.h>
     37 #include <audio_utils/primitives.h>
     38 #include <audio_utils/format.h>
     39 #include <audio_utils/minifloat.h>
     40 
     41 // NBAIO implementations
     42 #include <media/nbaio/AudioStreamInSource.h>
     43 #include <media/nbaio/AudioStreamOutSink.h>
     44 #include <media/nbaio/MonoPipe.h>
     45 #include <media/nbaio/MonoPipeReader.h>
     46 #include <media/nbaio/Pipe.h>
     47 #include <media/nbaio/PipeReader.h>
     48 #include <media/nbaio/SourceAudioBufferProvider.h>
     49 
     50 #include <powermanager/PowerManager.h>
     51 
     52 #include <common_time/cc_helper.h>
     53 #include <common_time/local_clock.h>
     54 
     55 #include "AudioFlinger.h"
     56 #include "AudioMixer.h"
     57 #include "FastMixer.h"
     58 #include "FastCapture.h"
     59 #include "ServiceUtilities.h"
     60 #include "SchedulingPolicyService.h"
     61 
     62 #ifdef ADD_BATTERY_DATA
     63 #include <media/IMediaPlayerService.h>
     64 #include <media/IMediaDeathNotifier.h>
     65 #endif
     66 
     67 #ifdef DEBUG_CPU_USAGE
     68 #include <cpustats/CentralTendencyStatistics.h>
     69 #include <cpustats/ThreadCpuUsage.h>
     70 #endif
     71 
     72 // ----------------------------------------------------------------------------
     73 
     74 // Note: the following macro is used for extremely verbose logging message.  In
     75 // order to run with ALOG_ASSERT turned on, we need to have LOG_NDEBUG set to
     76 // 0; but one side effect of this is to turn all LOGV's as well.  Some messages
     77 // are so verbose that we want to suppress them even when we have ALOG_ASSERT
     78 // turned on.  Do not uncomment the #def below unless you really know what you
     79 // are doing and want to see all of the extremely verbose messages.
     80 //#define VERY_VERY_VERBOSE_LOGGING
     81 #ifdef VERY_VERY_VERBOSE_LOGGING
     82 #define ALOGVV ALOGV
     83 #else
     84 #define ALOGVV(a...) do { } while(0)
     85 #endif
     86 
     87 #define max(a, b) ((a) > (b) ? (a) : (b))
     88 
     89 namespace android {
     90 
     91 // retry counts for buffer fill timeout
     92 // 50 * ~20msecs = 1 second
     93 static const int8_t kMaxTrackRetries = 50;
     94 static const int8_t kMaxTrackStartupRetries = 50;
     95 // allow less retry attempts on direct output thread.
     96 // direct outputs can be a scarce resource in audio hardware and should
     97 // be released as quickly as possible.
     98 static const int8_t kMaxTrackRetriesDirect = 2;
     99 
    100 // don't warn about blocked writes or record buffer overflows more often than this
    101 static const nsecs_t kWarningThrottleNs = seconds(5);
    102 
    103 // RecordThread loop sleep time upon application overrun or audio HAL read error
    104 static const int kRecordThreadSleepUs = 5000;
    105 
    106 // maximum time to wait in sendConfigEvent_l() for a status to be received
    107 static const nsecs_t kConfigEventTimeoutNs = seconds(2);
    108 
    109 // minimum sleep time for the mixer thread loop when tracks are active but in underrun
    110 static const uint32_t kMinThreadSleepTimeUs = 5000;
    111 // maximum divider applied to the active sleep time in the mixer thread loop
    112 static const uint32_t kMaxThreadSleepTimeShift = 2;
    113 
    114 // minimum normal sink buffer size, expressed in milliseconds rather than frames
    115 static const uint32_t kMinNormalSinkBufferSizeMs = 20;
    116 // maximum normal sink buffer size
    117 static const uint32_t kMaxNormalSinkBufferSizeMs = 24;
    118 
    119 // Offloaded output thread standby delay: allows track transition without going to standby
    120 static const nsecs_t kOffloadStandbyDelayNs = seconds(1);
    121 
    122 // Whether to use fast mixer
    123 static const enum {
    124     FastMixer_Never,    // never initialize or use: for debugging only
    125     FastMixer_Always,   // always initialize and use, even if not needed: for debugging only
    126                         // normal mixer multiplier is 1
    127     FastMixer_Static,   // initialize if needed, then use all the time if initialized,
    128                         // multiplier is calculated based on min & max normal mixer buffer size
    129     FastMixer_Dynamic,  // initialize if needed, then use dynamically depending on track load,
    130                         // multiplier is calculated based on min & max normal mixer buffer size
    131     // FIXME for FastMixer_Dynamic:
    132     //  Supporting this option will require fixing HALs that can't handle large writes.
    133     //  For example, one HAL implementation returns an error from a large write,
    134     //  and another HAL implementation corrupts memory, possibly in the sample rate converter.
    135     //  We could either fix the HAL implementations, or provide a wrapper that breaks
    136     //  up large writes into smaller ones, and the wrapper would need to deal with scheduler.
    137 } kUseFastMixer = FastMixer_Static;
    138 
    139 // Whether to use fast capture
    140 static const enum {
    141     FastCapture_Never,  // never initialize or use: for debugging only
    142     FastCapture_Always, // always initialize and use, even if not needed: for debugging only
    143     FastCapture_Static, // initialize if needed, then use all the time if initialized
    144 } kUseFastCapture = FastCapture_Static;
    145 
    146 // Priorities for requestPriority
    147 static const int kPriorityAudioApp = 2;
    148 static const int kPriorityFastMixer = 3;
    149 static const int kPriorityFastCapture = 3;
    150 
    151 // IAudioFlinger::createTrack() reports back to client the total size of shared memory area
    152 // for the track.  The client then sub-divides this into smaller buffers for its use.
    153 // Currently the client uses N-buffering by default, but doesn't tell us about the value of N.
    154 // So for now we just assume that client is double-buffered for fast tracks.
    155 // FIXME It would be better for client to tell AudioFlinger the value of N,
    156 // so AudioFlinger could allocate the right amount of memory.
    157 // See the client's minBufCount and mNotificationFramesAct calculations for details.
    158 
    159 // This is the default value, if not specified by property.
    160 static const int kFastTrackMultiplier = 2;
    161 
    162 // The minimum and maximum allowed values
    163 static const int kFastTrackMultiplierMin = 1;
    164 static const int kFastTrackMultiplierMax = 2;
    165 
    166 // The actual value to use, which can be specified per-device via property af.fast_track_multiplier.
    167 static int sFastTrackMultiplier = kFastTrackMultiplier;
    168 
    169 // See Thread::readOnlyHeap().
    170 // Initially this heap is used to allocate client buffers for "fast" AudioRecord.
    171 // Eventually it will be the single buffer that FastCapture writes into via HAL read(),
    172 // and that all "fast" AudioRecord clients read from.  In either case, the size can be small.
    173 static const size_t kRecordThreadReadOnlyHeapSize = 0x2000;
    174 
    175 // ----------------------------------------------------------------------------
    176 
    177 static pthread_once_t sFastTrackMultiplierOnce = PTHREAD_ONCE_INIT;
    178 
    179 static void sFastTrackMultiplierInit()
    180 {
    181     char value[PROPERTY_VALUE_MAX];
    182     if (property_get("af.fast_track_multiplier", value, NULL) > 0) {
    183         char *endptr;
    184         unsigned long ul = strtoul(value, &endptr, 0);
    185         if (*endptr == '\0' && kFastTrackMultiplierMin <= ul && ul <= kFastTrackMultiplierMax) {
    186             sFastTrackMultiplier = (int) ul;
    187         }
    188     }
    189 }
    190 
    191 // ----------------------------------------------------------------------------
    192 
    193 #ifdef ADD_BATTERY_DATA
    194 // To collect the amplifier usage
    195 static void addBatteryData(uint32_t params) {
    196     sp<IMediaPlayerService> service = IMediaDeathNotifier::getMediaPlayerService();
    197     if (service == NULL) {
    198         // it already logged
    199         return;
    200     }
    201 
    202     service->addBatteryData(params);
    203 }
    204 #endif
    205 
    206 
    207 // ----------------------------------------------------------------------------
    208 //      CPU Stats
    209 // ----------------------------------------------------------------------------
    210 
    211 class CpuStats {
    212 public:
    213     CpuStats();
    214     void sample(const String8 &title);
    215 #ifdef DEBUG_CPU_USAGE
    216 private:
    217     ThreadCpuUsage mCpuUsage;           // instantaneous thread CPU usage in wall clock ns
    218     CentralTendencyStatistics mWcStats; // statistics on thread CPU usage in wall clock ns
    219 
    220     CentralTendencyStatistics mHzStats; // statistics on thread CPU usage in cycles
    221 
    222     int mCpuNum;                        // thread's current CPU number
    223     int mCpukHz;                        // frequency of thread's current CPU in kHz
    224 #endif
    225 };
    226 
    227 CpuStats::CpuStats()
    228 #ifdef DEBUG_CPU_USAGE
    229     : mCpuNum(-1), mCpukHz(-1)
    230 #endif
    231 {
    232 }
    233 
    234 void CpuStats::sample(const String8 &title
    235 #ifndef DEBUG_CPU_USAGE
    236                 __unused
    237 #endif
    238         ) {
    239 #ifdef DEBUG_CPU_USAGE
    240     // get current thread's delta CPU time in wall clock ns
    241     double wcNs;
    242     bool valid = mCpuUsage.sampleAndEnable(wcNs);
    243 
    244     // record sample for wall clock statistics
    245     if (valid) {
    246         mWcStats.sample(wcNs);
    247     }
    248 
    249     // get the current CPU number
    250     int cpuNum = sched_getcpu();
    251 
    252     // get the current CPU frequency in kHz
    253     int cpukHz = mCpuUsage.getCpukHz(cpuNum);
    254 
    255     // check if either CPU number or frequency changed
    256     if (cpuNum != mCpuNum || cpukHz != mCpukHz) {
    257         mCpuNum = cpuNum;
    258         mCpukHz = cpukHz;
    259         // ignore sample for purposes of cycles
    260         valid = false;
    261     }
    262 
    263     // if no change in CPU number or frequency, then record sample for cycle statistics
    264     if (valid && mCpukHz > 0) {
    265         double cycles = wcNs * cpukHz * 0.000001;
    266         mHzStats.sample(cycles);
    267     }
    268 
    269     unsigned n = mWcStats.n();
    270     // mCpuUsage.elapsed() is expensive, so don't call it every loop
    271     if ((n & 127) == 1) {
    272         long long elapsed = mCpuUsage.elapsed();
    273         if (elapsed >= DEBUG_CPU_USAGE * 1000000000LL) {
    274             double perLoop = elapsed / (double) n;
    275             double perLoop100 = perLoop * 0.01;
    276             double perLoop1k = perLoop * 0.001;
    277             double mean = mWcStats.mean();
    278             double stddev = mWcStats.stddev();
    279             double minimum = mWcStats.minimum();
    280             double maximum = mWcStats.maximum();
    281             double meanCycles = mHzStats.mean();
    282             double stddevCycles = mHzStats.stddev();
    283             double minCycles = mHzStats.minimum();
    284             double maxCycles = mHzStats.maximum();
    285             mCpuUsage.resetElapsed();
    286             mWcStats.reset();
    287             mHzStats.reset();
    288             ALOGD("CPU usage for %s over past %.1f secs\n"
    289                 "  (%u mixer loops at %.1f mean ms per loop):\n"
    290                 "  us per mix loop: mean=%.0f stddev=%.0f min=%.0f max=%.0f\n"
    291                 "  %% of wall: mean=%.1f stddev=%.1f min=%.1f max=%.1f\n"
    292                 "  MHz: mean=%.1f, stddev=%.1f, min=%.1f max=%.1f",
    293                     title.string(),
    294                     elapsed * .000000001, n, perLoop * .000001,
    295                     mean * .001,
    296                     stddev * .001,
    297                     minimum * .001,
    298                     maximum * .001,
    299                     mean / perLoop100,
    300                     stddev / perLoop100,
    301                     minimum / perLoop100,
    302                     maximum / perLoop100,
    303                     meanCycles / perLoop1k,
    304                     stddevCycles / perLoop1k,
    305                     minCycles / perLoop1k,
    306                     maxCycles / perLoop1k);
    307 
    308         }
    309     }
    310 #endif
    311 };
    312 
    313 // ----------------------------------------------------------------------------
    314 //      ThreadBase
    315 // ----------------------------------------------------------------------------
    316 
    317 AudioFlinger::ThreadBase::ThreadBase(const sp<AudioFlinger>& audioFlinger, audio_io_handle_t id,
    318         audio_devices_t outDevice, audio_devices_t inDevice, type_t type)
    319     :   Thread(false /*canCallJava*/),
    320         mType(type),
    321         mAudioFlinger(audioFlinger),
    322         // mSampleRate, mFrameCount, mChannelMask, mChannelCount, mFrameSize, mFormat, mBufferSize
    323         // are set by PlaybackThread::readOutputParameters_l() or
    324         // RecordThread::readInputParameters_l()
    325         //FIXME: mStandby should be true here. Is this some kind of hack?
    326         mStandby(false), mOutDevice(outDevice), mInDevice(inDevice),
    327         mAudioSource(AUDIO_SOURCE_DEFAULT), mId(id),
    328         // mName will be set by concrete (non-virtual) subclass
    329         mDeathRecipient(new PMDeathRecipient(this))
    330 {
    331 }
    332 
    333 AudioFlinger::ThreadBase::~ThreadBase()
    334 {
    335     // mConfigEvents should be empty, but just in case it isn't, free the memory it owns
    336     mConfigEvents.clear();
    337 
    338     // do not lock the mutex in destructor
    339     releaseWakeLock_l();
    340     if (mPowerManager != 0) {
    341         sp<IBinder> binder = mPowerManager->asBinder();
    342         binder->unlinkToDeath(mDeathRecipient);
    343     }
    344 }
    345 
    346 status_t AudioFlinger::ThreadBase::readyToRun()
    347 {
    348     status_t status = initCheck();
    349     if (status == NO_ERROR) {
    350         ALOGI("AudioFlinger's thread %p ready to run", this);
    351     } else {
    352         ALOGE("No working audio driver found.");
    353     }
    354     return status;
    355 }
    356 
    357 void AudioFlinger::ThreadBase::exit()
    358 {
    359     ALOGV("ThreadBase::exit");
    360     // do any cleanup required for exit to succeed
    361     preExit();
    362     {
    363         // This lock prevents the following race in thread (uniprocessor for illustration):
    364         //  if (!exitPending()) {
    365         //      // context switch from here to exit()
    366         //      // exit() calls requestExit(), what exitPending() observes
    367         //      // exit() calls signal(), which is dropped since no waiters
    368         //      // context switch back from exit() to here
    369         //      mWaitWorkCV.wait(...);
    370         //      // now thread is hung
    371         //  }
    372         AutoMutex lock(mLock);
    373         requestExit();
    374         mWaitWorkCV.broadcast();
    375     }
    376     // When Thread::requestExitAndWait is made virtual and this method is renamed to
    377     // "virtual status_t requestExitAndWait()", replace by "return Thread::requestExitAndWait();"
    378     requestExitAndWait();
    379 }
    380 
    381 status_t AudioFlinger::ThreadBase::setParameters(const String8& keyValuePairs)
    382 {
    383     status_t status;
    384 
    385     ALOGV("ThreadBase::setParameters() %s", keyValuePairs.string());
    386     Mutex::Autolock _l(mLock);
    387 
    388     return sendSetParameterConfigEvent_l(keyValuePairs);
    389 }
    390 
    391 // sendConfigEvent_l() must be called with ThreadBase::mLock held
    392 // Can temporarily release the lock if waiting for a reply from processConfigEvents_l().
    393 status_t AudioFlinger::ThreadBase::sendConfigEvent_l(sp<ConfigEvent>& event)
    394 {
    395     status_t status = NO_ERROR;
    396 
    397     mConfigEvents.add(event);
    398     ALOGV("sendConfigEvent_l() num events %d event %d", mConfigEvents.size(), event->mType);
    399     mWaitWorkCV.signal();
    400     mLock.unlock();
    401     {
    402         Mutex::Autolock _l(event->mLock);
    403         while (event->mWaitStatus) {
    404             if (event->mCond.waitRelative(event->mLock, kConfigEventTimeoutNs) != NO_ERROR) {
    405                 event->mStatus = TIMED_OUT;
    406                 event->mWaitStatus = false;
    407             }
    408         }
    409         status = event->mStatus;
    410     }
    411     mLock.lock();
    412     return status;
    413 }
    414 
    415 void AudioFlinger::ThreadBase::sendIoConfigEvent(int event, int param)
    416 {
    417     Mutex::Autolock _l(mLock);
    418     sendIoConfigEvent_l(event, param);
    419 }
    420 
    421 // sendIoConfigEvent_l() must be called with ThreadBase::mLock held
    422 void AudioFlinger::ThreadBase::sendIoConfigEvent_l(int event, int param)
    423 {
    424     sp<ConfigEvent> configEvent = (ConfigEvent *)new IoConfigEvent(event, param);
    425     sendConfigEvent_l(configEvent);
    426 }
    427 
    428 // sendPrioConfigEvent_l() must be called with ThreadBase::mLock held
    429 void AudioFlinger::ThreadBase::sendPrioConfigEvent_l(pid_t pid, pid_t tid, int32_t prio)
    430 {
    431     sp<ConfigEvent> configEvent = (ConfigEvent *)new PrioConfigEvent(pid, tid, prio);
    432     sendConfigEvent_l(configEvent);
    433 }
    434 
    435 // sendSetParameterConfigEvent_l() must be called with ThreadBase::mLock held
    436 status_t AudioFlinger::ThreadBase::sendSetParameterConfigEvent_l(const String8& keyValuePair)
    437 {
    438     sp<ConfigEvent> configEvent = (ConfigEvent *)new SetParameterConfigEvent(keyValuePair);
    439     return sendConfigEvent_l(configEvent);
    440 }
    441 
    442 status_t AudioFlinger::ThreadBase::sendCreateAudioPatchConfigEvent(
    443                                                         const struct audio_patch *patch,
    444                                                         audio_patch_handle_t *handle)
    445 {
    446     Mutex::Autolock _l(mLock);
    447     sp<ConfigEvent> configEvent = (ConfigEvent *)new CreateAudioPatchConfigEvent(*patch, *handle);
    448     status_t status = sendConfigEvent_l(configEvent);
    449     if (status == NO_ERROR) {
    450         CreateAudioPatchConfigEventData *data =
    451                                         (CreateAudioPatchConfigEventData *)configEvent->mData.get();
    452         *handle = data->mHandle;
    453     }
    454     return status;
    455 }
    456 
    457 status_t AudioFlinger::ThreadBase::sendReleaseAudioPatchConfigEvent(
    458                                                                 const audio_patch_handle_t handle)
    459 {
    460     Mutex::Autolock _l(mLock);
    461     sp<ConfigEvent> configEvent = (ConfigEvent *)new ReleaseAudioPatchConfigEvent(handle);
    462     return sendConfigEvent_l(configEvent);
    463 }
    464 
    465 
    466 // post condition: mConfigEvents.isEmpty()
    467 void AudioFlinger::ThreadBase::processConfigEvents_l()
    468 {
    469     bool configChanged = false;
    470 
    471     while (!mConfigEvents.isEmpty()) {
    472         ALOGV("processConfigEvents_l() remaining events %d", mConfigEvents.size());
    473         sp<ConfigEvent> event = mConfigEvents[0];
    474         mConfigEvents.removeAt(0);
    475         switch (event->mType) {
    476         case CFG_EVENT_PRIO: {
    477             PrioConfigEventData *data = (PrioConfigEventData *)event->mData.get();
    478             // FIXME Need to understand why this has to be done asynchronously
    479             int err = requestPriority(data->mPid, data->mTid, data->mPrio,
    480                     true /*asynchronous*/);
    481             if (err != 0) {
    482                 ALOGW("Policy SCHED_FIFO priority %d is unavailable for pid %d tid %d; error %d",
    483                       data->mPrio, data->mPid, data->mTid, err);
    484             }
    485         } break;
    486         case CFG_EVENT_IO: {
    487             IoConfigEventData *data = (IoConfigEventData *)event->mData.get();
    488             audioConfigChanged(data->mEvent, data->mParam);
    489         } break;
    490         case CFG_EVENT_SET_PARAMETER: {
    491             SetParameterConfigEventData *data = (SetParameterConfigEventData *)event->mData.get();
    492             if (checkForNewParameter_l(data->mKeyValuePairs, event->mStatus)) {
    493                 configChanged = true;
    494             }
    495         } break;
    496         case CFG_EVENT_CREATE_AUDIO_PATCH: {
    497             CreateAudioPatchConfigEventData *data =
    498                                             (CreateAudioPatchConfigEventData *)event->mData.get();
    499             event->mStatus = createAudioPatch_l(&data->mPatch, &data->mHandle);
    500         } break;
    501         case CFG_EVENT_RELEASE_AUDIO_PATCH: {
    502             ReleaseAudioPatchConfigEventData *data =
    503                                             (ReleaseAudioPatchConfigEventData *)event->mData.get();
    504             event->mStatus = releaseAudioPatch_l(data->mHandle);
    505         } break;
    506         default:
    507             ALOG_ASSERT(false, "processConfigEvents_l() unknown event type %d", event->mType);
    508             break;
    509         }
    510         {
    511             Mutex::Autolock _l(event->mLock);
    512             if (event->mWaitStatus) {
    513                 event->mWaitStatus = false;
    514                 event->mCond.signal();
    515             }
    516         }
    517         ALOGV_IF(mConfigEvents.isEmpty(), "processConfigEvents_l() DONE thread %p", this);
    518     }
    519 
    520     if (configChanged) {
    521         cacheParameters_l();
    522     }
    523 }
    524 
    525 String8 channelMaskToString(audio_channel_mask_t mask, bool output) {
    526     String8 s;
    527     if (output) {
    528         if (mask & AUDIO_CHANNEL_OUT_FRONT_LEFT) s.append("front-left, ");
    529         if (mask & AUDIO_CHANNEL_OUT_FRONT_RIGHT) s.append("front-right, ");
    530         if (mask & AUDIO_CHANNEL_OUT_FRONT_CENTER) s.append("front-center, ");
    531         if (mask & AUDIO_CHANNEL_OUT_LOW_FREQUENCY) s.append("low freq, ");
    532         if (mask & AUDIO_CHANNEL_OUT_BACK_LEFT) s.append("back-left, ");
    533         if (mask & AUDIO_CHANNEL_OUT_BACK_RIGHT) s.append("back-right, ");
    534         if (mask & AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER) s.append("front-left-of-center, ");
    535         if (mask & AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER) s.append("front-right-of-center, ");
    536         if (mask & AUDIO_CHANNEL_OUT_BACK_CENTER) s.append("back-center, ");
    537         if (mask & AUDIO_CHANNEL_OUT_SIDE_LEFT) s.append("side-left, ");
    538         if (mask & AUDIO_CHANNEL_OUT_SIDE_RIGHT) s.append("side-right, ");
    539         if (mask & AUDIO_CHANNEL_OUT_TOP_CENTER) s.append("top-center ,");
    540         if (mask & AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT) s.append("top-front-left, ");
    541         if (mask & AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER) s.append("top-front-center, ");
    542         if (mask & AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT) s.append("top-front-right, ");
    543         if (mask & AUDIO_CHANNEL_OUT_TOP_BACK_LEFT) s.append("top-back-left, ");
    544         if (mask & AUDIO_CHANNEL_OUT_TOP_BACK_CENTER) s.append("top-back-center, " );
    545         if (mask & AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT) s.append("top-back-right, " );
    546         if (mask & ~AUDIO_CHANNEL_OUT_ALL) s.append("unknown,  ");
    547     } else {
    548         if (mask & AUDIO_CHANNEL_IN_LEFT) s.append("left, ");
    549         if (mask & AUDIO_CHANNEL_IN_RIGHT) s.append("right, ");
    550         if (mask & AUDIO_CHANNEL_IN_FRONT) s.append("front, ");
    551         if (mask & AUDIO_CHANNEL_IN_BACK) s.append("back, ");
    552         if (mask & AUDIO_CHANNEL_IN_LEFT_PROCESSED) s.append("left-processed, ");
    553         if (mask & AUDIO_CHANNEL_IN_RIGHT_PROCESSED) s.append("right-processed, ");
    554         if (mask & AUDIO_CHANNEL_IN_FRONT_PROCESSED) s.append("front-processed, ");
    555         if (mask & AUDIO_CHANNEL_IN_BACK_PROCESSED) s.append("back-processed, ");
    556         if (mask & AUDIO_CHANNEL_IN_PRESSURE) s.append("pressure, ");
    557         if (mask & AUDIO_CHANNEL_IN_X_AXIS) s.append("X, ");
    558         if (mask & AUDIO_CHANNEL_IN_Y_AXIS) s.append("Y, ");
    559         if (mask & AUDIO_CHANNEL_IN_Z_AXIS) s.append("Z, ");
    560         if (mask & AUDIO_CHANNEL_IN_VOICE_UPLINK) s.append("voice-uplink, ");
    561         if (mask & AUDIO_CHANNEL_IN_VOICE_DNLINK) s.append("voice-dnlink, ");
    562         if (mask & ~AUDIO_CHANNEL_IN_ALL) s.append("unknown,  ");
    563     }
    564     int len = s.length();
    565     if (s.length() > 2) {
    566         char *str = s.lockBuffer(len);
    567         s.unlockBuffer(len - 2);
    568     }
    569     return s;
    570 }
    571 
    572 void AudioFlinger::ThreadBase::dumpBase(int fd, const Vector<String16>& args __unused)
    573 {
    574     const size_t SIZE = 256;
    575     char buffer[SIZE];
    576     String8 result;
    577 
    578     bool locked = AudioFlinger::dumpTryLock(mLock);
    579     if (!locked) {
    580         dprintf(fd, "thread %p maybe dead locked\n", this);
    581     }
    582 
    583     dprintf(fd, "  I/O handle: %d\n", mId);
    584     dprintf(fd, "  TID: %d\n", getTid());
    585     dprintf(fd, "  Standby: %s\n", mStandby ? "yes" : "no");
    586     dprintf(fd, "  Sample rate: %u\n", mSampleRate);
    587     dprintf(fd, "  HAL frame count: %zu\n", mFrameCount);
    588     dprintf(fd, "  HAL buffer size: %u bytes\n", mBufferSize);
    589     dprintf(fd, "  Channel Count: %u\n", mChannelCount);
    590     dprintf(fd, "  Channel Mask: 0x%08x (%s)\n", mChannelMask,
    591             channelMaskToString(mChannelMask, mType != RECORD).string());
    592     dprintf(fd, "  Format: 0x%x (%s)\n", mHALFormat, formatToString(mHALFormat));
    593     dprintf(fd, "  Frame size: %zu\n", mFrameSize);
    594     dprintf(fd, "  Pending config events:");
    595     size_t numConfig = mConfigEvents.size();
    596     if (numConfig) {
    597         for (size_t i = 0; i < numConfig; i++) {
    598             mConfigEvents[i]->dump(buffer, SIZE);
    599             dprintf(fd, "\n    %s", buffer);
    600         }
    601         dprintf(fd, "\n");
    602     } else {
    603         dprintf(fd, " none\n");
    604     }
    605 
    606     if (locked) {
    607         mLock.unlock();
    608     }
    609 }
    610 
    611 void AudioFlinger::ThreadBase::dumpEffectChains(int fd, const Vector<String16>& args)
    612 {
    613     const size_t SIZE = 256;
    614     char buffer[SIZE];
    615     String8 result;
    616 
    617     size_t numEffectChains = mEffectChains.size();
    618     snprintf(buffer, SIZE, "  %zu Effect Chains\n", numEffectChains);
    619     write(fd, buffer, strlen(buffer));
    620 
    621     for (size_t i = 0; i < numEffectChains; ++i) {
    622         sp<EffectChain> chain = mEffectChains[i];
    623         if (chain != 0) {
    624             chain->dump(fd, args);
    625         }
    626     }
    627 }
    628 
    629 void AudioFlinger::ThreadBase::acquireWakeLock(int uid)
    630 {
    631     Mutex::Autolock _l(mLock);
    632     acquireWakeLock_l(uid);
    633 }
    634 
    635 String16 AudioFlinger::ThreadBase::getWakeLockTag()
    636 {
    637     switch (mType) {
    638         case MIXER:
    639             return String16("AudioMix");
    640         case DIRECT:
    641             return String16("AudioDirectOut");
    642         case DUPLICATING:
    643             return String16("AudioDup");
    644         case RECORD:
    645             return String16("AudioIn");
    646         case OFFLOAD:
    647             return String16("AudioOffload");
    648         default:
    649             ALOG_ASSERT(false);
    650             return String16("AudioUnknown");
    651     }
    652 }
    653 
    654 void AudioFlinger::ThreadBase::acquireWakeLock_l(int uid)
    655 {
    656     getPowerManager_l();
    657     if (mPowerManager != 0) {
    658         sp<IBinder> binder = new BBinder();
    659         status_t status;
    660         if (uid >= 0) {
    661             status = mPowerManager->acquireWakeLockWithUid(POWERMANAGER_PARTIAL_WAKE_LOCK,
    662                     binder,
    663                     getWakeLockTag(),
    664                     String16("media"),
    665                     uid,
    666                     true /* FIXME force oneway contrary to .aidl */);
    667         } else {
    668             status = mPowerManager->acquireWakeLock(POWERMANAGER_PARTIAL_WAKE_LOCK,
    669                     binder,
    670                     getWakeLockTag(),
    671                     String16("media"),
    672                     true /* FIXME force oneway contrary to .aidl */);
    673         }
    674         if (status == NO_ERROR) {
    675             mWakeLockToken = binder;
    676         }
    677         ALOGV("acquireWakeLock_l() %s status %d", mName, status);
    678     }
    679 }
    680 
    681 void AudioFlinger::ThreadBase::releaseWakeLock()
    682 {
    683     Mutex::Autolock _l(mLock);
    684     releaseWakeLock_l();
    685 }
    686 
    687 void AudioFlinger::ThreadBase::releaseWakeLock_l()
    688 {
    689     if (mWakeLockToken != 0) {
    690         ALOGV("releaseWakeLock_l() %s", mName);
    691         if (mPowerManager != 0) {
    692             mPowerManager->releaseWakeLock(mWakeLockToken, 0,
    693                     true /* FIXME force oneway contrary to .aidl */);
    694         }
    695         mWakeLockToken.clear();
    696     }
    697 }
    698 
    699 void AudioFlinger::ThreadBase::updateWakeLockUids(const SortedVector<int> &uids) {
    700     Mutex::Autolock _l(mLock);
    701     updateWakeLockUids_l(uids);
    702 }
    703 
    704 void AudioFlinger::ThreadBase::getPowerManager_l() {
    705 
    706     if (mPowerManager == 0) {
    707         // use checkService() to avoid blocking if power service is not up yet
    708         sp<IBinder> binder =
    709             defaultServiceManager()->checkService(String16("power"));
    710         if (binder == 0) {
    711             ALOGW("Thread %s cannot connect to the power manager service", mName);
    712         } else {
    713             mPowerManager = interface_cast<IPowerManager>(binder);
    714             binder->linkToDeath(mDeathRecipient);
    715         }
    716     }
    717 }
    718 
    719 void AudioFlinger::ThreadBase::updateWakeLockUids_l(const SortedVector<int> &uids) {
    720 
    721     getPowerManager_l();
    722     if (mWakeLockToken == NULL) {
    723         ALOGE("no wake lock to update!");
    724         return;
    725     }
    726     if (mPowerManager != 0) {
    727         sp<IBinder> binder = new BBinder();
    728         status_t status;
    729         status = mPowerManager->updateWakeLockUids(mWakeLockToken, uids.size(), uids.array(),
    730                     true /* FIXME force oneway contrary to .aidl */);
    731         ALOGV("acquireWakeLock_l() %s status %d", mName, status);
    732     }
    733 }
    734 
    735 void AudioFlinger::ThreadBase::clearPowerManager()
    736 {
    737     Mutex::Autolock _l(mLock);
    738     releaseWakeLock_l();
    739     mPowerManager.clear();
    740 }
    741 
    742 void AudioFlinger::ThreadBase::PMDeathRecipient::binderDied(const wp<IBinder>& who __unused)
    743 {
    744     sp<ThreadBase> thread = mThread.promote();
    745     if (thread != 0) {
    746         thread->clearPowerManager();
    747     }
    748     ALOGW("power manager service died !!!");
    749 }
    750 
    751 void AudioFlinger::ThreadBase::setEffectSuspended(
    752         const effect_uuid_t *type, bool suspend, int sessionId)
    753 {
    754     Mutex::Autolock _l(mLock);
    755     setEffectSuspended_l(type, suspend, sessionId);
    756 }
    757 
    758 void AudioFlinger::ThreadBase::setEffectSuspended_l(
    759         const effect_uuid_t *type, bool suspend, int sessionId)
    760 {
    761     sp<EffectChain> chain = getEffectChain_l(sessionId);
    762     if (chain != 0) {
    763         if (type != NULL) {
    764             chain->setEffectSuspended_l(type, suspend);
    765         } else {
    766             chain->setEffectSuspendedAll_l(suspend);
    767         }
    768     }
    769 
    770     updateSuspendedSessions_l(type, suspend, sessionId);
    771 }
    772 
    773 void AudioFlinger::ThreadBase::checkSuspendOnAddEffectChain_l(const sp<EffectChain>& chain)
    774 {
    775     ssize_t index = mSuspendedSessions.indexOfKey(chain->sessionId());
    776     if (index < 0) {
    777         return;
    778     }
    779 
    780     const KeyedVector <int, sp<SuspendedSessionDesc> >& sessionEffects =
    781             mSuspendedSessions.valueAt(index);
    782 
    783     for (size_t i = 0; i < sessionEffects.size(); i++) {
    784         sp<SuspendedSessionDesc> desc = sessionEffects.valueAt(i);
    785         for (int j = 0; j < desc->mRefCount; j++) {
    786             if (sessionEffects.keyAt(i) == EffectChain::kKeyForSuspendAll) {
    787                 chain->setEffectSuspendedAll_l(true);
    788             } else {
    789                 ALOGV("checkSuspendOnAddEffectChain_l() suspending effects %08x",
    790                     desc->mType.timeLow);
    791                 chain->setEffectSuspended_l(&desc->mType, true);
    792             }
    793         }
    794     }
    795 }
    796 
    797 void AudioFlinger::ThreadBase::updateSuspendedSessions_l(const effect_uuid_t *type,
    798                                                          bool suspend,
    799                                                          int sessionId)
    800 {
    801     ssize_t index = mSuspendedSessions.indexOfKey(sessionId);
    802 
    803     KeyedVector <int, sp<SuspendedSessionDesc> > sessionEffects;
    804 
    805     if (suspend) {
    806         if (index >= 0) {
    807             sessionEffects = mSuspendedSessions.valueAt(index);
    808         } else {
    809             mSuspendedSessions.add(sessionId, sessionEffects);
    810         }
    811     } else {
    812         if (index < 0) {
    813             return;
    814         }
    815         sessionEffects = mSuspendedSessions.valueAt(index);
    816     }
    817 
    818 
    819     int key = EffectChain::kKeyForSuspendAll;
    820     if (type != NULL) {
    821         key = type->timeLow;
    822     }
    823     index = sessionEffects.indexOfKey(key);
    824 
    825     sp<SuspendedSessionDesc> desc;
    826     if (suspend) {
    827         if (index >= 0) {
    828             desc = sessionEffects.valueAt(index);
    829         } else {
    830             desc = new SuspendedSessionDesc();
    831             if (type != NULL) {
    832                 desc->mType = *type;
    833             }
    834             sessionEffects.add(key, desc);
    835             ALOGV("updateSuspendedSessions_l() suspend adding effect %08x", key);
    836         }
    837         desc->mRefCount++;
    838     } else {
    839         if (index < 0) {
    840             return;
    841         }
    842         desc = sessionEffects.valueAt(index);
    843         if (--desc->mRefCount == 0) {
    844             ALOGV("updateSuspendedSessions_l() restore removing effect %08x", key);
    845             sessionEffects.removeItemsAt(index);
    846             if (sessionEffects.isEmpty()) {
    847                 ALOGV("updateSuspendedSessions_l() restore removing session %d",
    848                                  sessionId);
    849                 mSuspendedSessions.removeItem(sessionId);
    850             }
    851         }
    852     }
    853     if (!sessionEffects.isEmpty()) {
    854         mSuspendedSessions.replaceValueFor(sessionId, sessionEffects);
    855     }
    856 }
    857 
    858 void AudioFlinger::ThreadBase::checkSuspendOnEffectEnabled(const sp<EffectModule>& effect,
    859                                                             bool enabled,
    860                                                             int sessionId)
    861 {
    862     Mutex::Autolock _l(mLock);
    863     checkSuspendOnEffectEnabled_l(effect, enabled, sessionId);
    864 }
    865 
    866 void AudioFlinger::ThreadBase::checkSuspendOnEffectEnabled_l(const sp<EffectModule>& effect,
    867                                                             bool enabled,
    868                                                             int sessionId)
    869 {
    870     if (mType != RECORD) {
    871         // suspend all effects in AUDIO_SESSION_OUTPUT_MIX when enabling any effect on
    872         // another session. This gives the priority to well behaved effect control panels
    873         // and applications not using global effects.
    874         // Enabling post processing in AUDIO_SESSION_OUTPUT_STAGE session does not affect
    875         // global effects
    876         if ((sessionId != AUDIO_SESSION_OUTPUT_MIX) && (sessionId != AUDIO_SESSION_OUTPUT_STAGE)) {
    877             setEffectSuspended_l(NULL, enabled, AUDIO_SESSION_OUTPUT_MIX);
    878         }
    879     }
    880 
    881     sp<EffectChain> chain = getEffectChain_l(sessionId);
    882     if (chain != 0) {
    883         chain->checkSuspendOnEffectEnabled(effect, enabled);
    884     }
    885 }
    886 
    887 // ThreadBase::createEffect_l() must be called with AudioFlinger::mLock held
    888 sp<AudioFlinger::EffectHandle> AudioFlinger::ThreadBase::createEffect_l(
    889         const sp<AudioFlinger::Client>& client,
    890         const sp<IEffectClient>& effectClient,
    891         int32_t priority,
    892         int sessionId,
    893         effect_descriptor_t *desc,
    894         int *enabled,
    895         status_t *status)
    896 {
    897     sp<EffectModule> effect;
    898     sp<EffectHandle> handle;
    899     status_t lStatus;
    900     sp<EffectChain> chain;
    901     bool chainCreated = false;
    902     bool effectCreated = false;
    903     bool effectRegistered = false;
    904 
    905     lStatus = initCheck();
    906     if (lStatus != NO_ERROR) {
    907         ALOGW("createEffect_l() Audio driver not initialized.");
    908         goto Exit;
    909     }
    910 
    911     // Reject any effect on Direct output threads for now, since the format of
    912     // mSinkBuffer is not guaranteed to be compatible with effect processing (PCM 16 stereo).
    913     if (mType == DIRECT) {
    914         ALOGW("createEffect_l() Cannot add effect %s on Direct output type thread %s",
    915                 desc->name, mName);
    916         lStatus = BAD_VALUE;
    917         goto Exit;
    918     }
    919 
    920     // Reject any effect on mixer or duplicating multichannel sinks.
    921     // TODO: fix both format and multichannel issues with effects.
    922     if ((mType == MIXER || mType == DUPLICATING) && mChannelCount != FCC_2) {
    923         ALOGW("createEffect_l() Cannot add effect %s for multichannel(%d) %s threads",
    924                 desc->name, mChannelCount, mType == MIXER ? "MIXER" : "DUPLICATING");
    925         lStatus = BAD_VALUE;
    926         goto Exit;
    927     }
    928 
    929     // Allow global effects only on offloaded and mixer threads
    930     if (sessionId == AUDIO_SESSION_OUTPUT_MIX) {
    931         switch (mType) {
    932         case MIXER:
    933         case OFFLOAD:
    934             break;
    935         case DIRECT:
    936         case DUPLICATING:
    937         case RECORD:
    938         default:
    939             ALOGW("createEffect_l() Cannot add global effect %s on thread %s", desc->name, mName);
    940             lStatus = BAD_VALUE;
    941             goto Exit;
    942         }
    943     }
    944 
    945     // Only Pre processor effects are allowed on input threads and only on input threads
    946     if ((mType == RECORD) != ((desc->flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_PRE_PROC)) {
    947         ALOGW("createEffect_l() effect %s (flags %08x) created on wrong thread type %d",
    948                 desc->name, desc->flags, mType);
    949         lStatus = BAD_VALUE;
    950         goto Exit;
    951     }
    952 
    953     ALOGV("createEffect_l() thread %p effect %s on session %d", this, desc->name, sessionId);
    954 
    955     { // scope for mLock
    956         Mutex::Autolock _l(mLock);
    957 
    958         // check for existing effect chain with the requested audio session
    959         chain = getEffectChain_l(sessionId);
    960         if (chain == 0) {
    961             // create a new chain for this session
    962             ALOGV("createEffect_l() new effect chain for session %d", sessionId);
    963             chain = new EffectChain(this, sessionId);
    964             addEffectChain_l(chain);
    965             chain->setStrategy(getStrategyForSession_l(sessionId));
    966             chainCreated = true;
    967         } else {
    968             effect = chain->getEffectFromDesc_l(desc);
    969         }
    970 
    971         ALOGV("createEffect_l() got effect %p on chain %p", effect.get(), chain.get());
    972 
    973         if (effect == 0) {
    974             int id = mAudioFlinger->nextUniqueId();
    975             // Check CPU and memory usage
    976             lStatus = AudioSystem::registerEffect(desc, mId, chain->strategy(), sessionId, id);
    977             if (lStatus != NO_ERROR) {
    978                 goto Exit;
    979             }
    980             effectRegistered = true;
    981             // create a new effect module if none present in the chain
    982             effect = new EffectModule(this, chain, desc, id, sessionId);
    983             lStatus = effect->status();
    984             if (lStatus != NO_ERROR) {
    985                 goto Exit;
    986             }
    987             effect->setOffloaded(mType == OFFLOAD, mId);
    988 
    989             lStatus = chain->addEffect_l(effect);
    990             if (lStatus != NO_ERROR) {
    991                 goto Exit;
    992             }
    993             effectCreated = true;
    994 
    995             effect->setDevice(mOutDevice);
    996             effect->setDevice(mInDevice);
    997             effect->setMode(mAudioFlinger->getMode());
    998             effect->setAudioSource(mAudioSource);
    999         }
   1000         // create effect handle and connect it to effect module
   1001         handle = new EffectHandle(effect, client, effectClient, priority);
   1002         lStatus = handle->initCheck();
   1003         if (lStatus == OK) {
   1004             lStatus = effect->addHandle(handle.get());
   1005         }
   1006         if (enabled != NULL) {
   1007             *enabled = (int)effect->isEnabled();
   1008         }
   1009     }
   1010 
   1011 Exit:
   1012     if (lStatus != NO_ERROR && lStatus != ALREADY_EXISTS) {
   1013         Mutex::Autolock _l(mLock);
   1014         if (effectCreated) {
   1015             chain->removeEffect_l(effect);
   1016         }
   1017         if (effectRegistered) {
   1018             AudioSystem::unregisterEffect(effect->id());
   1019         }
   1020         if (chainCreated) {
   1021             removeEffectChain_l(chain);
   1022         }
   1023         handle.clear();
   1024     }
   1025 
   1026     *status = lStatus;
   1027     return handle;
   1028 }
   1029 
   1030 sp<AudioFlinger::EffectModule> AudioFlinger::ThreadBase::getEffect(int sessionId, int effectId)
   1031 {
   1032     Mutex::Autolock _l(mLock);
   1033     return getEffect_l(sessionId, effectId);
   1034 }
   1035 
   1036 sp<AudioFlinger::EffectModule> AudioFlinger::ThreadBase::getEffect_l(int sessionId, int effectId)
   1037 {
   1038     sp<EffectChain> chain = getEffectChain_l(sessionId);
   1039     return chain != 0 ? chain->getEffectFromId_l(effectId) : 0;
   1040 }
   1041 
   1042 // PlaybackThread::addEffect_l() must be called with AudioFlinger::mLock and
   1043 // PlaybackThread::mLock held
   1044 status_t AudioFlinger::ThreadBase::addEffect_l(const sp<EffectModule>& effect)
   1045 {
   1046     // check for existing effect chain with the requested audio session
   1047     int sessionId = effect->sessionId();
   1048     sp<EffectChain> chain = getEffectChain_l(sessionId);
   1049     bool chainCreated = false;
   1050 
   1051     ALOGD_IF((mType == OFFLOAD) && !effect->isOffloadable(),
   1052              "addEffect_l() on offloaded thread %p: effect %s does not support offload flags %x",
   1053                     this, effect->desc().name, effect->desc().flags);
   1054 
   1055     if (chain == 0) {
   1056         // create a new chain for this session
   1057         ALOGV("addEffect_l() new effect chain for session %d", sessionId);
   1058         chain = new EffectChain(this, sessionId);
   1059         addEffectChain_l(chain);
   1060         chain->setStrategy(getStrategyForSession_l(sessionId));
   1061         chainCreated = true;
   1062     }
   1063     ALOGV("addEffect_l() %p chain %p effect %p", this, chain.get(), effect.get());
   1064 
   1065     if (chain->getEffectFromId_l(effect->id()) != 0) {
   1066         ALOGW("addEffect_l() %p effect %s already present in chain %p",
   1067                 this, effect->desc().name, chain.get());
   1068         return BAD_VALUE;
   1069     }
   1070 
   1071     effect->setOffloaded(mType == OFFLOAD, mId);
   1072 
   1073     status_t status = chain->addEffect_l(effect);
   1074     if (status != NO_ERROR) {
   1075         if (chainCreated) {
   1076             removeEffectChain_l(chain);
   1077         }
   1078         return status;
   1079     }
   1080 
   1081     effect->setDevice(mOutDevice);
   1082     effect->setDevice(mInDevice);
   1083     effect->setMode(mAudioFlinger->getMode());
   1084     effect->setAudioSource(mAudioSource);
   1085     return NO_ERROR;
   1086 }
   1087 
   1088 void AudioFlinger::ThreadBase::removeEffect_l(const sp<EffectModule>& effect) {
   1089 
   1090     ALOGV("removeEffect_l() %p effect %p", this, effect.get());
   1091     effect_descriptor_t desc = effect->desc();
   1092     if ((desc.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
   1093         detachAuxEffect_l(effect->id());
   1094     }
   1095 
   1096     sp<EffectChain> chain = effect->chain().promote();
   1097     if (chain != 0) {
   1098         // remove effect chain if removing last effect
   1099         if (chain->removeEffect_l(effect) == 0) {
   1100             removeEffectChain_l(chain);
   1101         }
   1102     } else {
   1103         ALOGW("removeEffect_l() %p cannot promote chain for effect %p", this, effect.get());
   1104     }
   1105 }
   1106 
   1107 void AudioFlinger::ThreadBase::lockEffectChains_l(
   1108         Vector< sp<AudioFlinger::EffectChain> >& effectChains)
   1109 {
   1110     effectChains = mEffectChains;
   1111     for (size_t i = 0; i < mEffectChains.size(); i++) {
   1112         mEffectChains[i]->lock();
   1113     }
   1114 }
   1115 
   1116 void AudioFlinger::ThreadBase::unlockEffectChains(
   1117         const Vector< sp<AudioFlinger::EffectChain> >& effectChains)
   1118 {
   1119     for (size_t i = 0; i < effectChains.size(); i++) {
   1120         effectChains[i]->unlock();
   1121     }
   1122 }
   1123 
   1124 sp<AudioFlinger::EffectChain> AudioFlinger::ThreadBase::getEffectChain(int sessionId)
   1125 {
   1126     Mutex::Autolock _l(mLock);
   1127     return getEffectChain_l(sessionId);
   1128 }
   1129 
   1130 sp<AudioFlinger::EffectChain> AudioFlinger::ThreadBase::getEffectChain_l(int sessionId) const
   1131 {
   1132     size_t size = mEffectChains.size();
   1133     for (size_t i = 0; i < size; i++) {
   1134         if (mEffectChains[i]->sessionId() == sessionId) {
   1135             return mEffectChains[i];
   1136         }
   1137     }
   1138     return 0;
   1139 }
   1140 
   1141 void AudioFlinger::ThreadBase::setMode(audio_mode_t mode)
   1142 {
   1143     Mutex::Autolock _l(mLock);
   1144     size_t size = mEffectChains.size();
   1145     for (size_t i = 0; i < size; i++) {
   1146         mEffectChains[i]->setMode_l(mode);
   1147     }
   1148 }
   1149 
   1150 void AudioFlinger::ThreadBase::getAudioPortConfig(struct audio_port_config *config)
   1151 {
   1152     config->type = AUDIO_PORT_TYPE_MIX;
   1153     config->ext.mix.handle = mId;
   1154     config->sample_rate = mSampleRate;
   1155     config->format = mFormat;
   1156     config->channel_mask = mChannelMask;
   1157     config->config_mask = AUDIO_PORT_CONFIG_SAMPLE_RATE|AUDIO_PORT_CONFIG_CHANNEL_MASK|
   1158                             AUDIO_PORT_CONFIG_FORMAT;
   1159 }
   1160 
   1161 
   1162 // ----------------------------------------------------------------------------
   1163 //      Playback
   1164 // ----------------------------------------------------------------------------
   1165 
   1166 AudioFlinger::PlaybackThread::PlaybackThread(const sp<AudioFlinger>& audioFlinger,
   1167                                              AudioStreamOut* output,
   1168                                              audio_io_handle_t id,
   1169                                              audio_devices_t device,
   1170                                              type_t type)
   1171     :   ThreadBase(audioFlinger, id, device, AUDIO_DEVICE_NONE, type),
   1172         mNormalFrameCount(0), mSinkBuffer(NULL),
   1173         mMixerBufferEnabled(AudioFlinger::kEnableExtendedPrecision),
   1174         mMixerBuffer(NULL),
   1175         mMixerBufferSize(0),
   1176         mMixerBufferFormat(AUDIO_FORMAT_INVALID),
   1177         mMixerBufferValid(false),
   1178         mEffectBufferEnabled(AudioFlinger::kEnableExtendedPrecision),
   1179         mEffectBuffer(NULL),
   1180         mEffectBufferSize(0),
   1181         mEffectBufferFormat(AUDIO_FORMAT_INVALID),
   1182         mEffectBufferValid(false),
   1183         mSuspended(0), mBytesWritten(0),
   1184         mActiveTracksGeneration(0),
   1185         // mStreamTypes[] initialized in constructor body
   1186         mOutput(output),
   1187         mLastWriteTime(0), mNumWrites(0), mNumDelayedWrites(0), mInWrite(false),
   1188         mMixerStatus(MIXER_IDLE),
   1189         mMixerStatusIgnoringFastTracks(MIXER_IDLE),
   1190         standbyDelay(AudioFlinger::mStandbyTimeInNsecs),
   1191         mBytesRemaining(0),
   1192         mCurrentWriteLength(0),
   1193         mUseAsyncWrite(false),
   1194         mWriteAckSequence(0),
   1195         mDrainSequence(0),
   1196         mSignalPending(false),
   1197         mScreenState(AudioFlinger::mScreenState),
   1198         // index 0 is reserved for normal mixer's submix
   1199         mFastTrackAvailMask(((1 << FastMixerState::kMaxFastTracks) - 1) & ~1),
   1200         // mLatchD, mLatchQ,
   1201         mLatchDValid(false), mLatchQValid(false)
   1202 {
   1203     snprintf(mName, kNameLength, "AudioOut_%X", id);
   1204     mNBLogWriter = audioFlinger->newWriter_l(kLogSize, mName);
   1205 
   1206     // Assumes constructor is called by AudioFlinger with it's mLock held, but
   1207     // it would be safer to explicitly pass initial masterVolume/masterMute as
   1208     // parameter.
   1209     //
   1210     // If the HAL we are using has support for master volume or master mute,
   1211     // then do not attenuate or mute during mixing (just leave the volume at 1.0
   1212     // and the mute set to false).
   1213     mMasterVolume = audioFlinger->masterVolume_l();
   1214     mMasterMute = audioFlinger->masterMute_l();
   1215     if (mOutput && mOutput->audioHwDev) {
   1216         if (mOutput->audioHwDev->canSetMasterVolume()) {
   1217             mMasterVolume = 1.0;
   1218         }
   1219 
   1220         if (mOutput->audioHwDev->canSetMasterMute()) {
   1221             mMasterMute = false;
   1222         }
   1223     }
   1224 
   1225     readOutputParameters_l();
   1226 
   1227     // mStreamTypes[AUDIO_STREAM_CNT] is initialized by stream_type_t default constructor
   1228     // There is no AUDIO_STREAM_MIN, and ++ operator does not compile
   1229     for (audio_stream_type_t stream = AUDIO_STREAM_MIN; stream < AUDIO_STREAM_CNT;
   1230             stream = (audio_stream_type_t) (stream + 1)) {
   1231         mStreamTypes[stream].volume = mAudioFlinger->streamVolume_l(stream);
   1232         mStreamTypes[stream].mute = mAudioFlinger->streamMute_l(stream);
   1233     }
   1234     // mStreamTypes[AUDIO_STREAM_CNT] exists but isn't explicitly initialized here,
   1235     // because mAudioFlinger doesn't have one to copy from
   1236 }
   1237 
   1238 AudioFlinger::PlaybackThread::~PlaybackThread()
   1239 {
   1240     mAudioFlinger->unregisterWriter(mNBLogWriter);
   1241     free(mSinkBuffer);
   1242     free(mMixerBuffer);
   1243     free(mEffectBuffer);
   1244 }
   1245 
   1246 void AudioFlinger::PlaybackThread::dump(int fd, const Vector<String16>& args)
   1247 {
   1248     dumpInternals(fd, args);
   1249     dumpTracks(fd, args);
   1250     dumpEffectChains(fd, args);
   1251 }
   1252 
   1253 void AudioFlinger::PlaybackThread::dumpTracks(int fd, const Vector<String16>& args __unused)
   1254 {
   1255     const size_t SIZE = 256;
   1256     char buffer[SIZE];
   1257     String8 result;
   1258 
   1259     result.appendFormat("  Stream volumes in dB: ");
   1260     for (int i = 0; i < AUDIO_STREAM_CNT; ++i) {
   1261         const stream_type_t *st = &mStreamTypes[i];
   1262         if (i > 0) {
   1263             result.appendFormat(", ");
   1264         }
   1265         result.appendFormat("%d:%.2g", i, 20.0 * log10(st->volume));
   1266         if (st->mute) {
   1267             result.append("M");
   1268         }
   1269     }
   1270     result.append("\n");
   1271     write(fd, result.string(), result.length());
   1272     result.clear();
   1273 
   1274     // These values are "raw"; they will wrap around.  See prepareTracks_l() for a better way.
   1275     FastTrackUnderruns underruns = getFastTrackUnderruns(0);
   1276     dprintf(fd, "  Normal mixer raw underrun counters: partial=%u empty=%u\n",
   1277             underruns.mBitFields.mPartial, underruns.mBitFields.mEmpty);
   1278 
   1279     size_t numtracks = mTracks.size();
   1280     size_t numactive = mActiveTracks.size();
   1281     dprintf(fd, "  %d Tracks", numtracks);
   1282     size_t numactiveseen = 0;
   1283     if (numtracks) {
   1284         dprintf(fd, " of which %d are active\n", numactive);
   1285         Track::appendDumpHeader(result);
   1286         for (size_t i = 0; i < numtracks; ++i) {
   1287             sp<Track> track = mTracks[i];
   1288             if (track != 0) {
   1289                 bool active = mActiveTracks.indexOf(track) >= 0;
   1290                 if (active) {
   1291                     numactiveseen++;
   1292                 }
   1293                 track->dump(buffer, SIZE, active);
   1294                 result.append(buffer);
   1295             }
   1296         }
   1297     } else {
   1298         result.append("\n");
   1299     }
   1300     if (numactiveseen != numactive) {
   1301         // some tracks in the active list were not in the tracks list
   1302         snprintf(buffer, SIZE, "  The following tracks are in the active list but"
   1303                 " not in the track list\n");
   1304         result.append(buffer);
   1305         Track::appendDumpHeader(result);
   1306         for (size_t i = 0; i < numactive; ++i) {
   1307             sp<Track> track = mActiveTracks[i].promote();
   1308             if (track != 0 && mTracks.indexOf(track) < 0) {
   1309                 track->dump(buffer, SIZE, true);
   1310                 result.append(buffer);
   1311             }
   1312         }
   1313     }
   1314 
   1315     write(fd, result.string(), result.size());
   1316 }
   1317 
   1318 void AudioFlinger::PlaybackThread::dumpInternals(int fd, const Vector<String16>& args)
   1319 {
   1320     dprintf(fd, "\nOutput thread %p:\n", this);
   1321     dprintf(fd, "  Normal frame count: %zu\n", mNormalFrameCount);
   1322     dprintf(fd, "  Last write occurred (msecs): %llu\n", ns2ms(systemTime() - mLastWriteTime));
   1323     dprintf(fd, "  Total writes: %d\n", mNumWrites);
   1324     dprintf(fd, "  Delayed writes: %d\n", mNumDelayedWrites);
   1325     dprintf(fd, "  Blocked in write: %s\n", mInWrite ? "yes" : "no");
   1326     dprintf(fd, "  Suspend count: %d\n", mSuspended);
   1327     dprintf(fd, "  Sink buffer : %p\n", mSinkBuffer);
   1328     dprintf(fd, "  Mixer buffer: %p\n", mMixerBuffer);
   1329     dprintf(fd, "  Effect buffer: %p\n", mEffectBuffer);
   1330     dprintf(fd, "  Fast track availMask=%#x\n", mFastTrackAvailMask);
   1331 
   1332     dumpBase(fd, args);
   1333 }
   1334 
   1335 // Thread virtuals
   1336 
   1337 void AudioFlinger::PlaybackThread::onFirstRef()
   1338 {
   1339     run(mName, ANDROID_PRIORITY_URGENT_AUDIO);
   1340 }
   1341 
   1342 // ThreadBase virtuals
   1343 void AudioFlinger::PlaybackThread::preExit()
   1344 {
   1345     ALOGV("  preExit()");
   1346     // FIXME this is using hard-coded strings but in the future, this functionality will be
   1347     //       converted to use audio HAL extensions required to support tunneling
   1348     mOutput->stream->common.set_parameters(&mOutput->stream->common, "exiting=1");
   1349 }
   1350 
   1351 // PlaybackThread::createTrack_l() must be called with AudioFlinger::mLock held
   1352 sp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTrack_l(
   1353         const sp<AudioFlinger::Client>& client,
   1354         audio_stream_type_t streamType,
   1355         uint32_t sampleRate,
   1356         audio_format_t format,
   1357         audio_channel_mask_t channelMask,
   1358         size_t *pFrameCount,
   1359         const sp<IMemory>& sharedBuffer,
   1360         int sessionId,
   1361         IAudioFlinger::track_flags_t *flags,
   1362         pid_t tid,
   1363         int uid,
   1364         status_t *status)
   1365 {
   1366     size_t frameCount = *pFrameCount;
   1367     sp<Track> track;
   1368     status_t lStatus;
   1369 
   1370     bool isTimed = (*flags & IAudioFlinger::TRACK_TIMED) != 0;
   1371 
   1372     // client expresses a preference for FAST, but we get the final say
   1373     if (*flags & IAudioFlinger::TRACK_FAST) {
   1374       if (
   1375             // not timed
   1376             (!isTimed) &&
   1377             // either of these use cases:
   1378             (
   1379               // use case 1: shared buffer with any frame count
   1380               (
   1381                 (sharedBuffer != 0)
   1382               ) ||
   1383               // use case 2: callback handler and frame count is default or at least as large as HAL
   1384               (
   1385                 (tid != -1) &&
   1386                 ((frameCount == 0) ||
   1387                 (frameCount >= mFrameCount))
   1388               )
   1389             ) &&
   1390             // PCM data
   1391             audio_is_linear_pcm(format) &&
   1392             // identical channel mask to sink, or mono in and stereo sink
   1393             (channelMask == mChannelMask ||
   1394                     (channelMask == AUDIO_CHANNEL_OUT_MONO &&
   1395                             mChannelMask == AUDIO_CHANNEL_OUT_STEREO)) &&
   1396             // hardware sample rate
   1397             (sampleRate == mSampleRate) &&
   1398             // normal mixer has an associated fast mixer
   1399             hasFastMixer() &&
   1400             // there are sufficient fast track slots available
   1401             (mFastTrackAvailMask != 0)
   1402             // FIXME test that MixerThread for this fast track has a capable output HAL
   1403             // FIXME add a permission test also?
   1404         ) {
   1405         // if frameCount not specified, then it defaults to fast mixer (HAL) frame count
   1406         if (frameCount == 0) {
   1407             // read the fast track multiplier property the first time it is needed
   1408             int ok = pthread_once(&sFastTrackMultiplierOnce, sFastTrackMultiplierInit);
   1409             if (ok != 0) {
   1410                 ALOGE("%s pthread_once failed: %d", __func__, ok);
   1411             }
   1412             frameCount = mFrameCount * sFastTrackMultiplier;
   1413         }
   1414         ALOGV("AUDIO_OUTPUT_FLAG_FAST accepted: frameCount=%d mFrameCount=%d",
   1415                 frameCount, mFrameCount);
   1416       } else {
   1417         ALOGV("AUDIO_OUTPUT_FLAG_FAST denied: isTimed=%d sharedBuffer=%p frameCount=%d "
   1418                 "mFrameCount=%d format=%#x mFormat=%#x isLinear=%d channelMask=%#x "
   1419                 "sampleRate=%u mSampleRate=%u "
   1420                 "hasFastMixer=%d tid=%d fastTrackAvailMask=%#x",
   1421                 isTimed, sharedBuffer.get(), frameCount, mFrameCount, format, mFormat,
   1422                 audio_is_linear_pcm(format),
   1423                 channelMask, sampleRate, mSampleRate, hasFastMixer(), tid, mFastTrackAvailMask);
   1424         *flags &= ~IAudioFlinger::TRACK_FAST;
   1425         // For compatibility with AudioTrack calculation, buffer depth is forced
   1426         // to be at least 2 x the normal mixer frame count and cover audio hardware latency.
   1427         // This is probably too conservative, but legacy application code may depend on it.
   1428         // If you change this calculation, also review the start threshold which is related.
   1429         uint32_t latencyMs = mOutput->stream->get_latency(mOutput->stream);
   1430         uint32_t minBufCount = latencyMs / ((1000 * mNormalFrameCount) / mSampleRate);
   1431         if (minBufCount < 2) {
   1432             minBufCount = 2;
   1433         }
   1434         size_t minFrameCount = mNormalFrameCount * minBufCount;
   1435         if (frameCount < minFrameCount) {
   1436             frameCount = minFrameCount;
   1437         }
   1438       }
   1439     }
   1440     *pFrameCount = frameCount;
   1441 
   1442     switch (mType) {
   1443 
   1444     case DIRECT:
   1445         if (audio_is_linear_pcm(format)) {
   1446             if (sampleRate != mSampleRate || format != mFormat || channelMask != mChannelMask) {
   1447                 ALOGE("createTrack_l() Bad parameter: sampleRate %u format %#x, channelMask 0x%08x "
   1448                         "for output %p with format %#x",
   1449                         sampleRate, format, channelMask, mOutput, mFormat);
   1450                 lStatus = BAD_VALUE;
   1451                 goto Exit;
   1452             }
   1453         }
   1454         break;
   1455 
   1456     case OFFLOAD:
   1457         if (sampleRate != mSampleRate || format != mFormat || channelMask != mChannelMask) {
   1458             ALOGE("createTrack_l() Bad parameter: sampleRate %d format %#x, channelMask 0x%08x \""
   1459                     "for output %p with format %#x",
   1460                     sampleRate, format, channelMask, mOutput, mFormat);
   1461             lStatus = BAD_VALUE;
   1462             goto Exit;
   1463         }
   1464         break;
   1465 
   1466     default:
   1467         if (!audio_is_linear_pcm(format)) {
   1468                 ALOGE("createTrack_l() Bad parameter: format %#x \""
   1469                         "for output %p with format %#x",
   1470                         format, mOutput, mFormat);
   1471                 lStatus = BAD_VALUE;
   1472                 goto Exit;
   1473         }
   1474         if (sampleRate > mSampleRate * AUDIO_RESAMPLER_DOWN_RATIO_MAX) {
   1475             ALOGE("Sample rate out of range: %u mSampleRate %u", sampleRate, mSampleRate);
   1476             lStatus = BAD_VALUE;
   1477             goto Exit;
   1478         }
   1479         break;
   1480 
   1481     }
   1482 
   1483     lStatus = initCheck();
   1484     if (lStatus != NO_ERROR) {
   1485         ALOGE("createTrack_l() audio driver not initialized");
   1486         goto Exit;
   1487     }
   1488 
   1489     { // scope for mLock
   1490         Mutex::Autolock _l(mLock);
   1491 
   1492         // all tracks in same audio session must share the same routing strategy otherwise
   1493         // conflicts will happen when tracks are moved from one output to another by audio policy
   1494         // manager
   1495         uint32_t strategy = AudioSystem::getStrategyForStream(streamType);
   1496         for (size_t i = 0; i < mTracks.size(); ++i) {
   1497             sp<Track> t = mTracks[i];
   1498             if (t != 0 && t->isExternalTrack()) {
   1499                 uint32_t actual = AudioSystem::getStrategyForStream(t->streamType());
   1500                 if (sessionId == t->sessionId() && strategy != actual) {
   1501                     ALOGE("createTrack_l() mismatched strategy; expected %u but found %u",
   1502                             strategy, actual);
   1503                     lStatus = BAD_VALUE;
   1504                     goto Exit;
   1505                 }
   1506             }
   1507         }
   1508 
   1509         if (!isTimed) {
   1510             track = new Track(this, client, streamType, sampleRate, format,
   1511                               channelMask, frameCount, NULL, sharedBuffer,
   1512                               sessionId, uid, *flags, TrackBase::TYPE_DEFAULT);
   1513         } else {
   1514             track = TimedTrack::create(this, client, streamType, sampleRate, format,
   1515                     channelMask, frameCount, sharedBuffer, sessionId, uid);
   1516         }
   1517 
   1518         // new Track always returns non-NULL,
   1519         // but TimedTrack::create() is a factory that could fail by returning NULL
   1520         lStatus = track != 0 ? track->initCheck() : (status_t) NO_MEMORY;
   1521         if (lStatus != NO_ERROR) {
   1522             ALOGE("createTrack_l() initCheck failed %d; no control block?", lStatus);
   1523             // track must be cleared from the caller as the caller has the AF lock
   1524             goto Exit;
   1525         }
   1526         mTracks.add(track);
   1527 
   1528         sp<EffectChain> chain = getEffectChain_l(sessionId);
   1529         if (chain != 0) {
   1530             ALOGV("createTrack_l() setting main buffer %p", chain->inBuffer());
   1531             track->setMainBuffer(chain->inBuffer());
   1532             chain->setStrategy(AudioSystem::getStrategyForStream(track->streamType()));
   1533             chain->incTrackCnt();
   1534         }
   1535 
   1536         if ((*flags & IAudioFlinger::TRACK_FAST) && (tid != -1)) {
   1537             pid_t callingPid = IPCThreadState::self()->getCallingPid();
   1538             // we don't have CAP_SYS_NICE, nor do we want to have it as it's too powerful,
   1539             // so ask activity manager to do this on our behalf
   1540             sendPrioConfigEvent_l(callingPid, tid, kPriorityAudioApp);
   1541         }
   1542     }
   1543 
   1544     lStatus = NO_ERROR;
   1545 
   1546 Exit:
   1547     *status = lStatus;
   1548     return track;
   1549 }
   1550 
   1551 uint32_t AudioFlinger::PlaybackThread::correctLatency_l(uint32_t latency) const
   1552 {
   1553     return latency;
   1554 }
   1555 
   1556 uint32_t AudioFlinger::PlaybackThread::latency() const
   1557 {
   1558     Mutex::Autolock _l(mLock);
   1559     return latency_l();
   1560 }
   1561 uint32_t AudioFlinger::PlaybackThread::latency_l() const
   1562 {
   1563     if (initCheck() == NO_ERROR) {
   1564         return correctLatency_l(mOutput->stream->get_latency(mOutput->stream));
   1565     } else {
   1566         return 0;
   1567     }
   1568 }
   1569 
   1570 void AudioFlinger::PlaybackThread::setMasterVolume(float value)
   1571 {
   1572     Mutex::Autolock _l(mLock);
   1573     // Don't apply master volume in SW if our HAL can do it for us.
   1574     if (mOutput && mOutput->audioHwDev &&
   1575         mOutput->audioHwDev->canSetMasterVolume()) {
   1576         mMasterVolume = 1.0;
   1577     } else {
   1578         mMasterVolume = value;
   1579     }
   1580 }
   1581 
   1582 void AudioFlinger::PlaybackThread::setMasterMute(bool muted)
   1583 {
   1584     Mutex::Autolock _l(mLock);
   1585     // Don't apply master mute in SW if our HAL can do it for us.
   1586     if (mOutput && mOutput->audioHwDev &&
   1587         mOutput->audioHwDev->canSetMasterMute()) {
   1588         mMasterMute = false;
   1589     } else {
   1590         mMasterMute = muted;
   1591     }
   1592 }
   1593 
   1594 void AudioFlinger::PlaybackThread::setStreamVolume(audio_stream_type_t stream, float value)
   1595 {
   1596     Mutex::Autolock _l(mLock);
   1597     mStreamTypes[stream].volume = value;
   1598     broadcast_l();
   1599 }
   1600 
   1601 void AudioFlinger::PlaybackThread::setStreamMute(audio_stream_type_t stream, bool muted)
   1602 {
   1603     Mutex::Autolock _l(mLock);
   1604     mStreamTypes[stream].mute = muted;
   1605     broadcast_l();
   1606 }
   1607 
   1608 float AudioFlinger::PlaybackThread::streamVolume(audio_stream_type_t stream) const
   1609 {
   1610     Mutex::Autolock _l(mLock);
   1611     return mStreamTypes[stream].volume;
   1612 }
   1613 
   1614 // addTrack_l() must be called with ThreadBase::mLock held
   1615 status_t AudioFlinger::PlaybackThread::addTrack_l(const sp<Track>& track)
   1616 {
   1617     status_t status = ALREADY_EXISTS;
   1618 
   1619     // set retry count for buffer fill
   1620     track->mRetryCount = kMaxTrackStartupRetries;
   1621     if (mActiveTracks.indexOf(track) < 0) {
   1622         // the track is newly added, make sure it fills up all its
   1623         // buffers before playing. This is to ensure the client will
   1624         // effectively get the latency it requested.
   1625         if (track->isExternalTrack()) {
   1626             TrackBase::track_state state = track->mState;
   1627             mLock.unlock();
   1628             status = AudioSystem::startOutput(mId, track->streamType(), track->sessionId());
   1629             mLock.lock();
   1630             // abort track was stopped/paused while we released the lock
   1631             if (state != track->mState) {
   1632                 if (status == NO_ERROR) {
   1633                     mLock.unlock();
   1634                     AudioSystem::stopOutput(mId, track->streamType(), track->sessionId());
   1635                     mLock.lock();
   1636                 }
   1637                 return INVALID_OPERATION;
   1638             }
   1639             // abort if start is rejected by audio policy manager
   1640             if (status != NO_ERROR) {
   1641                 return PERMISSION_DENIED;
   1642             }
   1643 #ifdef ADD_BATTERY_DATA
   1644             // to track the speaker usage
   1645             addBatteryData(IMediaPlayerService::kBatteryDataAudioFlingerStart);
   1646 #endif
   1647         }
   1648 
   1649         track->mFillingUpStatus = track->sharedBuffer() != 0 ? Track::FS_FILLED : Track::FS_FILLING;
   1650         track->mResetDone = false;
   1651         track->mPresentationCompleteFrames = 0;
   1652         mActiveTracks.add(track);
   1653         mWakeLockUids.add(track->uid());
   1654         mActiveTracksGeneration++;
   1655         mLatestActiveTrack = track;
   1656         sp<EffectChain> chain = getEffectChain_l(track->sessionId());
   1657         if (chain != 0) {
   1658             ALOGV("addTrack_l() starting track on chain %p for session %d", chain.get(),
   1659                     track->sessionId());
   1660             chain->incActiveTrackCnt();
   1661         }
   1662 
   1663         status = NO_ERROR;
   1664     }
   1665 
   1666     onAddNewTrack_l();
   1667     return status;
   1668 }
   1669 
   1670 bool AudioFlinger::PlaybackThread::destroyTrack_l(const sp<Track>& track)
   1671 {
   1672     track->terminate();
   1673     // active tracks are removed by threadLoop()
   1674     bool trackActive = (mActiveTracks.indexOf(track) >= 0);
   1675     track->mState = TrackBase::STOPPED;
   1676     if (!trackActive) {
   1677         removeTrack_l(track);
   1678     } else if (track->isFastTrack() || track->isOffloaded() || track->isDirect()) {
   1679         track->mState = TrackBase::STOPPING_1;
   1680     }
   1681 
   1682     return trackActive;
   1683 }
   1684 
   1685 void AudioFlinger::PlaybackThread::removeTrack_l(const sp<Track>& track)
   1686 {
   1687     track->triggerEvents(AudioSystem::SYNC_EVENT_PRESENTATION_COMPLETE);
   1688     mTracks.remove(track);
   1689     deleteTrackName_l(track->name());
   1690     // redundant as track is about to be destroyed, for dumpsys only
   1691     track->mName = -1;
   1692     if (track->isFastTrack()) {
   1693         int index = track->mFastIndex;
   1694         ALOG_ASSERT(0 < index && index < (int)FastMixerState::kMaxFastTracks);
   1695         ALOG_ASSERT(!(mFastTrackAvailMask & (1 << index)));
   1696         mFastTrackAvailMask |= 1 << index;
   1697         // redundant as track is about to be destroyed, for dumpsys only
   1698         track->mFastIndex = -1;
   1699     }
   1700     sp<EffectChain> chain = getEffectChain_l(track->sessionId());
   1701     if (chain != 0) {
   1702         chain->decTrackCnt();
   1703     }
   1704 }
   1705 
   1706 void AudioFlinger::PlaybackThread::broadcast_l()
   1707 {
   1708     // Thread could be blocked waiting for async
   1709     // so signal it to handle state changes immediately
   1710     // If threadLoop is currently unlocked a signal of mWaitWorkCV will
   1711     // be lost so we also flag to prevent it blocking on mWaitWorkCV
   1712     mSignalPending = true;
   1713     mWaitWorkCV.broadcast();
   1714 }
   1715 
   1716 String8 AudioFlinger::PlaybackThread::getParameters(const String8& keys)
   1717 {
   1718     Mutex::Autolock _l(mLock);
   1719     if (initCheck() != NO_ERROR) {
   1720         return String8();
   1721     }
   1722 
   1723     char *s = mOutput->stream->common.get_parameters(&mOutput->stream->common, keys.string());
   1724     const String8 out_s8(s);
   1725     free(s);
   1726     return out_s8;
   1727 }
   1728 
   1729 void AudioFlinger::PlaybackThread::audioConfigChanged(int event, int param) {
   1730     AudioSystem::OutputDescriptor desc;
   1731     void *param2 = NULL;
   1732 
   1733     ALOGV("PlaybackThread::audioConfigChanged, thread %p, event %d, param %d", this, event,
   1734             param);
   1735 
   1736     switch (event) {
   1737     case AudioSystem::OUTPUT_OPENED:
   1738     case AudioSystem::OUTPUT_CONFIG_CHANGED:
   1739         desc.channelMask = mChannelMask;
   1740         desc.samplingRate = mSampleRate;
   1741         desc.format = mFormat;
   1742         desc.frameCount = mNormalFrameCount; // FIXME see
   1743                                              // AudioFlinger::frameCount(audio_io_handle_t)
   1744         desc.latency = latency_l();
   1745         param2 = &desc;
   1746         break;
   1747 
   1748     case AudioSystem::STREAM_CONFIG_CHANGED:
   1749         param2 = &param;
   1750     case AudioSystem::OUTPUT_CLOSED:
   1751     default:
   1752         break;
   1753     }
   1754     mAudioFlinger->audioConfigChanged(event, mId, param2);
   1755 }
   1756 
   1757 void AudioFlinger::PlaybackThread::writeCallback()
   1758 {
   1759     ALOG_ASSERT(mCallbackThread != 0);
   1760     mCallbackThread->resetWriteBlocked();
   1761 }
   1762 
   1763 void AudioFlinger::PlaybackThread::drainCallback()
   1764 {
   1765     ALOG_ASSERT(mCallbackThread != 0);
   1766     mCallbackThread->resetDraining();
   1767 }
   1768 
   1769 void AudioFlinger::PlaybackThread::resetWriteBlocked(uint32_t sequence)
   1770 {
   1771     Mutex::Autolock _l(mLock);
   1772     // reject out of sequence requests
   1773     if ((mWriteAckSequence & 1) && (sequence == mWriteAckSequence)) {
   1774         mWriteAckSequence &= ~1;
   1775         mWaitWorkCV.signal();
   1776     }
   1777 }
   1778 
   1779 void AudioFlinger::PlaybackThread::resetDraining(uint32_t sequence)
   1780 {
   1781     Mutex::Autolock _l(mLock);
   1782     // reject out of sequence requests
   1783     if ((mDrainSequence & 1) && (sequence == mDrainSequence)) {
   1784         mDrainSequence &= ~1;
   1785         mWaitWorkCV.signal();
   1786     }
   1787 }
   1788 
   1789 // static
   1790 int AudioFlinger::PlaybackThread::asyncCallback(stream_callback_event_t event,
   1791                                                 void *param __unused,
   1792                                                 void *cookie)
   1793 {
   1794     AudioFlinger::PlaybackThread *me = (AudioFlinger::PlaybackThread *)cookie;
   1795     ALOGV("asyncCallback() event %d", event);
   1796     switch (event) {
   1797     case STREAM_CBK_EVENT_WRITE_READY:
   1798         me->writeCallback();
   1799         break;
   1800     case STREAM_CBK_EVENT_DRAIN_READY:
   1801         me->drainCallback();
   1802         break;
   1803     default:
   1804         ALOGW("asyncCallback() unknown event %d", event);
   1805         break;
   1806     }
   1807     return 0;
   1808 }
   1809 
   1810 void AudioFlinger::PlaybackThread::readOutputParameters_l()
   1811 {
   1812     // unfortunately we have no way of recovering from errors here, hence the LOG_ALWAYS_FATAL
   1813     mSampleRate = mOutput->stream->common.get_sample_rate(&mOutput->stream->common);
   1814     mChannelMask = mOutput->stream->common.get_channels(&mOutput->stream->common);
   1815     if (!audio_is_output_channel(mChannelMask)) {
   1816         LOG_ALWAYS_FATAL("HAL channel mask %#x not valid for output", mChannelMask);
   1817     }
   1818     if ((mType == MIXER || mType == DUPLICATING)
   1819             && !isValidPcmSinkChannelMask(mChannelMask)) {
   1820         LOG_ALWAYS_FATAL("HAL channel mask %#x not supported for mixed output",
   1821                 mChannelMask);
   1822     }
   1823     mChannelCount = audio_channel_count_from_out_mask(mChannelMask);
   1824     mHALFormat = mOutput->stream->common.get_format(&mOutput->stream->common);
   1825     mFormat = mHALFormat;
   1826     if (!audio_is_valid_format(mFormat)) {
   1827         LOG_ALWAYS_FATAL("HAL format %#x not valid for output", mFormat);
   1828     }
   1829     if ((mType == MIXER || mType == DUPLICATING)
   1830             && !isValidPcmSinkFormat(mFormat)) {
   1831         LOG_FATAL("HAL format %#x not supported for mixed output",
   1832                 mFormat);
   1833     }
   1834     mFrameSize = audio_stream_out_frame_size(mOutput->stream);
   1835     mBufferSize = mOutput->stream->common.get_buffer_size(&mOutput->stream->common);
   1836     mFrameCount = mBufferSize / mFrameSize;
   1837     if (mFrameCount & 15) {
   1838         ALOGW("HAL output buffer size is %u frames but AudioMixer requires multiples of 16 frames",
   1839                 mFrameCount);
   1840     }
   1841 
   1842     if ((mOutput->flags & AUDIO_OUTPUT_FLAG_NON_BLOCKING) &&
   1843             (mOutput->stream->set_callback != NULL)) {
   1844         if (mOutput->stream->set_callback(mOutput->stream,
   1845                                       AudioFlinger::PlaybackThread::asyncCallback, this) == 0) {
   1846             mUseAsyncWrite = true;
   1847             mCallbackThread = new AudioFlinger::AsyncCallbackThread(this);
   1848         }
   1849     }
   1850 
   1851     // Calculate size of normal sink buffer relative to the HAL output buffer size
   1852     double multiplier = 1.0;
   1853     if (mType == MIXER && (kUseFastMixer == FastMixer_Static ||
   1854             kUseFastMixer == FastMixer_Dynamic)) {
   1855         size_t minNormalFrameCount = (kMinNormalSinkBufferSizeMs * mSampleRate) / 1000;
   1856         size_t maxNormalFrameCount = (kMaxNormalSinkBufferSizeMs * mSampleRate) / 1000;
   1857         // round up minimum and round down maximum to nearest 16 frames to satisfy AudioMixer
   1858         minNormalFrameCount = (minNormalFrameCount + 15) & ~15;
   1859         maxNormalFrameCount = maxNormalFrameCount & ~15;
   1860         if (maxNormalFrameCount < minNormalFrameCount) {
   1861             maxNormalFrameCount = minNormalFrameCount;
   1862         }
   1863         multiplier = (double) minNormalFrameCount / (double) mFrameCount;
   1864         if (multiplier <= 1.0) {
   1865             multiplier = 1.0;
   1866         } else if (multiplier <= 2.0) {
   1867             if (2 * mFrameCount <= maxNormalFrameCount) {
   1868                 multiplier = 2.0;
   1869             } else {
   1870                 multiplier = (double) maxNormalFrameCount / (double) mFrameCount;
   1871             }
   1872         } else {
   1873             // prefer an even multiplier, for compatibility with doubling of fast tracks due to HAL
   1874             // SRC (it would be unusual for the normal sink buffer size to not be a multiple of fast
   1875             // track, but we sometimes have to do this to satisfy the maximum frame count
   1876             // constraint)
   1877             // FIXME this rounding up should not be done if no HAL SRC
   1878             uint32_t truncMult = (uint32_t) multiplier;
   1879             if ((truncMult & 1)) {
   1880                 if ((truncMult + 1) * mFrameCount <= maxNormalFrameCount) {
   1881                     ++truncMult;
   1882                 }
   1883             }
   1884             multiplier = (double) truncMult;
   1885         }
   1886     }
   1887     mNormalFrameCount = multiplier * mFrameCount;
   1888     // round up to nearest 16 frames to satisfy AudioMixer
   1889     if (mType == MIXER || mType == DUPLICATING) {
   1890         mNormalFrameCount = (mNormalFrameCount + 15) & ~15;
   1891     }
   1892     ALOGI("HAL output buffer size %u frames, normal sink buffer size %u frames", mFrameCount,
   1893             mNormalFrameCount);
   1894 
   1895     // mSinkBuffer is the sink buffer.  Size is always multiple-of-16 frames.
   1896     // Originally this was int16_t[] array, need to remove legacy implications.
   1897     free(mSinkBuffer);
   1898     mSinkBuffer = NULL;
   1899     // For sink buffer size, we use the frame size from the downstream sink to avoid problems
   1900     // with non PCM formats for compressed music, e.g. AAC, and Offload threads.
   1901     const size_t sinkBufferSize = mNormalFrameCount * mFrameSize;
   1902     (void)posix_memalign(&mSinkBuffer, 32, sinkBufferSize);
   1903 
   1904     // We resize the mMixerBuffer according to the requirements of the sink buffer which
   1905     // drives the output.
   1906     free(mMixerBuffer);
   1907     mMixerBuffer = NULL;
   1908     if (mMixerBufferEnabled) {
   1909         mMixerBufferFormat = AUDIO_FORMAT_PCM_FLOAT; // also valid: AUDIO_FORMAT_PCM_16_BIT.
   1910         mMixerBufferSize = mNormalFrameCount * mChannelCount
   1911                 * audio_bytes_per_sample(mMixerBufferFormat);
   1912         (void)posix_memalign(&mMixerBuffer, 32, mMixerBufferSize);
   1913     }
   1914     free(mEffectBuffer);
   1915     mEffectBuffer = NULL;
   1916     if (mEffectBufferEnabled) {
   1917         mEffectBufferFormat = AUDIO_FORMAT_PCM_16_BIT; // Note: Effects support 16b only
   1918         mEffectBufferSize = mNormalFrameCount * mChannelCount
   1919                 * audio_bytes_per_sample(mEffectBufferFormat);
   1920         (void)posix_memalign(&mEffectBuffer, 32, mEffectBufferSize);
   1921     }
   1922 
   1923     // force reconfiguration of effect chains and engines to take new buffer size and audio
   1924     // parameters into account
   1925     // Note that mLock is not held when readOutputParameters_l() is called from the constructor
   1926     // but in this case nothing is done below as no audio sessions have effect yet so it doesn't
   1927     // matter.
   1928     // create a copy of mEffectChains as calling moveEffectChain_l() can reorder some effect chains
   1929     Vector< sp<EffectChain> > effectChains = mEffectChains;
   1930     for (size_t i = 0; i < effectChains.size(); i ++) {
   1931         mAudioFlinger->moveEffectChain_l(effectChains[i]->sessionId(), this, this, false);
   1932     }
   1933 }
   1934 
   1935 
   1936 status_t AudioFlinger::PlaybackThread::getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames)
   1937 {
   1938     if (halFrames == NULL || dspFrames == NULL) {
   1939         return BAD_VALUE;
   1940     }
   1941     Mutex::Autolock _l(mLock);
   1942     if (initCheck() != NO_ERROR) {
   1943         return INVALID_OPERATION;
   1944     }
   1945     size_t framesWritten = mBytesWritten / mFrameSize;
   1946     *halFrames = framesWritten;
   1947 
   1948     if (isSuspended()) {
   1949         // return an estimation of rendered frames when the output is suspended
   1950         size_t latencyFrames = (latency_l() * mSampleRate) / 1000;
   1951         *dspFrames = framesWritten >= latencyFrames ? framesWritten - latencyFrames : 0;
   1952         return NO_ERROR;
   1953     } else {
   1954         status_t status;
   1955         uint32_t frames;
   1956         status = mOutput->stream->get_render_position(mOutput->stream, &frames);
   1957         *dspFrames = (size_t)frames;
   1958         return status;
   1959     }
   1960 }
   1961 
   1962 uint32_t AudioFlinger::PlaybackThread::hasAudioSession(int sessionId) const
   1963 {
   1964     Mutex::Autolock _l(mLock);
   1965     uint32_t result = 0;
   1966     if (getEffectChain_l(sessionId) != 0) {
   1967         result = EFFECT_SESSION;
   1968     }
   1969 
   1970     for (size_t i = 0; i < mTracks.size(); ++i) {
   1971         sp<Track> track = mTracks[i];
   1972         if (sessionId == track->sessionId() && !track->isInvalid()) {
   1973             result |= TRACK_SESSION;
   1974             break;
   1975         }
   1976     }
   1977 
   1978     return result;
   1979 }
   1980 
   1981 uint32_t AudioFlinger::PlaybackThread::getStrategyForSession_l(int sessionId)
   1982 {
   1983     // session AUDIO_SESSION_OUTPUT_MIX is placed in same strategy as MUSIC stream so that
   1984     // it is moved to correct output by audio policy manager when A2DP is connected or disconnected
   1985     if (sessionId == AUDIO_SESSION_OUTPUT_MIX) {
   1986         return AudioSystem::getStrategyForStream(AUDIO_STREAM_MUSIC);
   1987     }
   1988     for (size_t i = 0; i < mTracks.size(); i++) {
   1989         sp<Track> track = mTracks[i];
   1990         if (sessionId == track->sessionId() && !track->isInvalid()) {
   1991             return AudioSystem::getStrategyForStream(track->streamType());
   1992         }
   1993     }
   1994     return AudioSystem::getStrategyForStream(AUDIO_STREAM_MUSIC);
   1995 }
   1996 
   1997 
   1998 AudioFlinger::AudioStreamOut* AudioFlinger::PlaybackThread::getOutput() const
   1999 {
   2000     Mutex::Autolock _l(mLock);
   2001     return mOutput;
   2002 }
   2003 
   2004 AudioFlinger::AudioStreamOut* AudioFlinger::PlaybackThread::clearOutput()
   2005 {
   2006     Mutex::Autolock _l(mLock);
   2007     AudioStreamOut *output = mOutput;
   2008     mOutput = NULL;
   2009     // FIXME FastMixer might also have a raw ptr to mOutputSink;
   2010     //       must push a NULL and wait for ack
   2011     mOutputSink.clear();
   2012     mPipeSink.clear();
   2013     mNormalSink.clear();
   2014     return output;
   2015 }
   2016 
   2017 // this method must always be called either with ThreadBase mLock held or inside the thread loop
   2018 audio_stream_t* AudioFlinger::PlaybackThread::stream() const
   2019 {
   2020     if (mOutput == NULL) {
   2021         return NULL;
   2022     }
   2023     return &mOutput->stream->common;
   2024 }
   2025 
   2026 uint32_t AudioFlinger::PlaybackThread::activeSleepTimeUs() const
   2027 {
   2028     return (uint32_t)((uint32_t)((mNormalFrameCount * 1000) / mSampleRate) * 1000);
   2029 }
   2030 
   2031 status_t AudioFlinger::PlaybackThread::setSyncEvent(const sp<SyncEvent>& event)
   2032 {
   2033     if (!isValidSyncEvent(event)) {
   2034         return BAD_VALUE;
   2035     }
   2036 
   2037     Mutex::Autolock _l(mLock);
   2038 
   2039     for (size_t i = 0; i < mTracks.size(); ++i) {
   2040         sp<Track> track = mTracks[i];
   2041         if (event->triggerSession() == track->sessionId()) {
   2042             (void) track->setSyncEvent(event);
   2043             return NO_ERROR;
   2044         }
   2045     }
   2046 
   2047     return NAME_NOT_FOUND;
   2048 }
   2049 
   2050 bool AudioFlinger::PlaybackThread::isValidSyncEvent(const sp<SyncEvent>& event) const
   2051 {
   2052     return event->type() == AudioSystem::SYNC_EVENT_PRESENTATION_COMPLETE;
   2053 }
   2054 
   2055 void AudioFlinger::PlaybackThread::threadLoop_removeTracks(
   2056         const Vector< sp<Track> >& tracksToRemove)
   2057 {
   2058     size_t count = tracksToRemove.size();
   2059     if (count > 0) {
   2060         for (size_t i = 0 ; i < count ; i++) {
   2061             const sp<Track>& track = tracksToRemove.itemAt(i);
   2062             if (track->isExternalTrack()) {
   2063                 AudioSystem::stopOutput(mId, track->streamType(), track->sessionId());
   2064 #ifdef ADD_BATTERY_DATA
   2065                 // to track the speaker usage
   2066                 addBatteryData(IMediaPlayerService::kBatteryDataAudioFlingerStop);
   2067 #endif
   2068                 if (track->isTerminated()) {
   2069                     AudioSystem::releaseOutput(mId);
   2070                 }
   2071             }
   2072         }
   2073     }
   2074 }
   2075 
   2076 void AudioFlinger::PlaybackThread::checkSilentMode_l()
   2077 {
   2078     if (!mMasterMute) {
   2079         char value[PROPERTY_VALUE_MAX];
   2080         if (property_get("ro.audio.silent", value, "0") > 0) {
   2081             char *endptr;
   2082             unsigned long ul = strtoul(value, &endptr, 0);
   2083             if (*endptr == '\0' && ul != 0) {
   2084                 ALOGD("Silence is golden");
   2085                 // The setprop command will not allow a property to be changed after
   2086                 // the first time it is set, so we don't have to worry about un-muting.
   2087                 setMasterMute_l(true);
   2088             }
   2089         }
   2090     }
   2091 }
   2092 
   2093 // shared by MIXER and DIRECT, overridden by DUPLICATING
   2094 ssize_t AudioFlinger::PlaybackThread::threadLoop_write()
   2095 {
   2096     // FIXME rewrite to reduce number of system calls
   2097     mLastWriteTime = systemTime();
   2098     mInWrite = true;
   2099     ssize_t bytesWritten;
   2100     const size_t offset = mCurrentWriteLength - mBytesRemaining;
   2101 
   2102     // If an NBAIO sink is present, use it to write the normal mixer's submix
   2103     if (mNormalSink != 0) {
   2104 
   2105         const size_t count = mBytesRemaining / mFrameSize;
   2106 
   2107         ATRACE_BEGIN("write");
   2108         // update the setpoint when AudioFlinger::mScreenState changes
   2109         uint32_t screenState = AudioFlinger::mScreenState;
   2110         if (screenState != mScreenState) {
   2111             mScreenState = screenState;
   2112             MonoPipe *pipe = (MonoPipe *)mPipeSink.get();
   2113             if (pipe != NULL) {
   2114                 pipe->setAvgFrames((mScreenState & 1) ?
   2115                         (pipe->maxFrames() * 7) / 8 : mNormalFrameCount * 2);
   2116             }
   2117         }
   2118         ssize_t framesWritten = mNormalSink->write((char *)mSinkBuffer + offset, count);
   2119         ATRACE_END();
   2120         if (framesWritten > 0) {
   2121             bytesWritten = framesWritten * mFrameSize;
   2122         } else {
   2123             bytesWritten = framesWritten;
   2124         }
   2125         status_t status = mNormalSink->getTimestamp(mLatchD.mTimestamp);
   2126         if (status == NO_ERROR) {
   2127             size_t totalFramesWritten = mNormalSink->framesWritten();
   2128             if (totalFramesWritten >= mLatchD.mTimestamp.mPosition) {
   2129                 mLatchD.mUnpresentedFrames = totalFramesWritten - mLatchD.mTimestamp.mPosition;
   2130                 // mLatchD.mFramesReleased is set immediately before D is clocked into Q
   2131                 mLatchDValid = true;
   2132             }
   2133         }
   2134     // otherwise use the HAL / AudioStreamOut directly
   2135     } else {
   2136         // Direct output and offload threads
   2137 
   2138         if (mUseAsyncWrite) {
   2139             ALOGW_IF(mWriteAckSequence & 1, "threadLoop_write(): out of sequence write request");
   2140             mWriteAckSequence += 2;
   2141             mWriteAckSequence |= 1;
   2142             ALOG_ASSERT(mCallbackThread != 0);
   2143             mCallbackThread->setWriteBlocked(mWriteAckSequence);
   2144         }
   2145         // FIXME We should have an implementation of timestamps for direct output threads.
   2146         // They are used e.g for multichannel PCM playback over HDMI.
   2147         bytesWritten = mOutput->stream->write(mOutput->stream,
   2148                                                    (char *)mSinkBuffer + offset, mBytesRemaining);
   2149         if (mUseAsyncWrite &&
   2150                 ((bytesWritten < 0) || (bytesWritten == (ssize_t)mBytesRemaining))) {
   2151             // do not wait for async callback in case of error of full write
   2152             mWriteAckSequence &= ~1;
   2153             ALOG_ASSERT(mCallbackThread != 0);
   2154             mCallbackThread->setWriteBlocked(mWriteAckSequence);
   2155         }
   2156     }
   2157 
   2158     mNumWrites++;
   2159     mInWrite = false;
   2160     mStandby = false;
   2161     return bytesWritten;
   2162 }
   2163 
   2164 void AudioFlinger::PlaybackThread::threadLoop_drain()
   2165 {
   2166     if (mOutput->stream->drain) {
   2167         ALOGV("draining %s", (mMixerStatus == MIXER_DRAIN_TRACK) ? "early" : "full");
   2168         if (mUseAsyncWrite) {
   2169             ALOGW_IF(mDrainSequence & 1, "threadLoop_drain(): out of sequence drain request");
   2170             mDrainSequence |= 1;
   2171             ALOG_ASSERT(mCallbackThread != 0);
   2172             mCallbackThread->setDraining(mDrainSequence);
   2173         }
   2174         mOutput->stream->drain(mOutput->stream,
   2175             (mMixerStatus == MIXER_DRAIN_TRACK) ? AUDIO_DRAIN_EARLY_NOTIFY
   2176                                                 : AUDIO_DRAIN_ALL);
   2177     }
   2178 }
   2179 
   2180 void AudioFlinger::PlaybackThread::threadLoop_exit()
   2181 {
   2182     // Default implementation has nothing to do
   2183 }
   2184 
   2185 /*
   2186 The derived values that are cached:
   2187  - mSinkBufferSize from frame count * frame size
   2188  - activeSleepTime from activeSleepTimeUs()
   2189  - idleSleepTime from idleSleepTimeUs()
   2190  - standbyDelay from mActiveSleepTimeUs (DIRECT only)
   2191  - maxPeriod from frame count and sample rate (MIXER only)
   2192 
   2193 The parameters that affect these derived values are:
   2194  - frame count
   2195  - frame size
   2196  - sample rate
   2197  - device type: A2DP or not
   2198  - device latency
   2199  - format: PCM or not
   2200  - active sleep time
   2201  - idle sleep time
   2202 */
   2203 
   2204 void AudioFlinger::PlaybackThread::cacheParameters_l()
   2205 {
   2206     mSinkBufferSize = mNormalFrameCount * mFrameSize;
   2207     activeSleepTime = activeSleepTimeUs();
   2208     idleSleepTime = idleSleepTimeUs();
   2209 }
   2210 
   2211 void AudioFlinger::PlaybackThread::invalidateTracks(audio_stream_type_t streamType)
   2212 {
   2213     ALOGV("MixerThread::invalidateTracks() mixer %p, streamType %d, mTracks.size %d",
   2214             this,  streamType, mTracks.size());
   2215     Mutex::Autolock _l(mLock);
   2216 
   2217     size_t size = mTracks.size();
   2218     for (size_t i = 0; i < size; i++) {
   2219         sp<Track> t = mTracks[i];
   2220         if (t->streamType() == streamType) {
   2221             t->invalidate();
   2222         }
   2223     }
   2224 }
   2225 
   2226 status_t AudioFlinger::PlaybackThread::addEffectChain_l(const sp<EffectChain>& chain)
   2227 {
   2228     int session = chain->sessionId();
   2229     int16_t* buffer = reinterpret_cast<int16_t*>(mEffectBufferEnabled
   2230             ? mEffectBuffer : mSinkBuffer);
   2231     bool ownsBuffer = false;
   2232 
   2233     ALOGV("addEffectChain_l() %p on thread %p for session %d", chain.get(), this, session);
   2234     if (session > 0) {
   2235         // Only one effect chain can be present in direct output thread and it uses
   2236         // the sink buffer as input
   2237         if (mType != DIRECT) {
   2238             size_t numSamples = mNormalFrameCount * mChannelCount;
   2239             buffer = new int16_t[numSamples];
   2240             memset(buffer, 0, numSamples * sizeof(int16_t));
   2241             ALOGV("addEffectChain_l() creating new input buffer %p session %d", buffer, session);
   2242             ownsBuffer = true;
   2243         }
   2244 
   2245         // Attach all tracks with same session ID to this chain.
   2246         for (size_t i = 0; i < mTracks.size(); ++i) {
   2247             sp<Track> track = mTracks[i];
   2248             if (session == track->sessionId()) {
   2249                 ALOGV("addEffectChain_l() track->setMainBuffer track %p buffer %p", track.get(),
   2250                         buffer);
   2251                 track->setMainBuffer(buffer);
   2252                 chain->incTrackCnt();
   2253             }
   2254         }
   2255 
   2256         // indicate all active tracks in the chain
   2257         for (size_t i = 0 ; i < mActiveTracks.size() ; ++i) {
   2258             sp<Track> track = mActiveTracks[i].promote();
   2259             if (track == 0) {
   2260                 continue;
   2261             }
   2262             if (session == track->sessionId()) {
   2263                 ALOGV("addEffectChain_l() activating track %p on session %d", track.get(), session);
   2264                 chain->incActiveTrackCnt();
   2265             }
   2266         }
   2267     }
   2268     chain->setThread(this);
   2269     chain->setInBuffer(buffer, ownsBuffer);
   2270     chain->setOutBuffer(reinterpret_cast<int16_t*>(mEffectBufferEnabled
   2271             ? mEffectBuffer : mSinkBuffer));
   2272     // Effect chain for session AUDIO_SESSION_OUTPUT_STAGE is inserted at end of effect
   2273     // chains list in order to be processed last as it contains output stage effects
   2274     // Effect chain for session AUDIO_SESSION_OUTPUT_MIX is inserted before
   2275     // session AUDIO_SESSION_OUTPUT_STAGE to be processed
   2276     // after track specific effects and before output stage
   2277     // It is therefore mandatory that AUDIO_SESSION_OUTPUT_MIX == 0 and
   2278     // that AUDIO_SESSION_OUTPUT_STAGE < AUDIO_SESSION_OUTPUT_MIX
   2279     // Effect chain for other sessions are inserted at beginning of effect
   2280     // chains list to be processed before output mix effects. Relative order between other
   2281     // sessions is not important
   2282     size_t size = mEffectChains.size();
   2283     size_t i = 0;
   2284     for (i = 0; i < size; i++) {
   2285         if (mEffectChains[i]->sessionId() < session) {
   2286             break;
   2287         }
   2288     }
   2289     mEffectChains.insertAt(chain, i);
   2290     checkSuspendOnAddEffectChain_l(chain);
   2291 
   2292     return NO_ERROR;
   2293 }
   2294 
   2295 size_t AudioFlinger::PlaybackThread::removeEffectChain_l(const sp<EffectChain>& chain)
   2296 {
   2297     int session = chain->sessionId();
   2298 
   2299     ALOGV("removeEffectChain_l() %p from thread %p for session %d", chain.get(), this, session);
   2300 
   2301     for (size_t i = 0; i < mEffectChains.size(); i++) {
   2302         if (chain == mEffectChains[i]) {
   2303             mEffectChains.removeAt(i);
   2304             // detach all active tracks from the chain
   2305             for (size_t i = 0 ; i < mActiveTracks.size() ; ++i) {
   2306                 sp<Track> track = mActiveTracks[i].promote();
   2307                 if (track == 0) {
   2308                     continue;
   2309                 }
   2310                 if (session == track->sessionId()) {
   2311                     ALOGV("removeEffectChain_l(): stopping track on chain %p for session Id: %d",
   2312                             chain.get(), session);
   2313                     chain->decActiveTrackCnt();
   2314                 }
   2315             }
   2316 
   2317             // detach all tracks with same session ID from this chain
   2318             for (size_t i = 0; i < mTracks.size(); ++i) {
   2319                 sp<Track> track = mTracks[i];
   2320                 if (session == track->sessionId()) {
   2321                     track->setMainBuffer(reinterpret_cast<int16_t*>(mSinkBuffer));
   2322                     chain->decTrackCnt();
   2323                 }
   2324             }
   2325             break;
   2326         }
   2327     }
   2328     return mEffectChains.size();
   2329 }
   2330 
   2331 status_t AudioFlinger::PlaybackThread::attachAuxEffect(
   2332         const sp<AudioFlinger::PlaybackThread::Track> track, int EffectId)
   2333 {
   2334     Mutex::Autolock _l(mLock);
   2335     return attachAuxEffect_l(track, EffectId);
   2336 }
   2337 
   2338 status_t AudioFlinger::PlaybackThread::attachAuxEffect_l(
   2339         const sp<AudioFlinger::PlaybackThread::Track> track, int EffectId)
   2340 {
   2341     status_t status = NO_ERROR;
   2342 
   2343     if (EffectId == 0) {
   2344         track->setAuxBuffer(0, NULL);
   2345     } else {
   2346         // Auxiliary effects are always in audio session AUDIO_SESSION_OUTPUT_MIX
   2347         sp<EffectModule> effect = getEffect_l(AUDIO_SESSION_OUTPUT_MIX, EffectId);
   2348         if (effect != 0) {
   2349             if ((effect->desc().flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
   2350                 track->setAuxBuffer(EffectId, (int32_t *)effect->inBuffer());
   2351             } else {
   2352                 status = INVALID_OPERATION;
   2353             }
   2354         } else {
   2355             status = BAD_VALUE;
   2356         }
   2357     }
   2358     return status;
   2359 }
   2360 
   2361 void AudioFlinger::PlaybackThread::detachAuxEffect_l(int effectId)
   2362 {
   2363     for (size_t i = 0; i < mTracks.size(); ++i) {
   2364         sp<Track> track = mTracks[i];
   2365         if (track->auxEffectId() == effectId) {
   2366             attachAuxEffect_l(track, 0);
   2367         }
   2368     }
   2369 }
   2370 
   2371 bool AudioFlinger::PlaybackThread::threadLoop()
   2372 {
   2373     Vector< sp<Track> > tracksToRemove;
   2374 
   2375     standbyTime = systemTime();
   2376 
   2377     // MIXER
   2378     nsecs_t lastWarning = 0;
   2379 
   2380     // DUPLICATING
   2381     // FIXME could this be made local to while loop?
   2382     writeFrames = 0;
   2383 
   2384     int lastGeneration = 0;
   2385 
   2386     cacheParameters_l();
   2387     sleepTime = idleSleepTime;
   2388 
   2389     if (mType == MIXER) {
   2390         sleepTimeShift = 0;
   2391     }
   2392 
   2393     CpuStats cpuStats;
   2394     const String8 myName(String8::format("thread %p type %d TID %d", this, mType, gettid()));
   2395 
   2396     acquireWakeLock();
   2397 
   2398     // mNBLogWriter->log can only be called while thread mutex mLock is held.
   2399     // So if you need to log when mutex is unlocked, set logString to a non-NULL string,
   2400     // and then that string will be logged at the next convenient opportunity.
   2401     const char *logString = NULL;
   2402 
   2403     checkSilentMode_l();
   2404 
   2405     while (!exitPending())
   2406     {
   2407         cpuStats.sample(myName);
   2408 
   2409         Vector< sp<EffectChain> > effectChains;
   2410 
   2411         { // scope for mLock
   2412 
   2413             Mutex::Autolock _l(mLock);
   2414 
   2415             processConfigEvents_l();
   2416 
   2417             if (logString != NULL) {
   2418                 mNBLogWriter->logTimestamp();
   2419                 mNBLogWriter->log(logString);
   2420                 logString = NULL;
   2421             }
   2422 
   2423             // Gather the framesReleased counters for all active tracks,
   2424             // and latch them atomically with the timestamp.
   2425             // FIXME We're using raw pointers as indices. A unique track ID would be a better index.
   2426             mLatchD.mFramesReleased.clear();
   2427             size_t size = mActiveTracks.size();
   2428             for (size_t i = 0; i < size; i++) {
   2429                 sp<Track> t = mActiveTracks[i].promote();
   2430                 if (t != 0) {
   2431                     mLatchD.mFramesReleased.add(t.get(),
   2432                             t->mAudioTrackServerProxy->framesReleased());
   2433                 }
   2434             }
   2435             if (mLatchDValid) {
   2436                 mLatchQ = mLatchD;
   2437                 mLatchDValid = false;
   2438                 mLatchQValid = true;
   2439             }
   2440 
   2441             saveOutputTracks();
   2442             if (mSignalPending) {
   2443                 // A signal was raised while we were unlocked
   2444                 mSignalPending = false;
   2445             } else if (waitingAsyncCallback_l()) {
   2446                 if (exitPending()) {
   2447                     break;
   2448                 }
   2449                 releaseWakeLock_l();
   2450                 mWakeLockUids.clear();
   2451                 mActiveTracksGeneration++;
   2452                 ALOGV("wait async completion");
   2453                 mWaitWorkCV.wait(mLock);
   2454                 ALOGV("async completion/wake");
   2455                 acquireWakeLock_l();
   2456                 standbyTime = systemTime() + standbyDelay;
   2457                 sleepTime = 0;
   2458 
   2459                 continue;
   2460             }
   2461             if ((!mActiveTracks.size() && systemTime() > standbyTime) ||
   2462                                    isSuspended()) {
   2463                 // put audio hardware into standby after short delay
   2464                 if (shouldStandby_l()) {
   2465 
   2466                     threadLoop_standby();
   2467 
   2468                     mStandby = true;
   2469                 }
   2470 
   2471                 if (!mActiveTracks.size() && mConfigEvents.isEmpty()) {
   2472                     // we're about to wait, flush the binder command buffer
   2473                     IPCThreadState::self()->flushCommands();
   2474 
   2475                     clearOutputTracks();
   2476 
   2477                     if (exitPending()) {
   2478                         break;
   2479                     }
   2480 
   2481                     releaseWakeLock_l();
   2482                     mWakeLockUids.clear();
   2483                     mActiveTracksGeneration++;
   2484                     // wait until we have something to do...
   2485                     ALOGV("%s going to sleep", myName.string());
   2486                     mWaitWorkCV.wait(mLock);
   2487                     ALOGV("%s waking up", myName.string());
   2488                     acquireWakeLock_l();
   2489 
   2490                     mMixerStatus = MIXER_IDLE;
   2491                     mMixerStatusIgnoringFastTracks = MIXER_IDLE;
   2492                     mBytesWritten = 0;
   2493                     mBytesRemaining = 0;
   2494                     checkSilentMode_l();
   2495 
   2496                     standbyTime = systemTime() + standbyDelay;
   2497                     sleepTime = idleSleepTime;
   2498                     if (mType == MIXER) {
   2499                         sleepTimeShift = 0;
   2500                     }
   2501 
   2502                     continue;
   2503                 }
   2504             }
   2505             // mMixerStatusIgnoringFastTracks is also updated internally
   2506             mMixerStatus = prepareTracks_l(&tracksToRemove);
   2507 
   2508             // compare with previously applied list
   2509             if (lastGeneration != mActiveTracksGeneration) {
   2510                 // update wakelock
   2511                 updateWakeLockUids_l(mWakeLockUids);
   2512                 lastGeneration = mActiveTracksGeneration;
   2513             }
   2514 
   2515             // prevent any changes in effect chain list and in each effect chain
   2516             // during mixing and effect process as the audio buffers could be deleted
   2517             // or modified if an effect is created or deleted
   2518             lockEffectChains_l(effectChains);
   2519         } // mLock scope ends
   2520 
   2521         if (mBytesRemaining == 0) {
   2522             mCurrentWriteLength = 0;
   2523             if (mMixerStatus == MIXER_TRACKS_READY) {
   2524                 // threadLoop_mix() sets mCurrentWriteLength
   2525                 threadLoop_mix();
   2526             } else if ((mMixerStatus != MIXER_DRAIN_TRACK)
   2527                         && (mMixerStatus != MIXER_DRAIN_ALL)) {
   2528                 // threadLoop_sleepTime sets sleepTime to 0 if data
   2529                 // must be written to HAL
   2530                 threadLoop_sleepTime();
   2531                 if (sleepTime == 0) {
   2532                     mCurrentWriteLength = mSinkBufferSize;
   2533                 }
   2534             }
   2535             // Either threadLoop_mix() or threadLoop_sleepTime() should have set
   2536             // mMixerBuffer with data if mMixerBufferValid is true and sleepTime == 0.
   2537             // Merge mMixerBuffer data into mEffectBuffer (if any effects are valid)
   2538             // or mSinkBuffer (if there are no effects).
   2539             //
   2540             // This is done pre-effects computation; if effects change to
   2541             // support higher precision, this needs to move.
   2542             //
   2543             // mMixerBufferValid is only set true by MixerThread::prepareTracks_l().
   2544             // TODO use sleepTime == 0 as an additional condition.
   2545             if (mMixerBufferValid) {
   2546                 void *buffer = mEffectBufferValid ? mEffectBuffer : mSinkBuffer;
   2547                 audio_format_t format = mEffectBufferValid ? mEffectBufferFormat : mFormat;
   2548 
   2549                 memcpy_by_audio_format(buffer, format, mMixerBuffer, mMixerBufferFormat,
   2550                         mNormalFrameCount * mChannelCount);
   2551             }
   2552 
   2553             mBytesRemaining = mCurrentWriteLength;
   2554             if (isSuspended()) {
   2555                 sleepTime = suspendSleepTimeUs();
   2556                 // simulate write to HAL when suspended
   2557                 mBytesWritten += mSinkBufferSize;
   2558                 mBytesRemaining = 0;
   2559             }
   2560 
   2561             // only process effects if we're going to write
   2562             if (sleepTime == 0 && mType != OFFLOAD) {
   2563                 for (size_t i = 0; i < effectChains.size(); i ++) {
   2564                     effectChains[i]->process_l();
   2565                 }
   2566             }
   2567         }
   2568         // Process effect chains for offloaded thread even if no audio
   2569         // was read from audio track: process only updates effect state
   2570         // and thus does have to be synchronized with audio writes but may have
   2571         // to be called while waiting for async write callback
   2572         if (mType == OFFLOAD) {
   2573             for (size_t i = 0; i < effectChains.size(); i ++) {
   2574                 effectChains[i]->process_l();
   2575             }
   2576         }
   2577 
   2578         // Only if the Effects buffer is enabled and there is data in the
   2579         // Effects buffer (buffer valid), we need to
   2580         // copy into the sink buffer.
   2581         // TODO use sleepTime == 0 as an additional condition.
   2582         if (mEffectBufferValid) {
   2583             //ALOGV("writing effect buffer to sink buffer format %#x", mFormat);
   2584             memcpy_by_audio_format(mSinkBuffer, mFormat, mEffectBuffer, mEffectBufferFormat,
   2585                     mNormalFrameCount * mChannelCount);
   2586         }
   2587 
   2588         // enable changes in effect chain
   2589         unlockEffectChains(effectChains);
   2590 
   2591         if (!waitingAsyncCallback()) {
   2592             // sleepTime == 0 means we must write to audio hardware
   2593             if (sleepTime == 0) {
   2594                 if (mBytesRemaining) {
   2595                     ssize_t ret = threadLoop_write();
   2596                     if (ret < 0) {
   2597                         mBytesRemaining = 0;
   2598                     } else {
   2599                         mBytesWritten += ret;
   2600                         mBytesRemaining -= ret;
   2601                     }
   2602                 } else if ((mMixerStatus == MIXER_DRAIN_TRACK) ||
   2603                         (mMixerStatus == MIXER_DRAIN_ALL)) {
   2604                     threadLoop_drain();
   2605                 }
   2606                 if (mType == MIXER) {
   2607                     // write blocked detection
   2608                     nsecs_t now = systemTime();
   2609                     nsecs_t delta = now - mLastWriteTime;
   2610                     if (!mStandby && delta > maxPeriod) {
   2611                         mNumDelayedWrites++;
   2612                         if ((now - lastWarning) > kWarningThrottleNs) {
   2613                             ATRACE_NAME("underrun");
   2614                             ALOGW("write blocked for %llu msecs, %d delayed writes, thread %p",
   2615                                     ns2ms(delta), mNumDelayedWrites, this);
   2616                             lastWarning = now;
   2617                         }
   2618                     }
   2619                 }
   2620 
   2621             } else {
   2622                 usleep(sleepTime);
   2623             }
   2624         }
   2625 
   2626         // Finally let go of removed track(s), without the lock held
   2627         // since we can't guarantee the destructors won't acquire that
   2628         // same lock.  This will also mutate and push a new fast mixer state.
   2629         threadLoop_removeTracks(tracksToRemove);
   2630         tracksToRemove.clear();
   2631 
   2632         // FIXME I don't understand the need for this here;
   2633         //       it was in the original code but maybe the
   2634         //       assignment in saveOutputTracks() makes this unnecessary?
   2635         clearOutputTracks();
   2636 
   2637         // Effect chains will be actually deleted here if they were removed from
   2638         // mEffectChains list during mixing or effects processing
   2639         effectChains.clear();
   2640 
   2641         // FIXME Note that the above .clear() is no longer necessary since effectChains
   2642         // is now local to this block, but will keep it for now (at least until merge done).
   2643     }
   2644 
   2645     threadLoop_exit();
   2646 
   2647     if (!mStandby) {
   2648         threadLoop_standby();
   2649         mStandby = true;
   2650     }
   2651 
   2652     releaseWakeLock();
   2653     mWakeLockUids.clear();
   2654     mActiveTracksGeneration++;
   2655 
   2656     ALOGV("Thread %p type %d exiting", this, mType);
   2657     return false;
   2658 }
   2659 
   2660 // removeTracks_l() must be called with ThreadBase::mLock held
   2661 void AudioFlinger::PlaybackThread::removeTracks_l(const Vector< sp<Track> >& tracksToRemove)
   2662 {
   2663     size_t count = tracksToRemove.size();
   2664     if (count > 0) {
   2665         for (size_t i=0 ; i<count ; i++) {
   2666             const sp<Track>& track = tracksToRemove.itemAt(i);
   2667             mActiveTracks.remove(track);
   2668             mWakeLockUids.remove(track->uid());
   2669             mActiveTracksGeneration++;
   2670             ALOGV("removeTracks_l removing track on session %d", track->sessionId());
   2671             sp<EffectChain> chain = getEffectChain_l(track->sessionId());
   2672             if (chain != 0) {
   2673                 ALOGV("stopping track on chain %p for session Id: %d", chain.get(),
   2674                         track->sessionId());
   2675                 chain->decActiveTrackCnt();
   2676             }
   2677             if (track->isTerminated()) {
   2678                 removeTrack_l(track);
   2679             }
   2680         }
   2681     }
   2682 
   2683 }
   2684 
   2685 status_t AudioFlinger::PlaybackThread::getTimestamp_l(AudioTimestamp& timestamp)
   2686 {
   2687     if (mNormalSink != 0) {
   2688         return mNormalSink->getTimestamp(timestamp);
   2689     }
   2690     if ((mType == OFFLOAD || mType == DIRECT) && mOutput->stream->get_presentation_position) {
   2691         uint64_t position64;
   2692         int ret = mOutput->stream->get_presentation_position(
   2693                                                 mOutput->stream, &position64, &timestamp.mTime);
   2694         if (ret == 0) {
   2695             timestamp.mPosition = (uint32_t)position64;
   2696             return NO_ERROR;
   2697         }
   2698     }
   2699     return INVALID_OPERATION;
   2700 }
   2701 
   2702 status_t AudioFlinger::PlaybackThread::createAudioPatch_l(const struct audio_patch *patch,
   2703                                                           audio_patch_handle_t *handle)
   2704 {
   2705     status_t status = NO_ERROR;
   2706     if (mOutput->audioHwDev->version() >= AUDIO_DEVICE_API_VERSION_3_0) {
   2707         // store new device and send to effects
   2708         audio_devices_t type = AUDIO_DEVICE_NONE;
   2709         for (unsigned int i = 0; i < patch->num_sinks; i++) {
   2710             type |= patch->sinks[i].ext.device.type;
   2711         }
   2712         mOutDevice = type;
   2713         for (size_t i = 0; i < mEffectChains.size(); i++) {
   2714             mEffectChains[i]->setDevice_l(mOutDevice);
   2715         }
   2716 
   2717         audio_hw_device_t *hwDevice = mOutput->audioHwDev->hwDevice();
   2718         status = hwDevice->create_audio_patch(hwDevice,
   2719                                                patch->num_sources,
   2720                                                patch->sources,
   2721                                                patch->num_sinks,
   2722                                                patch->sinks,
   2723                                                handle);
   2724     } else {
   2725         ALOG_ASSERT(false, "createAudioPatch_l() called on a pre 3.0 HAL");
   2726     }
   2727     return status;
   2728 }
   2729 
   2730 status_t AudioFlinger::PlaybackThread::releaseAudioPatch_l(const audio_patch_handle_t handle)
   2731 {
   2732     status_t status = NO_ERROR;
   2733     if (mOutput->audioHwDev->version() >= AUDIO_DEVICE_API_VERSION_3_0) {
   2734         audio_hw_device_t *hwDevice = mOutput->audioHwDev->hwDevice();
   2735         status = hwDevice->release_audio_patch(hwDevice, handle);
   2736     } else {
   2737         ALOG_ASSERT(false, "releaseAudioPatch_l() called on a pre 3.0 HAL");
   2738     }
   2739     return status;
   2740 }
   2741 
   2742 void AudioFlinger::PlaybackThread::addPatchTrack(const sp<PatchTrack>& track)
   2743 {
   2744     Mutex::Autolock _l(mLock);
   2745     mTracks.add(track);
   2746 }
   2747 
   2748 void AudioFlinger::PlaybackThread::deletePatchTrack(const sp<PatchTrack>& track)
   2749 {
   2750     Mutex::Autolock _l(mLock);
   2751     destroyTrack_l(track);
   2752 }
   2753 
   2754 void AudioFlinger::PlaybackThread::getAudioPortConfig(struct audio_port_config *config)
   2755 {
   2756     ThreadBase::getAudioPortConfig(config);
   2757     config->role = AUDIO_PORT_ROLE_SOURCE;
   2758     config->ext.mix.hw_module = mOutput->audioHwDev->handle();
   2759     config->ext.mix.usecase.stream = AUDIO_STREAM_DEFAULT;
   2760 }
   2761 
   2762 // ----------------------------------------------------------------------------
   2763 
   2764 AudioFlinger::MixerThread::MixerThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output,
   2765         audio_io_handle_t id, audio_devices_t device, type_t type)
   2766     :   PlaybackThread(audioFlinger, output, id, device, type),
   2767         // mAudioMixer below
   2768         // mFastMixer below
   2769         mFastMixerFutex(0)
   2770         // mOutputSink below
   2771         // mPipeSink below
   2772         // mNormalSink below
   2773 {
   2774     ALOGV("MixerThread() id=%d device=%#x type=%d", id, device, type);
   2775     ALOGV("mSampleRate=%u, mChannelMask=%#x, mChannelCount=%u, mFormat=%d, mFrameSize=%u, "
   2776             "mFrameCount=%d, mNormalFrameCount=%d",
   2777             mSampleRate, mChannelMask, mChannelCount, mFormat, mFrameSize, mFrameCount,
   2778             mNormalFrameCount);
   2779     mAudioMixer = new AudioMixer(mNormalFrameCount, mSampleRate);
   2780 
   2781     // create an NBAIO sink for the HAL output stream, and negotiate
   2782     mOutputSink = new AudioStreamOutSink(output->stream);
   2783     size_t numCounterOffers = 0;
   2784     const NBAIO_Format offers[1] = {Format_from_SR_C(mSampleRate, mChannelCount, mFormat)};
   2785     ssize_t index = mOutputSink->negotiate(offers, 1, NULL, numCounterOffers);
   2786     ALOG_ASSERT(index == 0);
   2787 
   2788     // initialize fast mixer depending on configuration
   2789     bool initFastMixer;
   2790     switch (kUseFastMixer) {
   2791     case FastMixer_Never:
   2792         initFastMixer = false;
   2793         break;
   2794     case FastMixer_Always:
   2795         initFastMixer = true;
   2796         break;
   2797     case FastMixer_Static:
   2798     case FastMixer_Dynamic:
   2799         initFastMixer = mFrameCount < mNormalFrameCount;
   2800         break;
   2801     }
   2802     if (initFastMixer) {
   2803         audio_format_t fastMixerFormat;
   2804         if (mMixerBufferEnabled && mEffectBufferEnabled) {
   2805             fastMixerFormat = AUDIO_FORMAT_PCM_FLOAT;
   2806         } else {
   2807             fastMixerFormat = AUDIO_FORMAT_PCM_16_BIT;
   2808         }
   2809         if (mFormat != fastMixerFormat) {
   2810             // change our Sink format to accept our intermediate precision
   2811             mFormat = fastMixerFormat;
   2812             free(mSinkBuffer);
   2813             mFrameSize = mChannelCount * audio_bytes_per_sample(mFormat);
   2814             const size_t sinkBufferSize = mNormalFrameCount * mFrameSize;
   2815             (void)posix_memalign(&mSinkBuffer, 32, sinkBufferSize);
   2816         }
   2817 
   2818         // create a MonoPipe to connect our submix to FastMixer
   2819         NBAIO_Format format = mOutputSink->format();
   2820         NBAIO_Format origformat = format;
   2821         // adjust format to match that of the Fast Mixer
   2822         format.mFormat = fastMixerFormat;
   2823         format.mFrameSize = audio_bytes_per_sample(format.mFormat) * format.mChannelCount;
   2824 
   2825         // This pipe depth compensates for scheduling latency of the normal mixer thread.
   2826         // When it wakes up after a maximum latency, it runs a few cycles quickly before
   2827         // finally blocking.  Note the pipe implementation rounds up the request to a power of 2.
   2828         MonoPipe *monoPipe = new MonoPipe(mNormalFrameCount * 4, format, true /*writeCanBlock*/);
   2829         const NBAIO_Format offers[1] = {format};
   2830         size_t numCounterOffers = 0;
   2831         ssize_t index = monoPipe->negotiate(offers, 1, NULL, numCounterOffers);
   2832         ALOG_ASSERT(index == 0);
   2833         monoPipe->setAvgFrames((mScreenState & 1) ?
   2834                 (monoPipe->maxFrames() * 7) / 8 : mNormalFrameCount * 2);
   2835         mPipeSink = monoPipe;
   2836 
   2837 #ifdef TEE_SINK
   2838         if (mTeeSinkOutputEnabled) {
   2839             // create a Pipe to archive a copy of FastMixer's output for dumpsys
   2840             Pipe *teeSink = new Pipe(mTeeSinkOutputFrames, origformat);
   2841             const NBAIO_Format offers2[1] = {origformat};
   2842             numCounterOffers = 0;
   2843             index = teeSink->negotiate(offers2, 1, NULL, numCounterOffers);
   2844             ALOG_ASSERT(index == 0);
   2845             mTeeSink = teeSink;
   2846             PipeReader *teeSource = new PipeReader(*teeSink);
   2847             numCounterOffers = 0;
   2848             index = teeSource->negotiate(offers2, 1, NULL, numCounterOffers);
   2849             ALOG_ASSERT(index == 0);
   2850             mTeeSource = teeSource;
   2851         }
   2852 #endif
   2853 
   2854         // create fast mixer and configure it initially with just one fast track for our submix
   2855         mFastMixer = new FastMixer();
   2856         FastMixerStateQueue *sq = mFastMixer->sq();
   2857 #ifdef STATE_QUEUE_DUMP
   2858         sq->setObserverDump(&mStateQueueObserverDump);
   2859         sq->setMutatorDump(&mStateQueueMutatorDump);
   2860 #endif
   2861         FastMixerState *state = sq->begin();
   2862         FastTrack *fastTrack = &state->mFastTracks[0];
   2863         // wrap the source side of the MonoPipe to make it an AudioBufferProvider
   2864         fastTrack->mBufferProvider = new SourceAudioBufferProvider(new MonoPipeReader(monoPipe));
   2865         fastTrack->mVolumeProvider = NULL;
   2866         fastTrack->mChannelMask = mChannelMask; // mPipeSink channel mask for audio to FastMixer
   2867         fastTrack->mFormat = mFormat; // mPipeSink format for audio to FastMixer
   2868         fastTrack->mGeneration++;
   2869         state->mFastTracksGen++;
   2870         state->mTrackMask = 1;
   2871         // fast mixer will use the HAL output sink
   2872         state->mOutputSink = mOutputSink.get();
   2873         state->mOutputSinkGen++;
   2874         state->mFrameCount = mFrameCount;
   2875         state->mCommand = FastMixerState::COLD_IDLE;
   2876         // already done in constructor initialization list
   2877         //mFastMixerFutex = 0;
   2878         state->mColdFutexAddr = &mFastMixerFutex;
   2879         state->mColdGen++;
   2880         state->mDumpState = &mFastMixerDumpState;
   2881 #ifdef TEE_SINK
   2882         state->mTeeSink = mTeeSink.get();
   2883 #endif
   2884         mFastMixerNBLogWriter = audioFlinger->newWriter_l(kFastMixerLogSize, "FastMixer");
   2885         state->mNBLogWriter = mFastMixerNBLogWriter.get();
   2886         sq->end();
   2887         sq->push(FastMixerStateQueue::BLOCK_UNTIL_PUSHED);
   2888 
   2889         // start the fast mixer
   2890         mFastMixer->run("FastMixer", PRIORITY_URGENT_AUDIO);
   2891         pid_t tid = mFastMixer->getTid();
   2892         int err = requestPriority(getpid_cached, tid, kPriorityFastMixer);
   2893         if (err != 0) {
   2894             ALOGW("Policy SCHED_FIFO priority %d is unavailable for pid %d tid %d; error %d",
   2895                     kPriorityFastMixer, getpid_cached, tid, err);
   2896         }
   2897 
   2898 #ifdef AUDIO_WATCHDOG
   2899         // create and start the watchdog
   2900         mAudioWatchdog = new AudioWatchdog();
   2901         mAudioWatchdog->setDump(&mAudioWatchdogDump);
   2902         mAudioWatchdog->run("AudioWatchdog", PRIORITY_URGENT_AUDIO);
   2903         tid = mAudioWatchdog->getTid();
   2904         err = requestPriority(getpid_cached, tid, kPriorityFastMixer);
   2905         if (err != 0) {
   2906             ALOGW("Policy SCHED_FIFO priority %d is unavailable for pid %d tid %d; error %d",
   2907                     kPriorityFastMixer, getpid_cached, tid, err);
   2908         }
   2909 #endif
   2910 
   2911     }
   2912 
   2913     switch (kUseFastMixer) {
   2914     case FastMixer_Never:
   2915     case FastMixer_Dynamic:
   2916         mNormalSink = mOutputSink;
   2917         break;
   2918     case FastMixer_Always:
   2919         mNormalSink = mPipeSink;
   2920         break;
   2921     case FastMixer_Static:
   2922         mNormalSink = initFastMixer ? mPipeSink : mOutputSink;
   2923         break;
   2924     }
   2925 }
   2926 
   2927 AudioFlinger::MixerThread::~MixerThread()
   2928 {
   2929     if (mFastMixer != 0) {
   2930         FastMixerStateQueue *sq = mFastMixer->sq();
   2931         FastMixerState *state = sq->begin();
   2932         if (state->mCommand == FastMixerState::COLD_IDLE) {
   2933             int32_t old = android_atomic_inc(&mFastMixerFutex);
   2934             if (old == -1) {
   2935                 (void) syscall(__NR_futex, &mFastMixerFutex, FUTEX_WAKE_PRIVATE, 1);
   2936             }
   2937         }
   2938         state->mCommand = FastMixerState::EXIT;
   2939         sq->end();
   2940         sq->push(FastMixerStateQueue::BLOCK_UNTIL_PUSHED);
   2941         mFastMixer->join();
   2942         // Though the fast mixer thread has exited, it's state queue is still valid.
   2943         // We'll use that extract the final state which contains one remaining fast track
   2944         // corresponding to our sub-mix.
   2945         state = sq->begin();
   2946         ALOG_ASSERT(state->mTrackMask == 1);
   2947         FastTrack *fastTrack = &state->mFastTracks[0];
   2948         ALOG_ASSERT(fastTrack->mBufferProvider != NULL);
   2949         delete fastTrack->mBufferProvider;
   2950         sq->end(false /*didModify*/);
   2951         mFastMixer.clear();
   2952 #ifdef AUDIO_WATCHDOG
   2953         if (mAudioWatchdog != 0) {
   2954             mAudioWatchdog->requestExit();
   2955             mAudioWatchdog->requestExitAndWait();
   2956             mAudioWatchdog.clear();
   2957         }
   2958 #endif
   2959     }
   2960     mAudioFlinger->unregisterWriter(mFastMixerNBLogWriter);
   2961     delete mAudioMixer;
   2962 }
   2963 
   2964 
   2965 uint32_t AudioFlinger::MixerThread::correctLatency_l(uint32_t latency) const
   2966 {
   2967     if (mFastMixer != 0) {
   2968         MonoPipe *pipe = (MonoPipe *)mPipeSink.get();
   2969         latency += (pipe->getAvgFrames() * 1000) / mSampleRate;
   2970     }
   2971     return latency;
   2972 }
   2973 
   2974 
   2975 void AudioFlinger::MixerThread::threadLoop_removeTracks(const Vector< sp<Track> >& tracksToRemove)
   2976 {
   2977     PlaybackThread::threadLoop_removeTracks(tracksToRemove);
   2978 }
   2979 
   2980 ssize_t AudioFlinger::MixerThread::threadLoop_write()
   2981 {
   2982     // FIXME we should only do one push per cycle; confirm this is true
   2983     // Start the fast mixer if it's not already running
   2984     if (mFastMixer != 0) {
   2985         FastMixerStateQueue *sq = mFastMixer->sq();
   2986         FastMixerState *state = sq->begin();
   2987         if (state->mCommand != FastMixerState::MIX_WRITE &&
   2988                 (kUseFastMixer != FastMixer_Dynamic || state->mTrackMask > 1)) {
   2989             if (state->mCommand == FastMixerState::COLD_IDLE) {
   2990                 int32_t old = android_atomic_inc(&mFastMixerFutex);
   2991                 if (old == -1) {
   2992                     (void) syscall(__NR_futex, &mFastMixerFutex, FUTEX_WAKE_PRIVATE, 1);
   2993                 }
   2994 #ifdef AUDIO_WATCHDOG
   2995                 if (mAudioWatchdog != 0) {
   2996                     mAudioWatchdog->resume();
   2997                 }
   2998 #endif
   2999             }
   3000             state->mCommand = FastMixerState::MIX_WRITE;
   3001             mFastMixerDumpState.increaseSamplingN(mAudioFlinger->isLowRamDevice() ?
   3002                     FastMixerDumpState::kSamplingNforLowRamDevice : FastMixerDumpState::kSamplingN);
   3003             sq->end();
   3004             sq->push(FastMixerStateQueue::BLOCK_UNTIL_PUSHED);
   3005             if (kUseFastMixer == FastMixer_Dynamic) {
   3006                 mNormalSink = mPipeSink;
   3007             }
   3008         } else {
   3009             sq->end(false /*didModify*/);
   3010         }
   3011     }
   3012     return PlaybackThread::threadLoop_write();
   3013 }
   3014 
   3015 void AudioFlinger::MixerThread::threadLoop_standby()
   3016 {
   3017     // Idle the fast mixer if it's currently running
   3018     if (mFastMixer != 0) {
   3019         FastMixerStateQueue *sq = mFastMixer->sq();
   3020         FastMixerState *state = sq->begin();
   3021         if (!(state->mCommand & FastMixerState::IDLE)) {
   3022             state->mCommand = FastMixerState::COLD_IDLE;
   3023             state->mColdFutexAddr = &mFastMixerFutex;
   3024             state->mColdGen++;
   3025             mFastMixerFutex = 0;
   3026             sq->end();
   3027             // BLOCK_UNTIL_PUSHED would be insufficient, as we need it to stop doing I/O now
   3028             sq->push(FastMixerStateQueue::BLOCK_UNTIL_ACKED);
   3029             if (kUseFastMixer == FastMixer_Dynamic) {
   3030                 mNormalSink = mOutputSink;
   3031             }
   3032 #ifdef AUDIO_WATCHDOG
   3033             if (mAudioWatchdog != 0) {
   3034                 mAudioWatchdog->pause();
   3035             }
   3036 #endif
   3037         } else {
   3038             sq->end(false /*didModify*/);
   3039         }
   3040     }
   3041     PlaybackThread::threadLoop_standby();
   3042 }
   3043 
   3044 bool AudioFlinger::PlaybackThread::waitingAsyncCallback_l()
   3045 {
   3046     return false;
   3047 }
   3048 
   3049 bool AudioFlinger::PlaybackThread::shouldStandby_l()
   3050 {
   3051     return !mStandby;
   3052 }
   3053 
   3054 bool AudioFlinger::PlaybackThread::waitingAsyncCallback()
   3055 {
   3056     Mutex::Autolock _l(mLock);
   3057     return waitingAsyncCallback_l();
   3058 }
   3059 
   3060 // shared by MIXER and DIRECT, overridden by DUPLICATING
   3061 void AudioFlinger::PlaybackThread::threadLoop_standby()
   3062 {
   3063     ALOGV("Audio hardware entering standby, mixer %p, suspend count %d", this, mSuspended);
   3064     mOutput->stream->common.standby(&mOutput->stream->common);
   3065     if (mUseAsyncWrite != 0) {
   3066         // discard any pending drain or write ack by incrementing sequence
   3067         mWriteAckSequence = (mWriteAckSequence + 2) & ~1;
   3068         mDrainSequence = (mDrainSequence + 2) & ~1;
   3069         ALOG_ASSERT(mCallbackThread != 0);
   3070         mCallbackThread->setWriteBlocked(mWriteAckSequence);
   3071         mCallbackThread->setDraining(mDrainSequence);
   3072     }
   3073 }
   3074 
   3075 void AudioFlinger::PlaybackThread::onAddNewTrack_l()
   3076 {
   3077     ALOGV("signal playback thread");
   3078     broadcast_l();
   3079 }
   3080 
   3081 void AudioFlinger::MixerThread::threadLoop_mix()
   3082 {
   3083     // obtain the presentation timestamp of the next output buffer
   3084     int64_t pts;
   3085     status_t status = INVALID_OPERATION;
   3086 
   3087     if (mNormalSink != 0) {
   3088         status = mNormalSink->getNextWriteTimestamp(&pts);
   3089     } else {
   3090         status = mOutputSink->getNextWriteTimestamp(&pts);
   3091     }
   3092 
   3093     if (status != NO_ERROR) {
   3094         pts = AudioBufferProvider::kInvalidPTS;
   3095     }
   3096 
   3097     // mix buffers...
   3098     mAudioMixer->process(pts);
   3099     mCurrentWriteLength = mSinkBufferSize;
   3100     // increase sleep time progressively when application underrun condition clears.
   3101     // Only increase sleep time if the mixer is ready for two consecutive times to avoid
   3102     // that a steady state of alternating ready/not ready conditions keeps the sleep time
   3103     // such that we would underrun the audio HAL.
   3104     if ((sleepTime == 0) && (sleepTimeShift > 0)) {
   3105         sleepTimeShift--;
   3106     }
   3107     sleepTime = 0;
   3108     standbyTime = systemTime() + standbyDelay;
   3109     //TODO: delay standby when effects have a tail
   3110 
   3111 }
   3112 
   3113 void AudioFlinger::MixerThread::threadLoop_sleepTime()
   3114 {
   3115     // If no tracks are ready, sleep once for the duration of an output
   3116     // buffer size, then write 0s to the output
   3117     if (sleepTime == 0) {
   3118         if (mMixerStatus == MIXER_TRACKS_ENABLED) {
   3119             sleepTime = activeSleepTime >> sleepTimeShift;
   3120             if (sleepTime < kMinThreadSleepTimeUs) {
   3121                 sleepTime = kMinThreadSleepTimeUs;
   3122             }
   3123             // reduce sleep time in case of consecutive application underruns to avoid
   3124             // starving the audio HAL. As activeSleepTimeUs() is larger than a buffer
   3125             // duration we would end up writing less data than needed by the audio HAL if
   3126             // the condition persists.
   3127             if (sleepTimeShift < kMaxThreadSleepTimeShift) {
   3128                 sleepTimeShift++;
   3129             }
   3130         } else {
   3131             sleepTime = idleSleepTime;
   3132         }
   3133     } else if (mBytesWritten != 0 || (mMixerStatus == MIXER_TRACKS_ENABLED)) {
   3134         // clear out mMixerBuffer or mSinkBuffer, to ensure buffers are cleared
   3135         // before effects processing or output.
   3136         if (mMixerBufferValid) {
   3137             memset(mMixerBuffer, 0, mMixerBufferSize);
   3138         } else {
   3139             memset(mSinkBuffer, 0, mSinkBufferSize);
   3140         }
   3141         sleepTime = 0;
   3142         ALOGV_IF(mBytesWritten == 0 && (mMixerStatus == MIXER_TRACKS_ENABLED),
   3143                 "anticipated start");
   3144     }
   3145     // TODO add standby time extension fct of effect tail
   3146 }
   3147 
   3148 // prepareTracks_l() must be called with ThreadBase::mLock held
   3149 AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTracks_l(
   3150         Vector< sp<Track> > *tracksToRemove)
   3151 {
   3152 
   3153     mixer_state mixerStatus = MIXER_IDLE;
   3154     // find out which tracks need to be processed
   3155     size_t count = mActiveTracks.size();
   3156     size_t mixedTracks = 0;
   3157     size_t tracksWithEffect = 0;
   3158     // counts only _active_ fast tracks
   3159     size_t fastTracks = 0;
   3160     uint32_t resetMask = 0; // bit mask of fast tracks that need to be reset
   3161 
   3162     float masterVolume = mMasterVolume;
   3163     bool masterMute = mMasterMute;
   3164 
   3165     if (masterMute) {
   3166         masterVolume = 0;
   3167     }
   3168     // Delegate master volume control to effect in output mix effect chain if needed
   3169     sp<EffectChain> chain = getEffectChain_l(AUDIO_SESSION_OUTPUT_MIX);
   3170     if (chain != 0) {
   3171         uint32_t v = (uint32_t)(masterVolume * (1 << 24));
   3172         chain->setVolume_l(&v, &v);
   3173         masterVolume = (float)((v + (1 << 23)) >> 24);
   3174         chain.clear();
   3175     }
   3176 
   3177     // prepare a new state to push
   3178     FastMixerStateQueue *sq = NULL;
   3179     FastMixerState *state = NULL;
   3180     bool didModify = false;
   3181     FastMixerStateQueue::block_t block = FastMixerStateQueue::BLOCK_UNTIL_PUSHED;
   3182     if (mFastMixer != 0) {
   3183         sq = mFastMixer->sq();
   3184         state = sq->begin();
   3185     }
   3186 
   3187     mMixerBufferValid = false;  // mMixerBuffer has no valid data until appropriate tracks found.
   3188     mEffectBufferValid = false; // mEffectBuffer has no valid data until tracks found.
   3189 
   3190     for (size_t i=0 ; i<count ; i++) {
   3191         const sp<Track> t = mActiveTracks[i].promote();
   3192         if (t == 0) {
   3193             continue;
   3194         }
   3195 
   3196         // this const just means the local variable doesn't change
   3197         Track* const track = t.get();
   3198 
   3199         // process fast tracks
   3200         if (track->isFastTrack()) {
   3201 
   3202             // It's theoretically possible (though unlikely) for a fast track to be created
   3203             // and then removed within the same normal mix cycle.  This is not a problem, as
   3204             // the track never becomes active so it's fast mixer slot is never touched.
   3205             // The converse, of removing an (active) track and then creating a new track
   3206             // at the identical fast mixer slot within the same normal mix cycle,
   3207             // is impossible because the slot isn't marked available until the end of each cycle.
   3208             int j = track->mFastIndex;
   3209             ALOG_ASSERT(0 < j && j < (int)FastMixerState::kMaxFastTracks);
   3210             ALOG_ASSERT(!(mFastTrackAvailMask & (1 << j)));
   3211             FastTrack *fastTrack = &state->mFastTracks[j];
   3212 
   3213             // Determine whether the track is currently in underrun condition,
   3214             // and whether it had a recent underrun.
   3215             FastTrackDump *ftDump = &mFastMixerDumpState.mTracks[j];
   3216             FastTrackUnderruns underruns = ftDump->mUnderruns;
   3217             uint32_t recentFull = (underruns.mBitFields.mFull -
   3218                     track->mObservedUnderruns.mBitFields.mFull) & UNDERRUN_MASK;
   3219             uint32_t recentPartial = (underruns.mBitFields.mPartial -
   3220                     track->mObservedUnderruns.mBitFields.mPartial) & UNDERRUN_MASK;
   3221             uint32_t recentEmpty = (underruns.mBitFields.mEmpty -
   3222                     track->mObservedUnderruns.mBitFields.mEmpty) & UNDERRUN_MASK;
   3223             uint32_t recentUnderruns = recentPartial + recentEmpty;
   3224             track->mObservedUnderruns = underruns;
   3225             // don't count underruns that occur while stopping or pausing
   3226             // or stopped which can occur when flush() is called while active
   3227             if (!(track->isStopping() || track->isPausing() || track->isStopped()) &&
   3228                     recentUnderruns > 0) {
   3229                 // FIXME fast mixer will pull & mix partial buffers, but we count as a full underrun
   3230                 track->mAudioTrackServerProxy->tallyUnderrunFrames(recentUnderruns * mFrameCount);
   3231             }
   3232 
   3233             // This is similar to the state machine for normal tracks,
   3234             // with a few modifications for fast tracks.
   3235             bool isActive = true;
   3236             switch (track->mState) {
   3237             case TrackBase::STOPPING_1:
   3238                 // track stays active in STOPPING_1 state until first underrun
   3239                 if (recentUnderruns > 0 || track->isTerminated()) {
   3240                     track->mState = TrackBase::STOPPING_2;
   3241                 }
   3242                 break;
   3243             case TrackBase::PAUSING:
   3244                 // ramp down is not yet implemented
   3245                 track->setPaused();
   3246                 break;
   3247             case TrackBase::RESUMING:
   3248                 // ramp up is not yet implemented
   3249                 track->mState = TrackBase::ACTIVE;
   3250                 break;
   3251             case TrackBase::ACTIVE:
   3252                 if (recentFull > 0 || recentPartial > 0) {
   3253                     // track has provided at least some frames recently: reset retry count
   3254                     track->mRetryCount = kMaxTrackRetries;
   3255                 }
   3256                 if (recentUnderruns == 0) {
   3257                     // no recent underruns: stay active
   3258                     break;
   3259                 }
   3260                 // there has recently been an underrun of some kind
   3261                 if (track->sharedBuffer() == 0) {
   3262                     // were any of the recent underruns "empty" (no frames available)?
   3263                     if (recentEmpty == 0) {
   3264                         // no, then ignore the partial underruns as they are allowed indefinitely
   3265                         break;
   3266                     }
   3267                     // there has recently been an "empty" underrun: decrement the retry counter
   3268                     if (--(track->mRetryCount) > 0) {
   3269                         break;
   3270                     }
   3271                     // indicate to client process that the track was disabled because of underrun;
   3272                     // it will then automatically call start() when data is available
   3273                     android_atomic_or(CBLK_DISABLED, &track->mCblk->mFlags);
   3274                     // remove from active list, but state remains ACTIVE [confusing but true]
   3275                     isActive = false;
   3276                     break;
   3277                 }
   3278                 // fall through
   3279             case TrackBase::STOPPING_2:
   3280             case TrackBase::PAUSED:
   3281             case TrackBase::STOPPED:
   3282             case TrackBase::FLUSHED:   // flush() while active
   3283                 // Check for presentation complete if track is inactive
   3284                 // We have consumed all the buffers of this track.
   3285                 // This would be incomplete if we auto-paused on underrun
   3286                 {
   3287                     size_t audioHALFrames =
   3288                             (mOutput->stream->get_latency(mOutput->stream)*mSampleRate) / 1000;
   3289                     size_t framesWritten = mBytesWritten / mFrameSize;
   3290                     if (!(mStandby || track->presentationComplete(framesWritten, audioHALFrames))) {
   3291                         // track stays in active list until presentation is complete
   3292                         break;
   3293                     }
   3294                 }
   3295                 if (track->isStopping_2()) {
   3296                     track->mState = TrackBase::STOPPED;
   3297                 }
   3298                 if (track->isStopped()) {
   3299                     // Can't reset directly, as fast mixer is still polling this track
   3300                     //   track->reset();
   3301                     // So instead mark this track as needing to be reset after push with ack
   3302                     resetMask |= 1 << i;
   3303                 }
   3304                 isActive = false;
   3305                 break;
   3306             case TrackBase::IDLE:
   3307             default:
   3308                 LOG_ALWAYS_FATAL("unexpected track state %d", track->mState);
   3309             }
   3310 
   3311             if (isActive) {
   3312                 // was it previously inactive?
   3313                 if (!(state->mTrackMask & (1 << j))) {
   3314                     ExtendedAudioBufferProvider *eabp = track;
   3315                     VolumeProvider *vp = track;
   3316                     fastTrack->mBufferProvider = eabp;
   3317                     fastTrack->mVolumeProvider = vp;
   3318                     fastTrack->mChannelMask = track->mChannelMask;
   3319                     fastTrack->mFormat = track->mFormat;
   3320                     fastTrack->mGeneration++;
   3321                     state->mTrackMask |= 1 << j;
   3322                     didModify = true;
   3323                     // no acknowledgement required for newly active tracks
   3324                 }
   3325                 // cache the combined master volume and stream type volume for fast mixer; this
   3326                 // lacks any synchronization or barrier so VolumeProvider may read a stale value
   3327                 track->mCachedVolume = masterVolume * mStreamTypes[track->streamType()].volume;
   3328                 ++fastTracks;
   3329             } else {
   3330                 // was it previously active?
   3331                 if (state->mTrackMask & (1 << j)) {
   3332                     fastTrack->mBufferProvider = NULL;
   3333                     fastTrack->mGeneration++;
   3334                     state->mTrackMask &= ~(1 << j);
   3335                     didModify = true;
   3336                     // If any fast tracks were removed, we must wait for acknowledgement
   3337                     // because we're about to decrement the last sp<> on those tracks.
   3338                     block = FastMixerStateQueue::BLOCK_UNTIL_ACKED;
   3339                 } else {
   3340                     LOG_ALWAYS_FATAL("fast track %d should have been active", j);
   3341                 }
   3342                 tracksToRemove->add(track);
   3343                 // Avoids a misleading display in dumpsys
   3344                 track->mObservedUnderruns.mBitFields.mMostRecent = UNDERRUN_FULL;
   3345             }
   3346             continue;
   3347         }
   3348 
   3349         {   // local variable scope to avoid goto warning
   3350 
   3351         audio_track_cblk_t* cblk = track->cblk();
   3352 
   3353         // The first time a track is added we wait
   3354         // for all its buffers to be filled before processing it
   3355         int name = track->name();
   3356         // make sure that we have enough frames to mix one full buffer.
   3357         // enforce this condition only once to enable draining the buffer in case the client
   3358         // app does not call stop() and relies on underrun to stop:
   3359         // hence the test on (mMixerStatus == MIXER_TRACKS_READY) meaning the track was mixed
   3360         // during last round
   3361         size_t desiredFrames;
   3362         uint32_t sr = track->sampleRate();
   3363         if (sr == mSampleRate) {
   3364             desiredFrames = mNormalFrameCount;
   3365         } else {
   3366             // +1 for rounding and +1 for additional sample needed for interpolation
   3367             desiredFrames = (mNormalFrameCount * sr) / mSampleRate + 1 + 1;
   3368             // add frames already consumed but not yet released by the resampler
   3369             // because mAudioTrackServerProxy->framesReady() will include these frames
   3370             desiredFrames += mAudioMixer->getUnreleasedFrames(track->name());
   3371 #if 0
   3372             // the minimum track buffer size is normally twice the number of frames necessary
   3373             // to fill one buffer and the resampler should not leave more than one buffer worth
   3374             // of unreleased frames after each pass, but just in case...
   3375             ALOG_ASSERT(desiredFrames <= cblk->frameCount_);
   3376 #endif
   3377         }
   3378         uint32_t minFrames = 1;
   3379         if ((track->sharedBuffer() == 0) && !track->isStopped() && !track->isPausing() &&
   3380                 (mMixerStatusIgnoringFastTracks == MIXER_TRACKS_READY)) {
   3381             minFrames = desiredFrames;
   3382         }
   3383 
   3384         size_t framesReady = track->framesReady();
   3385         if ((framesReady >= minFrames) && track->isReady() &&
   3386                 !track->isPaused() && !track->isTerminated())
   3387         {
   3388             ALOGVV("track %d s=%08x [OK] on thread %p", name, cblk->mServer, this);
   3389 
   3390             mixedTracks++;
   3391 
   3392             // track->mainBuffer() != mSinkBuffer or mMixerBuffer means
   3393             // there is an effect chain connected to the track
   3394             chain.clear();
   3395             if (track->mainBuffer() != mSinkBuffer &&
   3396                     track->mainBuffer() != mMixerBuffer) {
   3397                 if (mEffectBufferEnabled) {
   3398                     mEffectBufferValid = true; // Later can set directly.
   3399                 }
   3400                 chain = getEffectChain_l(track->sessionId());
   3401                 // Delegate volume control to effect in track effect chain if needed
   3402                 if (chain != 0) {
   3403                     tracksWithEffect++;
   3404                 } else {
   3405                     ALOGW("prepareTracks_l(): track %d attached to effect but no chain found on "
   3406                             "session %d",
   3407                             name, track->sessionId());
   3408                 }
   3409             }
   3410 
   3411 
   3412             int param = AudioMixer::VOLUME;
   3413             if (track->mFillingUpStatus == Track::FS_FILLED) {
   3414                 // no ramp for the first volume setting
   3415                 track->mFillingUpStatus = Track::FS_ACTIVE;
   3416                 if (track->mState == TrackBase::RESUMING) {
   3417                     track->mState = TrackBase::ACTIVE;
   3418                     param = AudioMixer::RAMP_VOLUME;
   3419                 }
   3420                 mAudioMixer->setParameter(name, AudioMixer::RESAMPLE, AudioMixer::RESET, NULL);
   3421             // FIXME should not make a decision based on mServer
   3422             } else if (cblk->mServer != 0) {
   3423                 // If the track is stopped before the first frame was mixed,
   3424                 // do not apply ramp
   3425                 param = AudioMixer::RAMP_VOLUME;
   3426             }
   3427 
   3428             // compute volume for this track
   3429             uint32_t vl, vr;       // in U8.24 integer format
   3430             float vlf, vrf, vaf;   // in [0.0, 1.0] float format
   3431             if (track->isPausing() || mStreamTypes[track->streamType()].mute) {
   3432                 vl = vr = 0;
   3433                 vlf = vrf = vaf = 0.;
   3434                 if (track->isPausing()) {
   3435                     track->setPaused();
   3436                 }
   3437             } else {
   3438 
   3439                 // read original volumes with volume control
   3440                 float typeVolume = mStreamTypes[track->streamType()].volume;
   3441                 float v = masterVolume * typeVolume;
   3442                 AudioTrackServerProxy *proxy = track->mAudioTrackServerProxy;
   3443                 gain_minifloat_packed_t vlr = proxy->getVolumeLR();
   3444                 vlf = float_from_gain(gain_minifloat_unpack_left(vlr));
   3445                 vrf = float_from_gain(gain_minifloat_unpack_right(vlr));
   3446                 // track volumes come from shared memory, so can't be trusted and must be clamped
   3447                 if (vlf > GAIN_FLOAT_UNITY) {
   3448                     ALOGV("Track left volume out of range: %.3g", vlf);
   3449                     vlf = GAIN_FLOAT_UNITY;
   3450                 }
   3451                 if (vrf > GAIN_FLOAT_UNITY) {
   3452                     ALOGV("Track right volume out of range: %.3g", vrf);
   3453                     vrf = GAIN_FLOAT_UNITY;
   3454                 }
   3455                 // now apply the master volume and stream type volume
   3456                 vlf *= v;
   3457                 vrf *= v;
   3458                 // assuming master volume and stream type volume each go up to 1.0,
   3459                 // then derive vl and vr as U8.24 versions for the effect chain
   3460                 const float scaleto8_24 = MAX_GAIN_INT * MAX_GAIN_INT;
   3461                 vl = (uint32_t) (scaleto8_24 * vlf);
   3462                 vr = (uint32_t) (scaleto8_24 * vrf);
   3463                 // vl and vr are now in U8.24 format
   3464                 uint16_t sendLevel = proxy->getSendLevel_U4_12();
   3465                 // send level comes from shared memory and so may be corrupt
   3466                 if (sendLevel > MAX_GAIN_INT) {
   3467                     ALOGV("Track send level out of range: %04X", sendLevel);
   3468                     sendLevel = MAX_GAIN_INT;
   3469                 }
   3470                 // vaf is represented as [0.0, 1.0] float by rescaling sendLevel
   3471                 vaf = v * sendLevel * (1. / MAX_GAIN_INT);
   3472             }
   3473 
   3474             // Delegate volume control to effect in track effect chain if needed
   3475             if (chain != 0 && chain->setVolume_l(&vl, &vr)) {
   3476                 // Do not ramp volume if volume is controlled by effect
   3477                 param = AudioMixer::VOLUME;
   3478                 // Update remaining floating point volume levels
   3479                 vlf = (float)vl / (1 << 24);
   3480                 vrf = (float)vr / (1 << 24);
   3481                 track->mHasVolumeController = true;
   3482             } else {
   3483                 // force no volume ramp when volume controller was just disabled or removed
   3484                 // from effect chain to avoid volume spike
   3485                 if (track->mHasVolumeController) {
   3486                     param = AudioMixer::VOLUME;
   3487                 }
   3488                 track->mHasVolumeController = false;
   3489             }
   3490 
   3491             // XXX: these things DON'T need to be done each time
   3492             mAudioMixer->setBufferProvider(name, track);
   3493             mAudioMixer->enable(name);
   3494 
   3495             mAudioMixer->setParameter(name, param, AudioMixer::VOLUME0, &vlf);
   3496             mAudioMixer->setParameter(name, param, AudioMixer::VOLUME1, &vrf);
   3497             mAudioMixer->setParameter(name, param, AudioMixer::AUXLEVEL, &vaf);
   3498             mAudioMixer->setParameter(
   3499                 name,
   3500                 AudioMixer::TRACK,
   3501                 AudioMixer::FORMAT, (void *)track->format());
   3502             mAudioMixer->setParameter(
   3503                 name,
   3504                 AudioMixer::TRACK,
   3505                 AudioMixer::CHANNEL_MASK, (void *)(uintptr_t)track->channelMask());
   3506             mAudioMixer->setParameter(
   3507                 name,
   3508                 AudioMixer::TRACK,
   3509                 AudioMixer::MIXER_CHANNEL_MASK, (void *)(uintptr_t)mChannelMask);
   3510             // limit track sample rate to 2 x output sample rate, which changes at re-configuration
   3511             uint32_t maxSampleRate = mSampleRate * AUDIO_RESAMPLER_DOWN_RATIO_MAX;
   3512             uint32_t reqSampleRate = track->mAudioTrackServerProxy->getSampleRate();
   3513             if (reqSampleRate == 0) {
   3514                 reqSampleRate = mSampleRate;
   3515             } else if (reqSampleRate > maxSampleRate) {
   3516                 reqSampleRate = maxSampleRate;
   3517             }
   3518             mAudioMixer->setParameter(
   3519                 name,
   3520                 AudioMixer::RESAMPLE,
   3521                 AudioMixer::SAMPLE_RATE,
   3522                 (void *)(uintptr_t)reqSampleRate);
   3523             /*
   3524              * Select the appropriate output buffer for the track.
   3525              *
   3526              * Tracks with effects go into their own effects chain buffer
   3527              * and from there into either mEffectBuffer or mSinkBuffer.
   3528              *
   3529              * Other tracks can use mMixerBuffer for higher precision
   3530              * channel accumulation.  If this buffer is enabled
   3531              * (mMixerBufferEnabled true), then selected tracks will accumulate
   3532              * into it.
   3533              *
   3534              */
   3535             if (mMixerBufferEnabled
   3536                     && (track->mainBuffer() == mSinkBuffer
   3537                             || track->mainBuffer() == mMixerBuffer)) {
   3538                 mAudioMixer->setParameter(
   3539                         name,
   3540                         AudioMixer::TRACK,
   3541                         AudioMixer::MIXER_FORMAT, (void *)mMixerBufferFormat);
   3542                 mAudioMixer->setParameter(
   3543                         name,
   3544                         AudioMixer::TRACK,
   3545                         AudioMixer::MAIN_BUFFER, (void *)mMixerBuffer);
   3546                 // TODO: override track->mainBuffer()?
   3547                 mMixerBufferValid = true;
   3548             } else {
   3549                 mAudioMixer->setParameter(
   3550                         name,
   3551                         AudioMixer::TRACK,
   3552                         AudioMixer::MIXER_FORMAT, (void *)AUDIO_FORMAT_PCM_16_BIT);
   3553                 mAudioMixer->setParameter(
   3554                         name,
   3555                         AudioMixer::TRACK,
   3556                         AudioMixer::MAIN_BUFFER, (void *)track->mainBuffer());
   3557             }
   3558             mAudioMixer->setParameter(
   3559                 name,
   3560                 AudioMixer::TRACK,
   3561                 AudioMixer::AUX_BUFFER, (void *)track->auxBuffer());
   3562 
   3563             // reset retry count
   3564             track->mRetryCount = kMaxTrackRetries;
   3565 
   3566             // If one track is ready, set the mixer ready if:
   3567             //  - the mixer was not ready during previous round OR
   3568             //  - no other track is not ready
   3569             if (mMixerStatusIgnoringFastTracks != MIXER_TRACKS_READY ||
   3570                     mixerStatus != MIXER_TRACKS_ENABLED) {
   3571                 mixerStatus = MIXER_TRACKS_READY;
   3572             }
   3573         } else {
   3574             if (framesReady < desiredFrames && !track->isStopped() && !track->isPaused()) {
   3575                 track->mAudioTrackServerProxy->tallyUnderrunFrames(desiredFrames);
   3576             }
   3577             // clear effect chain input buffer if an active track underruns to avoid sending
   3578             // previous audio buffer again to effects
   3579             chain = getEffectChain_l(track->sessionId());
   3580             if (chain != 0) {
   3581                 chain->clearInputBuffer();
   3582             }
   3583 
   3584             ALOGVV("track %d s=%08x [NOT READY] on thread %p", name, cblk->mServer, this);
   3585             if ((track->sharedBuffer() != 0) || track->isTerminated() ||
   3586                     track->isStopped() || track->isPaused()) {
   3587                 // We have consumed all the buffers of this track.
   3588                 // Remove it from the list of active tracks.
   3589                 // TODO: use actual buffer filling status instead of latency when available from
   3590                 // audio HAL
   3591                 size_t audioHALFrames = (latency_l() * mSampleRate) / 1000;
   3592                 size_t framesWritten = mBytesWritten / mFrameSize;
   3593                 if (mStandby || track->presentationComplete(framesWritten, audioHALFrames)) {
   3594                     if (track->isStopped()) {
   3595                         track->reset();
   3596                     }
   3597                     tracksToRemove->add(track);
   3598                 }
   3599             } else {
   3600                 // No buffers for this track. Give it a few chances to
   3601                 // fill a buffer, then remove it from active list.
   3602                 if (--(track->mRetryCount) <= 0) {
   3603                     ALOGI("BUFFER TIMEOUT: remove(%d) from active list on thread %p", name, this);
   3604                     tracksToRemove->add(track);
   3605                     // indicate to client process that the track was disabled because of underrun;
   3606                     // it will then automatically call start() when data is available
   3607                     android_atomic_or(CBLK_DISABLED, &cblk->mFlags);
   3608                 // If one track is not ready, mark the mixer also not ready if:
   3609                 //  - the mixer was ready during previous round OR
   3610                 //  - no other track is ready
   3611                 } else if (mMixerStatusIgnoringFastTracks == MIXER_TRACKS_READY ||
   3612                                 mixerStatus != MIXER_TRACKS_READY) {
   3613                     mixerStatus = MIXER_TRACKS_ENABLED;
   3614                 }
   3615             }
   3616             mAudioMixer->disable(name);
   3617         }
   3618 
   3619         }   // local variable scope to avoid goto warning
   3620 track_is_ready: ;
   3621 
   3622     }
   3623 
   3624     // Push the new FastMixer state if necessary
   3625     bool pauseAudioWatchdog = false;
   3626     if (didModify) {
   3627         state->mFastTracksGen++;
   3628         // if the fast mixer was active, but now there are no fast tracks, then put it in cold idle
   3629         if (kUseFastMixer == FastMixer_Dynamic &&
   3630                 state->mCommand == FastMixerState::MIX_WRITE && state->mTrackMask <= 1) {
   3631             state->mCommand = FastMixerState::COLD_IDLE;
   3632             state->mColdFutexAddr = &mFastMixerFutex;
   3633             state->mColdGen++;
   3634             mFastMixerFutex = 0;
   3635             if (kUseFastMixer == FastMixer_Dynamic) {
   3636                 mNormalSink = mOutputSink;
   3637             }
   3638             // If we go into cold idle, need to wait for acknowledgement
   3639             // so that fast mixer stops doing I/O.
   3640             block = FastMixerStateQueue::BLOCK_UNTIL_ACKED;
   3641             pauseAudioWatchdog = true;
   3642         }
   3643     }
   3644     if (sq != NULL) {
   3645         sq->end(didModify);
   3646         sq->push(block);
   3647     }
   3648 #ifdef AUDIO_WATCHDOG
   3649     if (pauseAudioWatchdog && mAudioWatchdog != 0) {
   3650         mAudioWatchdog->pause();
   3651     }
   3652 #endif
   3653 
   3654     // Now perform the deferred reset on fast tracks that have stopped
   3655     while (resetMask != 0) {
   3656         size_t i = __builtin_ctz(resetMask);
   3657         ALOG_ASSERT(i < count);
   3658         resetMask &= ~(1 << i);
   3659         sp<Track> t = mActiveTracks[i].promote();
   3660         if (t == 0) {
   3661             continue;
   3662         }
   3663         Track* track = t.get();
   3664         ALOG_ASSERT(track->isFastTrack() && track->isStopped());
   3665         track->reset();
   3666     }
   3667 
   3668     // remove all the tracks that need to be...
   3669     removeTracks_l(*tracksToRemove);
   3670 
   3671     if (getEffectChain_l(AUDIO_SESSION_OUTPUT_MIX) != 0) {
   3672         mEffectBufferValid = true;
   3673     }
   3674 
   3675     if (mEffectBufferValid) {
   3676         // as long as there are effects we should clear the effects buffer, to avoid
   3677         // passing a non-clean buffer to the effect chain
   3678         memset(mEffectBuffer, 0, mEffectBufferSize);
   3679     }
   3680     // sink or mix buffer must be cleared if all tracks are connected to an
   3681     // effect chain as in this case the mixer will not write to the sink or mix buffer
   3682     // and track effects will accumulate into it
   3683     if ((mBytesRemaining == 0) && ((mixedTracks != 0 && mixedTracks == tracksWithEffect) ||
   3684             (mixedTracks == 0 && fastTracks > 0))) {
   3685         // FIXME as a performance optimization, should remember previous zero status
   3686         if (mMixerBufferValid) {
   3687             memset(mMixerBuffer, 0, mMixerBufferSize);
   3688             // TODO: In testing, mSinkBuffer below need not be cleared because
   3689             // the PlaybackThread::threadLoop() copies mMixerBuffer into mSinkBuffer
   3690             // after mixing.
   3691             //
   3692             // To enforce this guarantee:
   3693             // ((mixedTracks != 0 && mixedTracks == tracksWithEffect) ||
   3694             // (mixedTracks == 0 && fastTracks > 0))
   3695             // must imply MIXER_TRACKS_READY.
   3696             // Later, we may clear buffers regardless, and skip much of this logic.
   3697         }
   3698         // FIXME as a performance optimization, should remember previous zero status
   3699         memset(mSinkBuffer, 0, mNormalFrameCount * mFrameSize);
   3700     }
   3701 
   3702     // if any fast tracks, then status is ready
   3703     mMixerStatusIgnoringFastTracks = mixerStatus;
   3704     if (fastTracks > 0) {
   3705         mixerStatus = MIXER_TRACKS_READY;
   3706     }
   3707     return mixerStatus;
   3708 }
   3709 
   3710 // getTrackName_l() must be called with ThreadBase::mLock held
   3711 int AudioFlinger::MixerThread::getTrackName_l(audio_channel_mask_t channelMask,
   3712         audio_format_t format, int sessionId)
   3713 {
   3714     return mAudioMixer->getTrackName(channelMask, format, sessionId);
   3715 }
   3716 
   3717 // deleteTrackName_l() must be called with ThreadBase::mLock held
   3718 void AudioFlinger::MixerThread::deleteTrackName_l(int name)
   3719 {
   3720     ALOGV("remove track (%d) and delete from mixer", name);
   3721     mAudioMixer->deleteTrackName(name);
   3722 }
   3723 
   3724 // checkForNewParameter_l() must be called with ThreadBase::mLock held
   3725 bool AudioFlinger::MixerThread::checkForNewParameter_l(const String8& keyValuePair,
   3726                                                        status_t& status)
   3727 {
   3728     bool reconfig = false;
   3729 
   3730     status = NO_ERROR;
   3731 
   3732     // if !&IDLE, holds the FastMixer state to restore after new parameters processed
   3733     FastMixerState::Command previousCommand = FastMixerState::HOT_IDLE;
   3734     if (mFastMixer != 0) {
   3735         FastMixerStateQueue *sq = mFastMixer->sq();
   3736         FastMixerState *state = sq->begin();
   3737         if (!(state->mCommand & FastMixerState::IDLE)) {
   3738             previousCommand = state->mCommand;
   3739             state->mCommand = FastMixerState::HOT_IDLE;
   3740             sq->end();
   3741             sq->push(FastMixerStateQueue::BLOCK_UNTIL_ACKED);
   3742         } else {
   3743             sq->end(false /*didModify*/);
   3744         }
   3745     }
   3746 
   3747     AudioParameter param = AudioParameter(keyValuePair);
   3748     int value;
   3749     if (param.getInt(String8(AudioParameter::keySamplingRate), value) == NO_ERROR) {
   3750         reconfig = true;
   3751     }
   3752     if (param.getInt(String8(AudioParameter::keyFormat), value) == NO_ERROR) {
   3753         if (!isValidPcmSinkFormat((audio_format_t) value)) {
   3754             status = BAD_VALUE;
   3755         } else {
   3756             // no need to save value, since it's constant
   3757             reconfig = true;
   3758         }
   3759     }
   3760     if (param.getInt(String8(AudioParameter::keyChannels), value) == NO_ERROR) {
   3761         if (!isValidPcmSinkChannelMask((audio_channel_mask_t) value)) {
   3762             status = BAD_VALUE;
   3763         } else {
   3764             // no need to save value, since it's constant
   3765             reconfig = true;
   3766         }
   3767     }
   3768     if (param.getInt(String8(AudioParameter::keyFrameCount), value) == NO_ERROR) {
   3769         // do not accept frame count changes if tracks are open as the track buffer
   3770         // size depends on frame count and correct behavior would not be guaranteed
   3771         // if frame count is changed after track creation
   3772         if (!mTracks.isEmpty()) {
   3773             status = INVALID_OPERATION;
   3774         } else {
   3775             reconfig = true;
   3776         }
   3777     }
   3778     if (param.getInt(String8(AudioParameter::keyRouting), value) == NO_ERROR) {
   3779 #ifdef ADD_BATTERY_DATA
   3780         // when changing the audio output device, call addBatteryData to notify
   3781         // the change
   3782         if (mOutDevice != value) {
   3783             uint32_t params = 0;
   3784             // check whether speaker is on
   3785             if (value & AUDIO_DEVICE_OUT_SPEAKER) {
   3786                 params |= IMediaPlayerService::kBatteryDataSpeakerOn;
   3787             }
   3788 
   3789             audio_devices_t deviceWithoutSpeaker
   3790                 = AUDIO_DEVICE_OUT_ALL & ~AUDIO_DEVICE_OUT_SPEAKER;
   3791             // check if any other device (except speaker) is on
   3792             if (value & deviceWithoutSpeaker ) {
   3793                 params |= IMediaPlayerService::kBatteryDataOtherAudioDeviceOn;
   3794             }
   3795 
   3796             if (params != 0) {
   3797                 addBatteryData(params);
   3798             }
   3799         }
   3800 #endif
   3801 
   3802         // forward device change to effects that have requested to be
   3803         // aware of attached audio device.
   3804         if (value != AUDIO_DEVICE_NONE) {
   3805             mOutDevice = value;
   3806             for (size_t i = 0; i < mEffectChains.size(); i++) {
   3807                 mEffectChains[i]->setDevice_l(mOutDevice);
   3808             }
   3809         }
   3810     }
   3811 
   3812     if (status == NO_ERROR) {
   3813         status = mOutput->stream->common.set_parameters(&mOutput->stream->common,
   3814                                                 keyValuePair.string());
   3815         if (!mStandby && status == INVALID_OPERATION) {
   3816             mOutput->stream->common.standby(&mOutput->stream->common);
   3817             mStandby = true;
   3818             mBytesWritten = 0;
   3819             status = mOutput->stream->common.set_parameters(&mOutput->stream->common,
   3820                                                    keyValuePair.string());
   3821         }
   3822         if (status == NO_ERROR && reconfig) {
   3823             readOutputParameters_l();
   3824             delete mAudioMixer;
   3825             mAudioMixer = new AudioMixer(mNormalFrameCount, mSampleRate);
   3826             for (size_t i = 0; i < mTracks.size() ; i++) {
   3827                 int name = getTrackName_l(mTracks[i]->mChannelMask,
   3828                         mTracks[i]->mFormat, mTracks[i]->mSessionId);
   3829                 if (name < 0) {
   3830                     break;
   3831                 }
   3832                 mTracks[i]->mName = name;
   3833             }
   3834             sendIoConfigEvent_l(AudioSystem::OUTPUT_CONFIG_CHANGED);
   3835         }
   3836     }
   3837 
   3838     if (!(previousCommand & FastMixerState::IDLE)) {
   3839         ALOG_ASSERT(mFastMixer != 0);
   3840         FastMixerStateQueue *sq = mFastMixer->sq();
   3841         FastMixerState *state = sq->begin();
   3842         ALOG_ASSERT(state->mCommand == FastMixerState::HOT_IDLE);
   3843         state->mCommand = previousCommand;
   3844         sq->end();
   3845         sq->push(FastMixerStateQueue::BLOCK_UNTIL_PUSHED);
   3846     }
   3847 
   3848     return reconfig;
   3849 }
   3850 
   3851 
   3852 void AudioFlinger::MixerThread::dumpInternals(int fd, const Vector<String16>& args)
   3853 {
   3854     const size_t SIZE = 256;
   3855     char buffer[SIZE];
   3856     String8 result;
   3857 
   3858     PlaybackThread::dumpInternals(fd, args);
   3859 
   3860     dprintf(fd, "  AudioMixer tracks: 0x%08x\n", mAudioMixer->trackNames());
   3861 
   3862     // Make a non-atomic copy of fast mixer dump state so it won't change underneath us
   3863     const FastMixerDumpState copy(mFastMixerDumpState);
   3864     copy.dump(fd);
   3865 
   3866 #ifdef STATE_QUEUE_DUMP
   3867     // Similar for state queue
   3868     StateQueueObserverDump observerCopy = mStateQueueObserverDump;
   3869     observerCopy.dump(fd);
   3870     StateQueueMutatorDump mutatorCopy = mStateQueueMutatorDump;
   3871     mutatorCopy.dump(fd);
   3872 #endif
   3873 
   3874 #ifdef TEE_SINK
   3875     // Write the tee output to a .wav file
   3876     dumpTee(fd, mTeeSource, mId);
   3877 #endif
   3878 
   3879 #ifdef AUDIO_WATCHDOG
   3880     if (mAudioWatchdog != 0) {
   3881         // Make a non-atomic copy of audio watchdog dump so it won't change underneath us
   3882         AudioWatchdogDump wdCopy = mAudioWatchdogDump;
   3883         wdCopy.dump(fd);
   3884     }
   3885 #endif
   3886 }
   3887 
   3888 uint32_t AudioFlinger::MixerThread::idleSleepTimeUs() const
   3889 {
   3890     return (uint32_t)(((mNormalFrameCount * 1000) / mSampleRate) * 1000) / 2;
   3891 }
   3892 
   3893 uint32_t AudioFlinger::MixerThread::suspendSleepTimeUs() const
   3894 {
   3895     return (uint32_t)(((mNormalFrameCount * 1000) / mSampleRate) * 1000);
   3896 }
   3897 
   3898 void AudioFlinger::MixerThread::cacheParameters_l()
   3899 {
   3900     PlaybackThread::cacheParameters_l();
   3901 
   3902     // FIXME: Relaxed timing because of a certain device that can't meet latency
   3903     // Should be reduced to 2x after the vendor fixes the driver issue
   3904     // increase threshold again due to low power audio mode. The way this warning
   3905     // threshold is calculated and its usefulness should be reconsidered anyway.
   3906     maxPeriod = seconds(mNormalFrameCount) / mSampleRate * 15;
   3907 }
   3908 
   3909 // ----------------------------------------------------------------------------
   3910 
   3911 AudioFlinger::DirectOutputThread::DirectOutputThread(const sp<AudioFlinger>& audioFlinger,
   3912         AudioStreamOut* output, audio_io_handle_t id, audio_devices_t device)
   3913     :   PlaybackThread(audioFlinger, output, id, device, DIRECT)
   3914         // mLeftVolFloat, mRightVolFloat
   3915 {
   3916 }
   3917 
   3918 AudioFlinger::DirectOutputThread::DirectOutputThread(const sp<AudioFlinger>& audioFlinger,
   3919         AudioStreamOut* output, audio_io_handle_t id, uint32_t device,
   3920         ThreadBase::type_t type)
   3921     :   PlaybackThread(audioFlinger, output, id, device, type)
   3922         // mLeftVolFloat, mRightVolFloat
   3923 {
   3924 }
   3925 
   3926 AudioFlinger::DirectOutputThread::~DirectOutputThread()
   3927 {
   3928 }
   3929 
   3930 void AudioFlinger::DirectOutputThread::processVolume_l(Track *track, bool lastTrack)
   3931 {
   3932     audio_track_cblk_t* cblk = track->cblk();
   3933     float left, right;
   3934 
   3935     if (mMasterMute || mStreamTypes[track->streamType()].mute) {
   3936         left = right = 0;
   3937     } else {
   3938         float typeVolume = mStreamTypes[track->streamType()].volume;
   3939         float v = mMasterVolume * typeVolume;
   3940         AudioTrackServerProxy *proxy = track->mAudioTrackServerProxy;
   3941         gain_minifloat_packed_t vlr = proxy->getVolumeLR();
   3942         left = float_from_gain(gain_minifloat_unpack_left(vlr));
   3943         if (left > GAIN_FLOAT_UNITY) {
   3944             left = GAIN_FLOAT_UNITY;
   3945         }
   3946         left *= v;
   3947         right = float_from_gain(gain_minifloat_unpack_right(vlr));
   3948         if (right > GAIN_FLOAT_UNITY) {
   3949             right = GAIN_FLOAT_UNITY;
   3950         }
   3951         right *= v;
   3952     }
   3953 
   3954     if (lastTrack) {
   3955         if (left != mLeftVolFloat || right != mRightVolFloat) {
   3956             mLeftVolFloat = left;
   3957             mRightVolFloat = right;
   3958 
   3959             // Convert volumes from float to 8.24
   3960             uint32_t vl = (uint32_t)(left * (1 << 24));
   3961             uint32_t vr = (uint32_t)(right * (1 << 24));
   3962 
   3963             // Delegate volume control to effect in track effect chain if needed
   3964             // only one effect chain can be present on DirectOutputThread, so if
   3965             // there is one, the track is connected to it
   3966             if (!mEffectChains.isEmpty()) {
   3967                 mEffectChains[0]->setVolume_l(&vl, &vr);
   3968                 left = (float)vl / (1 << 24);
   3969                 right = (float)vr / (1 << 24);
   3970             }
   3971             if (mOutput->stream->set_volume) {
   3972                 mOutput->stream->set_volume(mOutput->stream, left, right);
   3973             }
   3974         }
   3975     }
   3976 }
   3977 
   3978 
   3979 AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prepareTracks_l(
   3980     Vector< sp<Track> > *tracksToRemove
   3981 )
   3982 {
   3983     size_t count = mActiveTracks.size();
   3984     mixer_state mixerStatus = MIXER_IDLE;
   3985 
   3986     // find out which tracks need to be processed
   3987     for (size_t i = 0; i < count; i++) {
   3988         sp<Track> t = mActiveTracks[i].promote();
   3989         // The track died recently
   3990         if (t == 0) {
   3991             continue;
   3992         }
   3993 
   3994         Track* const track = t.get();
   3995         audio_track_cblk_t* cblk = track->cblk();
   3996         // Only consider last track started for volume and mixer state control.
   3997         // In theory an older track could underrun and restart after the new one starts
   3998         // but as we only care about the transition phase between two tracks on a
   3999         // direct output, it is not a problem to ignore the underrun case.
   4000         sp<Track> l = mLatestActiveTrack.promote();
   4001         bool last = l.get() == track;
   4002 
   4003         // The first time a track is added we wait
   4004         // for all its buffers to be filled before processing it
   4005         uint32_t minFrames;
   4006         if ((track->sharedBuffer() == 0) && !track->isStopping_1() && !track->isPausing()) {
   4007             minFrames = mNormalFrameCount;
   4008         } else {
   4009             minFrames = 1;
   4010         }
   4011 
   4012         if ((track->framesReady() >= minFrames) && track->isReady() && !track->isPaused() &&
   4013                 !track->isStopping_2() && !track->isStopped())
   4014         {
   4015             ALOGVV("track %d s=%08x [OK]", track->name(), cblk->mServer);
   4016 
   4017             if (track->mFillingUpStatus == Track::FS_FILLED) {
   4018                 track->mFillingUpStatus = Track::FS_ACTIVE;
   4019                 // make sure processVolume_l() will apply new volume even if 0
   4020                 mLeftVolFloat = mRightVolFloat = -1.0;
   4021                 if (track->mState == TrackBase::RESUMING) {
   4022                     track->mState = TrackBase::ACTIVE;
   4023                 }
   4024             }
   4025 
   4026             // compute volume for this track
   4027             processVolume_l(track, last);
   4028             if (last) {
   4029                 // reset retry count
   4030                 track->mRetryCount = kMaxTrackRetriesDirect;
   4031                 mActiveTrack = t;
   4032                 mixerStatus = MIXER_TRACKS_READY;
   4033             }
   4034         } else {
   4035             // clear effect chain input buffer if the last active track started underruns
   4036             // to avoid sending previous audio buffer again to effects
   4037             if (!mEffectChains.isEmpty() && last) {
   4038                 mEffectChains[0]->clearInputBuffer();
   4039             }
   4040             if (track->isStopping_1()) {
   4041                 track->mState = TrackBase::STOPPING_2;
   4042             }
   4043             if ((track->sharedBuffer() != 0) || track->isStopped() ||
   4044                     track->isStopping_2() || track->isPaused()) {
   4045                 // We have consumed all the buffers of this track.
   4046                 // Remove it from the list of active tracks.
   4047                 size_t audioHALFrames;
   4048                 if (audio_is_linear_pcm(mFormat)) {
   4049                     audioHALFrames = (latency_l() * mSampleRate) / 1000;
   4050                 } else {
   4051                     audioHALFrames = 0;
   4052                 }
   4053 
   4054                 size_t framesWritten = mBytesWritten / mFrameSize;
   4055                 if (mStandby || !last ||
   4056                         track->presentationComplete(framesWritten, audioHALFrames)) {
   4057                     if (track->isStopping_2()) {
   4058                         track->mState = TrackBase::STOPPED;
   4059                     }
   4060                     if (track->isStopped()) {
   4061                         if (track->mState == TrackBase::FLUSHED) {
   4062                             flushHw_l();
   4063                         }
   4064                         track->reset();
   4065                     }
   4066                     tracksToRemove->add(track);
   4067                 }
   4068             } else {
   4069                 // No buffers for this track. Give it a few chances to
   4070                 // fill a buffer, then remove it from active list.
   4071                 // Only consider last track started for mixer state control
   4072                 if (--(track->mRetryCount) <= 0) {
   4073                     ALOGV("BUFFER TIMEOUT: remove(%d) from active list", track->name());
   4074                     tracksToRemove->add(track);
   4075                     // indicate to client process that the track was disabled because of underrun;
   4076                     // it will then automatically call start() when data is available
   4077                     android_atomic_or(CBLK_DISABLED, &cblk->mFlags);
   4078                 } else if (last) {
   4079                     mixerStatus = MIXER_TRACKS_ENABLED;
   4080                 }
   4081             }
   4082         }
   4083     }
   4084 
   4085     // remove all the tracks that need to be...
   4086     removeTracks_l(*tracksToRemove);
   4087 
   4088     return mixerStatus;
   4089 }
   4090 
   4091 void AudioFlinger::DirectOutputThread::threadLoop_mix()
   4092 {
   4093     size_t frameCount = mFrameCount;
   4094     int8_t *curBuf = (int8_t *)mSinkBuffer;
   4095     // output audio to hardware
   4096     while (frameCount) {
   4097         AudioBufferProvider::Buffer buffer;
   4098         buffer.frameCount = frameCount;
   4099         mActiveTrack->getNextBuffer(&buffer);
   4100         if (buffer.raw == NULL) {
   4101             memset(curBuf, 0, frameCount * mFrameSize);
   4102             break;
   4103         }
   4104         memcpy(curBuf, buffer.raw, buffer.frameCount * mFrameSize);
   4105         frameCount -= buffer.frameCount;
   4106         curBuf += buffer.frameCount * mFrameSize;
   4107         mActiveTrack->releaseBuffer(&buffer);
   4108     }
   4109     mCurrentWriteLength = curBuf - (int8_t *)mSinkBuffer;
   4110     sleepTime = 0;
   4111     standbyTime = systemTime() + standbyDelay;
   4112     mActiveTrack.clear();
   4113 }
   4114 
   4115 void AudioFlinger::DirectOutputThread::threadLoop_sleepTime()
   4116 {
   4117     if (sleepTime == 0) {
   4118         if (mMixerStatus == MIXER_TRACKS_ENABLED) {
   4119             sleepTime = activeSleepTime;
   4120         } else {
   4121             sleepTime = idleSleepTime;
   4122         }
   4123     } else if (mBytesWritten != 0 && audio_is_linear_pcm(mFormat)) {
   4124         memset(mSinkBuffer, 0, mFrameCount * mFrameSize);
   4125         sleepTime = 0;
   4126     }
   4127 }
   4128 
   4129 // getTrackName_l() must be called with ThreadBase::mLock held
   4130 int AudioFlinger::DirectOutputThread::getTrackName_l(audio_channel_mask_t channelMask __unused,
   4131         audio_format_t format __unused, int sessionId __unused)
   4132 {
   4133     return 0;
   4134 }
   4135 
   4136 // deleteTrackName_l() must be called with ThreadBase::mLock held
   4137 void AudioFlinger::DirectOutputThread::deleteTrackName_l(int name __unused)
   4138 {
   4139 }
   4140 
   4141 // checkForNewParameter_l() must be called with ThreadBase::mLock held
   4142 bool AudioFlinger::DirectOutputThread::checkForNewParameter_l(const String8& keyValuePair,
   4143                                                               status_t& status)
   4144 {
   4145     bool reconfig = false;
   4146 
   4147     status = NO_ERROR;
   4148 
   4149     AudioParameter param = AudioParameter(keyValuePair);
   4150     int value;
   4151     if (param.getInt(String8(AudioParameter::keyRouting), value) == NO_ERROR) {
   4152         // forward device change to effects that have requested to be
   4153         // aware of attached audio device.
   4154         if (value != AUDIO_DEVICE_NONE) {
   4155             mOutDevice = value;
   4156             for (size_t i = 0; i < mEffectChains.size(); i++) {
   4157                 mEffectChains[i]->setDevice_l(mOutDevice);
   4158             }
   4159         }
   4160     }
   4161     if (param.getInt(String8(AudioParameter::keyFrameCount), value) == NO_ERROR) {
   4162         // do not accept frame count changes if tracks are open as the track buffer
   4163         // size depends on frame count and correct behavior would not be garantied
   4164         // if frame count is changed after track creation
   4165         if (!mTracks.isEmpty()) {
   4166             status = INVALID_OPERATION;
   4167         } else {
   4168             reconfig = true;
   4169         }
   4170     }
   4171     if (status == NO_ERROR) {
   4172         status = mOutput->stream->common.set_parameters(&mOutput->stream->common,
   4173                                                 keyValuePair.string());
   4174         if (!mStandby && status == INVALID_OPERATION) {
   4175             mOutput->stream->common.standby(&mOutput->stream->common);
   4176             mStandby = true;
   4177             mBytesWritten = 0;
   4178             status = mOutput->stream->common.set_parameters(&mOutput->stream->common,
   4179                                                    keyValuePair.string());
   4180         }
   4181         if (status == NO_ERROR && reconfig) {
   4182             readOutputParameters_l();
   4183             sendIoConfigEvent_l(AudioSystem::OUTPUT_CONFIG_CHANGED);
   4184         }
   4185     }
   4186 
   4187     return reconfig;
   4188 }
   4189 
   4190 uint32_t AudioFlinger::DirectOutputThread::activeSleepTimeUs() const
   4191 {
   4192     uint32_t time;
   4193     if (audio_is_linear_pcm(mFormat)) {
   4194         time = PlaybackThread::activeSleepTimeUs();
   4195     } else {
   4196         time = 10000;
   4197     }
   4198     return time;
   4199 }
   4200 
   4201 uint32_t AudioFlinger::DirectOutputThread::idleSleepTimeUs() const
   4202 {
   4203     uint32_t time;
   4204     if (audio_is_linear_pcm(mFormat)) {
   4205         time = (uint32_t)(((mFrameCount * 1000) / mSampleRate) * 1000) / 2;
   4206     } else {
   4207         time = 10000;
   4208     }
   4209     return time;
   4210 }
   4211 
   4212 uint32_t AudioFlinger::DirectOutputThread::suspendSleepTimeUs() const
   4213 {
   4214     uint32_t time;
   4215     if (audio_is_linear_pcm(mFormat)) {
   4216         time = (uint32_t)(((mFrameCount * 1000) / mSampleRate) * 1000);
   4217     } else {
   4218         time = 10000;
   4219     }
   4220     return time;
   4221 }
   4222 
   4223 void AudioFlinger::DirectOutputThread::cacheParameters_l()
   4224 {
   4225     PlaybackThread::cacheParameters_l();
   4226 
   4227     // use shorter standby delay as on normal output to release
   4228     // hardware resources as soon as possible
   4229     if (audio_is_linear_pcm(mFormat)) {
   4230         standbyDelay = microseconds(activeSleepTime*2);
   4231     } else {
   4232         standbyDelay = kOffloadStandbyDelayNs;
   4233     }
   4234 }
   4235 
   4236 void AudioFlinger::DirectOutputThread::flushHw_l()
   4237 {
   4238     if (mOutput->stream->flush != NULL)
   4239         mOutput->stream->flush(mOutput->stream);
   4240 }
   4241 
   4242 // ----------------------------------------------------------------------------
   4243 
   4244 AudioFlinger::AsyncCallbackThread::AsyncCallbackThread(
   4245         const wp<AudioFlinger::PlaybackThread>& playbackThread)
   4246     :   Thread(false /*canCallJava*/),
   4247         mPlaybackThread(playbackThread),
   4248         mWriteAckSequence(0),
   4249         mDrainSequence(0)
   4250 {
   4251 }
   4252 
   4253 AudioFlinger::AsyncCallbackThread::~AsyncCallbackThread()
   4254 {
   4255 }
   4256 
   4257 void AudioFlinger::AsyncCallbackThread::onFirstRef()
   4258 {
   4259     run("Offload Cbk", ANDROID_PRIORITY_URGENT_AUDIO);
   4260 }
   4261 
   4262 bool AudioFlinger::AsyncCallbackThread::threadLoop()
   4263 {
   4264     while (!exitPending()) {
   4265         uint32_t writeAckSequence;
   4266         uint32_t drainSequence;
   4267 
   4268         {
   4269             Mutex::Autolock _l(mLock);
   4270             while (!((mWriteAckSequence & 1) ||
   4271                      (mDrainSequence & 1) ||
   4272                      exitPending())) {
   4273                 mWaitWorkCV.wait(mLock);
   4274             }
   4275 
   4276             if (exitPending()) {
   4277                 break;
   4278             }
   4279             ALOGV("AsyncCallbackThread mWriteAckSequence %d mDrainSequence %d",
   4280                   mWriteAckSequence, mDrainSequence);
   4281             writeAckSequence = mWriteAckSequence;
   4282             mWriteAckSequence &= ~1;
   4283             drainSequence = mDrainSequence;
   4284             mDrainSequence &= ~1;
   4285         }
   4286         {
   4287             sp<AudioFlinger::PlaybackThread> playbackThread = mPlaybackThread.promote();
   4288             if (playbackThread != 0) {
   4289                 if (writeAckSequence & 1) {
   4290                     playbackThread->resetWriteBlocked(writeAckSequence >> 1);
   4291                 }
   4292                 if (drainSequence & 1) {
   4293                     playbackThread->resetDraining(drainSequence >> 1);
   4294                 }
   4295             }
   4296         }
   4297     }
   4298     return false;
   4299 }
   4300 
   4301 void AudioFlinger::AsyncCallbackThread::exit()
   4302 {
   4303     ALOGV("AsyncCallbackThread::exit");
   4304     Mutex::Autolock _l(mLock);
   4305     requestExit();
   4306     mWaitWorkCV.broadcast();
   4307 }
   4308 
   4309 void AudioFlinger::AsyncCallbackThread::setWriteBlocked(uint32_t sequence)
   4310 {
   4311     Mutex::Autolock _l(mLock);
   4312     // bit 0 is cleared
   4313     mWriteAckSequence = sequence << 1;
   4314 }
   4315 
   4316 void AudioFlinger::AsyncCallbackThread::resetWriteBlocked()
   4317 {
   4318     Mutex::Autolock _l(mLock);
   4319     // ignore unexpected callbacks
   4320     if (mWriteAckSequence & 2) {
   4321         mWriteAckSequence |= 1;
   4322         mWaitWorkCV.signal();
   4323     }
   4324 }
   4325 
   4326 void AudioFlinger::AsyncCallbackThread::setDraining(uint32_t sequence)
   4327 {
   4328     Mutex::Autolock _l(mLock);
   4329     // bit 0 is cleared
   4330     mDrainSequence = sequence << 1;
   4331 }
   4332 
   4333 void AudioFlinger::AsyncCallbackThread::resetDraining()
   4334 {
   4335     Mutex::Autolock _l(mLock);
   4336     // ignore unexpected callbacks
   4337     if (mDrainSequence & 2) {
   4338         mDrainSequence |= 1;
   4339         mWaitWorkCV.signal();
   4340     }
   4341 }
   4342 
   4343 
   4344 // ----------------------------------------------------------------------------
   4345 AudioFlinger::OffloadThread::OffloadThread(const sp<AudioFlinger>& audioFlinger,
   4346         AudioStreamOut* output, audio_io_handle_t id, uint32_t device)
   4347     :   DirectOutputThread(audioFlinger, output, id, device, OFFLOAD),
   4348         mHwPaused(false),
   4349         mFlushPending(false),
   4350         mPausedBytesRemaining(0)
   4351 {
   4352     //FIXME: mStandby should be set to true by ThreadBase constructor
   4353     mStandby = true;
   4354 }
   4355 
   4356 void AudioFlinger::OffloadThread::threadLoop_exit()
   4357 {
   4358     if (mFlushPending || mHwPaused) {
   4359         // If a flush is pending or track was paused, just discard buffered data
   4360         flushHw_l();
   4361     } else {
   4362         mMixerStatus = MIXER_DRAIN_ALL;
   4363         threadLoop_drain();
   4364     }
   4365     if (mUseAsyncWrite) {
   4366         ALOG_ASSERT(mCallbackThread != 0);
   4367         mCallbackThread->exit();
   4368     }
   4369     PlaybackThread::threadLoop_exit();
   4370 }
   4371 
   4372 AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTracks_l(
   4373     Vector< sp<Track> > *tracksToRemove
   4374 )
   4375 {
   4376     size_t count = mActiveTracks.size();
   4377 
   4378     mixer_state mixerStatus = MIXER_IDLE;
   4379     bool doHwPause = false;
   4380     bool doHwResume = false;
   4381 
   4382     ALOGV("OffloadThread::prepareTracks_l active tracks %d", count);
   4383 
   4384     // find out which tracks need to be processed
   4385     for (size_t i = 0; i < count; i++) {
   4386         sp<Track> t = mActiveTracks[i].promote();
   4387         // The track died recently
   4388         if (t == 0) {
   4389             continue;
   4390         }
   4391         Track* const track = t.get();
   4392         audio_track_cblk_t* cblk = track->cblk();
   4393         // Only consider last track started for volume and mixer state control.
   4394         // In theory an older track could underrun and restart after the new one starts
   4395         // but as we only care about the transition phase between two tracks on a
   4396         // direct output, it is not a problem to ignore the underrun case.
   4397         sp<Track> l = mLatestActiveTrack.promote();
   4398         bool last = l.get() == track;
   4399 
   4400         if (track->isInvalid()) {
   4401             ALOGW("An invalidated track shouldn't be in active list");
   4402             tracksToRemove->add(track);
   4403             continue;
   4404         }
   4405 
   4406         if (track->mState == TrackBase::IDLE) {
   4407             ALOGW("An idle track shouldn't be in active list");
   4408             continue;
   4409         }
   4410 
   4411         if (track->isPausing()) {
   4412             track->setPaused();
   4413             if (last) {
   4414                 if (!mHwPaused) {
   4415                     doHwPause = true;
   4416                     mHwPaused = true;
   4417                 }
   4418                 // If we were part way through writing the mixbuffer to
   4419                 // the HAL we must save this until we resume
   4420                 // BUG - this will be wrong if a different track is made active,
   4421                 // in that case we want to discard the pending data in the
   4422                 // mixbuffer and tell the client to present it again when the
   4423                 // track is resumed
   4424                 mPausedWriteLength = mCurrentWriteLength;
   4425                 mPausedBytesRemaining = mBytesRemaining;
   4426                 mBytesRemaining = 0;    // stop writing
   4427             }
   4428             tracksToRemove->add(track);
   4429         } else if (track->isFlushPending()) {
   4430             track->flushAck();
   4431             if (last) {
   4432                 mFlushPending = true;
   4433             }
   4434         } else if (track->isResumePending()){
   4435             track->resumeAck();
   4436             if (last) {
   4437                 if (mPausedBytesRemaining) {
   4438                     // Need to continue write that was interrupted
   4439                     mCurrentWriteLength = mPausedWriteLength;
   4440                     mBytesRemaining = mPausedBytesRemaining;
   4441                     mPausedBytesRemaining = 0;
   4442                 }
   4443                 if (mHwPaused) {
   4444                     doHwResume = true;
   4445                     mHwPaused = false;
   4446                     // threadLoop_mix() will handle the case that we need to
   4447                     // resume an interrupted write
   4448                 }
   4449                 // enable write to audio HAL
   4450                 sleepTime = 0;
   4451 
   4452                 // Do not handle new data in this iteration even if track->framesReady()
   4453                 mixerStatus = MIXER_TRACKS_ENABLED;
   4454             }
   4455         }  else if (track->framesReady() && track->isReady() &&
   4456                 !track->isPaused() && !track->isTerminated() && !track->isStopping_2()) {
   4457             ALOGVV("OffloadThread: track %d s=%08x [OK]", track->name(), cblk->mServer);
   4458             if (track->mFillingUpStatus == Track::FS_FILLED) {
   4459                 track->mFillingUpStatus = Track::FS_ACTIVE;
   4460                 // make sure processVolume_l() will apply new volume even if 0
   4461                 mLeftVolFloat = mRightVolFloat = -1.0;
   4462             }
   4463 
   4464             if (last) {
   4465                 sp<Track> previousTrack = mPreviousTrack.promote();
   4466                 if (previousTrack != 0) {
   4467                     if (track != previousTrack.get()) {
   4468                         // Flush any data still being written from last track
   4469                         mBytesRemaining = 0;
   4470                         if (mPausedBytesRemaining) {
   4471                             // Last track was paused so we also need to flush saved
   4472                             // mixbuffer state and invalidate track so that it will
   4473                             // re-submit that unwritten data when it is next resumed
   4474                             mPausedBytesRemaining = 0;
   4475                             // Invalidate is a bit drastic - would be more efficient
   4476                             // to have a flag to tell client that some of the
   4477                             // previously written data was lost
   4478                             previousTrack->invalidate();
   4479                         }
   4480                         // flush data already sent to the DSP if changing audio session as audio
   4481                         // comes from a different source. Also invalidate previous track to force a
   4482                         // seek when resuming.
   4483                         if (previousTrack->sessionId() != track->sessionId()) {
   4484                             previousTrack->invalidate();
   4485                         }
   4486                     }
   4487                 }
   4488                 mPreviousTrack = track;
   4489                 // reset retry count
   4490                 track->mRetryCount = kMaxTrackRetriesOffload;
   4491                 mActiveTrack = t;
   4492                 mixerStatus = MIXER_TRACKS_READY;
   4493             }
   4494         } else {
   4495             ALOGVV("OffloadThread: track %d s=%08x [NOT READY]", track->name(), cblk->mServer);
   4496             if (track->isStopping_1()) {
   4497                 // Hardware buffer can hold a large amount of audio so we must
   4498                 // wait for all current track's data to drain before we say
   4499                 // that the track is stopped.
   4500                 if (mBytesRemaining == 0) {
   4501                     // Only start draining when all data in mixbuffer
   4502                     // has been written
   4503                     ALOGV("OffloadThread: underrun and STOPPING_1 -> draining, STOPPING_2");
   4504                     track->mState = TrackBase::STOPPING_2; // so presentation completes after drain
   4505                     // do not drain if no data was ever sent to HAL (mStandby == true)
   4506                     if (last && !mStandby) {
   4507                         // do not modify drain sequence if we are already draining. This happens
   4508                         // when resuming from pause after drain.
   4509                         if ((mDrainSequence & 1) == 0) {
   4510                             sleepTime = 0;
   4511                             standbyTime = systemTime() + standbyDelay;
   4512                             mixerStatus = MIXER_DRAIN_TRACK;
   4513                             mDrainSequence += 2;
   4514                         }
   4515                         if (mHwPaused) {
   4516                             // It is possible to move from PAUSED to STOPPING_1 without
   4517                             // a resume so we must ensure hardware is running
   4518                             doHwResume = true;
   4519                             mHwPaused = false;
   4520                         }
   4521                     }
   4522                 }
   4523             } else if (track->isStopping_2()) {
   4524                 // Drain has completed or we are in standby, signal presentation complete
   4525                 if (!(mDrainSequence & 1) || !last || mStandby) {
   4526                     track->mState = TrackBase::STOPPED;
   4527                     size_t audioHALFrames =
   4528                             (mOutput->stream->get_latency(mOutput->stream)*mSampleRate) / 1000;
   4529                     size_t framesWritten =
   4530                             mBytesWritten / audio_stream_out_frame_size(mOutput->stream);
   4531                     track->presentationComplete(framesWritten, audioHALFrames);
   4532                     track->reset();
   4533                     tracksToRemove->add(track);
   4534                 }
   4535             } else {
   4536                 // No buffers for this track. Give it a few chances to
   4537                 // fill a buffer, then remove it from active list.
   4538                 if (--(track->mRetryCount) <= 0) {
   4539                     ALOGV("OffloadThread: BUFFER TIMEOUT: remove(%d) from active list",
   4540                           track->name());
   4541                     tracksToRemove->add(track);
   4542                     // indicate to client process that the track was disabled because of underrun;
   4543                     // it will then automatically call start() when data is available
   4544                     android_atomic_or(CBLK_DISABLED, &cblk->mFlags);
   4545                 } else if (last){
   4546                     mixerStatus = MIXER_TRACKS_ENABLED;
   4547                 }
   4548             }
   4549         }
   4550         // compute volume for this track
   4551         processVolume_l(track, last);
   4552     }
   4553 
   4554     // make sure the pause/flush/resume sequence is executed in the right order.
   4555     // If a flush is pending and a track is active but the HW is not paused, force a HW pause
   4556     // before flush and then resume HW. This can happen in case of pause/flush/resume
   4557     // if resume is received before pause is executed.
   4558     if (!mStandby && (doHwPause || (mFlushPending && !mHwPaused && (count != 0)))) {
   4559         mOutput->stream->pause(mOutput->stream);
   4560     }
   4561     if (mFlushPending) {
   4562         flushHw_l();
   4563         mFlushPending = false;
   4564     }
   4565     if (!mStandby && doHwResume) {
   4566         mOutput->stream->resume(mOutput->stream);
   4567     }
   4568 
   4569     // remove all the tracks that need to be...
   4570     removeTracks_l(*tracksToRemove);
   4571 
   4572     return mixerStatus;
   4573 }
   4574 
   4575 // must be called with thread mutex locked
   4576 bool AudioFlinger::OffloadThread::waitingAsyncCallback_l()
   4577 {
   4578     ALOGVV("waitingAsyncCallback_l mWriteAckSequence %d mDrainSequence %d",
   4579           mWriteAckSequence, mDrainSequence);
   4580     if (mUseAsyncWrite && ((mWriteAckSequence & 1) || (mDrainSequence & 1))) {
   4581         return true;
   4582     }
   4583     return false;
   4584 }
   4585 
   4586 // must be called with thread mutex locked
   4587 bool AudioFlinger::OffloadThread::shouldStandby_l()
   4588 {
   4589     bool trackPaused = false;
   4590 
   4591     // do not put the HAL in standby when paused. AwesomePlayer clear the offloaded AudioTrack
   4592     // after a timeout and we will enter standby then.
   4593     if (mTracks.size() > 0) {
   4594         trackPaused = mTracks[mTracks.size() - 1]->isPaused();
   4595     }
   4596 
   4597     return !mStandby && !trackPaused;
   4598 }
   4599 
   4600 
   4601 bool AudioFlinger::OffloadThread::waitingAsyncCallback()
   4602 {
   4603     Mutex::Autolock _l(mLock);
   4604     return waitingAsyncCallback_l();
   4605 }
   4606 
   4607 void AudioFlinger::OffloadThread::flushHw_l()
   4608 {
   4609     DirectOutputThread::flushHw_l();
   4610     // Flush anything still waiting in the mixbuffer
   4611     mCurrentWriteLength = 0;
   4612     mBytesRemaining = 0;
   4613     mPausedWriteLength = 0;
   4614     mPausedBytesRemaining = 0;
   4615     mHwPaused = false;
   4616 
   4617     if (mUseAsyncWrite) {
   4618         // discard any pending drain or write ack by incrementing sequence
   4619         mWriteAckSequence = (mWriteAckSequence + 2) & ~1;
   4620         mDrainSequence = (mDrainSequence + 2) & ~1;
   4621         ALOG_ASSERT(mCallbackThread != 0);
   4622         mCallbackThread->setWriteBlocked(mWriteAckSequence);
   4623         mCallbackThread->setDraining(mDrainSequence);
   4624     }
   4625 }
   4626 
   4627 void AudioFlinger::OffloadThread::onAddNewTrack_l()
   4628 {
   4629     sp<Track> previousTrack = mPreviousTrack.promote();
   4630     sp<Track> latestTrack = mLatestActiveTrack.promote();
   4631 
   4632     if (previousTrack != 0 && latestTrack != 0 &&
   4633         (previousTrack->sessionId() != latestTrack->sessionId())) {
   4634         mFlushPending = true;
   4635     }
   4636     PlaybackThread::onAddNewTrack_l();
   4637 }
   4638 
   4639 // ----------------------------------------------------------------------------
   4640 
   4641 AudioFlinger::DuplicatingThread::DuplicatingThread(const sp<AudioFlinger>& audioFlinger,
   4642         AudioFlinger::MixerThread* mainThread, audio_io_handle_t id)
   4643     :   MixerThread(audioFlinger, mainThread->getOutput(), id, mainThread->outDevice(),
   4644                 DUPLICATING),
   4645         mWaitTimeMs(UINT_MAX)
   4646 {
   4647     addOutputTrack(mainThread);
   4648 }
   4649 
   4650 AudioFlinger::DuplicatingThread::~DuplicatingThread()
   4651 {
   4652     for (size_t i = 0; i < mOutputTracks.size(); i++) {
   4653         mOutputTracks[i]->destroy();
   4654     }
   4655 }
   4656 
   4657 void AudioFlinger::DuplicatingThread::threadLoop_mix()
   4658 {
   4659     // mix buffers...
   4660     if (outputsReady(outputTracks)) {
   4661         mAudioMixer->process(AudioBufferProvider::kInvalidPTS);
   4662     } else {
   4663         memset(mSinkBuffer, 0, mSinkBufferSize);
   4664     }
   4665     sleepTime = 0;
   4666     writeFrames = mNormalFrameCount;
   4667     mCurrentWriteLength = mSinkBufferSize;
   4668     standbyTime = systemTime() + standbyDelay;
   4669 }
   4670 
   4671 void AudioFlinger::DuplicatingThread::threadLoop_sleepTime()
   4672 {
   4673     if (sleepTime == 0) {
   4674         if (mMixerStatus == MIXER_TRACKS_ENABLED) {
   4675             sleepTime = activeSleepTime;
   4676         } else {
   4677             sleepTime = idleSleepTime;
   4678         }
   4679     } else if (mBytesWritten != 0) {
   4680         if (mMixerStatus == MIXER_TRACKS_ENABLED) {
   4681             writeFrames = mNormalFrameCount;
   4682             memset(mSinkBuffer, 0, mSinkBufferSize);
   4683         } else {
   4684             // flush remaining overflow buffers in output tracks
   4685             writeFrames = 0;
   4686         }
   4687         sleepTime = 0;
   4688     }
   4689 }
   4690 
   4691 ssize_t AudioFlinger::DuplicatingThread::threadLoop_write()
   4692 {
   4693     for (size_t i = 0; i < outputTracks.size(); i++) {
   4694         // We convert the duplicating thread format to AUDIO_FORMAT_PCM_16_BIT
   4695         // for delivery downstream as needed. This in-place conversion is safe as
   4696         // AUDIO_FORMAT_PCM_16_BIT is smaller than any other supported format
   4697         // (AUDIO_FORMAT_PCM_8_BIT is not allowed here).
   4698         if (mFormat != AUDIO_FORMAT_PCM_16_BIT) {
   4699             memcpy_by_audio_format(mSinkBuffer, AUDIO_FORMAT_PCM_16_BIT,
   4700                     mSinkBuffer, mFormat, writeFrames * mChannelCount);
   4701         }
   4702         outputTracks[i]->write(reinterpret_cast<int16_t*>(mSinkBuffer), writeFrames);
   4703     }
   4704     mStandby = false;
   4705     return (ssize_t)mSinkBufferSize;
   4706 }
   4707 
   4708 void AudioFlinger::DuplicatingThread::threadLoop_standby()
   4709 {
   4710     // DuplicatingThread implements standby by stopping all tracks
   4711     for (size_t i = 0; i < outputTracks.size(); i++) {
   4712         outputTracks[i]->stop();
   4713     }
   4714 }
   4715 
   4716 void AudioFlinger::DuplicatingThread::saveOutputTracks()
   4717 {
   4718     outputTracks = mOutputTracks;
   4719 }
   4720 
   4721 void AudioFlinger::DuplicatingThread::clearOutputTracks()
   4722 {
   4723     outputTracks.clear();
   4724 }
   4725 
   4726 void AudioFlinger::DuplicatingThread::addOutputTrack(MixerThread *thread)
   4727 {
   4728     Mutex::Autolock _l(mLock);
   4729     // FIXME explain this formula
   4730     size_t frameCount = (3 * mNormalFrameCount * mSampleRate) / thread->sampleRate();
   4731     // OutputTrack is forced to AUDIO_FORMAT_PCM_16_BIT regardless of mFormat
   4732     // due to current usage case and restrictions on the AudioBufferProvider.
   4733     // Actual buffer conversion is done in threadLoop_write().
   4734     //
   4735     // TODO: This may change in the future, depending on multichannel
   4736     // (and non int16_t*) support on AF::PlaybackThread::OutputTrack
   4737     OutputTrack *outputTrack = new OutputTrack(thread,
   4738                                             this,
   4739                                             mSampleRate,
   4740                                             AUDIO_FORMAT_PCM_16_BIT,
   4741                                             mChannelMask,
   4742                                             frameCount,
   4743                                             IPCThreadState::self()->getCallingUid());
   4744     if (outputTrack->cblk() != NULL) {
   4745         thread->setStreamVolume(AUDIO_STREAM_CNT, 1.0f);
   4746         mOutputTracks.add(outputTrack);
   4747         ALOGV("addOutputTrack() track %p, on thread %p", outputTrack, thread);
   4748         updateWaitTime_l();
   4749     }
   4750 }
   4751 
   4752 void AudioFlinger::DuplicatingThread::removeOutputTrack(MixerThread *thread)
   4753 {
   4754     Mutex::Autolock _l(mLock);
   4755     for (size_t i = 0; i < mOutputTracks.size(); i++) {
   4756         if (mOutputTracks[i]->thread() == thread) {
   4757             mOutputTracks[i]->destroy();
   4758             mOutputTracks.removeAt(i);
   4759             updateWaitTime_l();
   4760             return;
   4761         }
   4762     }
   4763     ALOGV("removeOutputTrack(): unkonwn thread: %p", thread);
   4764 }
   4765 
   4766 // caller must hold mLock
   4767 void AudioFlinger::DuplicatingThread::updateWaitTime_l()
   4768 {
   4769     mWaitTimeMs = UINT_MAX;
   4770     for (size_t i = 0; i < mOutputTracks.size(); i++) {
   4771         sp<ThreadBase> strong = mOutputTracks[i]->thread().promote();
   4772         if (strong != 0) {
   4773             uint32_t waitTimeMs = (strong->frameCount() * 2 * 1000) / strong->sampleRate();
   4774             if (waitTimeMs < mWaitTimeMs) {
   4775                 mWaitTimeMs = waitTimeMs;
   4776             }
   4777         }
   4778     }
   4779 }
   4780 
   4781 
   4782 bool AudioFlinger::DuplicatingThread::outputsReady(
   4783         const SortedVector< sp<OutputTrack> > &outputTracks)
   4784 {
   4785     for (size_t i = 0; i < outputTracks.size(); i++) {
   4786         sp<ThreadBase> thread = outputTracks[i]->thread().promote();
   4787         if (thread == 0) {
   4788             ALOGW("DuplicatingThread::outputsReady() could not promote thread on output track %p",
   4789                     outputTracks[i].get());
   4790             return false;
   4791         }
   4792         PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
   4793         // see note at standby() declaration
   4794         if (playbackThread->standby() && !playbackThread->isSuspended()) {
   4795             ALOGV("DuplicatingThread output track %p on thread %p Not Ready", outputTracks[i].get(),
   4796                     thread.get());
   4797             return false;
   4798         }
   4799     }
   4800     return true;
   4801 }
   4802 
   4803 uint32_t AudioFlinger::DuplicatingThread::activeSleepTimeUs() const
   4804 {
   4805     return (mWaitTimeMs * 1000) / 2;
   4806 }
   4807 
   4808 void AudioFlinger::DuplicatingThread::cacheParameters_l()
   4809 {
   4810     // updateWaitTime_l() sets mWaitTimeMs, which affects activeSleepTimeUs(), so call it first
   4811     updateWaitTime_l();
   4812 
   4813     MixerThread::cacheParameters_l();
   4814 }
   4815 
   4816 // ----------------------------------------------------------------------------
   4817 //      Record
   4818 // ----------------------------------------------------------------------------
   4819 
   4820 AudioFlinger::RecordThread::RecordThread(const sp<AudioFlinger>& audioFlinger,
   4821                                          AudioStreamIn *input,
   4822                                          audio_io_handle_t id,
   4823                                          audio_devices_t outDevice,
   4824                                          audio_devices_t inDevice
   4825 #ifdef TEE_SINK
   4826                                          , const sp<NBAIO_Sink>& teeSink
   4827 #endif
   4828                                          ) :
   4829     ThreadBase(audioFlinger, id, outDevice, inDevice, RECORD),
   4830     mInput(input), mActiveTracksGen(0), mRsmpInBuffer(NULL),
   4831     // mRsmpInFrames and mRsmpInFramesP2 are set by readInputParameters_l()
   4832     mRsmpInRear(0)
   4833 #ifdef TEE_SINK
   4834     , mTeeSink(teeSink)
   4835 #endif
   4836     , mReadOnlyHeap(new MemoryDealer(kRecordThreadReadOnlyHeapSize,
   4837             "RecordThreadRO", MemoryHeapBase::READ_ONLY))
   4838     // mFastCapture below
   4839     , mFastCaptureFutex(0)
   4840     // mInputSource
   4841     // mPipeSink
   4842     // mPipeSource
   4843     , mPipeFramesP2(0)
   4844     // mPipeMemory
   4845     // mFastCaptureNBLogWriter
   4846     , mFastTrackAvail(false)
   4847 {
   4848     snprintf(mName, kNameLength, "AudioIn_%X", id);
   4849     mNBLogWriter = audioFlinger->newWriter_l(kLogSize, mName);
   4850 
   4851     readInputParameters_l();
   4852 
   4853     // create an NBAIO source for the HAL input stream, and negotiate
   4854     mInputSource = new AudioStreamInSource(input->stream);
   4855     size_t numCounterOffers = 0;
   4856     const NBAIO_Format offers[1] = {Format_from_SR_C(mSampleRate, mChannelCount, mFormat)};
   4857     ssize_t index = mInputSource->negotiate(offers, 1, NULL, numCounterOffers);
   4858     ALOG_ASSERT(index == 0);
   4859 
   4860     // initialize fast capture depending on configuration
   4861     bool initFastCapture;
   4862     switch (kUseFastCapture) {
   4863     case FastCapture_Never:
   4864         initFastCapture = false;
   4865         break;
   4866     case FastCapture_Always:
   4867         initFastCapture = true;
   4868         break;
   4869     case FastCapture_Static:
   4870         uint32_t primaryOutputSampleRate;
   4871         {
   4872             AutoMutex _l(audioFlinger->mHardwareLock);
   4873             primaryOutputSampleRate = audioFlinger->mPrimaryOutputSampleRate;
   4874         }
   4875         initFastCapture =
   4876                 // either capture sample rate is same as (a reasonable) primary output sample rate
   4877                 (((primaryOutputSampleRate == 44100 || primaryOutputSampleRate == 48000) &&
   4878                     (mSampleRate == primaryOutputSampleRate)) ||
   4879                 // or primary output sample rate is unknown, and capture sample rate is reasonable
   4880                 ((primaryOutputSampleRate == 0) &&
   4881                     ((mSampleRate == 44100 || mSampleRate == 48000)))) &&
   4882                 // and the buffer size is < 12 ms
   4883                 (mFrameCount * 1000) / mSampleRate < 12;
   4884         break;
   4885     // case FastCapture_Dynamic:
   4886     }
   4887 
   4888     if (initFastCapture) {
   4889         // create a Pipe for FastMixer to write to, and for us and fast tracks to read from
   4890         NBAIO_Format format = mInputSource->format();
   4891         size_t pipeFramesP2 = roundup(mSampleRate / 25);    // double-buffering of 20 ms each
   4892         size_t pipeSize = pipeFramesP2 * Format_frameSize(format);
   4893         void *pipeBuffer;
   4894         const sp<MemoryDealer> roHeap(readOnlyHeap());
   4895         sp<IMemory> pipeMemory;
   4896         if ((roHeap == 0) ||
   4897                 (pipeMemory = roHeap->allocate(pipeSize)) == 0 ||
   4898                 (pipeBuffer = pipeMemory->pointer()) == NULL) {
   4899             ALOGE("not enough memory for pipe buffer size=%zu", pipeSize);
   4900             goto failed;
   4901         }
   4902         // pipe will be shared directly with fast clients, so clear to avoid leaking old information
   4903         memset(pipeBuffer, 0, pipeSize);
   4904         Pipe *pipe = new Pipe(pipeFramesP2, format, pipeBuffer);
   4905         const NBAIO_Format offers[1] = {format};
   4906         size_t numCounterOffers = 0;
   4907         ssize_t index = pipe->negotiate(offers, 1, NULL, numCounterOffers);
   4908         ALOG_ASSERT(index == 0);
   4909         mPipeSink = pipe;
   4910         PipeReader *pipeReader = new PipeReader(*pipe);
   4911         numCounterOffers = 0;
   4912         index = pipeReader->negotiate(offers, 1, NULL, numCounterOffers);
   4913         ALOG_ASSERT(index == 0);
   4914         mPipeSource = pipeReader;
   4915         mPipeFramesP2 = pipeFramesP2;
   4916         mPipeMemory = pipeMemory;
   4917 
   4918         // create fast capture
   4919         mFastCapture = new FastCapture();
   4920         FastCaptureStateQueue *sq = mFastCapture->sq();
   4921 #ifdef STATE_QUEUE_DUMP
   4922         // FIXME
   4923 #endif
   4924         FastCaptureState *state = sq->begin();
   4925         state->mCblk = NULL;
   4926         state->mInputSource = mInputSource.get();
   4927         state->mInputSourceGen++;
   4928         state->mPipeSink = pipe;
   4929         state->mPipeSinkGen++;
   4930         state->mFrameCount = mFrameCount;
   4931         state->mCommand = FastCaptureState::COLD_IDLE;
   4932         // already done in constructor initialization list
   4933         //mFastCaptureFutex = 0;
   4934         state->mColdFutexAddr = &mFastCaptureFutex;
   4935         state->mColdGen++;
   4936         state->mDumpState = &mFastCaptureDumpState;
   4937 #ifdef TEE_SINK
   4938         // FIXME
   4939 #endif
   4940         mFastCaptureNBLogWriter = audioFlinger->newWriter_l(kFastCaptureLogSize, "FastCapture");
   4941         state->mNBLogWriter = mFastCaptureNBLogWriter.get();
   4942         sq->end();
   4943         sq->push(FastCaptureStateQueue::BLOCK_UNTIL_PUSHED);
   4944 
   4945         // start the fast capture
   4946         mFastCapture->run("FastCapture", ANDROID_PRIORITY_URGENT_AUDIO);
   4947         pid_t tid = mFastCapture->getTid();
   4948         int err = requestPriority(getpid_cached, tid, kPriorityFastMixer);
   4949         if (err != 0) {
   4950             ALOGW("Policy SCHED_FIFO priority %d is unavailable for pid %d tid %d; error %d",
   4951                     kPriorityFastCapture, getpid_cached, tid, err);
   4952         }
   4953 
   4954 #ifdef AUDIO_WATCHDOG
   4955         // FIXME
   4956 #endif
   4957 
   4958         mFastTrackAvail = true;
   4959     }
   4960 failed: ;
   4961 
   4962     // FIXME mNormalSource
   4963 }
   4964 
   4965 
   4966 AudioFlinger::RecordThread::~RecordThread()
   4967 {
   4968     if (mFastCapture != 0) {
   4969         FastCaptureStateQueue *sq = mFastCapture->sq();
   4970         FastCaptureState *state = sq->begin();
   4971         if (state->mCommand == FastCaptureState::COLD_IDLE) {
   4972             int32_t old = android_atomic_inc(&mFastCaptureFutex);
   4973             if (old == -1) {
   4974                 (void) syscall(__NR_futex, &mFastCaptureFutex, FUTEX_WAKE_PRIVATE, 1);
   4975             }
   4976         }
   4977         state->mCommand = FastCaptureState::EXIT;
   4978         sq->end();
   4979         sq->push(FastCaptureStateQueue::BLOCK_UNTIL_PUSHED);
   4980         mFastCapture->join();
   4981         mFastCapture.clear();
   4982     }
   4983     mAudioFlinger->unregisterWriter(mFastCaptureNBLogWriter);
   4984     mAudioFlinger->unregisterWriter(mNBLogWriter);
   4985     delete[] mRsmpInBuffer;
   4986 }
   4987 
   4988 void AudioFlinger::RecordThread::onFirstRef()
   4989 {
   4990     run(mName, PRIORITY_URGENT_AUDIO);
   4991 }
   4992 
   4993 bool AudioFlinger::RecordThread::threadLoop()
   4994 {
   4995     nsecs_t lastWarning = 0;
   4996 
   4997     inputStandBy();
   4998 
   4999 reacquire_wakelock:
   5000     sp<RecordTrack> activeTrack;
   5001     int activeTracksGen;
   5002     {
   5003         Mutex::Autolock _l(mLock);
   5004         size_t size = mActiveTracks.size();
   5005         activeTracksGen = mActiveTracksGen;
   5006         if (size > 0) {
   5007             // FIXME an arbitrary choice
   5008             activeTrack = mActiveTracks[0];
   5009             acquireWakeLock_l(activeTrack->uid());
   5010             if (size > 1) {
   5011                 SortedVector<int> tmp;
   5012                 for (size_t i = 0; i < size; i++) {
   5013                     tmp.add(mActiveTracks[i]->uid());
   5014                 }
   5015                 updateWakeLockUids_l(tmp);
   5016             }
   5017         } else {
   5018             acquireWakeLock_l(-1);
   5019         }
   5020     }
   5021 
   5022     // used to request a deferred sleep, to be executed later while mutex is unlocked
   5023     uint32_t sleepUs = 0;
   5024 
   5025     // loop while there is work to do
   5026     for (;;) {
   5027         Vector< sp<EffectChain> > effectChains;
   5028 
   5029         // sleep with mutex unlocked
   5030         if (sleepUs > 0) {
   5031             usleep(sleepUs);
   5032             sleepUs = 0;
   5033         }
   5034 
   5035         // activeTracks accumulates a copy of a subset of mActiveTracks
   5036         Vector< sp<RecordTrack> > activeTracks;
   5037 
   5038         // reference to the (first and only) active fast track
   5039         sp<RecordTrack> fastTrack;
   5040 
   5041         // reference to a fast track which is about to be removed
   5042         sp<RecordTrack> fastTrackToRemove;
   5043 
   5044         { // scope for mLock
   5045             Mutex::Autolock _l(mLock);
   5046 
   5047             processConfigEvents_l();
   5048 
   5049             // check exitPending here because checkForNewParameters_l() and
   5050             // checkForNewParameters_l() can temporarily release mLock
   5051             if (exitPending()) {
   5052                 break;
   5053             }
   5054 
   5055             // if no active track(s), then standby and release wakelock
   5056             size_t size = mActiveTracks.size();
   5057             if (size == 0) {
   5058                 standbyIfNotAlreadyInStandby();
   5059                 // exitPending() can't become true here
   5060                 releaseWakeLock_l();
   5061                 ALOGV("RecordThread: loop stopping");
   5062                 // go to sleep
   5063                 mWaitWorkCV.wait(mLock);
   5064                 ALOGV("RecordThread: loop starting");
   5065                 goto reacquire_wakelock;
   5066             }
   5067 
   5068             if (mActiveTracksGen != activeTracksGen) {
   5069                 activeTracksGen = mActiveTracksGen;
   5070                 SortedVector<int> tmp;
   5071                 for (size_t i = 0; i < size; i++) {
   5072                     tmp.add(mActiveTracks[i]->uid());
   5073                 }
   5074                 updateWakeLockUids_l(tmp);
   5075             }
   5076 
   5077             bool doBroadcast = false;
   5078             for (size_t i = 0; i < size; ) {
   5079 
   5080                 activeTrack = mActiveTracks[i];
   5081                 if (activeTrack->isTerminated()) {
   5082                     if (activeTrack->isFastTrack()) {
   5083                         ALOG_ASSERT(fastTrackToRemove == 0);
   5084                         fastTrackToRemove = activeTrack;
   5085                     }
   5086                     removeTrack_l(activeTrack);
   5087                     mActiveTracks.remove(activeTrack);
   5088                     mActiveTracksGen++;
   5089                     size--;
   5090                     continue;
   5091                 }
   5092 
   5093                 TrackBase::track_state activeTrackState = activeTrack->mState;
   5094                 switch (activeTrackState) {
   5095 
   5096                 case TrackBase::PAUSING:
   5097                     mActiveTracks.remove(activeTrack);
   5098                     mActiveTracksGen++;
   5099                     doBroadcast = true;
   5100                     size--;
   5101                     continue;
   5102 
   5103                 case TrackBase::STARTING_1:
   5104                     sleepUs = 10000;
   5105                     i++;
   5106                     continue;
   5107 
   5108                 case TrackBase::STARTING_2:
   5109                     doBroadcast = true;
   5110                     mStandby = false;
   5111                     activeTrack->mState = TrackBase::ACTIVE;
   5112                     break;
   5113 
   5114                 case TrackBase::ACTIVE:
   5115                     break;
   5116 
   5117                 case TrackBase::IDLE:
   5118                     i++;
   5119                     continue;
   5120 
   5121                 default:
   5122                     LOG_ALWAYS_FATAL("Unexpected activeTrackState %d", activeTrackState);
   5123                 }
   5124 
   5125                 activeTracks.add(activeTrack);
   5126                 i++;
   5127 
   5128                 if (activeTrack->isFastTrack()) {
   5129                     ALOG_ASSERT(!mFastTrackAvail);
   5130                     ALOG_ASSERT(fastTrack == 0);
   5131                     fastTrack = activeTrack;
   5132                 }
   5133             }
   5134             if (doBroadcast) {
   5135                 mStartStopCond.broadcast();
   5136             }
   5137 
   5138             // sleep if there are no active tracks to process
   5139             if (activeTracks.size() == 0) {
   5140                 if (sleepUs == 0) {
   5141                     sleepUs = kRecordThreadSleepUs;
   5142                 }
   5143                 continue;
   5144             }
   5145             sleepUs = 0;
   5146 
   5147             lockEffectChains_l(effectChains);
   5148         }
   5149 
   5150         // thread mutex is now unlocked, mActiveTracks unknown, activeTracks.size() > 0
   5151 
   5152         size_t size = effectChains.size();
   5153         for (size_t i = 0; i < size; i++) {
   5154             // thread mutex is not locked, but effect chain is locked
   5155             effectChains[i]->process_l();
   5156         }
   5157 
   5158         // Push a new fast capture state if fast capture is not already running, or cblk change
   5159         if (mFastCapture != 0) {
   5160             FastCaptureStateQueue *sq = mFastCapture->sq();
   5161             FastCaptureState *state = sq->begin();
   5162             bool didModify = false;
   5163             FastCaptureStateQueue::block_t block = FastCaptureStateQueue::BLOCK_UNTIL_PUSHED;
   5164             if (state->mCommand != FastCaptureState::READ_WRITE /* FIXME &&
   5165                     (kUseFastMixer != FastMixer_Dynamic || state->mTrackMask > 1)*/) {
   5166                 if (state->mCommand == FastCaptureState::COLD_IDLE) {
   5167                     int32_t old = android_atomic_inc(&mFastCaptureFutex);
   5168                     if (old == -1) {
   5169                         (void) syscall(__NR_futex, &mFastCaptureFutex, FUTEX_WAKE_PRIVATE, 1);
   5170                     }
   5171                 }
   5172                 state->mCommand = FastCaptureState::READ_WRITE;
   5173 #if 0   // FIXME
   5174                 mFastCaptureDumpState.increaseSamplingN(mAudioFlinger->isLowRamDevice() ?
   5175                         FastCaptureDumpState::kSamplingNforLowRamDevice : FastMixerDumpState::kSamplingN);
   5176 #endif
   5177                 didModify = true;
   5178             }
   5179             audio_track_cblk_t *cblkOld = state->mCblk;
   5180             audio_track_cblk_t *cblkNew = fastTrack != 0 ? fastTrack->cblk() : NULL;
   5181             if (cblkNew != cblkOld) {
   5182                 state->mCblk = cblkNew;
   5183                 // block until acked if removing a fast track
   5184                 if (cblkOld != NULL) {
   5185                     block = FastCaptureStateQueue::BLOCK_UNTIL_ACKED;
   5186                 }
   5187                 didModify = true;
   5188             }
   5189             sq->end(didModify);
   5190             if (didModify) {
   5191                 sq->push(block);
   5192 #if 0
   5193                 if (kUseFastCapture == FastCapture_Dynamic) {
   5194                     mNormalSource = mPipeSource;
   5195                 }
   5196 #endif
   5197             }
   5198         }
   5199 
   5200         // now run the fast track destructor with thread mutex unlocked
   5201         fastTrackToRemove.clear();
   5202 
   5203         // Read from HAL to keep up with fastest client if multiple active tracks, not slowest one.
   5204         // Only the client(s) that are too slow will overrun. But if even the fastest client is too
   5205         // slow, then this RecordThread will overrun by not calling HAL read often enough.
   5206         // If destination is non-contiguous, first read past the nominal end of buffer, then
   5207         // copy to the right place.  Permitted because mRsmpInBuffer was over-allocated.
   5208 
   5209         int32_t rear = mRsmpInRear & (mRsmpInFramesP2 - 1);
   5210         ssize_t framesRead;
   5211 
   5212         // If an NBAIO source is present, use it to read the normal capture's data
   5213         if (mPipeSource != 0) {
   5214             size_t framesToRead = mBufferSize / mFrameSize;
   5215             framesRead = mPipeSource->read(&mRsmpInBuffer[rear * mChannelCount],
   5216                     framesToRead, AudioBufferProvider::kInvalidPTS);
   5217             if (framesRead == 0) {
   5218                 // since pipe is non-blocking, simulate blocking input
   5219                 sleepUs = (framesToRead * 1000000LL) / mSampleRate;
   5220             }
   5221         // otherwise use the HAL / AudioStreamIn directly
   5222         } else {
   5223             ssize_t bytesRead = mInput->stream->read(mInput->stream,
   5224                     &mRsmpInBuffer[rear * mChannelCount], mBufferSize);
   5225             if (bytesRead < 0) {
   5226                 framesRead = bytesRead;
   5227             } else {
   5228                 framesRead = bytesRead / mFrameSize;
   5229             }
   5230         }
   5231 
   5232         if (framesRead < 0 || (framesRead == 0 && mPipeSource == 0)) {
   5233             ALOGE("read failed: framesRead=%d", framesRead);
   5234             // Force input into standby so that it tries to recover at next read attempt
   5235             inputStandBy();
   5236             sleepUs = kRecordThreadSleepUs;
   5237         }
   5238         if (framesRead <= 0) {
   5239             goto unlock;
   5240         }
   5241         ALOG_ASSERT(framesRead > 0);
   5242 
   5243         if (mTeeSink != 0) {
   5244             (void) mTeeSink->write(&mRsmpInBuffer[rear * mChannelCount], framesRead);
   5245         }
   5246         // If destination is non-contiguous, we now correct for reading past end of buffer.
   5247         {
   5248             size_t part1 = mRsmpInFramesP2 - rear;
   5249             if ((size_t) framesRead > part1) {
   5250                 memcpy(mRsmpInBuffer, &mRsmpInBuffer[mRsmpInFramesP2 * mChannelCount],
   5251                         (framesRead - part1) * mFrameSize);
   5252             }
   5253         }
   5254         rear = mRsmpInRear += framesRead;
   5255 
   5256         size = activeTracks.size();
   5257         // loop over each active track
   5258         for (size_t i = 0; i < size; i++) {
   5259             activeTrack = activeTracks[i];
   5260 
   5261             // skip fast tracks, as those are handled directly by FastCapture
   5262             if (activeTrack->isFastTrack()) {
   5263                 continue;
   5264             }
   5265 
   5266             enum {
   5267                 OVERRUN_UNKNOWN,
   5268                 OVERRUN_TRUE,
   5269                 OVERRUN_FALSE
   5270             } overrun = OVERRUN_UNKNOWN;
   5271 
   5272             // loop over getNextBuffer to handle circular sink
   5273             for (;;) {
   5274 
   5275                 activeTrack->mSink.frameCount = ~0;
   5276                 status_t status = activeTrack->getNextBuffer(&activeTrack->mSink);
   5277                 size_t framesOut = activeTrack->mSink.frameCount;
   5278                 LOG_ALWAYS_FATAL_IF((status == OK) != (framesOut > 0));
   5279 
   5280                 int32_t front = activeTrack->mRsmpInFront;
   5281                 ssize_t filled = rear - front;
   5282                 size_t framesIn;
   5283 
   5284                 if (filled < 0) {
   5285                     // should not happen, but treat like a massive overrun and re-sync
   5286                     framesIn = 0;
   5287                     activeTrack->mRsmpInFront = rear;
   5288                     overrun = OVERRUN_TRUE;
   5289                 } else if ((size_t) filled <= mRsmpInFrames) {
   5290                     framesIn = (size_t) filled;
   5291                 } else {
   5292                     // client is not keeping up with server, but give it latest data
   5293                     framesIn = mRsmpInFrames;
   5294                     activeTrack->mRsmpInFront = front = rear - framesIn;
   5295                     overrun = OVERRUN_TRUE;
   5296                 }
   5297 
   5298                 if (framesOut == 0 || framesIn == 0) {
   5299                     break;
   5300                 }
   5301 
   5302                 if (activeTrack->mResampler == NULL) {
   5303                     // no resampling
   5304                     if (framesIn > framesOut) {
   5305                         framesIn = framesOut;
   5306                     } else {
   5307                         framesOut = framesIn;
   5308                     }
   5309                     int8_t *dst = activeTrack->mSink.i8;
   5310                     while (framesIn > 0) {
   5311                         front &= mRsmpInFramesP2 - 1;
   5312                         size_t part1 = mRsmpInFramesP2 - front;
   5313                         if (part1 > framesIn) {
   5314                             part1 = framesIn;
   5315                         }
   5316                         int8_t *src = (int8_t *)mRsmpInBuffer + (front * mFrameSize);
   5317                         if (mChannelCount == activeTrack->mChannelCount) {
   5318                             memcpy(dst, src, part1 * mFrameSize);
   5319                         } else if (mChannelCount == 1) {
   5320                             upmix_to_stereo_i16_from_mono_i16((int16_t *)dst, (const int16_t *)src,
   5321                                     part1);
   5322                         } else {
   5323                             downmix_to_mono_i16_from_stereo_i16((int16_t *)dst, (const int16_t *)src,
   5324                                     part1);
   5325                         }
   5326                         dst += part1 * activeTrack->mFrameSize;
   5327                         front += part1;
   5328                         framesIn -= part1;
   5329                     }
   5330                     activeTrack->mRsmpInFront += framesOut;
   5331 
   5332                 } else {
   5333                     // resampling
   5334                     // FIXME framesInNeeded should really be part of resampler API, and should
   5335                     //       depend on the SRC ratio
   5336                     //       to keep mRsmpInBuffer full so resampler always has sufficient input
   5337                     size_t framesInNeeded;
   5338                     // FIXME only re-calculate when it changes, and optimize for common ratios
   5339                     // Do not precompute in/out because floating point is not associative
   5340                     // e.g. a*b/c != a*(b/c).
   5341                     const double in(mSampleRate);
   5342                     const double out(activeTrack->mSampleRate);
   5343                     framesInNeeded = ceil(framesOut * in / out) + 1;
   5344                     ALOGV("need %u frames in to produce %u out given in/out ratio of %.4g",
   5345                                 framesInNeeded, framesOut, in / out);
   5346                     // Although we theoretically have framesIn in circular buffer, some of those are
   5347                     // unreleased frames, and thus must be discounted for purpose of budgeting.
   5348                     size_t unreleased = activeTrack->mRsmpInUnrel;
   5349                     framesIn = framesIn > unreleased ? framesIn - unreleased : 0;
   5350                     if (framesIn < framesInNeeded) {
   5351                         ALOGV("not enough to resample: have %u frames in but need %u in to "
   5352                                 "produce %u out given in/out ratio of %.4g",
   5353                                 framesIn, framesInNeeded, framesOut, in / out);
   5354                         size_t newFramesOut = framesIn > 0 ? floor((framesIn - 1) * out / in) : 0;
   5355                         LOG_ALWAYS_FATAL_IF(newFramesOut >= framesOut);
   5356                         if (newFramesOut == 0) {
   5357                             break;
   5358                         }
   5359                         framesInNeeded = ceil(newFramesOut * in / out) + 1;
   5360                         ALOGV("now need %u frames in to produce %u out given out/in ratio of %.4g",
   5361                                 framesInNeeded, newFramesOut, out / in);
   5362                         LOG_ALWAYS_FATAL_IF(framesIn < framesInNeeded);
   5363                         ALOGV("success 2: have %u frames in and need %u in to produce %u out "
   5364                               "given in/out ratio of %.4g",
   5365                               framesIn, framesInNeeded, newFramesOut, in / out);
   5366                         framesOut = newFramesOut;
   5367                     } else {
   5368                         ALOGV("success 1: have %u in and need %u in to produce %u out "
   5369                             "given in/out ratio of %.4g",
   5370                             framesIn, framesInNeeded, framesOut, in / out);
   5371                     }
   5372 
   5373                     // reallocate mRsmpOutBuffer as needed; we will grow but never shrink
   5374                     if (activeTrack->mRsmpOutFrameCount < framesOut) {
   5375                         // FIXME why does each track need it's own mRsmpOutBuffer? can't they share?
   5376                         delete[] activeTrack->mRsmpOutBuffer;
   5377                         // resampler always outputs stereo
   5378                         activeTrack->mRsmpOutBuffer = new int32_t[framesOut * FCC_2];
   5379                         activeTrack->mRsmpOutFrameCount = framesOut;
   5380                     }
   5381 
   5382                     // resampler accumulates, but we only have one source track
   5383                     memset(activeTrack->mRsmpOutBuffer, 0, framesOut * FCC_2 * sizeof(int32_t));
   5384                     activeTrack->mResampler->resample(activeTrack->mRsmpOutBuffer, framesOut,
   5385                             // FIXME how about having activeTrack implement this interface itself?
   5386                             activeTrack->mResamplerBufferProvider
   5387                             /*this*/ /* AudioBufferProvider* */);
   5388                     // ditherAndClamp() works as long as all buffers returned by
   5389                     // activeTrack->getNextBuffer() are 32 bit aligned which should be always true.
   5390                     if (activeTrack->mChannelCount == 1) {
   5391                         // temporarily type pun mRsmpOutBuffer from Q4.27 to int16_t
   5392                         ditherAndClamp(activeTrack->mRsmpOutBuffer, activeTrack->mRsmpOutBuffer,
   5393                                 framesOut);
   5394                         // the resampler always outputs stereo samples:
   5395                         // do post stereo to mono conversion
   5396                         downmix_to_mono_i16_from_stereo_i16(activeTrack->mSink.i16,
   5397                                 (const int16_t *)activeTrack->mRsmpOutBuffer, framesOut);
   5398                     } else {
   5399                         ditherAndClamp((int32_t *)activeTrack->mSink.raw,
   5400                                 activeTrack->mRsmpOutBuffer, framesOut);
   5401                     }
   5402                     // now done with mRsmpOutBuffer
   5403 
   5404                 }
   5405 
   5406                 if (framesOut > 0 && (overrun == OVERRUN_UNKNOWN)) {
   5407                     overrun = OVERRUN_FALSE;
   5408                 }
   5409 
   5410                 if (activeTrack->mFramesToDrop == 0) {
   5411                     if (framesOut > 0) {
   5412                         activeTrack->mSink.frameCount = framesOut;
   5413                         activeTrack->releaseBuffer(&activeTrack->mSink);
   5414                     }
   5415                 } else {
   5416                     // FIXME could do a partial drop of framesOut
   5417                     if (activeTrack->mFramesToDrop > 0) {
   5418                         activeTrack->mFramesToDrop -= framesOut;
   5419                         if (activeTrack->mFramesToDrop <= 0) {
   5420                             activeTrack->clearSyncStartEvent();
   5421                         }
   5422                     } else {
   5423                         activeTrack->mFramesToDrop += framesOut;
   5424                         if (activeTrack->mFramesToDrop >= 0 || activeTrack->mSyncStartEvent == 0 ||
   5425                                 activeTrack->mSyncStartEvent->isCancelled()) {
   5426                             ALOGW("Synced record %s, session %d, trigger session %d",
   5427                                   (activeTrack->mFramesToDrop >= 0) ? "timed out" : "cancelled",
   5428                                   activeTrack->sessionId(),
   5429                                   (activeTrack->mSyncStartEvent != 0) ?
   5430                                           activeTrack->mSyncStartEvent->triggerSession() : 0);
   5431                             activeTrack->clearSyncStartEvent();
   5432                         }
   5433                     }
   5434                 }
   5435 
   5436                 if (framesOut == 0) {
   5437                     break;
   5438                 }
   5439             }
   5440 
   5441             switch (overrun) {
   5442             case OVERRUN_TRUE:
   5443                 // client isn't retrieving buffers fast enough
   5444                 if (!activeTrack->setOverflow()) {
   5445                     nsecs_t now = systemTime();
   5446                     // FIXME should lastWarning per track?
   5447                     if ((now - lastWarning) > kWarningThrottleNs) {
   5448                         ALOGW("RecordThread: buffer overflow");
   5449                         lastWarning = now;
   5450                     }
   5451                 }
   5452                 break;
   5453             case OVERRUN_FALSE:
   5454                 activeTrack->clearOverflow();
   5455                 break;
   5456             case OVERRUN_UNKNOWN:
   5457                 break;
   5458             }
   5459 
   5460         }
   5461 
   5462 unlock:
   5463         // enable changes in effect chain
   5464         unlockEffectChains(effectChains);
   5465         // effectChains doesn't need to be cleared, since it is cleared by destructor at scope end
   5466     }
   5467 
   5468     standbyIfNotAlreadyInStandby();
   5469 
   5470     {
   5471         Mutex::Autolock _l(mLock);
   5472         for (size_t i = 0; i < mTracks.size(); i++) {
   5473             sp<RecordTrack> track = mTracks[i];
   5474             track->invalidate();
   5475         }
   5476         mActiveTracks.clear();
   5477         mActiveTracksGen++;
   5478         mStartStopCond.broadcast();
   5479     }
   5480 
   5481     releaseWakeLock();
   5482 
   5483     ALOGV("RecordThread %p exiting", this);
   5484     return false;
   5485 }
   5486 
   5487 void AudioFlinger::RecordThread::standbyIfNotAlreadyInStandby()
   5488 {
   5489     if (!mStandby) {
   5490         inputStandBy();
   5491         mStandby = true;
   5492     }
   5493 }
   5494 
   5495 void AudioFlinger::RecordThread::inputStandBy()
   5496 {
   5497     // Idle the fast capture if it's currently running
   5498     if (mFastCapture != 0) {
   5499         FastCaptureStateQueue *sq = mFastCapture->sq();
   5500         FastCaptureState *state = sq->begin();
   5501         if (!(state->mCommand & FastCaptureState::IDLE)) {
   5502             state->mCommand = FastCaptureState::COLD_IDLE;
   5503             state->mColdFutexAddr = &mFastCaptureFutex;
   5504             state->mColdGen++;
   5505             mFastCaptureFutex = 0;
   5506             sq->end();
   5507             // BLOCK_UNTIL_PUSHED would be insufficient, as we need it to stop doing I/O now
   5508             sq->push(FastCaptureStateQueue::BLOCK_UNTIL_ACKED);
   5509 #if 0
   5510             if (kUseFastCapture == FastCapture_Dynamic) {
   5511                 // FIXME
   5512             }
   5513 #endif
   5514 #ifdef AUDIO_WATCHDOG
   5515             // FIXME
   5516 #endif
   5517         } else {
   5518             sq->end(false /*didModify*/);
   5519         }
   5520     }
   5521     mInput->stream->common.standby(&mInput->stream->common);
   5522 }
   5523 
   5524 // RecordThread::createRecordTrack_l() must be called with AudioFlinger::mLock held
   5525 sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createRecordTrack_l(
   5526         const sp<AudioFlinger::Client>& client,
   5527         uint32_t sampleRate,
   5528         audio_format_t format,
   5529         audio_channel_mask_t channelMask,
   5530         size_t *pFrameCount,
   5531         int sessionId,
   5532         size_t *notificationFrames,
   5533         int uid,
   5534         IAudioFlinger::track_flags_t *flags,
   5535         pid_t tid,
   5536         status_t *status)
   5537 {
   5538     size_t frameCount = *pFrameCount;
   5539     sp<RecordTrack> track;
   5540     status_t lStatus;
   5541 
   5542     // client expresses a preference for FAST, but we get the final say
   5543     if (*flags & IAudioFlinger::TRACK_FAST) {
   5544       if (
   5545             // use case: callback handler
   5546             (tid != -1) &&
   5547             // frame count is not specified, or is exactly the pipe depth
   5548             ((frameCount == 0) || (frameCount == mPipeFramesP2)) &&
   5549             // PCM data
   5550             audio_is_linear_pcm(format) &&
   5551             // native format
   5552             (format == mFormat) &&
   5553             // native channel mask
   5554             (channelMask == mChannelMask) &&
   5555             // native hardware sample rate
   5556             (sampleRate == mSampleRate) &&
   5557             // record thread has an associated fast capture
   5558             hasFastCapture() &&
   5559             // there are sufficient fast track slots available
   5560             mFastTrackAvail
   5561         ) {
   5562         ALOGV("AUDIO_INPUT_FLAG_FAST accepted: frameCount=%u mFrameCount=%u",
   5563                 frameCount, mFrameCount);
   5564       } else {
   5565         ALOGV("AUDIO_INPUT_FLAG_FAST denied: frameCount=%u mFrameCount=%u mPipeFramesP2=%u "
   5566                 "format=%#x isLinear=%d channelMask=%#x sampleRate=%u mSampleRate=%u "
   5567                 "hasFastCapture=%d tid=%d mFastTrackAvail=%d",
   5568                 frameCount, mFrameCount, mPipeFramesP2,
   5569                 format, audio_is_linear_pcm(format), channelMask, sampleRate, mSampleRate,
   5570                 hasFastCapture(), tid, mFastTrackAvail);
   5571         *flags &= ~IAudioFlinger::TRACK_FAST;
   5572       }
   5573     }
   5574 
   5575     // compute track buffer size in frames, and suggest the notification frame count
   5576     if (*flags & IAudioFlinger::TRACK_FAST) {
   5577         // fast track: frame count is exactly the pipe depth
   5578         frameCount = mPipeFramesP2;
   5579         // ignore requested notificationFrames, and always notify exactly once every HAL buffer
   5580         *notificationFrames = mFrameCount;
   5581     } else {
   5582         // not fast track: max notification period is resampled equivalent of one HAL buffer time
   5583         //                 or 20 ms if there is a fast capture
   5584         // TODO This could be a roundupRatio inline, and const
   5585         size_t maxNotificationFrames = ((int64_t) (hasFastCapture() ? mSampleRate/50 : mFrameCount)
   5586                 * sampleRate + mSampleRate - 1) / mSampleRate;
   5587         // minimum number of notification periods is at least kMinNotifications,
   5588         // and at least kMinMs rounded up to a whole notification period (minNotificationsByMs)
   5589         static const size_t kMinNotifications = 3;
   5590         static const uint32_t kMinMs = 30;
   5591         // TODO This could be a roundupRatio inline
   5592         const size_t minFramesByMs = (sampleRate * kMinMs + 1000 - 1) / 1000;
   5593         // TODO This could be a roundupRatio inline
   5594         const size_t minNotificationsByMs = (minFramesByMs + maxNotificationFrames - 1) /
   5595                 maxNotificationFrames;
   5596         const size_t minFrameCount = maxNotificationFrames *
   5597                 max(kMinNotifications, minNotificationsByMs);
   5598         frameCount = max(frameCount, minFrameCount);
   5599         if (*notificationFrames == 0 || *notificationFrames > maxNotificationFrames) {
   5600             *notificationFrames = maxNotificationFrames;
   5601         }
   5602     }
   5603     *pFrameCount = frameCount;
   5604 
   5605     lStatus = initCheck();
   5606     if (lStatus != NO_ERROR) {
   5607         ALOGE("createRecordTrack_l() audio driver not initialized");
   5608         goto Exit;
   5609     }
   5610 
   5611     { // scope for mLock
   5612         Mutex::Autolock _l(mLock);
   5613 
   5614         track = new RecordTrack(this, client, sampleRate,
   5615                       format, channelMask, frameCount, NULL, sessionId, uid,
   5616                       *flags, TrackBase::TYPE_DEFAULT);
   5617 
   5618         lStatus = track->initCheck();
   5619         if (lStatus != NO_ERROR) {
   5620             ALOGE("createRecordTrack_l() initCheck failed %d; no control block?", lStatus);
   5621             // track must be cleared from the caller as the caller has the AF lock
   5622             goto Exit;
   5623         }
   5624         mTracks.add(track);
   5625 
   5626         // disable AEC and NS if the device is a BT SCO headset supporting those pre processings
   5627         bool suspend = audio_is_bluetooth_sco_device(mInDevice) &&
   5628                         mAudioFlinger->btNrecIsOff();
   5629         setEffectSuspended_l(FX_IID_AEC, suspend, sessionId);
   5630         setEffectSuspended_l(FX_IID_NS, suspend, sessionId);
   5631 
   5632         if ((*flags & IAudioFlinger::TRACK_FAST) && (tid != -1)) {
   5633             pid_t callingPid = IPCThreadState::self()->getCallingPid();
   5634             // we don't have CAP_SYS_NICE, nor do we want to have it as it's too powerful,
   5635             // so ask activity manager to do this on our behalf
   5636             sendPrioConfigEvent_l(callingPid, tid, kPriorityAudioApp);
   5637         }
   5638     }
   5639 
   5640     lStatus = NO_ERROR;
   5641 
   5642 Exit:
   5643     *status = lStatus;
   5644     return track;
   5645 }
   5646 
   5647 status_t AudioFlinger::RecordThread::start(RecordThread::RecordTrack* recordTrack,
   5648                                            AudioSystem::sync_event_t event,
   5649                                            int triggerSession)
   5650 {
   5651     ALOGV("RecordThread::start event %d, triggerSession %d", event, triggerSession);
   5652     sp<ThreadBase> strongMe = this;
   5653     status_t status = NO_ERROR;
   5654 
   5655     if (event == AudioSystem::SYNC_EVENT_NONE) {
   5656         recordTrack->clearSyncStartEvent();
   5657     } else if (event != AudioSystem::SYNC_EVENT_SAME) {
   5658         recordTrack->mSyncStartEvent = mAudioFlinger->createSyncEvent(event,
   5659                                        triggerSession,
   5660                                        recordTrack->sessionId(),
   5661                                        syncStartEventCallback,
   5662                                        recordTrack);
   5663         // Sync event can be cancelled by the trigger session if the track is not in a
   5664         // compatible state in which case we start record immediately
   5665         if (recordTrack->mSyncStartEvent->isCancelled()) {
   5666             recordTrack->clearSyncStartEvent();
   5667         } else {
   5668             // do not wait for the event for more than AudioSystem::kSyncRecordStartTimeOutMs
   5669             recordTrack->mFramesToDrop = -
   5670                     ((AudioSystem::kSyncRecordStartTimeOutMs * recordTrack->mSampleRate) / 1000);
   5671         }
   5672     }
   5673 
   5674     {
   5675         // This section is a rendezvous between binder thread executing start() and RecordThread
   5676         AutoMutex lock(mLock);
   5677         if (mActiveTracks.indexOf(recordTrack) >= 0) {
   5678             if (recordTrack->mState == TrackBase::PAUSING) {
   5679                 ALOGV("active record track PAUSING -> ACTIVE");
   5680                 recordTrack->mState = TrackBase::ACTIVE;
   5681             } else {
   5682                 ALOGV("active record track state %d", recordTrack->mState);
   5683             }
   5684             return status;
   5685         }
   5686 
   5687         // TODO consider other ways of handling this, such as changing the state to :STARTING and
   5688         //      adding the track to mActiveTracks after returning from AudioSystem::startInput(),
   5689         //      or using a separate command thread
   5690         recordTrack->mState = TrackBase::STARTING_1;
   5691         mActiveTracks.add(recordTrack);
   5692         mActiveTracksGen++;
   5693         status_t status = NO_ERROR;
   5694         if (recordTrack->isExternalTrack()) {
   5695             mLock.unlock();
   5696             status = AudioSystem::startInput(mId, (audio_session_t)recordTrack->sessionId());
   5697             mLock.lock();
   5698             // FIXME should verify that recordTrack is still in mActiveTracks
   5699             if (status != NO_ERROR) {
   5700                 mActiveTracks.remove(recordTrack);
   5701                 mActiveTracksGen++;
   5702                 recordTrack->clearSyncStartEvent();
   5703                 ALOGV("RecordThread::start error %d", status);
   5704                 return status;
   5705             }
   5706         }
   5707         // Catch up with current buffer indices if thread is already running.
   5708         // This is what makes a new client discard all buffered data.  If the track's mRsmpInFront
   5709         // was initialized to some value closer to the thread's mRsmpInFront, then the track could
   5710         // see previously buffered data before it called start(), but with greater risk of overrun.
   5711 
   5712         recordTrack->mRsmpInFront = mRsmpInRear;
   5713         recordTrack->mRsmpInUnrel = 0;
   5714         // FIXME why reset?
   5715         if (recordTrack->mResampler != NULL) {
   5716             recordTrack->mResampler->reset();
   5717         }
   5718         recordTrack->mState = TrackBase::STARTING_2;
   5719         // signal thread to start
   5720         mWaitWorkCV.broadcast();
   5721         if (mActiveTracks.indexOf(recordTrack) < 0) {
   5722             ALOGV("Record failed to start");
   5723             status = BAD_VALUE;
   5724             goto startError;
   5725         }
   5726         return status;
   5727     }
   5728 
   5729 startError:
   5730     if (recordTrack->isExternalTrack()) {
   5731         AudioSystem::stopInput(mId, (audio_session_t)recordTrack->sessionId());
   5732     }
   5733     recordTrack->clearSyncStartEvent();
   5734     // FIXME I wonder why we do not reset the state here?
   5735     return status;
   5736 }
   5737 
   5738 void AudioFlinger::RecordThread::syncStartEventCallback(const wp<SyncEvent>& event)
   5739 {
   5740     sp<SyncEvent> strongEvent = event.promote();
   5741 
   5742     if (strongEvent != 0) {
   5743         sp<RefBase> ptr = strongEvent->cookie().promote();
   5744         if (ptr != 0) {
   5745             RecordTrack *recordTrack = (RecordTrack *)ptr.get();
   5746             recordTrack->handleSyncStartEvent(strongEvent);
   5747         }
   5748     }
   5749 }
   5750 
   5751 bool AudioFlinger::RecordThread::stop(RecordThread::RecordTrack* recordTrack) {
   5752     ALOGV("RecordThread::stop");
   5753     AutoMutex _l(mLock);
   5754     if (mActiveTracks.indexOf(recordTrack) != 0 || recordTrack->mState == TrackBase::PAUSING) {
   5755         return false;
   5756     }
   5757     // note that threadLoop may still be processing the track at this point [without lock]
   5758     recordTrack->mState = TrackBase::PAUSING;
   5759     // do not wait for mStartStopCond if exiting
   5760     if (exitPending()) {
   5761         return true;
   5762     }
   5763     // FIXME incorrect usage of wait: no explicit predicate or loop
   5764     mStartStopCond.wait(mLock);
   5765     // if we have been restarted, recordTrack is in mActiveTracks here
   5766     if (exitPending() || mActiveTracks.indexOf(recordTrack) != 0) {
   5767         ALOGV("Record stopped OK");
   5768         return true;
   5769     }
   5770     return false;
   5771 }
   5772 
   5773 bool AudioFlinger::RecordThread::isValidSyncEvent(const sp<SyncEvent>& event __unused) const
   5774 {
   5775     return false;
   5776 }
   5777 
   5778 status_t AudioFlinger::RecordThread::setSyncEvent(const sp<SyncEvent>& event __unused)
   5779 {
   5780 #if 0   // This branch is currently dead code, but is preserved in case it will be needed in future
   5781     if (!isValidSyncEvent(event)) {
   5782         return BAD_VALUE;
   5783     }
   5784 
   5785     int eventSession = event->triggerSession();
   5786     status_t ret = NAME_NOT_FOUND;
   5787 
   5788     Mutex::Autolock _l(mLock);
   5789 
   5790     for (size_t i = 0; i < mTracks.size(); i++) {
   5791         sp<RecordTrack> track = mTracks[i];
   5792         if (eventSession == track->sessionId()) {
   5793             (void) track->setSyncEvent(event);
   5794             ret = NO_ERROR;
   5795         }
   5796     }
   5797     return ret;
   5798 #else
   5799     return BAD_VALUE;
   5800 #endif
   5801 }
   5802 
   5803 // destroyTrack_l() must be called with ThreadBase::mLock held
   5804 void AudioFlinger::RecordThread::destroyTrack_l(const sp<RecordTrack>& track)
   5805 {
   5806     track->terminate();
   5807     track->mState = TrackBase::STOPPED;
   5808     // active tracks are removed by threadLoop()
   5809     if (mActiveTracks.indexOf(track) < 0) {
   5810         removeTrack_l(track);
   5811     }
   5812 }
   5813 
   5814 void AudioFlinger::RecordThread::removeTrack_l(const sp<RecordTrack>& track)
   5815 {
   5816     mTracks.remove(track);
   5817     // need anything related to effects here?
   5818     if (track->isFastTrack()) {
   5819         ALOG_ASSERT(!mFastTrackAvail);
   5820         mFastTrackAvail = true;
   5821     }
   5822 }
   5823 
   5824 void AudioFlinger::RecordThread::dump(int fd, const Vector<String16>& args)
   5825 {
   5826     dumpInternals(fd, args);
   5827     dumpTracks(fd, args);
   5828     dumpEffectChains(fd, args);
   5829 }
   5830 
   5831 void AudioFlinger::RecordThread::dumpInternals(int fd, const Vector<String16>& args)
   5832 {
   5833     dprintf(fd, "\nInput thread %p:\n", this);
   5834 
   5835     if (mActiveTracks.size() > 0) {
   5836         dprintf(fd, "  Buffer size: %zu bytes\n", mBufferSize);
   5837     } else {
   5838         dprintf(fd, "  No active record clients\n");
   5839     }
   5840     dprintf(fd, "  Fast capture thread: %s\n", hasFastCapture() ? "yes" : "no");
   5841     dprintf(fd, "  Fast track available: %s\n", mFastTrackAvail ? "yes" : "no");
   5842 
   5843     dumpBase(fd, args);
   5844 }
   5845 
   5846 void AudioFlinger::RecordThread::dumpTracks(int fd, const Vector<String16>& args __unused)
   5847 {
   5848     const size_t SIZE = 256;
   5849     char buffer[SIZE];
   5850     String8 result;
   5851 
   5852     size_t numtracks = mTracks.size();
   5853     size_t numactive = mActiveTracks.size();
   5854     size_t numactiveseen = 0;
   5855     dprintf(fd, "  %d Tracks", numtracks);
   5856     if (numtracks) {
   5857         dprintf(fd, " of which %d are active\n", numactive);
   5858         RecordTrack::appendDumpHeader(result);
   5859         for (size_t i = 0; i < numtracks ; ++i) {
   5860             sp<RecordTrack> track = mTracks[i];
   5861             if (track != 0) {
   5862                 bool active = mActiveTracks.indexOf(track) >= 0;
   5863                 if (active) {
   5864                     numactiveseen++;
   5865                 }
   5866                 track->dump(buffer, SIZE, active);
   5867                 result.append(buffer);
   5868             }
   5869         }
   5870     } else {
   5871         dprintf(fd, "\n");
   5872     }
   5873 
   5874     if (numactiveseen != numactive) {
   5875         snprintf(buffer, SIZE, "  The following tracks are in the active list but"
   5876                 " not in the track list\n");
   5877         result.append(buffer);
   5878         RecordTrack::appendDumpHeader(result);
   5879         for (size_t i = 0; i < numactive; ++i) {
   5880             sp<RecordTrack> track = mActiveTracks[i];
   5881             if (mTracks.indexOf(track) < 0) {
   5882                 track->dump(buffer, SIZE, true);
   5883                 result.append(buffer);
   5884             }
   5885         }
   5886 
   5887     }
   5888     write(fd, result.string(), result.size());
   5889 }
   5890 
   5891 // AudioBufferProvider interface
   5892 status_t AudioFlinger::RecordThread::ResamplerBufferProvider::getNextBuffer(
   5893         AudioBufferProvider::Buffer* buffer, int64_t pts __unused)
   5894 {
   5895     RecordTrack *activeTrack = mRecordTrack;
   5896     sp<ThreadBase> threadBase = activeTrack->mThread.promote();
   5897     if (threadBase == 0) {
   5898         buffer->frameCount = 0;
   5899         buffer->raw = NULL;
   5900         return NOT_ENOUGH_DATA;
   5901     }
   5902     RecordThread *recordThread = (RecordThread *) threadBase.get();
   5903     int32_t rear = recordThread->mRsmpInRear;
   5904     int32_t front = activeTrack->mRsmpInFront;
   5905     ssize_t filled = rear - front;
   5906     // FIXME should not be P2 (don't want to increase latency)
   5907     // FIXME if client not keeping up, discard
   5908     LOG_ALWAYS_FATAL_IF(!(0 <= filled && (size_t) filled <= recordThread->mRsmpInFrames));
   5909     // 'filled' may be non-contiguous, so return only the first contiguous chunk
   5910     front &= recordThread->mRsmpInFramesP2 - 1;
   5911     size_t part1 = recordThread->mRsmpInFramesP2 - front;
   5912     if (part1 > (size_t) filled) {
   5913         part1 = filled;
   5914     }
   5915     size_t ask = buffer->frameCount;
   5916     ALOG_ASSERT(ask > 0);
   5917     if (part1 > ask) {
   5918         part1 = ask;
   5919     }
   5920     if (part1 == 0) {
   5921         // Higher-level should keep mRsmpInBuffer full, and not call resampler if empty
   5922         LOG_ALWAYS_FATAL("RecordThread::getNextBuffer() starved");
   5923         buffer->raw = NULL;
   5924         buffer->frameCount = 0;
   5925         activeTrack->mRsmpInUnrel = 0;
   5926         return NOT_ENOUGH_DATA;
   5927     }
   5928 
   5929     buffer->raw = recordThread->mRsmpInBuffer + front * recordThread->mChannelCount;
   5930     buffer->frameCount = part1;
   5931     activeTrack->mRsmpInUnrel = part1;
   5932     return NO_ERROR;
   5933 }
   5934 
   5935 // AudioBufferProvider interface
   5936 void AudioFlinger::RecordThread::ResamplerBufferProvider::releaseBuffer(
   5937         AudioBufferProvider::Buffer* buffer)
   5938 {
   5939     RecordTrack *activeTrack = mRecordTrack;
   5940     size_t stepCount = buffer->frameCount;
   5941     if (stepCount == 0) {
   5942         return;
   5943     }
   5944     ALOG_ASSERT(stepCount <= activeTrack->mRsmpInUnrel);
   5945     activeTrack->mRsmpInUnrel -= stepCount;
   5946     activeTrack->mRsmpInFront += stepCount;
   5947     buffer->raw = NULL;
   5948     buffer->frameCount = 0;
   5949 }
   5950 
   5951 bool AudioFlinger::RecordThread::checkForNewParameter_l(const String8& keyValuePair,
   5952                                                         status_t& status)
   5953 {
   5954     bool reconfig = false;
   5955 
   5956     status = NO_ERROR;
   5957 
   5958     audio_format_t reqFormat = mFormat;
   5959     uint32_t samplingRate = mSampleRate;
   5960     audio_channel_mask_t channelMask = audio_channel_in_mask_from_count(mChannelCount);
   5961 
   5962     AudioParameter param = AudioParameter(keyValuePair);
   5963     int value;
   5964     // TODO Investigate when this code runs. Check with audio policy when a sample rate and
   5965     //      channel count change can be requested. Do we mandate the first client defines the
   5966     //      HAL sampling rate and channel count or do we allow changes on the fly?
   5967     if (param.getInt(String8(AudioParameter::keySamplingRate), value) == NO_ERROR) {
   5968         samplingRate = value;
   5969         reconfig = true;
   5970     }
   5971     if (param.getInt(String8(AudioParameter::keyFormat), value) == NO_ERROR) {
   5972         if ((audio_format_t) value != AUDIO_FORMAT_PCM_16_BIT) {
   5973             status = BAD_VALUE;
   5974         } else {
   5975             reqFormat = (audio_format_t) value;
   5976             reconfig = true;
   5977         }
   5978     }
   5979     if (param.getInt(String8(AudioParameter::keyChannels), value) == NO_ERROR) {
   5980         audio_channel_mask_t mask = (audio_channel_mask_t) value;
   5981         if (mask != AUDIO_CHANNEL_IN_MONO && mask != AUDIO_CHANNEL_IN_STEREO) {
   5982             status = BAD_VALUE;
   5983         } else {
   5984             channelMask = mask;
   5985             reconfig = true;
   5986         }
   5987     }
   5988     if (param.getInt(String8(AudioParameter::keyFrameCount), value) == NO_ERROR) {
   5989         // do not accept frame count changes if tracks are open as the track buffer
   5990         // size depends on frame count and correct behavior would not be guaranteed
   5991         // if frame count is changed after track creation
   5992         if (mActiveTracks.size() > 0) {
   5993             status = INVALID_OPERATION;
   5994         } else {
   5995             reconfig = true;
   5996         }
   5997     }
   5998     if (param.getInt(String8(AudioParameter::keyRouting), value) == NO_ERROR) {
   5999         // forward device change to effects that have requested to be
   6000         // aware of attached audio device.
   6001         for (size_t i = 0; i < mEffectChains.size(); i++) {
   6002             mEffectChains[i]->setDevice_l(value);
   6003         }
   6004 
   6005         // store input device and output device but do not forward output device to audio HAL.
   6006         // Note that status is ignored by the caller for output device
   6007         // (see AudioFlinger::setParameters()
   6008         if (audio_is_output_devices(value)) {
   6009             mOutDevice = value;
   6010             status = BAD_VALUE;
   6011         } else {
   6012             mInDevice = value;
   6013             // disable AEC and NS if the device is a BT SCO headset supporting those
   6014             // pre processings
   6015             if (mTracks.size() > 0) {
   6016                 bool suspend = audio_is_bluetooth_sco_device(mInDevice) &&
   6017                                     mAudioFlinger->btNrecIsOff();
   6018                 for (size_t i = 0; i < mTracks.size(); i++) {
   6019                     sp<RecordTrack> track = mTracks[i];
   6020                     setEffectSuspended_l(FX_IID_AEC, suspend, track->sessionId());
   6021                     setEffectSuspended_l(FX_IID_NS, suspend, track->sessionId());
   6022                 }
   6023             }
   6024         }
   6025     }
   6026     if (param.getInt(String8(AudioParameter::keyInputSource), value) == NO_ERROR &&
   6027             mAudioSource != (audio_source_t)value) {
   6028         // forward device change to effects that have requested to be
   6029         // aware of attached audio device.
   6030         for (size_t i = 0; i < mEffectChains.size(); i++) {
   6031             mEffectChains[i]->setAudioSource_l((audio_source_t)value);
   6032         }
   6033         mAudioSource = (audio_source_t)value;
   6034     }
   6035 
   6036     if (status == NO_ERROR) {
   6037         status = mInput->stream->common.set_parameters(&mInput->stream->common,
   6038                 keyValuePair.string());
   6039         if (status == INVALID_OPERATION) {
   6040             inputStandBy();
   6041             status = mInput->stream->common.set_parameters(&mInput->stream->common,
   6042                     keyValuePair.string());
   6043         }
   6044         if (reconfig) {
   6045             if (status == BAD_VALUE &&
   6046                 reqFormat == mInput->stream->common.get_format(&mInput->stream->common) &&
   6047                 reqFormat == AUDIO_FORMAT_PCM_16_BIT &&
   6048                 (mInput->stream->common.get_sample_rate(&mInput->stream->common)
   6049                         <= (2 * samplingRate)) &&
   6050                 audio_channel_count_from_in_mask(
   6051                         mInput->stream->common.get_channels(&mInput->stream->common)) <= FCC_2 &&
   6052                 (channelMask == AUDIO_CHANNEL_IN_MONO ||
   6053                         channelMask == AUDIO_CHANNEL_IN_STEREO)) {
   6054                 status = NO_ERROR;
   6055             }
   6056             if (status == NO_ERROR) {
   6057                 readInputParameters_l();
   6058                 sendIoConfigEvent_l(AudioSystem::INPUT_CONFIG_CHANGED);
   6059             }
   6060         }
   6061     }
   6062 
   6063     return reconfig;
   6064 }
   6065 
   6066 String8 AudioFlinger::RecordThread::getParameters(const String8& keys)
   6067 {
   6068     Mutex::Autolock _l(mLock);
   6069     if (initCheck() != NO_ERROR) {
   6070         return String8();
   6071     }
   6072 
   6073     char *s = mInput->stream->common.get_parameters(&mInput->stream->common, keys.string());
   6074     const String8 out_s8(s);
   6075     free(s);
   6076     return out_s8;
   6077 }
   6078 
   6079 void AudioFlinger::RecordThread::audioConfigChanged(int event, int param __unused) {
   6080     AudioSystem::OutputDescriptor desc;
   6081     const void *param2 = NULL;
   6082 
   6083     switch (event) {
   6084     case AudioSystem::INPUT_OPENED:
   6085     case AudioSystem::INPUT_CONFIG_CHANGED:
   6086         desc.channelMask = mChannelMask;
   6087         desc.samplingRate = mSampleRate;
   6088         desc.format = mFormat;
   6089         desc.frameCount = mFrameCount;
   6090         desc.latency = 0;
   6091         param2 = &desc;
   6092         break;
   6093 
   6094     case AudioSystem::INPUT_CLOSED:
   6095     default:
   6096         break;
   6097     }
   6098     mAudioFlinger->audioConfigChanged(event, mId, param2);
   6099 }
   6100 
   6101 void AudioFlinger::RecordThread::readInputParameters_l()
   6102 {
   6103     mSampleRate = mInput->stream->common.get_sample_rate(&mInput->stream->common);
   6104     mChannelMask = mInput->stream->common.get_channels(&mInput->stream->common);
   6105     mChannelCount = audio_channel_count_from_in_mask(mChannelMask);
   6106     mHALFormat = mInput->stream->common.get_format(&mInput->stream->common);
   6107     mFormat = mHALFormat;
   6108     if (mFormat != AUDIO_FORMAT_PCM_16_BIT) {
   6109         ALOGE("HAL format %#x not supported; must be AUDIO_FORMAT_PCM_16_BIT", mFormat);
   6110     }
   6111     mFrameSize = audio_stream_in_frame_size(mInput->stream);
   6112     mBufferSize = mInput->stream->common.get_buffer_size(&mInput->stream->common);
   6113     mFrameCount = mBufferSize / mFrameSize;
   6114     // This is the formula for calculating the temporary buffer size.
   6115     // With 7 HAL buffers, we can guarantee ability to down-sample the input by ratio of 6:1 to
   6116     // 1 full output buffer, regardless of the alignment of the available input.
   6117     // The value is somewhat arbitrary, and could probably be even larger.
   6118     // A larger value should allow more old data to be read after a track calls start(),
   6119     // without increasing latency.
   6120     mRsmpInFrames = mFrameCount * 7;
   6121     mRsmpInFramesP2 = roundup(mRsmpInFrames);
   6122     delete[] mRsmpInBuffer;
   6123 
   6124     // TODO optimize audio capture buffer sizes ...
   6125     // Here we calculate the size of the sliding buffer used as a source
   6126     // for resampling.  mRsmpInFramesP2 is currently roundup(mFrameCount * 7).
   6127     // For current HAL frame counts, this is usually 2048 = 40 ms.  It would
   6128     // be better to have it derived from the pipe depth in the long term.
   6129     // The current value is higher than necessary.  However it should not add to latency.
   6130 
   6131     // Over-allocate beyond mRsmpInFramesP2 to permit a HAL read past end of buffer
   6132     mRsmpInBuffer = new int16_t[(mRsmpInFramesP2 + mFrameCount - 1) * mChannelCount];
   6133 
   6134     // AudioRecord mSampleRate and mChannelCount are constant due to AudioRecord API constraints.
   6135     // But if thread's mSampleRate or mChannelCount changes, how will that affect active tracks?
   6136 }
   6137 
   6138 uint32_t AudioFlinger::RecordThread::getInputFramesLost()
   6139 {
   6140     Mutex::Autolock _l(mLock);
   6141     if (initCheck() != NO_ERROR) {
   6142         return 0;
   6143     }
   6144 
   6145     return mInput->stream->get_input_frames_lost(mInput->stream);
   6146 }
   6147 
   6148 uint32_t AudioFlinger::RecordThread::hasAudioSession(int sessionId) const
   6149 {
   6150     Mutex::Autolock _l(mLock);
   6151     uint32_t result = 0;
   6152     if (getEffectChain_l(sessionId) != 0) {
   6153         result = EFFECT_SESSION;
   6154     }
   6155 
   6156     for (size_t i = 0; i < mTracks.size(); ++i) {
   6157         if (sessionId == mTracks[i]->sessionId()) {
   6158             result |= TRACK_SESSION;
   6159             break;
   6160         }
   6161     }
   6162 
   6163     return result;
   6164 }
   6165 
   6166 KeyedVector<int, bool> AudioFlinger::RecordThread::sessionIds() const
   6167 {
   6168     KeyedVector<int, bool> ids;
   6169     Mutex::Autolock _l(mLock);
   6170     for (size_t j = 0; j < mTracks.size(); ++j) {
   6171         sp<RecordThread::RecordTrack> track = mTracks[j];
   6172         int sessionId = track->sessionId();
   6173         if (ids.indexOfKey(sessionId) < 0) {
   6174             ids.add(sessionId, true);
   6175         }
   6176     }
   6177     return ids;
   6178 }
   6179 
   6180 AudioFlinger::AudioStreamIn* AudioFlinger::RecordThread::clearInput()
   6181 {
   6182     Mutex::Autolock _l(mLock);
   6183     AudioStreamIn *input = mInput;
   6184     mInput = NULL;
   6185     return input;
   6186 }
   6187 
   6188 // this method must always be called either with ThreadBase mLock held or inside the thread loop
   6189 audio_stream_t* AudioFlinger::RecordThread::stream() const
   6190 {
   6191     if (mInput == NULL) {
   6192         return NULL;
   6193     }
   6194     return &mInput->stream->common;
   6195 }
   6196 
   6197 status_t AudioFlinger::RecordThread::addEffectChain_l(const sp<EffectChain>& chain)
   6198 {
   6199     // only one chain per input thread
   6200     if (mEffectChains.size() != 0) {
   6201         ALOGW("addEffectChain_l() already one chain %p on thread %p", chain.get(), this);
   6202         return INVALID_OPERATION;
   6203     }
   6204     ALOGV("addEffectChain_l() %p on thread %p", chain.get(), this);
   6205     chain->setThread(this);
   6206     chain->setInBuffer(NULL);
   6207     chain->setOutBuffer(NULL);
   6208 
   6209     checkSuspendOnAddEffectChain_l(chain);
   6210 
   6211     // make sure enabled pre processing effects state is communicated to the HAL as we
   6212     // just moved them to a new input stream.
   6213     chain->syncHalEffectsState();
   6214 
   6215     mEffectChains.add(chain);
   6216 
   6217     return NO_ERROR;
   6218 }
   6219 
   6220 size_t AudioFlinger::RecordThread::removeEffectChain_l(const sp<EffectChain>& chain)
   6221 {
   6222     ALOGV("removeEffectChain_l() %p from thread %p", chain.get(), this);
   6223     ALOGW_IF(mEffectChains.size() != 1,
   6224             "removeEffectChain_l() %p invalid chain size %d on thread %p",
   6225             chain.get(), mEffectChains.size(), this);
   6226     if (mEffectChains.size() == 1) {
   6227         mEffectChains.removeAt(0);
   6228     }
   6229     return 0;
   6230 }
   6231 
   6232 status_t AudioFlinger::RecordThread::createAudioPatch_l(const struct audio_patch *patch,
   6233                                                           audio_patch_handle_t *handle)
   6234 {
   6235     status_t status = NO_ERROR;
   6236     if (mInput->audioHwDev->version() >= AUDIO_DEVICE_API_VERSION_3_0) {
   6237         // store new device and send to effects
   6238         mInDevice = patch->sources[0].ext.device.type;
   6239         for (size_t i = 0; i < mEffectChains.size(); i++) {
   6240             mEffectChains[i]->setDevice_l(mInDevice);
   6241         }
   6242 
   6243         // disable AEC and NS if the device is a BT SCO headset supporting those
   6244         // pre processings
   6245         if (mTracks.size() > 0) {
   6246             bool suspend = audio_is_bluetooth_sco_device(mInDevice) &&
   6247                                 mAudioFlinger->btNrecIsOff();
   6248             for (size_t i = 0; i < mTracks.size(); i++) {
   6249                 sp<RecordTrack> track = mTracks[i];
   6250                 setEffectSuspended_l(FX_IID_AEC, suspend, track->sessionId());
   6251                 setEffectSuspended_l(FX_IID_NS, suspend, track->sessionId());
   6252             }
   6253         }
   6254 
   6255         // store new source and send to effects
   6256         if (mAudioSource != patch->sinks[0].ext.mix.usecase.source) {
   6257             mAudioSource = patch->sinks[0].ext.mix.usecase.source;
   6258             for (size_t i = 0; i < mEffectChains.size(); i++) {
   6259                 mEffectChains[i]->setAudioSource_l(mAudioSource);
   6260             }
   6261         }
   6262 
   6263         audio_hw_device_t *hwDevice = mInput->audioHwDev->hwDevice();
   6264         status = hwDevice->create_audio_patch(hwDevice,
   6265                                                patch->num_sources,
   6266                                                patch->sources,
   6267                                                patch->num_sinks,
   6268                                                patch->sinks,
   6269                                                handle);
   6270     } else {
   6271         ALOG_ASSERT(false, "createAudioPatch_l() called on a pre 3.0 HAL");
   6272     }
   6273     return status;
   6274 }
   6275 
   6276 status_t AudioFlinger::RecordThread::releaseAudioPatch_l(const audio_patch_handle_t handle)
   6277 {
   6278     status_t status = NO_ERROR;
   6279     if (mInput->audioHwDev->version() >= AUDIO_DEVICE_API_VERSION_3_0) {
   6280         audio_hw_device_t *hwDevice = mInput->audioHwDev->hwDevice();
   6281         status = hwDevice->release_audio_patch(hwDevice, handle);
   6282     } else {
   6283         ALOG_ASSERT(false, "releaseAudioPatch_l() called on a pre 3.0 HAL");
   6284     }
   6285     return status;
   6286 }
   6287 
   6288 void AudioFlinger::RecordThread::addPatchRecord(const sp<PatchRecord>& record)
   6289 {
   6290     Mutex::Autolock _l(mLock);
   6291     mTracks.add(record);
   6292 }
   6293 
   6294 void AudioFlinger::RecordThread::deletePatchRecord(const sp<PatchRecord>& record)
   6295 {
   6296     Mutex::Autolock _l(mLock);
   6297     destroyTrack_l(record);
   6298 }
   6299 
   6300 void AudioFlinger::RecordThread::getAudioPortConfig(struct audio_port_config *config)
   6301 {
   6302     ThreadBase::getAudioPortConfig(config);
   6303     config->role = AUDIO_PORT_ROLE_SINK;
   6304     config->ext.mix.hw_module = mInput->audioHwDev->handle();
   6305     config->ext.mix.usecase.source = mAudioSource;
   6306 }
   6307 
   6308 }; // namespace android
   6309