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         mHwSupportsPause(false), mHwPaused(false), mFlushPending(false),
   1201         // mLatchD, mLatchQ,
   1202         mLatchDValid(false), mLatchQValid(false)
   1203 {
   1204     snprintf(mName, kNameLength, "AudioOut_%X", id);
   1205     mNBLogWriter = audioFlinger->newWriter_l(kLogSize, mName);
   1206 
   1207     // Assumes constructor is called by AudioFlinger with it's mLock held, but
   1208     // it would be safer to explicitly pass initial masterVolume/masterMute as
   1209     // parameter.
   1210     //
   1211     // If the HAL we are using has support for master volume or master mute,
   1212     // then do not attenuate or mute during mixing (just leave the volume at 1.0
   1213     // and the mute set to false).
   1214     mMasterVolume = audioFlinger->masterVolume_l();
   1215     mMasterMute = audioFlinger->masterMute_l();
   1216     if (mOutput && mOutput->audioHwDev) {
   1217         if (mOutput->audioHwDev->canSetMasterVolume()) {
   1218             mMasterVolume = 1.0;
   1219         }
   1220 
   1221         if (mOutput->audioHwDev->canSetMasterMute()) {
   1222             mMasterMute = false;
   1223         }
   1224     }
   1225 
   1226     readOutputParameters_l();
   1227 
   1228     // ++ 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 }
   1235 
   1236 AudioFlinger::PlaybackThread::~PlaybackThread()
   1237 {
   1238     mAudioFlinger->unregisterWriter(mNBLogWriter);
   1239     free(mSinkBuffer);
   1240     free(mMixerBuffer);
   1241     free(mEffectBuffer);
   1242 }
   1243 
   1244 void AudioFlinger::PlaybackThread::dump(int fd, const Vector<String16>& args)
   1245 {
   1246     dumpInternals(fd, args);
   1247     dumpTracks(fd, args);
   1248     dumpEffectChains(fd, args);
   1249 }
   1250 
   1251 void AudioFlinger::PlaybackThread::dumpTracks(int fd, const Vector<String16>& args __unused)
   1252 {
   1253     const size_t SIZE = 256;
   1254     char buffer[SIZE];
   1255     String8 result;
   1256 
   1257     result.appendFormat("  Stream volumes in dB: ");
   1258     for (int i = 0; i < AUDIO_STREAM_CNT; ++i) {
   1259         const stream_type_t *st = &mStreamTypes[i];
   1260         if (i > 0) {
   1261             result.appendFormat(", ");
   1262         }
   1263         result.appendFormat("%d:%.2g", i, 20.0 * log10(st->volume));
   1264         if (st->mute) {
   1265             result.append("M");
   1266         }
   1267     }
   1268     result.append("\n");
   1269     write(fd, result.string(), result.length());
   1270     result.clear();
   1271 
   1272     // These values are "raw"; they will wrap around.  See prepareTracks_l() for a better way.
   1273     FastTrackUnderruns underruns = getFastTrackUnderruns(0);
   1274     dprintf(fd, "  Normal mixer raw underrun counters: partial=%u empty=%u\n",
   1275             underruns.mBitFields.mPartial, underruns.mBitFields.mEmpty);
   1276 
   1277     size_t numtracks = mTracks.size();
   1278     size_t numactive = mActiveTracks.size();
   1279     dprintf(fd, "  %d Tracks", numtracks);
   1280     size_t numactiveseen = 0;
   1281     if (numtracks) {
   1282         dprintf(fd, " of which %d are active\n", numactive);
   1283         Track::appendDumpHeader(result);
   1284         for (size_t i = 0; i < numtracks; ++i) {
   1285             sp<Track> track = mTracks[i];
   1286             if (track != 0) {
   1287                 bool active = mActiveTracks.indexOf(track) >= 0;
   1288                 if (active) {
   1289                     numactiveseen++;
   1290                 }
   1291                 track->dump(buffer, SIZE, active);
   1292                 result.append(buffer);
   1293             }
   1294         }
   1295     } else {
   1296         result.append("\n");
   1297     }
   1298     if (numactiveseen != numactive) {
   1299         // some tracks in the active list were not in the tracks list
   1300         snprintf(buffer, SIZE, "  The following tracks are in the active list but"
   1301                 " not in the track list\n");
   1302         result.append(buffer);
   1303         Track::appendDumpHeader(result);
   1304         for (size_t i = 0; i < numactive; ++i) {
   1305             sp<Track> track = mActiveTracks[i].promote();
   1306             if (track != 0 && mTracks.indexOf(track) < 0) {
   1307                 track->dump(buffer, SIZE, true);
   1308                 result.append(buffer);
   1309             }
   1310         }
   1311     }
   1312 
   1313     write(fd, result.string(), result.size());
   1314 }
   1315 
   1316 void AudioFlinger::PlaybackThread::dumpInternals(int fd, const Vector<String16>& args)
   1317 {
   1318     dprintf(fd, "\nOutput thread %p:\n", this);
   1319     dprintf(fd, "  Normal frame count: %zu\n", mNormalFrameCount);
   1320     dprintf(fd, "  Last write occurred (msecs): %llu\n", ns2ms(systemTime() - mLastWriteTime));
   1321     dprintf(fd, "  Total writes: %d\n", mNumWrites);
   1322     dprintf(fd, "  Delayed writes: %d\n", mNumDelayedWrites);
   1323     dprintf(fd, "  Blocked in write: %s\n", mInWrite ? "yes" : "no");
   1324     dprintf(fd, "  Suspend count: %d\n", mSuspended);
   1325     dprintf(fd, "  Sink buffer : %p\n", mSinkBuffer);
   1326     dprintf(fd, "  Mixer buffer: %p\n", mMixerBuffer);
   1327     dprintf(fd, "  Effect buffer: %p\n", mEffectBuffer);
   1328     dprintf(fd, "  Fast track availMask=%#x\n", mFastTrackAvailMask);
   1329 
   1330     dumpBase(fd, args);
   1331 }
   1332 
   1333 // Thread virtuals
   1334 
   1335 void AudioFlinger::PlaybackThread::onFirstRef()
   1336 {
   1337     run(mName, ANDROID_PRIORITY_URGENT_AUDIO);
   1338 }
   1339 
   1340 // ThreadBase virtuals
   1341 void AudioFlinger::PlaybackThread::preExit()
   1342 {
   1343     ALOGV("  preExit()");
   1344     // FIXME this is using hard-coded strings but in the future, this functionality will be
   1345     //       converted to use audio HAL extensions required to support tunneling
   1346     mOutput->stream->common.set_parameters(&mOutput->stream->common, "exiting=1");
   1347 }
   1348 
   1349 // PlaybackThread::createTrack_l() must be called with AudioFlinger::mLock held
   1350 sp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTrack_l(
   1351         const sp<AudioFlinger::Client>& client,
   1352         audio_stream_type_t streamType,
   1353         uint32_t sampleRate,
   1354         audio_format_t format,
   1355         audio_channel_mask_t channelMask,
   1356         size_t *pFrameCount,
   1357         const sp<IMemory>& sharedBuffer,
   1358         int sessionId,
   1359         IAudioFlinger::track_flags_t *flags,
   1360         pid_t tid,
   1361         int uid,
   1362         status_t *status)
   1363 {
   1364     size_t frameCount = *pFrameCount;
   1365     sp<Track> track;
   1366     status_t lStatus;
   1367 
   1368     bool isTimed = (*flags & IAudioFlinger::TRACK_TIMED) != 0;
   1369 
   1370     // client expresses a preference for FAST, but we get the final say
   1371     if (*flags & IAudioFlinger::TRACK_FAST) {
   1372       if (
   1373             // not timed
   1374             (!isTimed) &&
   1375             // either of these use cases:
   1376             (
   1377               // use case 1: shared buffer with any frame count
   1378               (
   1379                 (sharedBuffer != 0)
   1380               ) ||
   1381               // use case 2: callback handler and frame count is default or at least as large as HAL
   1382               (
   1383                 (tid != -1) &&
   1384                 ((frameCount == 0) ||
   1385                 (frameCount >= mFrameCount))
   1386               )
   1387             ) &&
   1388             // PCM data
   1389             audio_is_linear_pcm(format) &&
   1390             // identical channel mask to sink, or mono in and stereo sink
   1391             (channelMask == mChannelMask ||
   1392                     (channelMask == AUDIO_CHANNEL_OUT_MONO &&
   1393                             mChannelMask == AUDIO_CHANNEL_OUT_STEREO)) &&
   1394             // hardware sample rate
   1395             (sampleRate == mSampleRate) &&
   1396             // normal mixer has an associated fast mixer
   1397             hasFastMixer() &&
   1398             // there are sufficient fast track slots available
   1399             (mFastTrackAvailMask != 0)
   1400             // FIXME test that MixerThread for this fast track has a capable output HAL
   1401             // FIXME add a permission test also?
   1402         ) {
   1403         // if frameCount not specified, then it defaults to fast mixer (HAL) frame count
   1404         if (frameCount == 0) {
   1405             // read the fast track multiplier property the first time it is needed
   1406             int ok = pthread_once(&sFastTrackMultiplierOnce, sFastTrackMultiplierInit);
   1407             if (ok != 0) {
   1408                 ALOGE("%s pthread_once failed: %d", __func__, ok);
   1409             }
   1410             frameCount = mFrameCount * sFastTrackMultiplier;
   1411         }
   1412         ALOGV("AUDIO_OUTPUT_FLAG_FAST accepted: frameCount=%d mFrameCount=%d",
   1413                 frameCount, mFrameCount);
   1414       } else {
   1415         ALOGV("AUDIO_OUTPUT_FLAG_FAST denied: isTimed=%d sharedBuffer=%p frameCount=%d "
   1416                 "mFrameCount=%d format=%#x mFormat=%#x isLinear=%d channelMask=%#x "
   1417                 "sampleRate=%u mSampleRate=%u "
   1418                 "hasFastMixer=%d tid=%d fastTrackAvailMask=%#x",
   1419                 isTimed, sharedBuffer.get(), frameCount, mFrameCount, format, mFormat,
   1420                 audio_is_linear_pcm(format),
   1421                 channelMask, sampleRate, mSampleRate, hasFastMixer(), tid, mFastTrackAvailMask);
   1422         *flags &= ~IAudioFlinger::TRACK_FAST;
   1423         // For compatibility with AudioTrack calculation, buffer depth is forced
   1424         // to be at least 2 x the normal mixer frame count and cover audio hardware latency.
   1425         // This is probably too conservative, but legacy application code may depend on it.
   1426         // If you change this calculation, also review the start threshold which is related.
   1427         uint32_t latencyMs = mOutput->stream->get_latency(mOutput->stream);
   1428         uint32_t minBufCount = latencyMs / ((1000 * mNormalFrameCount) / mSampleRate);
   1429         if (minBufCount < 2) {
   1430             minBufCount = 2;
   1431         }
   1432         size_t minFrameCount = mNormalFrameCount * minBufCount;
   1433         if (frameCount < minFrameCount) {
   1434             frameCount = minFrameCount;
   1435         }
   1436       }
   1437     }
   1438     *pFrameCount = frameCount;
   1439 
   1440     switch (mType) {
   1441 
   1442     case DIRECT:
   1443         if (audio_is_linear_pcm(format)) {
   1444             if (sampleRate != mSampleRate || format != mFormat || channelMask != mChannelMask) {
   1445                 ALOGE("createTrack_l() Bad parameter: sampleRate %u format %#x, channelMask 0x%08x "
   1446                         "for output %p with format %#x",
   1447                         sampleRate, format, channelMask, mOutput, mFormat);
   1448                 lStatus = BAD_VALUE;
   1449                 goto Exit;
   1450             }
   1451         }
   1452         break;
   1453 
   1454     case OFFLOAD:
   1455         if (sampleRate != mSampleRate || format != mFormat || channelMask != mChannelMask) {
   1456             ALOGE("createTrack_l() Bad parameter: sampleRate %d format %#x, channelMask 0x%08x \""
   1457                     "for output %p with format %#x",
   1458                     sampleRate, format, channelMask, mOutput, mFormat);
   1459             lStatus = BAD_VALUE;
   1460             goto Exit;
   1461         }
   1462         break;
   1463 
   1464     default:
   1465         if (!audio_is_linear_pcm(format)) {
   1466                 ALOGE("createTrack_l() Bad parameter: format %#x \""
   1467                         "for output %p with format %#x",
   1468                         format, mOutput, mFormat);
   1469                 lStatus = BAD_VALUE;
   1470                 goto Exit;
   1471         }
   1472         if (sampleRate > mSampleRate * AUDIO_RESAMPLER_DOWN_RATIO_MAX) {
   1473             ALOGE("Sample rate out of range: %u mSampleRate %u", sampleRate, mSampleRate);
   1474             lStatus = BAD_VALUE;
   1475             goto Exit;
   1476         }
   1477         break;
   1478 
   1479     }
   1480 
   1481     lStatus = initCheck();
   1482     if (lStatus != NO_ERROR) {
   1483         ALOGE("createTrack_l() audio driver not initialized");
   1484         goto Exit;
   1485     }
   1486 
   1487     { // scope for mLock
   1488         Mutex::Autolock _l(mLock);
   1489 
   1490         // all tracks in same audio session must share the same routing strategy otherwise
   1491         // conflicts will happen when tracks are moved from one output to another by audio policy
   1492         // manager
   1493         uint32_t strategy = AudioSystem::getStrategyForStream(streamType);
   1494         for (size_t i = 0; i < mTracks.size(); ++i) {
   1495             sp<Track> t = mTracks[i];
   1496             if (t != 0 && t->isExternalTrack()) {
   1497                 uint32_t actual = AudioSystem::getStrategyForStream(t->streamType());
   1498                 if (sessionId == t->sessionId() && strategy != actual) {
   1499                     ALOGE("createTrack_l() mismatched strategy; expected %u but found %u",
   1500                             strategy, actual);
   1501                     lStatus = BAD_VALUE;
   1502                     goto Exit;
   1503                 }
   1504             }
   1505         }
   1506 
   1507         if (!isTimed) {
   1508             track = new Track(this, client, streamType, sampleRate, format,
   1509                               channelMask, frameCount, NULL, sharedBuffer,
   1510                               sessionId, uid, *flags, TrackBase::TYPE_DEFAULT);
   1511         } else {
   1512             track = TimedTrack::create(this, client, streamType, sampleRate, format,
   1513                     channelMask, frameCount, sharedBuffer, sessionId, uid);
   1514         }
   1515 
   1516         // new Track always returns non-NULL,
   1517         // but TimedTrack::create() is a factory that could fail by returning NULL
   1518         lStatus = track != 0 ? track->initCheck() : (status_t) NO_MEMORY;
   1519         if (lStatus != NO_ERROR) {
   1520             ALOGE("createTrack_l() initCheck failed %d; no control block?", lStatus);
   1521             // track must be cleared from the caller as the caller has the AF lock
   1522             goto Exit;
   1523         }
   1524         mTracks.add(track);
   1525 
   1526         sp<EffectChain> chain = getEffectChain_l(sessionId);
   1527         if (chain != 0) {
   1528             ALOGV("createTrack_l() setting main buffer %p", chain->inBuffer());
   1529             track->setMainBuffer(chain->inBuffer());
   1530             chain->setStrategy(AudioSystem::getStrategyForStream(track->streamType()));
   1531             chain->incTrackCnt();
   1532         }
   1533 
   1534         if ((*flags & IAudioFlinger::TRACK_FAST) && (tid != -1)) {
   1535             pid_t callingPid = IPCThreadState::self()->getCallingPid();
   1536             // we don't have CAP_SYS_NICE, nor do we want to have it as it's too powerful,
   1537             // so ask activity manager to do this on our behalf
   1538             sendPrioConfigEvent_l(callingPid, tid, kPriorityAudioApp);
   1539         }
   1540     }
   1541 
   1542     lStatus = NO_ERROR;
   1543 
   1544 Exit:
   1545     *status = lStatus;
   1546     return track;
   1547 }
   1548 
   1549 uint32_t AudioFlinger::PlaybackThread::correctLatency_l(uint32_t latency) const
   1550 {
   1551     return latency;
   1552 }
   1553 
   1554 uint32_t AudioFlinger::PlaybackThread::latency() const
   1555 {
   1556     Mutex::Autolock _l(mLock);
   1557     return latency_l();
   1558 }
   1559 uint32_t AudioFlinger::PlaybackThread::latency_l() const
   1560 {
   1561     if (initCheck() == NO_ERROR) {
   1562         return correctLatency_l(mOutput->stream->get_latency(mOutput->stream));
   1563     } else {
   1564         return 0;
   1565     }
   1566 }
   1567 
   1568 void AudioFlinger::PlaybackThread::setMasterVolume(float value)
   1569 {
   1570     Mutex::Autolock _l(mLock);
   1571     // Don't apply master volume in SW if our HAL can do it for us.
   1572     if (mOutput && mOutput->audioHwDev &&
   1573         mOutput->audioHwDev->canSetMasterVolume()) {
   1574         mMasterVolume = 1.0;
   1575     } else {
   1576         mMasterVolume = value;
   1577     }
   1578 }
   1579 
   1580 void AudioFlinger::PlaybackThread::setMasterMute(bool muted)
   1581 {
   1582     Mutex::Autolock _l(mLock);
   1583     // Don't apply master mute in SW if our HAL can do it for us.
   1584     if (mOutput && mOutput->audioHwDev &&
   1585         mOutput->audioHwDev->canSetMasterMute()) {
   1586         mMasterMute = false;
   1587     } else {
   1588         mMasterMute = muted;
   1589     }
   1590 }
   1591 
   1592 void AudioFlinger::PlaybackThread::setStreamVolume(audio_stream_type_t stream, float value)
   1593 {
   1594     Mutex::Autolock _l(mLock);
   1595     mStreamTypes[stream].volume = value;
   1596     broadcast_l();
   1597 }
   1598 
   1599 void AudioFlinger::PlaybackThread::setStreamMute(audio_stream_type_t stream, bool muted)
   1600 {
   1601     Mutex::Autolock _l(mLock);
   1602     mStreamTypes[stream].mute = muted;
   1603     broadcast_l();
   1604 }
   1605 
   1606 float AudioFlinger::PlaybackThread::streamVolume(audio_stream_type_t stream) const
   1607 {
   1608     Mutex::Autolock _l(mLock);
   1609     return mStreamTypes[stream].volume;
   1610 }
   1611 
   1612 // addTrack_l() must be called with ThreadBase::mLock held
   1613 status_t AudioFlinger::PlaybackThread::addTrack_l(const sp<Track>& track)
   1614 {
   1615     status_t status = ALREADY_EXISTS;
   1616 
   1617     // set retry count for buffer fill
   1618     track->mRetryCount = kMaxTrackStartupRetries;
   1619     if (mActiveTracks.indexOf(track) < 0) {
   1620         // the track is newly added, make sure it fills up all its
   1621         // buffers before playing. This is to ensure the client will
   1622         // effectively get the latency it requested.
   1623         if (track->isExternalTrack()) {
   1624             TrackBase::track_state state = track->mState;
   1625             mLock.unlock();
   1626             status = AudioSystem::startOutput(mId, track->streamType(),
   1627                                               (audio_session_t)track->sessionId());
   1628             mLock.lock();
   1629             // abort track was stopped/paused while we released the lock
   1630             if (state != track->mState) {
   1631                 if (status == NO_ERROR) {
   1632                     mLock.unlock();
   1633                     AudioSystem::stopOutput(mId, track->streamType(),
   1634                                             (audio_session_t)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     mHwSupportsPause = false;
   1852     if (mOutput->flags & AUDIO_OUTPUT_FLAG_DIRECT) {
   1853         if (mOutput->stream->pause != NULL) {
   1854             if (mOutput->stream->resume != NULL) {
   1855                 mHwSupportsPause = true;
   1856             } else {
   1857                 ALOGW("direct output implements pause but not resume");
   1858             }
   1859         } else if (mOutput->stream->resume != NULL) {
   1860             ALOGW("direct output implements resume but not pause");
   1861         }
   1862     }
   1863 
   1864     // Calculate size of normal sink buffer relative to the HAL output buffer size
   1865     double multiplier = 1.0;
   1866     if (mType == MIXER && (kUseFastMixer == FastMixer_Static ||
   1867             kUseFastMixer == FastMixer_Dynamic)) {
   1868         size_t minNormalFrameCount = (kMinNormalSinkBufferSizeMs * mSampleRate) / 1000;
   1869         size_t maxNormalFrameCount = (kMaxNormalSinkBufferSizeMs * mSampleRate) / 1000;
   1870         // round up minimum and round down maximum to nearest 16 frames to satisfy AudioMixer
   1871         minNormalFrameCount = (minNormalFrameCount + 15) & ~15;
   1872         maxNormalFrameCount = maxNormalFrameCount & ~15;
   1873         if (maxNormalFrameCount < minNormalFrameCount) {
   1874             maxNormalFrameCount = minNormalFrameCount;
   1875         }
   1876         multiplier = (double) minNormalFrameCount / (double) mFrameCount;
   1877         if (multiplier <= 1.0) {
   1878             multiplier = 1.0;
   1879         } else if (multiplier <= 2.0) {
   1880             if (2 * mFrameCount <= maxNormalFrameCount) {
   1881                 multiplier = 2.0;
   1882             } else {
   1883                 multiplier = (double) maxNormalFrameCount / (double) mFrameCount;
   1884             }
   1885         } else {
   1886             // prefer an even multiplier, for compatibility with doubling of fast tracks due to HAL
   1887             // SRC (it would be unusual for the normal sink buffer size to not be a multiple of fast
   1888             // track, but we sometimes have to do this to satisfy the maximum frame count
   1889             // constraint)
   1890             // FIXME this rounding up should not be done if no HAL SRC
   1891             uint32_t truncMult = (uint32_t) multiplier;
   1892             if ((truncMult & 1)) {
   1893                 if ((truncMult + 1) * mFrameCount <= maxNormalFrameCount) {
   1894                     ++truncMult;
   1895                 }
   1896             }
   1897             multiplier = (double) truncMult;
   1898         }
   1899     }
   1900     mNormalFrameCount = multiplier * mFrameCount;
   1901     // round up to nearest 16 frames to satisfy AudioMixer
   1902     if (mType == MIXER || mType == DUPLICATING) {
   1903         mNormalFrameCount = (mNormalFrameCount + 15) & ~15;
   1904     }
   1905     ALOGI("HAL output buffer size %u frames, normal sink buffer size %u frames", mFrameCount,
   1906             mNormalFrameCount);
   1907 
   1908     // mSinkBuffer is the sink buffer.  Size is always multiple-of-16 frames.
   1909     // Originally this was int16_t[] array, need to remove legacy implications.
   1910     free(mSinkBuffer);
   1911     mSinkBuffer = NULL;
   1912     // For sink buffer size, we use the frame size from the downstream sink to avoid problems
   1913     // with non PCM formats for compressed music, e.g. AAC, and Offload threads.
   1914     const size_t sinkBufferSize = mNormalFrameCount * mFrameSize;
   1915     (void)posix_memalign(&mSinkBuffer, 32, sinkBufferSize);
   1916 
   1917     // We resize the mMixerBuffer according to the requirements of the sink buffer which
   1918     // drives the output.
   1919     free(mMixerBuffer);
   1920     mMixerBuffer = NULL;
   1921     if (mMixerBufferEnabled) {
   1922         mMixerBufferFormat = AUDIO_FORMAT_PCM_FLOAT; // also valid: AUDIO_FORMAT_PCM_16_BIT.
   1923         mMixerBufferSize = mNormalFrameCount * mChannelCount
   1924                 * audio_bytes_per_sample(mMixerBufferFormat);
   1925         (void)posix_memalign(&mMixerBuffer, 32, mMixerBufferSize);
   1926     }
   1927     free(mEffectBuffer);
   1928     mEffectBuffer = NULL;
   1929     if (mEffectBufferEnabled) {
   1930         mEffectBufferFormat = AUDIO_FORMAT_PCM_16_BIT; // Note: Effects support 16b only
   1931         mEffectBufferSize = mNormalFrameCount * mChannelCount
   1932                 * audio_bytes_per_sample(mEffectBufferFormat);
   1933         (void)posix_memalign(&mEffectBuffer, 32, mEffectBufferSize);
   1934     }
   1935 
   1936     // force reconfiguration of effect chains and engines to take new buffer size and audio
   1937     // parameters into account
   1938     // Note that mLock is not held when readOutputParameters_l() is called from the constructor
   1939     // but in this case nothing is done below as no audio sessions have effect yet so it doesn't
   1940     // matter.
   1941     // create a copy of mEffectChains as calling moveEffectChain_l() can reorder some effect chains
   1942     Vector< sp<EffectChain> > effectChains = mEffectChains;
   1943     for (size_t i = 0; i < effectChains.size(); i ++) {
   1944         mAudioFlinger->moveEffectChain_l(effectChains[i]->sessionId(), this, this, false);
   1945     }
   1946 }
   1947 
   1948 
   1949 status_t AudioFlinger::PlaybackThread::getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames)
   1950 {
   1951     if (halFrames == NULL || dspFrames == NULL) {
   1952         return BAD_VALUE;
   1953     }
   1954     Mutex::Autolock _l(mLock);
   1955     if (initCheck() != NO_ERROR) {
   1956         return INVALID_OPERATION;
   1957     }
   1958     size_t framesWritten = mBytesWritten / mFrameSize;
   1959     *halFrames = framesWritten;
   1960 
   1961     if (isSuspended()) {
   1962         // return an estimation of rendered frames when the output is suspended
   1963         size_t latencyFrames = (latency_l() * mSampleRate) / 1000;
   1964         *dspFrames = framesWritten >= latencyFrames ? framesWritten - latencyFrames : 0;
   1965         return NO_ERROR;
   1966     } else {
   1967         status_t status;
   1968         uint32_t frames;
   1969         status = mOutput->stream->get_render_position(mOutput->stream, &frames);
   1970         *dspFrames = (size_t)frames;
   1971         return status;
   1972     }
   1973 }
   1974 
   1975 uint32_t AudioFlinger::PlaybackThread::hasAudioSession(int sessionId) const
   1976 {
   1977     Mutex::Autolock _l(mLock);
   1978     uint32_t result = 0;
   1979     if (getEffectChain_l(sessionId) != 0) {
   1980         result = EFFECT_SESSION;
   1981     }
   1982 
   1983     for (size_t i = 0; i < mTracks.size(); ++i) {
   1984         sp<Track> track = mTracks[i];
   1985         if (sessionId == track->sessionId() && !track->isInvalid()) {
   1986             result |= TRACK_SESSION;
   1987             break;
   1988         }
   1989     }
   1990 
   1991     return result;
   1992 }
   1993 
   1994 uint32_t AudioFlinger::PlaybackThread::getStrategyForSession_l(int sessionId)
   1995 {
   1996     // session AUDIO_SESSION_OUTPUT_MIX is placed in same strategy as MUSIC stream so that
   1997     // it is moved to correct output by audio policy manager when A2DP is connected or disconnected
   1998     if (sessionId == AUDIO_SESSION_OUTPUT_MIX) {
   1999         return AudioSystem::getStrategyForStream(AUDIO_STREAM_MUSIC);
   2000     }
   2001     for (size_t i = 0; i < mTracks.size(); i++) {
   2002         sp<Track> track = mTracks[i];
   2003         if (sessionId == track->sessionId() && !track->isInvalid()) {
   2004             return AudioSystem::getStrategyForStream(track->streamType());
   2005         }
   2006     }
   2007     return AudioSystem::getStrategyForStream(AUDIO_STREAM_MUSIC);
   2008 }
   2009 
   2010 
   2011 AudioFlinger::AudioStreamOut* AudioFlinger::PlaybackThread::getOutput() const
   2012 {
   2013     Mutex::Autolock _l(mLock);
   2014     return mOutput;
   2015 }
   2016 
   2017 AudioFlinger::AudioStreamOut* AudioFlinger::PlaybackThread::clearOutput()
   2018 {
   2019     Mutex::Autolock _l(mLock);
   2020     AudioStreamOut *output = mOutput;
   2021     mOutput = NULL;
   2022     // FIXME FastMixer might also have a raw ptr to mOutputSink;
   2023     //       must push a NULL and wait for ack
   2024     mOutputSink.clear();
   2025     mPipeSink.clear();
   2026     mNormalSink.clear();
   2027     return output;
   2028 }
   2029 
   2030 // this method must always be called either with ThreadBase mLock held or inside the thread loop
   2031 audio_stream_t* AudioFlinger::PlaybackThread::stream() const
   2032 {
   2033     if (mOutput == NULL) {
   2034         return NULL;
   2035     }
   2036     return &mOutput->stream->common;
   2037 }
   2038 
   2039 uint32_t AudioFlinger::PlaybackThread::activeSleepTimeUs() const
   2040 {
   2041     return (uint32_t)((uint32_t)((mNormalFrameCount * 1000) / mSampleRate) * 1000);
   2042 }
   2043 
   2044 status_t AudioFlinger::PlaybackThread::setSyncEvent(const sp<SyncEvent>& event)
   2045 {
   2046     if (!isValidSyncEvent(event)) {
   2047         return BAD_VALUE;
   2048     }
   2049 
   2050     Mutex::Autolock _l(mLock);
   2051 
   2052     for (size_t i = 0; i < mTracks.size(); ++i) {
   2053         sp<Track> track = mTracks[i];
   2054         if (event->triggerSession() == track->sessionId()) {
   2055             (void) track->setSyncEvent(event);
   2056             return NO_ERROR;
   2057         }
   2058     }
   2059 
   2060     return NAME_NOT_FOUND;
   2061 }
   2062 
   2063 bool AudioFlinger::PlaybackThread::isValidSyncEvent(const sp<SyncEvent>& event) const
   2064 {
   2065     return event->type() == AudioSystem::SYNC_EVENT_PRESENTATION_COMPLETE;
   2066 }
   2067 
   2068 void AudioFlinger::PlaybackThread::threadLoop_removeTracks(
   2069         const Vector< sp<Track> >& tracksToRemove)
   2070 {
   2071     size_t count = tracksToRemove.size();
   2072     if (count > 0) {
   2073         for (size_t i = 0 ; i < count ; i++) {
   2074             const sp<Track>& track = tracksToRemove.itemAt(i);
   2075             if (track->isExternalTrack()) {
   2076                 AudioSystem::stopOutput(mId, track->streamType(),
   2077                                         (audio_session_t)track->sessionId());
   2078 #ifdef ADD_BATTERY_DATA
   2079                 // to track the speaker usage
   2080                 addBatteryData(IMediaPlayerService::kBatteryDataAudioFlingerStop);
   2081 #endif
   2082                 if (track->isTerminated()) {
   2083                     AudioSystem::releaseOutput(mId, track->streamType(),
   2084                                                (audio_session_t)track->sessionId());
   2085                 }
   2086             }
   2087         }
   2088     }
   2089 }
   2090 
   2091 void AudioFlinger::PlaybackThread::checkSilentMode_l()
   2092 {
   2093     if (!mMasterMute) {
   2094         char value[PROPERTY_VALUE_MAX];
   2095         if (property_get("ro.audio.silent", value, "0") > 0) {
   2096             char *endptr;
   2097             unsigned long ul = strtoul(value, &endptr, 0);
   2098             if (*endptr == '\0' && ul != 0) {
   2099                 ALOGD("Silence is golden");
   2100                 // The setprop command will not allow a property to be changed after
   2101                 // the first time it is set, so we don't have to worry about un-muting.
   2102                 setMasterMute_l(true);
   2103             }
   2104         }
   2105     }
   2106 }
   2107 
   2108 // shared by MIXER and DIRECT, overridden by DUPLICATING
   2109 ssize_t AudioFlinger::PlaybackThread::threadLoop_write()
   2110 {
   2111     // FIXME rewrite to reduce number of system calls
   2112     mLastWriteTime = systemTime();
   2113     mInWrite = true;
   2114     ssize_t bytesWritten;
   2115     const size_t offset = mCurrentWriteLength - mBytesRemaining;
   2116 
   2117     // If an NBAIO sink is present, use it to write the normal mixer's submix
   2118     if (mNormalSink != 0) {
   2119 
   2120         const size_t count = mBytesRemaining / mFrameSize;
   2121 
   2122         ATRACE_BEGIN("write");
   2123         // update the setpoint when AudioFlinger::mScreenState changes
   2124         uint32_t screenState = AudioFlinger::mScreenState;
   2125         if (screenState != mScreenState) {
   2126             mScreenState = screenState;
   2127             MonoPipe *pipe = (MonoPipe *)mPipeSink.get();
   2128             if (pipe != NULL) {
   2129                 pipe->setAvgFrames((mScreenState & 1) ?
   2130                         (pipe->maxFrames() * 7) / 8 : mNormalFrameCount * 2);
   2131             }
   2132         }
   2133         ssize_t framesWritten = mNormalSink->write((char *)mSinkBuffer + offset, count);
   2134         ATRACE_END();
   2135         if (framesWritten > 0) {
   2136             bytesWritten = framesWritten * mFrameSize;
   2137         } else {
   2138             bytesWritten = framesWritten;
   2139         }
   2140         status_t status = mNormalSink->getTimestamp(mLatchD.mTimestamp);
   2141         if (status == NO_ERROR) {
   2142             size_t totalFramesWritten = mNormalSink->framesWritten();
   2143             if (totalFramesWritten >= mLatchD.mTimestamp.mPosition) {
   2144                 mLatchD.mUnpresentedFrames = totalFramesWritten - mLatchD.mTimestamp.mPosition;
   2145                 // mLatchD.mFramesReleased is set immediately before D is clocked into Q
   2146                 mLatchDValid = true;
   2147             }
   2148         }
   2149     // otherwise use the HAL / AudioStreamOut directly
   2150     } else {
   2151         // Direct output and offload threads
   2152 
   2153         if (mUseAsyncWrite) {
   2154             ALOGW_IF(mWriteAckSequence & 1, "threadLoop_write(): out of sequence write request");
   2155             mWriteAckSequence += 2;
   2156             mWriteAckSequence |= 1;
   2157             ALOG_ASSERT(mCallbackThread != 0);
   2158             mCallbackThread->setWriteBlocked(mWriteAckSequence);
   2159         }
   2160         // FIXME We should have an implementation of timestamps for direct output threads.
   2161         // They are used e.g for multichannel PCM playback over HDMI.
   2162         bytesWritten = mOutput->stream->write(mOutput->stream,
   2163                                                    (char *)mSinkBuffer + offset, mBytesRemaining);
   2164         if (mUseAsyncWrite &&
   2165                 ((bytesWritten < 0) || (bytesWritten == (ssize_t)mBytesRemaining))) {
   2166             // do not wait for async callback in case of error of full write
   2167             mWriteAckSequence &= ~1;
   2168             ALOG_ASSERT(mCallbackThread != 0);
   2169             mCallbackThread->setWriteBlocked(mWriteAckSequence);
   2170         }
   2171     }
   2172 
   2173     mNumWrites++;
   2174     mInWrite = false;
   2175     mStandby = false;
   2176     return bytesWritten;
   2177 }
   2178 
   2179 void AudioFlinger::PlaybackThread::threadLoop_drain()
   2180 {
   2181     if (mOutput->stream->drain) {
   2182         ALOGV("draining %s", (mMixerStatus == MIXER_DRAIN_TRACK) ? "early" : "full");
   2183         if (mUseAsyncWrite) {
   2184             ALOGW_IF(mDrainSequence & 1, "threadLoop_drain(): out of sequence drain request");
   2185             mDrainSequence |= 1;
   2186             ALOG_ASSERT(mCallbackThread != 0);
   2187             mCallbackThread->setDraining(mDrainSequence);
   2188         }
   2189         mOutput->stream->drain(mOutput->stream,
   2190             (mMixerStatus == MIXER_DRAIN_TRACK) ? AUDIO_DRAIN_EARLY_NOTIFY
   2191                                                 : AUDIO_DRAIN_ALL);
   2192     }
   2193 }
   2194 
   2195 void AudioFlinger::PlaybackThread::threadLoop_exit()
   2196 {
   2197     {
   2198         Mutex::Autolock _l(mLock);
   2199         for (size_t i = 0; i < mTracks.size(); i++) {
   2200             sp<Track> track = mTracks[i];
   2201             track->invalidate();
   2202         }
   2203     }
   2204 }
   2205 
   2206 /*
   2207 The derived values that are cached:
   2208  - mSinkBufferSize from frame count * frame size
   2209  - activeSleepTime from activeSleepTimeUs()
   2210  - idleSleepTime from idleSleepTimeUs()
   2211  - standbyDelay from mActiveSleepTimeUs (DIRECT only)
   2212  - maxPeriod from frame count and sample rate (MIXER only)
   2213 
   2214 The parameters that affect these derived values are:
   2215  - frame count
   2216  - frame size
   2217  - sample rate
   2218  - device type: A2DP or not
   2219  - device latency
   2220  - format: PCM or not
   2221  - active sleep time
   2222  - idle sleep time
   2223 */
   2224 
   2225 void AudioFlinger::PlaybackThread::cacheParameters_l()
   2226 {
   2227     mSinkBufferSize = mNormalFrameCount * mFrameSize;
   2228     activeSleepTime = activeSleepTimeUs();
   2229     idleSleepTime = idleSleepTimeUs();
   2230 }
   2231 
   2232 void AudioFlinger::PlaybackThread::invalidateTracks(audio_stream_type_t streamType)
   2233 {
   2234     ALOGV("MixerThread::invalidateTracks() mixer %p, streamType %d, mTracks.size %d",
   2235             this,  streamType, mTracks.size());
   2236     Mutex::Autolock _l(mLock);
   2237 
   2238     size_t size = mTracks.size();
   2239     for (size_t i = 0; i < size; i++) {
   2240         sp<Track> t = mTracks[i];
   2241         if (t->streamType() == streamType) {
   2242             t->invalidate();
   2243         }
   2244     }
   2245 }
   2246 
   2247 status_t AudioFlinger::PlaybackThread::addEffectChain_l(const sp<EffectChain>& chain)
   2248 {
   2249     int session = chain->sessionId();
   2250     int16_t* buffer = reinterpret_cast<int16_t*>(mEffectBufferEnabled
   2251             ? mEffectBuffer : mSinkBuffer);
   2252     bool ownsBuffer = false;
   2253 
   2254     ALOGV("addEffectChain_l() %p on thread %p for session %d", chain.get(), this, session);
   2255     if (session > 0) {
   2256         // Only one effect chain can be present in direct output thread and it uses
   2257         // the sink buffer as input
   2258         if (mType != DIRECT) {
   2259             size_t numSamples = mNormalFrameCount * mChannelCount;
   2260             buffer = new int16_t[numSamples];
   2261             memset(buffer, 0, numSamples * sizeof(int16_t));
   2262             ALOGV("addEffectChain_l() creating new input buffer %p session %d", buffer, session);
   2263             ownsBuffer = true;
   2264         }
   2265 
   2266         // Attach all tracks with same session ID to this chain.
   2267         for (size_t i = 0; i < mTracks.size(); ++i) {
   2268             sp<Track> track = mTracks[i];
   2269             if (session == track->sessionId()) {
   2270                 ALOGV("addEffectChain_l() track->setMainBuffer track %p buffer %p", track.get(),
   2271                         buffer);
   2272                 track->setMainBuffer(buffer);
   2273                 chain->incTrackCnt();
   2274             }
   2275         }
   2276 
   2277         // indicate all active tracks in the chain
   2278         for (size_t i = 0 ; i < mActiveTracks.size() ; ++i) {
   2279             sp<Track> track = mActiveTracks[i].promote();
   2280             if (track == 0) {
   2281                 continue;
   2282             }
   2283             if (session == track->sessionId()) {
   2284                 ALOGV("addEffectChain_l() activating track %p on session %d", track.get(), session);
   2285                 chain->incActiveTrackCnt();
   2286             }
   2287         }
   2288     }
   2289     chain->setThread(this);
   2290     chain->setInBuffer(buffer, ownsBuffer);
   2291     chain->setOutBuffer(reinterpret_cast<int16_t*>(mEffectBufferEnabled
   2292             ? mEffectBuffer : mSinkBuffer));
   2293     // Effect chain for session AUDIO_SESSION_OUTPUT_STAGE is inserted at end of effect
   2294     // chains list in order to be processed last as it contains output stage effects
   2295     // Effect chain for session AUDIO_SESSION_OUTPUT_MIX is inserted before
   2296     // session AUDIO_SESSION_OUTPUT_STAGE to be processed
   2297     // after track specific effects and before output stage
   2298     // It is therefore mandatory that AUDIO_SESSION_OUTPUT_MIX == 0 and
   2299     // that AUDIO_SESSION_OUTPUT_STAGE < AUDIO_SESSION_OUTPUT_MIX
   2300     // Effect chain for other sessions are inserted at beginning of effect
   2301     // chains list to be processed before output mix effects. Relative order between other
   2302     // sessions is not important
   2303     size_t size = mEffectChains.size();
   2304     size_t i = 0;
   2305     for (i = 0; i < size; i++) {
   2306         if (mEffectChains[i]->sessionId() < session) {
   2307             break;
   2308         }
   2309     }
   2310     mEffectChains.insertAt(chain, i);
   2311     checkSuspendOnAddEffectChain_l(chain);
   2312 
   2313     return NO_ERROR;
   2314 }
   2315 
   2316 size_t AudioFlinger::PlaybackThread::removeEffectChain_l(const sp<EffectChain>& chain)
   2317 {
   2318     int session = chain->sessionId();
   2319 
   2320     ALOGV("removeEffectChain_l() %p from thread %p for session %d", chain.get(), this, session);
   2321 
   2322     for (size_t i = 0; i < mEffectChains.size(); i++) {
   2323         if (chain == mEffectChains[i]) {
   2324             mEffectChains.removeAt(i);
   2325             // detach all active tracks from the chain
   2326             for (size_t i = 0 ; i < mActiveTracks.size() ; ++i) {
   2327                 sp<Track> track = mActiveTracks[i].promote();
   2328                 if (track == 0) {
   2329                     continue;
   2330                 }
   2331                 if (session == track->sessionId()) {
   2332                     ALOGV("removeEffectChain_l(): stopping track on chain %p for session Id: %d",
   2333                             chain.get(), session);
   2334                     chain->decActiveTrackCnt();
   2335                 }
   2336             }
   2337 
   2338             // detach all tracks with same session ID from this chain
   2339             for (size_t i = 0; i < mTracks.size(); ++i) {
   2340                 sp<Track> track = mTracks[i];
   2341                 if (session == track->sessionId()) {
   2342                     track->setMainBuffer(reinterpret_cast<int16_t*>(mSinkBuffer));
   2343                     chain->decTrackCnt();
   2344                 }
   2345             }
   2346             break;
   2347         }
   2348     }
   2349     return mEffectChains.size();
   2350 }
   2351 
   2352 status_t AudioFlinger::PlaybackThread::attachAuxEffect(
   2353         const sp<AudioFlinger::PlaybackThread::Track> track, int EffectId)
   2354 {
   2355     Mutex::Autolock _l(mLock);
   2356     return attachAuxEffect_l(track, EffectId);
   2357 }
   2358 
   2359 status_t AudioFlinger::PlaybackThread::attachAuxEffect_l(
   2360         const sp<AudioFlinger::PlaybackThread::Track> track, int EffectId)
   2361 {
   2362     status_t status = NO_ERROR;
   2363 
   2364     if (EffectId == 0) {
   2365         track->setAuxBuffer(0, NULL);
   2366     } else {
   2367         // Auxiliary effects are always in audio session AUDIO_SESSION_OUTPUT_MIX
   2368         sp<EffectModule> effect = getEffect_l(AUDIO_SESSION_OUTPUT_MIX, EffectId);
   2369         if (effect != 0) {
   2370             if ((effect->desc().flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
   2371                 track->setAuxBuffer(EffectId, (int32_t *)effect->inBuffer());
   2372             } else {
   2373                 status = INVALID_OPERATION;
   2374             }
   2375         } else {
   2376             status = BAD_VALUE;
   2377         }
   2378     }
   2379     return status;
   2380 }
   2381 
   2382 void AudioFlinger::PlaybackThread::detachAuxEffect_l(int effectId)
   2383 {
   2384     for (size_t i = 0; i < mTracks.size(); ++i) {
   2385         sp<Track> track = mTracks[i];
   2386         if (track->auxEffectId() == effectId) {
   2387             attachAuxEffect_l(track, 0);
   2388         }
   2389     }
   2390 }
   2391 
   2392 bool AudioFlinger::PlaybackThread::threadLoop()
   2393 {
   2394     Vector< sp<Track> > tracksToRemove;
   2395 
   2396     standbyTime = systemTime();
   2397 
   2398     // MIXER
   2399     nsecs_t lastWarning = 0;
   2400 
   2401     // DUPLICATING
   2402     // FIXME could this be made local to while loop?
   2403     writeFrames = 0;
   2404 
   2405     int lastGeneration = 0;
   2406 
   2407     cacheParameters_l();
   2408     sleepTime = idleSleepTime;
   2409 
   2410     if (mType == MIXER) {
   2411         sleepTimeShift = 0;
   2412     }
   2413 
   2414     CpuStats cpuStats;
   2415     const String8 myName(String8::format("thread %p type %d TID %d", this, mType, gettid()));
   2416 
   2417     acquireWakeLock();
   2418 
   2419     // mNBLogWriter->log can only be called while thread mutex mLock is held.
   2420     // So if you need to log when mutex is unlocked, set logString to a non-NULL string,
   2421     // and then that string will be logged at the next convenient opportunity.
   2422     const char *logString = NULL;
   2423 
   2424     checkSilentMode_l();
   2425 
   2426     while (!exitPending())
   2427     {
   2428         cpuStats.sample(myName);
   2429 
   2430         Vector< sp<EffectChain> > effectChains;
   2431 
   2432         { // scope for mLock
   2433 
   2434             Mutex::Autolock _l(mLock);
   2435 
   2436             processConfigEvents_l();
   2437 
   2438             if (logString != NULL) {
   2439                 mNBLogWriter->logTimestamp();
   2440                 mNBLogWriter->log(logString);
   2441                 logString = NULL;
   2442             }
   2443 
   2444             // Gather the framesReleased counters for all active tracks,
   2445             // and latch them atomically with the timestamp.
   2446             // FIXME We're using raw pointers as indices. A unique track ID would be a better index.
   2447             mLatchD.mFramesReleased.clear();
   2448             size_t size = mActiveTracks.size();
   2449             for (size_t i = 0; i < size; i++) {
   2450                 sp<Track> t = mActiveTracks[i].promote();
   2451                 if (t != 0) {
   2452                     mLatchD.mFramesReleased.add(t.get(),
   2453                             t->mAudioTrackServerProxy->framesReleased());
   2454                 }
   2455             }
   2456             if (mLatchDValid) {
   2457                 mLatchQ = mLatchD;
   2458                 mLatchDValid = false;
   2459                 mLatchQValid = true;
   2460             }
   2461 
   2462             saveOutputTracks();
   2463             if (mSignalPending) {
   2464                 // A signal was raised while we were unlocked
   2465                 mSignalPending = false;
   2466             } else if (waitingAsyncCallback_l()) {
   2467                 if (exitPending()) {
   2468                     break;
   2469                 }
   2470                 releaseWakeLock_l();
   2471                 mWakeLockUids.clear();
   2472                 mActiveTracksGeneration++;
   2473                 ALOGV("wait async completion");
   2474                 mWaitWorkCV.wait(mLock);
   2475                 ALOGV("async completion/wake");
   2476                 acquireWakeLock_l();
   2477                 standbyTime = systemTime() + standbyDelay;
   2478                 sleepTime = 0;
   2479 
   2480                 continue;
   2481             }
   2482             if ((!mActiveTracks.size() && systemTime() > standbyTime) ||
   2483                                    isSuspended()) {
   2484                 // put audio hardware into standby after short delay
   2485                 if (shouldStandby_l()) {
   2486 
   2487                     threadLoop_standby();
   2488 
   2489                     mStandby = true;
   2490                 }
   2491 
   2492                 if (!mActiveTracks.size() && mConfigEvents.isEmpty()) {
   2493                     // we're about to wait, flush the binder command buffer
   2494                     IPCThreadState::self()->flushCommands();
   2495 
   2496                     clearOutputTracks();
   2497 
   2498                     if (exitPending()) {
   2499                         break;
   2500                     }
   2501 
   2502                     releaseWakeLock_l();
   2503                     mWakeLockUids.clear();
   2504                     mActiveTracksGeneration++;
   2505                     // wait until we have something to do...
   2506                     ALOGV("%s going to sleep", myName.string());
   2507                     mWaitWorkCV.wait(mLock);
   2508                     ALOGV("%s waking up", myName.string());
   2509                     acquireWakeLock_l();
   2510 
   2511                     mMixerStatus = MIXER_IDLE;
   2512                     mMixerStatusIgnoringFastTracks = MIXER_IDLE;
   2513                     mBytesWritten = 0;
   2514                     mBytesRemaining = 0;
   2515                     checkSilentMode_l();
   2516 
   2517                     standbyTime = systemTime() + standbyDelay;
   2518                     sleepTime = idleSleepTime;
   2519                     if (mType == MIXER) {
   2520                         sleepTimeShift = 0;
   2521                     }
   2522 
   2523                     continue;
   2524                 }
   2525             }
   2526             // mMixerStatusIgnoringFastTracks is also updated internally
   2527             mMixerStatus = prepareTracks_l(&tracksToRemove);
   2528 
   2529             // compare with previously applied list
   2530             if (lastGeneration != mActiveTracksGeneration) {
   2531                 // update wakelock
   2532                 updateWakeLockUids_l(mWakeLockUids);
   2533                 lastGeneration = mActiveTracksGeneration;
   2534             }
   2535 
   2536             // prevent any changes in effect chain list and in each effect chain
   2537             // during mixing and effect process as the audio buffers could be deleted
   2538             // or modified if an effect is created or deleted
   2539             lockEffectChains_l(effectChains);
   2540         } // mLock scope ends
   2541 
   2542         if (mBytesRemaining == 0) {
   2543             mCurrentWriteLength = 0;
   2544             if (mMixerStatus == MIXER_TRACKS_READY) {
   2545                 // threadLoop_mix() sets mCurrentWriteLength
   2546                 threadLoop_mix();
   2547             } else if ((mMixerStatus != MIXER_DRAIN_TRACK)
   2548                         && (mMixerStatus != MIXER_DRAIN_ALL)) {
   2549                 // threadLoop_sleepTime sets sleepTime to 0 if data
   2550                 // must be written to HAL
   2551                 threadLoop_sleepTime();
   2552                 if (sleepTime == 0) {
   2553                     mCurrentWriteLength = mSinkBufferSize;
   2554                 }
   2555             }
   2556             // Either threadLoop_mix() or threadLoop_sleepTime() should have set
   2557             // mMixerBuffer with data if mMixerBufferValid is true and sleepTime == 0.
   2558             // Merge mMixerBuffer data into mEffectBuffer (if any effects are valid)
   2559             // or mSinkBuffer (if there are no effects).
   2560             //
   2561             // This is done pre-effects computation; if effects change to
   2562             // support higher precision, this needs to move.
   2563             //
   2564             // mMixerBufferValid is only set true by MixerThread::prepareTracks_l().
   2565             // TODO use sleepTime == 0 as an additional condition.
   2566             if (mMixerBufferValid) {
   2567                 void *buffer = mEffectBufferValid ? mEffectBuffer : mSinkBuffer;
   2568                 audio_format_t format = mEffectBufferValid ? mEffectBufferFormat : mFormat;
   2569 
   2570                 memcpy_by_audio_format(buffer, format, mMixerBuffer, mMixerBufferFormat,
   2571                         mNormalFrameCount * mChannelCount);
   2572             }
   2573 
   2574             mBytesRemaining = mCurrentWriteLength;
   2575             if (isSuspended()) {
   2576                 sleepTime = suspendSleepTimeUs();
   2577                 // simulate write to HAL when suspended
   2578                 mBytesWritten += mSinkBufferSize;
   2579                 mBytesRemaining = 0;
   2580             }
   2581 
   2582             // only process effects if we're going to write
   2583             if (sleepTime == 0 && mType != OFFLOAD) {
   2584                 for (size_t i = 0; i < effectChains.size(); i ++) {
   2585                     effectChains[i]->process_l();
   2586                 }
   2587             }
   2588         }
   2589         // Process effect chains for offloaded thread even if no audio
   2590         // was read from audio track: process only updates effect state
   2591         // and thus does have to be synchronized with audio writes but may have
   2592         // to be called while waiting for async write callback
   2593         if (mType == OFFLOAD) {
   2594             for (size_t i = 0; i < effectChains.size(); i ++) {
   2595                 effectChains[i]->process_l();
   2596             }
   2597         }
   2598 
   2599         // Only if the Effects buffer is enabled and there is data in the
   2600         // Effects buffer (buffer valid), we need to
   2601         // copy into the sink buffer.
   2602         // TODO use sleepTime == 0 as an additional condition.
   2603         if (mEffectBufferValid) {
   2604             //ALOGV("writing effect buffer to sink buffer format %#x", mFormat);
   2605             memcpy_by_audio_format(mSinkBuffer, mFormat, mEffectBuffer, mEffectBufferFormat,
   2606                     mNormalFrameCount * mChannelCount);
   2607         }
   2608 
   2609         // enable changes in effect chain
   2610         unlockEffectChains(effectChains);
   2611 
   2612         if (!waitingAsyncCallback()) {
   2613             // sleepTime == 0 means we must write to audio hardware
   2614             if (sleepTime == 0) {
   2615                 if (mBytesRemaining) {
   2616                     ssize_t ret = threadLoop_write();
   2617                     if (ret < 0) {
   2618                         mBytesRemaining = 0;
   2619                     } else {
   2620                         mBytesWritten += ret;
   2621                         mBytesRemaining -= ret;
   2622                     }
   2623                 } else if ((mMixerStatus == MIXER_DRAIN_TRACK) ||
   2624                         (mMixerStatus == MIXER_DRAIN_ALL)) {
   2625                     threadLoop_drain();
   2626                 }
   2627                 if (mType == MIXER) {
   2628                     // write blocked detection
   2629                     nsecs_t now = systemTime();
   2630                     nsecs_t delta = now - mLastWriteTime;
   2631                     if (!mStandby && delta > maxPeriod) {
   2632                         mNumDelayedWrites++;
   2633                         if ((now - lastWarning) > kWarningThrottleNs) {
   2634                             ATRACE_NAME("underrun");
   2635                             ALOGW("write blocked for %llu msecs, %d delayed writes, thread %p",
   2636                                     ns2ms(delta), mNumDelayedWrites, this);
   2637                             lastWarning = now;
   2638                         }
   2639                     }
   2640                 }
   2641 
   2642             } else {
   2643                 usleep(sleepTime);
   2644             }
   2645         }
   2646 
   2647         // Finally let go of removed track(s), without the lock held
   2648         // since we can't guarantee the destructors won't acquire that
   2649         // same lock.  This will also mutate and push a new fast mixer state.
   2650         threadLoop_removeTracks(tracksToRemove);
   2651         tracksToRemove.clear();
   2652 
   2653         // FIXME I don't understand the need for this here;
   2654         //       it was in the original code but maybe the
   2655         //       assignment in saveOutputTracks() makes this unnecessary?
   2656         clearOutputTracks();
   2657 
   2658         // Effect chains will be actually deleted here if they were removed from
   2659         // mEffectChains list during mixing or effects processing
   2660         effectChains.clear();
   2661 
   2662         // FIXME Note that the above .clear() is no longer necessary since effectChains
   2663         // is now local to this block, but will keep it for now (at least until merge done).
   2664     }
   2665 
   2666     threadLoop_exit();
   2667 
   2668     if (!mStandby) {
   2669         threadLoop_standby();
   2670         mStandby = true;
   2671     }
   2672 
   2673     releaseWakeLock();
   2674     mWakeLockUids.clear();
   2675     mActiveTracksGeneration++;
   2676 
   2677     ALOGV("Thread %p type %d exiting", this, mType);
   2678     return false;
   2679 }
   2680 
   2681 // removeTracks_l() must be called with ThreadBase::mLock held
   2682 void AudioFlinger::PlaybackThread::removeTracks_l(const Vector< sp<Track> >& tracksToRemove)
   2683 {
   2684     size_t count = tracksToRemove.size();
   2685     if (count > 0) {
   2686         for (size_t i=0 ; i<count ; i++) {
   2687             const sp<Track>& track = tracksToRemove.itemAt(i);
   2688             mActiveTracks.remove(track);
   2689             mWakeLockUids.remove(track->uid());
   2690             mActiveTracksGeneration++;
   2691             ALOGV("removeTracks_l removing track on session %d", track->sessionId());
   2692             sp<EffectChain> chain = getEffectChain_l(track->sessionId());
   2693             if (chain != 0) {
   2694                 ALOGV("stopping track on chain %p for session Id: %d", chain.get(),
   2695                         track->sessionId());
   2696                 chain->decActiveTrackCnt();
   2697             }
   2698             if (track->isTerminated()) {
   2699                 removeTrack_l(track);
   2700             }
   2701         }
   2702     }
   2703 
   2704 }
   2705 
   2706 status_t AudioFlinger::PlaybackThread::getTimestamp_l(AudioTimestamp& timestamp)
   2707 {
   2708     if (mNormalSink != 0) {
   2709         return mNormalSink->getTimestamp(timestamp);
   2710     }
   2711     if ((mType == OFFLOAD || mType == DIRECT)
   2712             && mOutput != NULL && mOutput->stream->get_presentation_position) {
   2713         uint64_t position64;
   2714         int ret = mOutput->stream->get_presentation_position(
   2715                                                 mOutput->stream, &position64, &timestamp.mTime);
   2716         if (ret == 0) {
   2717             timestamp.mPosition = (uint32_t)position64;
   2718             return NO_ERROR;
   2719         }
   2720     }
   2721     return INVALID_OPERATION;
   2722 }
   2723 
   2724 status_t AudioFlinger::PlaybackThread::createAudioPatch_l(const struct audio_patch *patch,
   2725                                                           audio_patch_handle_t *handle)
   2726 {
   2727     status_t status = NO_ERROR;
   2728     if (mOutput->audioHwDev->version() >= AUDIO_DEVICE_API_VERSION_3_0) {
   2729         // store new device and send to effects
   2730         audio_devices_t type = AUDIO_DEVICE_NONE;
   2731         for (unsigned int i = 0; i < patch->num_sinks; i++) {
   2732             type |= patch->sinks[i].ext.device.type;
   2733         }
   2734         mOutDevice = type;
   2735         for (size_t i = 0; i < mEffectChains.size(); i++) {
   2736             mEffectChains[i]->setDevice_l(mOutDevice);
   2737         }
   2738 
   2739         audio_hw_device_t *hwDevice = mOutput->audioHwDev->hwDevice();
   2740         status = hwDevice->create_audio_patch(hwDevice,
   2741                                                patch->num_sources,
   2742                                                patch->sources,
   2743                                                patch->num_sinks,
   2744                                                patch->sinks,
   2745                                                handle);
   2746     } else {
   2747         ALOG_ASSERT(false, "createAudioPatch_l() called on a pre 3.0 HAL");
   2748     }
   2749     return status;
   2750 }
   2751 
   2752 status_t AudioFlinger::PlaybackThread::releaseAudioPatch_l(const audio_patch_handle_t handle)
   2753 {
   2754     status_t status = NO_ERROR;
   2755     if (mOutput->audioHwDev->version() >= AUDIO_DEVICE_API_VERSION_3_0) {
   2756         audio_hw_device_t *hwDevice = mOutput->audioHwDev->hwDevice();
   2757         status = hwDevice->release_audio_patch(hwDevice, handle);
   2758     } else {
   2759         ALOG_ASSERT(false, "releaseAudioPatch_l() called on a pre 3.0 HAL");
   2760     }
   2761     return status;
   2762 }
   2763 
   2764 void AudioFlinger::PlaybackThread::addPatchTrack(const sp<PatchTrack>& track)
   2765 {
   2766     Mutex::Autolock _l(mLock);
   2767     mTracks.add(track);
   2768 }
   2769 
   2770 void AudioFlinger::PlaybackThread::deletePatchTrack(const sp<PatchTrack>& track)
   2771 {
   2772     Mutex::Autolock _l(mLock);
   2773     destroyTrack_l(track);
   2774 }
   2775 
   2776 void AudioFlinger::PlaybackThread::getAudioPortConfig(struct audio_port_config *config)
   2777 {
   2778     ThreadBase::getAudioPortConfig(config);
   2779     config->role = AUDIO_PORT_ROLE_SOURCE;
   2780     config->ext.mix.hw_module = mOutput->audioHwDev->handle();
   2781     config->ext.mix.usecase.stream = AUDIO_STREAM_DEFAULT;
   2782 }
   2783 
   2784 // ----------------------------------------------------------------------------
   2785 
   2786 AudioFlinger::MixerThread::MixerThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output,
   2787         audio_io_handle_t id, audio_devices_t device, type_t type)
   2788     :   PlaybackThread(audioFlinger, output, id, device, type),
   2789         // mAudioMixer below
   2790         // mFastMixer below
   2791         mFastMixerFutex(0)
   2792         // mOutputSink below
   2793         // mPipeSink below
   2794         // mNormalSink below
   2795 {
   2796     ALOGV("MixerThread() id=%d device=%#x type=%d", id, device, type);
   2797     ALOGV("mSampleRate=%u, mChannelMask=%#x, mChannelCount=%u, mFormat=%d, mFrameSize=%u, "
   2798             "mFrameCount=%d, mNormalFrameCount=%d",
   2799             mSampleRate, mChannelMask, mChannelCount, mFormat, mFrameSize, mFrameCount,
   2800             mNormalFrameCount);
   2801     mAudioMixer = new AudioMixer(mNormalFrameCount, mSampleRate);
   2802 
   2803     // create an NBAIO sink for the HAL output stream, and negotiate
   2804     mOutputSink = new AudioStreamOutSink(output->stream);
   2805     size_t numCounterOffers = 0;
   2806     const NBAIO_Format offers[1] = {Format_from_SR_C(mSampleRate, mChannelCount, mFormat)};
   2807     ssize_t index = mOutputSink->negotiate(offers, 1, NULL, numCounterOffers);
   2808     ALOG_ASSERT(index == 0);
   2809 
   2810     // initialize fast mixer depending on configuration
   2811     bool initFastMixer;
   2812     switch (kUseFastMixer) {
   2813     case FastMixer_Never:
   2814         initFastMixer = false;
   2815         break;
   2816     case FastMixer_Always:
   2817         initFastMixer = true;
   2818         break;
   2819     case FastMixer_Static:
   2820     case FastMixer_Dynamic:
   2821         initFastMixer = mFrameCount < mNormalFrameCount;
   2822         break;
   2823     }
   2824     if (initFastMixer) {
   2825         audio_format_t fastMixerFormat;
   2826         if (mMixerBufferEnabled && mEffectBufferEnabled) {
   2827             fastMixerFormat = AUDIO_FORMAT_PCM_FLOAT;
   2828         } else {
   2829             fastMixerFormat = AUDIO_FORMAT_PCM_16_BIT;
   2830         }
   2831         if (mFormat != fastMixerFormat) {
   2832             // change our Sink format to accept our intermediate precision
   2833             mFormat = fastMixerFormat;
   2834             free(mSinkBuffer);
   2835             mFrameSize = mChannelCount * audio_bytes_per_sample(mFormat);
   2836             const size_t sinkBufferSize = mNormalFrameCount * mFrameSize;
   2837             (void)posix_memalign(&mSinkBuffer, 32, sinkBufferSize);
   2838         }
   2839 
   2840         // create a MonoPipe to connect our submix to FastMixer
   2841         NBAIO_Format format = mOutputSink->format();
   2842         NBAIO_Format origformat = format;
   2843         // adjust format to match that of the Fast Mixer
   2844         format.mFormat = fastMixerFormat;
   2845         format.mFrameSize = audio_bytes_per_sample(format.mFormat) * format.mChannelCount;
   2846 
   2847         // This pipe depth compensates for scheduling latency of the normal mixer thread.
   2848         // When it wakes up after a maximum latency, it runs a few cycles quickly before
   2849         // finally blocking.  Note the pipe implementation rounds up the request to a power of 2.
   2850         MonoPipe *monoPipe = new MonoPipe(mNormalFrameCount * 4, format, true /*writeCanBlock*/);
   2851         const NBAIO_Format offers[1] = {format};
   2852         size_t numCounterOffers = 0;
   2853         ssize_t index = monoPipe->negotiate(offers, 1, NULL, numCounterOffers);
   2854         ALOG_ASSERT(index == 0);
   2855         monoPipe->setAvgFrames((mScreenState & 1) ?
   2856                 (monoPipe->maxFrames() * 7) / 8 : mNormalFrameCount * 2);
   2857         mPipeSink = monoPipe;
   2858 
   2859 #ifdef TEE_SINK
   2860         if (mTeeSinkOutputEnabled) {
   2861             // create a Pipe to archive a copy of FastMixer's output for dumpsys
   2862             Pipe *teeSink = new Pipe(mTeeSinkOutputFrames, origformat);
   2863             const NBAIO_Format offers2[1] = {origformat};
   2864             numCounterOffers = 0;
   2865             index = teeSink->negotiate(offers2, 1, NULL, numCounterOffers);
   2866             ALOG_ASSERT(index == 0);
   2867             mTeeSink = teeSink;
   2868             PipeReader *teeSource = new PipeReader(*teeSink);
   2869             numCounterOffers = 0;
   2870             index = teeSource->negotiate(offers2, 1, NULL, numCounterOffers);
   2871             ALOG_ASSERT(index == 0);
   2872             mTeeSource = teeSource;
   2873         }
   2874 #endif
   2875 
   2876         // create fast mixer and configure it initially with just one fast track for our submix
   2877         mFastMixer = new FastMixer();
   2878         FastMixerStateQueue *sq = mFastMixer->sq();
   2879 #ifdef STATE_QUEUE_DUMP
   2880         sq->setObserverDump(&mStateQueueObserverDump);
   2881         sq->setMutatorDump(&mStateQueueMutatorDump);
   2882 #endif
   2883         FastMixerState *state = sq->begin();
   2884         FastTrack *fastTrack = &state->mFastTracks[0];
   2885         // wrap the source side of the MonoPipe to make it an AudioBufferProvider
   2886         fastTrack->mBufferProvider = new SourceAudioBufferProvider(new MonoPipeReader(monoPipe));
   2887         fastTrack->mVolumeProvider = NULL;
   2888         fastTrack->mChannelMask = mChannelMask; // mPipeSink channel mask for audio to FastMixer
   2889         fastTrack->mFormat = mFormat; // mPipeSink format for audio to FastMixer
   2890         fastTrack->mGeneration++;
   2891         state->mFastTracksGen++;
   2892         state->mTrackMask = 1;
   2893         // fast mixer will use the HAL output sink
   2894         state->mOutputSink = mOutputSink.get();
   2895         state->mOutputSinkGen++;
   2896         state->mFrameCount = mFrameCount;
   2897         state->mCommand = FastMixerState::COLD_IDLE;
   2898         // already done in constructor initialization list
   2899         //mFastMixerFutex = 0;
   2900         state->mColdFutexAddr = &mFastMixerFutex;
   2901         state->mColdGen++;
   2902         state->mDumpState = &mFastMixerDumpState;
   2903 #ifdef TEE_SINK
   2904         state->mTeeSink = mTeeSink.get();
   2905 #endif
   2906         mFastMixerNBLogWriter = audioFlinger->newWriter_l(kFastMixerLogSize, "FastMixer");
   2907         state->mNBLogWriter = mFastMixerNBLogWriter.get();
   2908         sq->end();
   2909         sq->push(FastMixerStateQueue::BLOCK_UNTIL_PUSHED);
   2910 
   2911         // start the fast mixer
   2912         mFastMixer->run("FastMixer", PRIORITY_URGENT_AUDIO);
   2913         pid_t tid = mFastMixer->getTid();
   2914         int err = requestPriority(getpid_cached, tid, kPriorityFastMixer);
   2915         if (err != 0) {
   2916             ALOGW("Policy SCHED_FIFO priority %d is unavailable for pid %d tid %d; error %d",
   2917                     kPriorityFastMixer, getpid_cached, tid, err);
   2918         }
   2919 
   2920 #ifdef AUDIO_WATCHDOG
   2921         // create and start the watchdog
   2922         mAudioWatchdog = new AudioWatchdog();
   2923         mAudioWatchdog->setDump(&mAudioWatchdogDump);
   2924         mAudioWatchdog->run("AudioWatchdog", PRIORITY_URGENT_AUDIO);
   2925         tid = mAudioWatchdog->getTid();
   2926         err = requestPriority(getpid_cached, tid, kPriorityFastMixer);
   2927         if (err != 0) {
   2928             ALOGW("Policy SCHED_FIFO priority %d is unavailable for pid %d tid %d; error %d",
   2929                     kPriorityFastMixer, getpid_cached, tid, err);
   2930         }
   2931 #endif
   2932 
   2933     }
   2934 
   2935     switch (kUseFastMixer) {
   2936     case FastMixer_Never:
   2937     case FastMixer_Dynamic:
   2938         mNormalSink = mOutputSink;
   2939         break;
   2940     case FastMixer_Always:
   2941         mNormalSink = mPipeSink;
   2942         break;
   2943     case FastMixer_Static:
   2944         mNormalSink = initFastMixer ? mPipeSink : mOutputSink;
   2945         break;
   2946     }
   2947 }
   2948 
   2949 AudioFlinger::MixerThread::~MixerThread()
   2950 {
   2951     if (mFastMixer != 0) {
   2952         FastMixerStateQueue *sq = mFastMixer->sq();
   2953         FastMixerState *state = sq->begin();
   2954         if (state->mCommand == FastMixerState::COLD_IDLE) {
   2955             int32_t old = android_atomic_inc(&mFastMixerFutex);
   2956             if (old == -1) {
   2957                 (void) syscall(__NR_futex, &mFastMixerFutex, FUTEX_WAKE_PRIVATE, 1);
   2958             }
   2959         }
   2960         state->mCommand = FastMixerState::EXIT;
   2961         sq->end();
   2962         sq->push(FastMixerStateQueue::BLOCK_UNTIL_PUSHED);
   2963         mFastMixer->join();
   2964         // Though the fast mixer thread has exited, it's state queue is still valid.
   2965         // We'll use that extract the final state which contains one remaining fast track
   2966         // corresponding to our sub-mix.
   2967         state = sq->begin();
   2968         ALOG_ASSERT(state->mTrackMask == 1);
   2969         FastTrack *fastTrack = &state->mFastTracks[0];
   2970         ALOG_ASSERT(fastTrack->mBufferProvider != NULL);
   2971         delete fastTrack->mBufferProvider;
   2972         sq->end(false /*didModify*/);
   2973         mFastMixer.clear();
   2974 #ifdef AUDIO_WATCHDOG
   2975         if (mAudioWatchdog != 0) {
   2976             mAudioWatchdog->requestExit();
   2977             mAudioWatchdog->requestExitAndWait();
   2978             mAudioWatchdog.clear();
   2979         }
   2980 #endif
   2981     }
   2982     mAudioFlinger->unregisterWriter(mFastMixerNBLogWriter);
   2983     delete mAudioMixer;
   2984 }
   2985 
   2986 
   2987 uint32_t AudioFlinger::MixerThread::correctLatency_l(uint32_t latency) const
   2988 {
   2989     if (mFastMixer != 0) {
   2990         MonoPipe *pipe = (MonoPipe *)mPipeSink.get();
   2991         latency += (pipe->getAvgFrames() * 1000) / mSampleRate;
   2992     }
   2993     return latency;
   2994 }
   2995 
   2996 
   2997 void AudioFlinger::MixerThread::threadLoop_removeTracks(const Vector< sp<Track> >& tracksToRemove)
   2998 {
   2999     PlaybackThread::threadLoop_removeTracks(tracksToRemove);
   3000 }
   3001 
   3002 ssize_t AudioFlinger::MixerThread::threadLoop_write()
   3003 {
   3004     // FIXME we should only do one push per cycle; confirm this is true
   3005     // Start the fast mixer if it's not already running
   3006     if (mFastMixer != 0) {
   3007         FastMixerStateQueue *sq = mFastMixer->sq();
   3008         FastMixerState *state = sq->begin();
   3009         if (state->mCommand != FastMixerState::MIX_WRITE &&
   3010                 (kUseFastMixer != FastMixer_Dynamic || state->mTrackMask > 1)) {
   3011             if (state->mCommand == FastMixerState::COLD_IDLE) {
   3012                 int32_t old = android_atomic_inc(&mFastMixerFutex);
   3013                 if (old == -1) {
   3014                     (void) syscall(__NR_futex, &mFastMixerFutex, FUTEX_WAKE_PRIVATE, 1);
   3015                 }
   3016 #ifdef AUDIO_WATCHDOG
   3017                 if (mAudioWatchdog != 0) {
   3018                     mAudioWatchdog->resume();
   3019                 }
   3020 #endif
   3021             }
   3022             state->mCommand = FastMixerState::MIX_WRITE;
   3023             mFastMixerDumpState.increaseSamplingN(mAudioFlinger->isLowRamDevice() ?
   3024                     FastMixerDumpState::kSamplingNforLowRamDevice : FastMixerDumpState::kSamplingN);
   3025             sq->end();
   3026             sq->push(FastMixerStateQueue::BLOCK_UNTIL_PUSHED);
   3027             if (kUseFastMixer == FastMixer_Dynamic) {
   3028                 mNormalSink = mPipeSink;
   3029             }
   3030         } else {
   3031             sq->end(false /*didModify*/);
   3032         }
   3033     }
   3034     return PlaybackThread::threadLoop_write();
   3035 }
   3036 
   3037 void AudioFlinger::MixerThread::threadLoop_standby()
   3038 {
   3039     // Idle the fast mixer if it's currently running
   3040     if (mFastMixer != 0) {
   3041         FastMixerStateQueue *sq = mFastMixer->sq();
   3042         FastMixerState *state = sq->begin();
   3043         if (!(state->mCommand & FastMixerState::IDLE)) {
   3044             state->mCommand = FastMixerState::COLD_IDLE;
   3045             state->mColdFutexAddr = &mFastMixerFutex;
   3046             state->mColdGen++;
   3047             mFastMixerFutex = 0;
   3048             sq->end();
   3049             // BLOCK_UNTIL_PUSHED would be insufficient, as we need it to stop doing I/O now
   3050             sq->push(FastMixerStateQueue::BLOCK_UNTIL_ACKED);
   3051             if (kUseFastMixer == FastMixer_Dynamic) {
   3052                 mNormalSink = mOutputSink;
   3053             }
   3054 #ifdef AUDIO_WATCHDOG
   3055             if (mAudioWatchdog != 0) {
   3056                 mAudioWatchdog->pause();
   3057             }
   3058 #endif
   3059         } else {
   3060             sq->end(false /*didModify*/);
   3061         }
   3062     }
   3063     PlaybackThread::threadLoop_standby();
   3064 }
   3065 
   3066 bool AudioFlinger::PlaybackThread::waitingAsyncCallback_l()
   3067 {
   3068     return false;
   3069 }
   3070 
   3071 bool AudioFlinger::PlaybackThread::shouldStandby_l()
   3072 {
   3073     return !mStandby;
   3074 }
   3075 
   3076 bool AudioFlinger::PlaybackThread::waitingAsyncCallback()
   3077 {
   3078     Mutex::Autolock _l(mLock);
   3079     return waitingAsyncCallback_l();
   3080 }
   3081 
   3082 // shared by MIXER and DIRECT, overridden by DUPLICATING
   3083 void AudioFlinger::PlaybackThread::threadLoop_standby()
   3084 {
   3085     ALOGV("Audio hardware entering standby, mixer %p, suspend count %d", this, mSuspended);
   3086     mOutput->stream->common.standby(&mOutput->stream->common);
   3087     if (mUseAsyncWrite != 0) {
   3088         // discard any pending drain or write ack by incrementing sequence
   3089         mWriteAckSequence = (mWriteAckSequence + 2) & ~1;
   3090         mDrainSequence = (mDrainSequence + 2) & ~1;
   3091         ALOG_ASSERT(mCallbackThread != 0);
   3092         mCallbackThread->setWriteBlocked(mWriteAckSequence);
   3093         mCallbackThread->setDraining(mDrainSequence);
   3094     }
   3095     mHwPaused = false;
   3096 }
   3097 
   3098 void AudioFlinger::PlaybackThread::onAddNewTrack_l()
   3099 {
   3100     ALOGV("signal playback thread");
   3101     broadcast_l();
   3102 }
   3103 
   3104 void AudioFlinger::MixerThread::threadLoop_mix()
   3105 {
   3106     // obtain the presentation timestamp of the next output buffer
   3107     int64_t pts;
   3108     status_t status = INVALID_OPERATION;
   3109 
   3110     if (mNormalSink != 0) {
   3111         status = mNormalSink->getNextWriteTimestamp(&pts);
   3112     } else {
   3113         status = mOutputSink->getNextWriteTimestamp(&pts);
   3114     }
   3115 
   3116     if (status != NO_ERROR) {
   3117         pts = AudioBufferProvider::kInvalidPTS;
   3118     }
   3119 
   3120     // mix buffers...
   3121     mAudioMixer->process(pts);
   3122     mCurrentWriteLength = mSinkBufferSize;
   3123     // increase sleep time progressively when application underrun condition clears.
   3124     // Only increase sleep time if the mixer is ready for two consecutive times to avoid
   3125     // that a steady state of alternating ready/not ready conditions keeps the sleep time
   3126     // such that we would underrun the audio HAL.
   3127     if ((sleepTime == 0) && (sleepTimeShift > 0)) {
   3128         sleepTimeShift--;
   3129     }
   3130     sleepTime = 0;
   3131     standbyTime = systemTime() + standbyDelay;
   3132     //TODO: delay standby when effects have a tail
   3133 
   3134 }
   3135 
   3136 void AudioFlinger::MixerThread::threadLoop_sleepTime()
   3137 {
   3138     // If no tracks are ready, sleep once for the duration of an output
   3139     // buffer size, then write 0s to the output
   3140     if (sleepTime == 0) {
   3141         if (mMixerStatus == MIXER_TRACKS_ENABLED) {
   3142             sleepTime = activeSleepTime >> sleepTimeShift;
   3143             if (sleepTime < kMinThreadSleepTimeUs) {
   3144                 sleepTime = kMinThreadSleepTimeUs;
   3145             }
   3146             // reduce sleep time in case of consecutive application underruns to avoid
   3147             // starving the audio HAL. As activeSleepTimeUs() is larger than a buffer
   3148             // duration we would end up writing less data than needed by the audio HAL if
   3149             // the condition persists.
   3150             if (sleepTimeShift < kMaxThreadSleepTimeShift) {
   3151                 sleepTimeShift++;
   3152             }
   3153         } else {
   3154             sleepTime = idleSleepTime;
   3155         }
   3156     } else if (mBytesWritten != 0 || (mMixerStatus == MIXER_TRACKS_ENABLED)) {
   3157         // clear out mMixerBuffer or mSinkBuffer, to ensure buffers are cleared
   3158         // before effects processing or output.
   3159         if (mMixerBufferValid) {
   3160             memset(mMixerBuffer, 0, mMixerBufferSize);
   3161         } else {
   3162             memset(mSinkBuffer, 0, mSinkBufferSize);
   3163         }
   3164         sleepTime = 0;
   3165         ALOGV_IF(mBytesWritten == 0 && (mMixerStatus == MIXER_TRACKS_ENABLED),
   3166                 "anticipated start");
   3167     }
   3168     // TODO add standby time extension fct of effect tail
   3169 }
   3170 
   3171 // prepareTracks_l() must be called with ThreadBase::mLock held
   3172 AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTracks_l(
   3173         Vector< sp<Track> > *tracksToRemove)
   3174 {
   3175 
   3176     mixer_state mixerStatus = MIXER_IDLE;
   3177     // find out which tracks need to be processed
   3178     size_t count = mActiveTracks.size();
   3179     size_t mixedTracks = 0;
   3180     size_t tracksWithEffect = 0;
   3181     // counts only _active_ fast tracks
   3182     size_t fastTracks = 0;
   3183     uint32_t resetMask = 0; // bit mask of fast tracks that need to be reset
   3184 
   3185     float masterVolume = mMasterVolume;
   3186     bool masterMute = mMasterMute;
   3187 
   3188     if (masterMute) {
   3189         masterVolume = 0;
   3190     }
   3191     // Delegate master volume control to effect in output mix effect chain if needed
   3192     sp<EffectChain> chain = getEffectChain_l(AUDIO_SESSION_OUTPUT_MIX);
   3193     if (chain != 0) {
   3194         uint32_t v = (uint32_t)(masterVolume * (1 << 24));
   3195         chain->setVolume_l(&v, &v);
   3196         masterVolume = (float)((v + (1 << 23)) >> 24);
   3197         chain.clear();
   3198     }
   3199 
   3200     // prepare a new state to push
   3201     FastMixerStateQueue *sq = NULL;
   3202     FastMixerState *state = NULL;
   3203     bool didModify = false;
   3204     FastMixerStateQueue::block_t block = FastMixerStateQueue::BLOCK_UNTIL_PUSHED;
   3205     if (mFastMixer != 0) {
   3206         sq = mFastMixer->sq();
   3207         state = sq->begin();
   3208     }
   3209 
   3210     mMixerBufferValid = false;  // mMixerBuffer has no valid data until appropriate tracks found.
   3211     mEffectBufferValid = false; // mEffectBuffer has no valid data until tracks found.
   3212 
   3213     for (size_t i=0 ; i<count ; i++) {
   3214         const sp<Track> t = mActiveTracks[i].promote();
   3215         if (t == 0) {
   3216             continue;
   3217         }
   3218 
   3219         // this const just means the local variable doesn't change
   3220         Track* const track = t.get();
   3221 
   3222         // process fast tracks
   3223         if (track->isFastTrack()) {
   3224 
   3225             // It's theoretically possible (though unlikely) for a fast track to be created
   3226             // and then removed within the same normal mix cycle.  This is not a problem, as
   3227             // the track never becomes active so it's fast mixer slot is never touched.
   3228             // The converse, of removing an (active) track and then creating a new track
   3229             // at the identical fast mixer slot within the same normal mix cycle,
   3230             // is impossible because the slot isn't marked available until the end of each cycle.
   3231             int j = track->mFastIndex;
   3232             ALOG_ASSERT(0 < j && j < (int)FastMixerState::kMaxFastTracks);
   3233             ALOG_ASSERT(!(mFastTrackAvailMask & (1 << j)));
   3234             FastTrack *fastTrack = &state->mFastTracks[j];
   3235 
   3236             // Determine whether the track is currently in underrun condition,
   3237             // and whether it had a recent underrun.
   3238             FastTrackDump *ftDump = &mFastMixerDumpState.mTracks[j];
   3239             FastTrackUnderruns underruns = ftDump->mUnderruns;
   3240             uint32_t recentFull = (underruns.mBitFields.mFull -
   3241                     track->mObservedUnderruns.mBitFields.mFull) & UNDERRUN_MASK;
   3242             uint32_t recentPartial = (underruns.mBitFields.mPartial -
   3243                     track->mObservedUnderruns.mBitFields.mPartial) & UNDERRUN_MASK;
   3244             uint32_t recentEmpty = (underruns.mBitFields.mEmpty -
   3245                     track->mObservedUnderruns.mBitFields.mEmpty) & UNDERRUN_MASK;
   3246             uint32_t recentUnderruns = recentPartial + recentEmpty;
   3247             track->mObservedUnderruns = underruns;
   3248             // don't count underruns that occur while stopping or pausing
   3249             // or stopped which can occur when flush() is called while active
   3250             if (!(track->isStopping() || track->isPausing() || track->isStopped()) &&
   3251                     recentUnderruns > 0) {
   3252                 // FIXME fast mixer will pull & mix partial buffers, but we count as a full underrun
   3253                 track->mAudioTrackServerProxy->tallyUnderrunFrames(recentUnderruns * mFrameCount);
   3254             }
   3255 
   3256             // This is similar to the state machine for normal tracks,
   3257             // with a few modifications for fast tracks.
   3258             bool isActive = true;
   3259             switch (track->mState) {
   3260             case TrackBase::STOPPING_1:
   3261                 // track stays active in STOPPING_1 state until first underrun
   3262                 if (recentUnderruns > 0 || track->isTerminated()) {
   3263                     track->mState = TrackBase::STOPPING_2;
   3264                 }
   3265                 break;
   3266             case TrackBase::PAUSING:
   3267                 // ramp down is not yet implemented
   3268                 track->setPaused();
   3269                 break;
   3270             case TrackBase::RESUMING:
   3271                 // ramp up is not yet implemented
   3272                 track->mState = TrackBase::ACTIVE;
   3273                 break;
   3274             case TrackBase::ACTIVE:
   3275                 if (recentFull > 0 || recentPartial > 0) {
   3276                     // track has provided at least some frames recently: reset retry count
   3277                     track->mRetryCount = kMaxTrackRetries;
   3278                 }
   3279                 if (recentUnderruns == 0) {
   3280                     // no recent underruns: stay active
   3281                     break;
   3282                 }
   3283                 // there has recently been an underrun of some kind
   3284                 if (track->sharedBuffer() == 0) {
   3285                     // were any of the recent underruns "empty" (no frames available)?
   3286                     if (recentEmpty == 0) {
   3287                         // no, then ignore the partial underruns as they are allowed indefinitely
   3288                         break;
   3289                     }
   3290                     // there has recently been an "empty" underrun: decrement the retry counter
   3291                     if (--(track->mRetryCount) > 0) {
   3292                         break;
   3293                     }
   3294                     // indicate to client process that the track was disabled because of underrun;
   3295                     // it will then automatically call start() when data is available
   3296                     android_atomic_or(CBLK_DISABLED, &track->mCblk->mFlags);
   3297                     // remove from active list, but state remains ACTIVE [confusing but true]
   3298                     isActive = false;
   3299                     break;
   3300                 }
   3301                 // fall through
   3302             case TrackBase::STOPPING_2:
   3303             case TrackBase::PAUSED:
   3304             case TrackBase::STOPPED:
   3305             case TrackBase::FLUSHED:   // flush() while active
   3306                 // Check for presentation complete if track is inactive
   3307                 // We have consumed all the buffers of this track.
   3308                 // This would be incomplete if we auto-paused on underrun
   3309                 {
   3310                     size_t audioHALFrames =
   3311                             (mOutput->stream->get_latency(mOutput->stream)*mSampleRate) / 1000;
   3312                     size_t framesWritten = mBytesWritten / mFrameSize;
   3313                     if (!(mStandby || track->presentationComplete(framesWritten, audioHALFrames))) {
   3314                         // track stays in active list until presentation is complete
   3315                         break;
   3316                     }
   3317                 }
   3318                 if (track->isStopping_2()) {
   3319                     track->mState = TrackBase::STOPPED;
   3320                 }
   3321                 if (track->isStopped()) {
   3322                     // Can't reset directly, as fast mixer is still polling this track
   3323                     //   track->reset();
   3324                     // So instead mark this track as needing to be reset after push with ack
   3325                     resetMask |= 1 << i;
   3326                 }
   3327                 isActive = false;
   3328                 break;
   3329             case TrackBase::IDLE:
   3330             default:
   3331                 LOG_ALWAYS_FATAL("unexpected track state %d", track->mState);
   3332             }
   3333 
   3334             if (isActive) {
   3335                 // was it previously inactive?
   3336                 if (!(state->mTrackMask & (1 << j))) {
   3337                     ExtendedAudioBufferProvider *eabp = track;
   3338                     VolumeProvider *vp = track;
   3339                     fastTrack->mBufferProvider = eabp;
   3340                     fastTrack->mVolumeProvider = vp;
   3341                     fastTrack->mChannelMask = track->mChannelMask;
   3342                     fastTrack->mFormat = track->mFormat;
   3343                     fastTrack->mGeneration++;
   3344                     state->mTrackMask |= 1 << j;
   3345                     didModify = true;
   3346                     // no acknowledgement required for newly active tracks
   3347                 }
   3348                 // cache the combined master volume and stream type volume for fast mixer; this
   3349                 // lacks any synchronization or barrier so VolumeProvider may read a stale value
   3350                 track->mCachedVolume = masterVolume * mStreamTypes[track->streamType()].volume;
   3351                 ++fastTracks;
   3352             } else {
   3353                 // was it previously active?
   3354                 if (state->mTrackMask & (1 << j)) {
   3355                     fastTrack->mBufferProvider = NULL;
   3356                     fastTrack->mGeneration++;
   3357                     state->mTrackMask &= ~(1 << j);
   3358                     didModify = true;
   3359                     // If any fast tracks were removed, we must wait for acknowledgement
   3360                     // because we're about to decrement the last sp<> on those tracks.
   3361                     block = FastMixerStateQueue::BLOCK_UNTIL_ACKED;
   3362                 } else {
   3363                     LOG_ALWAYS_FATAL("fast track %d should have been active", j);
   3364                 }
   3365                 tracksToRemove->add(track);
   3366                 // Avoids a misleading display in dumpsys
   3367                 track->mObservedUnderruns.mBitFields.mMostRecent = UNDERRUN_FULL;
   3368             }
   3369             continue;
   3370         }
   3371 
   3372         {   // local variable scope to avoid goto warning
   3373 
   3374         audio_track_cblk_t* cblk = track->cblk();
   3375 
   3376         // The first time a track is added we wait
   3377         // for all its buffers to be filled before processing it
   3378         int name = track->name();
   3379         // make sure that we have enough frames to mix one full buffer.
   3380         // enforce this condition only once to enable draining the buffer in case the client
   3381         // app does not call stop() and relies on underrun to stop:
   3382         // hence the test on (mMixerStatus == MIXER_TRACKS_READY) meaning the track was mixed
   3383         // during last round
   3384         size_t desiredFrames;
   3385         uint32_t sr = track->sampleRate();
   3386         if (sr == mSampleRate) {
   3387             desiredFrames = mNormalFrameCount;
   3388         } else {
   3389             // +1 for rounding and +1 for additional sample needed for interpolation
   3390             desiredFrames = (mNormalFrameCount * sr) / mSampleRate + 1 + 1;
   3391             // add frames already consumed but not yet released by the resampler
   3392             // because mAudioTrackServerProxy->framesReady() will include these frames
   3393             desiredFrames += mAudioMixer->getUnreleasedFrames(track->name());
   3394 #if 0
   3395             // the minimum track buffer size is normally twice the number of frames necessary
   3396             // to fill one buffer and the resampler should not leave more than one buffer worth
   3397             // of unreleased frames after each pass, but just in case...
   3398             ALOG_ASSERT(desiredFrames <= cblk->frameCount_);
   3399 #endif
   3400         }
   3401         uint32_t minFrames = 1;
   3402         if ((track->sharedBuffer() == 0) && !track->isStopped() && !track->isPausing() &&
   3403                 (mMixerStatusIgnoringFastTracks == MIXER_TRACKS_READY)) {
   3404             minFrames = desiredFrames;
   3405         }
   3406 
   3407         size_t framesReady = track->framesReady();
   3408         if ((framesReady >= minFrames) && track->isReady() &&
   3409                 !track->isPaused() && !track->isTerminated())
   3410         {
   3411             ALOGVV("track %d s=%08x [OK] on thread %p", name, cblk->mServer, this);
   3412 
   3413             mixedTracks++;
   3414 
   3415             // track->mainBuffer() != mSinkBuffer or mMixerBuffer means
   3416             // there is an effect chain connected to the track
   3417             chain.clear();
   3418             if (track->mainBuffer() != mSinkBuffer &&
   3419                     track->mainBuffer() != mMixerBuffer) {
   3420                 if (mEffectBufferEnabled) {
   3421                     mEffectBufferValid = true; // Later can set directly.
   3422                 }
   3423                 chain = getEffectChain_l(track->sessionId());
   3424                 // Delegate volume control to effect in track effect chain if needed
   3425                 if (chain != 0) {
   3426                     tracksWithEffect++;
   3427                 } else {
   3428                     ALOGW("prepareTracks_l(): track %d attached to effect but no chain found on "
   3429                             "session %d",
   3430                             name, track->sessionId());
   3431                 }
   3432             }
   3433 
   3434 
   3435             int param = AudioMixer::VOLUME;
   3436             if (track->mFillingUpStatus == Track::FS_FILLED) {
   3437                 // no ramp for the first volume setting
   3438                 track->mFillingUpStatus = Track::FS_ACTIVE;
   3439                 if (track->mState == TrackBase::RESUMING) {
   3440                     track->mState = TrackBase::ACTIVE;
   3441                     param = AudioMixer::RAMP_VOLUME;
   3442                 }
   3443                 mAudioMixer->setParameter(name, AudioMixer::RESAMPLE, AudioMixer::RESET, NULL);
   3444             // FIXME should not make a decision based on mServer
   3445             } else if (cblk->mServer != 0) {
   3446                 // If the track is stopped before the first frame was mixed,
   3447                 // do not apply ramp
   3448                 param = AudioMixer::RAMP_VOLUME;
   3449             }
   3450 
   3451             // compute volume for this track
   3452             uint32_t vl, vr;       // in U8.24 integer format
   3453             float vlf, vrf, vaf;   // in [0.0, 1.0] float format
   3454             if (track->isPausing() || mStreamTypes[track->streamType()].mute) {
   3455                 vl = vr = 0;
   3456                 vlf = vrf = vaf = 0.;
   3457                 if (track->isPausing()) {
   3458                     track->setPaused();
   3459                 }
   3460             } else {
   3461 
   3462                 // read original volumes with volume control
   3463                 float typeVolume = mStreamTypes[track->streamType()].volume;
   3464                 float v = masterVolume * typeVolume;
   3465                 AudioTrackServerProxy *proxy = track->mAudioTrackServerProxy;
   3466                 gain_minifloat_packed_t vlr = proxy->getVolumeLR();
   3467                 vlf = float_from_gain(gain_minifloat_unpack_left(vlr));
   3468                 vrf = float_from_gain(gain_minifloat_unpack_right(vlr));
   3469                 // track volumes come from shared memory, so can't be trusted and must be clamped
   3470                 if (vlf > GAIN_FLOAT_UNITY) {
   3471                     ALOGV("Track left volume out of range: %.3g", vlf);
   3472                     vlf = GAIN_FLOAT_UNITY;
   3473                 }
   3474                 if (vrf > GAIN_FLOAT_UNITY) {
   3475                     ALOGV("Track right volume out of range: %.3g", vrf);
   3476                     vrf = GAIN_FLOAT_UNITY;
   3477                 }
   3478                 // now apply the master volume and stream type volume
   3479                 vlf *= v;
   3480                 vrf *= v;
   3481                 // assuming master volume and stream type volume each go up to 1.0,
   3482                 // then derive vl and vr as U8.24 versions for the effect chain
   3483                 const float scaleto8_24 = MAX_GAIN_INT * MAX_GAIN_INT;
   3484                 vl = (uint32_t) (scaleto8_24 * vlf);
   3485                 vr = (uint32_t) (scaleto8_24 * vrf);
   3486                 // vl and vr are now in U8.24 format
   3487                 uint16_t sendLevel = proxy->getSendLevel_U4_12();
   3488                 // send level comes from shared memory and so may be corrupt
   3489                 if (sendLevel > MAX_GAIN_INT) {
   3490                     ALOGV("Track send level out of range: %04X", sendLevel);
   3491                     sendLevel = MAX_GAIN_INT;
   3492                 }
   3493                 // vaf is represented as [0.0, 1.0] float by rescaling sendLevel
   3494                 vaf = v * sendLevel * (1. / MAX_GAIN_INT);
   3495             }
   3496 
   3497             // Delegate volume control to effect in track effect chain if needed
   3498             if (chain != 0 && chain->setVolume_l(&vl, &vr)) {
   3499                 // Do not ramp volume if volume is controlled by effect
   3500                 param = AudioMixer::VOLUME;
   3501                 // Update remaining floating point volume levels
   3502                 vlf = (float)vl / (1 << 24);
   3503                 vrf = (float)vr / (1 << 24);
   3504                 track->mHasVolumeController = true;
   3505             } else {
   3506                 // force no volume ramp when volume controller was just disabled or removed
   3507                 // from effect chain to avoid volume spike
   3508                 if (track->mHasVolumeController) {
   3509                     param = AudioMixer::VOLUME;
   3510                 }
   3511                 track->mHasVolumeController = false;
   3512             }
   3513 
   3514             // XXX: these things DON'T need to be done each time
   3515             mAudioMixer->setBufferProvider(name, track);
   3516             mAudioMixer->enable(name);
   3517 
   3518             mAudioMixer->setParameter(name, param, AudioMixer::VOLUME0, &vlf);
   3519             mAudioMixer->setParameter(name, param, AudioMixer::VOLUME1, &vrf);
   3520             mAudioMixer->setParameter(name, param, AudioMixer::AUXLEVEL, &vaf);
   3521             mAudioMixer->setParameter(
   3522                 name,
   3523                 AudioMixer::TRACK,
   3524                 AudioMixer::FORMAT, (void *)track->format());
   3525             mAudioMixer->setParameter(
   3526                 name,
   3527                 AudioMixer::TRACK,
   3528                 AudioMixer::CHANNEL_MASK, (void *)(uintptr_t)track->channelMask());
   3529             mAudioMixer->setParameter(
   3530                 name,
   3531                 AudioMixer::TRACK,
   3532                 AudioMixer::MIXER_CHANNEL_MASK, (void *)(uintptr_t)mChannelMask);
   3533             // limit track sample rate to 2 x output sample rate, which changes at re-configuration
   3534             uint32_t maxSampleRate = mSampleRate * AUDIO_RESAMPLER_DOWN_RATIO_MAX;
   3535             uint32_t reqSampleRate = track->mAudioTrackServerProxy->getSampleRate();
   3536             if (reqSampleRate == 0) {
   3537                 reqSampleRate = mSampleRate;
   3538             } else if (reqSampleRate > maxSampleRate) {
   3539                 reqSampleRate = maxSampleRate;
   3540             }
   3541             mAudioMixer->setParameter(
   3542                 name,
   3543                 AudioMixer::RESAMPLE,
   3544                 AudioMixer::SAMPLE_RATE,
   3545                 (void *)(uintptr_t)reqSampleRate);
   3546             /*
   3547              * Select the appropriate output buffer for the track.
   3548              *
   3549              * Tracks with effects go into their own effects chain buffer
   3550              * and from there into either mEffectBuffer or mSinkBuffer.
   3551              *
   3552              * Other tracks can use mMixerBuffer for higher precision
   3553              * channel accumulation.  If this buffer is enabled
   3554              * (mMixerBufferEnabled true), then selected tracks will accumulate
   3555              * into it.
   3556              *
   3557              */
   3558             if (mMixerBufferEnabled
   3559                     && (track->mainBuffer() == mSinkBuffer
   3560                             || track->mainBuffer() == mMixerBuffer)) {
   3561                 mAudioMixer->setParameter(
   3562                         name,
   3563                         AudioMixer::TRACK,
   3564                         AudioMixer::MIXER_FORMAT, (void *)mMixerBufferFormat);
   3565                 mAudioMixer->setParameter(
   3566                         name,
   3567                         AudioMixer::TRACK,
   3568                         AudioMixer::MAIN_BUFFER, (void *)mMixerBuffer);
   3569                 // TODO: override track->mainBuffer()?
   3570                 mMixerBufferValid = true;
   3571             } else {
   3572                 mAudioMixer->setParameter(
   3573                         name,
   3574                         AudioMixer::TRACK,
   3575                         AudioMixer::MIXER_FORMAT, (void *)AUDIO_FORMAT_PCM_16_BIT);
   3576                 mAudioMixer->setParameter(
   3577                         name,
   3578                         AudioMixer::TRACK,
   3579                         AudioMixer::MAIN_BUFFER, (void *)track->mainBuffer());
   3580             }
   3581             mAudioMixer->setParameter(
   3582                 name,
   3583                 AudioMixer::TRACK,
   3584                 AudioMixer::AUX_BUFFER, (void *)track->auxBuffer());
   3585 
   3586             // reset retry count
   3587             track->mRetryCount = kMaxTrackRetries;
   3588 
   3589             // If one track is ready, set the mixer ready if:
   3590             //  - the mixer was not ready during previous round OR
   3591             //  - no other track is not ready
   3592             if (mMixerStatusIgnoringFastTracks != MIXER_TRACKS_READY ||
   3593                     mixerStatus != MIXER_TRACKS_ENABLED) {
   3594                 mixerStatus = MIXER_TRACKS_READY;
   3595             }
   3596         } else {
   3597             if (framesReady < desiredFrames && !track->isStopped() && !track->isPaused()) {
   3598                 track->mAudioTrackServerProxy->tallyUnderrunFrames(desiredFrames);
   3599             }
   3600             // clear effect chain input buffer if an active track underruns to avoid sending
   3601             // previous audio buffer again to effects
   3602             chain = getEffectChain_l(track->sessionId());
   3603             if (chain != 0) {
   3604                 chain->clearInputBuffer();
   3605             }
   3606 
   3607             ALOGVV("track %d s=%08x [NOT READY] on thread %p", name, cblk->mServer, this);
   3608             if ((track->sharedBuffer() != 0) || track->isTerminated() ||
   3609                     track->isStopped() || track->isPaused()) {
   3610                 // We have consumed all the buffers of this track.
   3611                 // Remove it from the list of active tracks.
   3612                 // TODO: use actual buffer filling status instead of latency when available from
   3613                 // audio HAL
   3614                 size_t audioHALFrames = (latency_l() * mSampleRate) / 1000;
   3615                 size_t framesWritten = mBytesWritten / mFrameSize;
   3616                 if (mStandby || track->presentationComplete(framesWritten, audioHALFrames)) {
   3617                     if (track->isStopped()) {
   3618                         track->reset();
   3619                     }
   3620                     tracksToRemove->add(track);
   3621                 }
   3622             } else {
   3623                 // No buffers for this track. Give it a few chances to
   3624                 // fill a buffer, then remove it from active list.
   3625                 if (--(track->mRetryCount) <= 0) {
   3626                     ALOGI("BUFFER TIMEOUT: remove(%d) from active list on thread %p", name, this);
   3627                     tracksToRemove->add(track);
   3628                     // indicate to client process that the track was disabled because of underrun;
   3629                     // it will then automatically call start() when data is available
   3630                     android_atomic_or(CBLK_DISABLED, &cblk->mFlags);
   3631                 // If one track is not ready, mark the mixer also not ready if:
   3632                 //  - the mixer was ready during previous round OR
   3633                 //  - no other track is ready
   3634                 } else if (mMixerStatusIgnoringFastTracks == MIXER_TRACKS_READY ||
   3635                                 mixerStatus != MIXER_TRACKS_READY) {
   3636                     mixerStatus = MIXER_TRACKS_ENABLED;
   3637                 }
   3638             }
   3639             mAudioMixer->disable(name);
   3640         }
   3641 
   3642         }   // local variable scope to avoid goto warning
   3643 track_is_ready: ;
   3644 
   3645     }
   3646 
   3647     // Push the new FastMixer state if necessary
   3648     bool pauseAudioWatchdog = false;
   3649     if (didModify) {
   3650         state->mFastTracksGen++;
   3651         // if the fast mixer was active, but now there are no fast tracks, then put it in cold idle
   3652         if (kUseFastMixer == FastMixer_Dynamic &&
   3653                 state->mCommand == FastMixerState::MIX_WRITE && state->mTrackMask <= 1) {
   3654             state->mCommand = FastMixerState::COLD_IDLE;
   3655             state->mColdFutexAddr = &mFastMixerFutex;
   3656             state->mColdGen++;
   3657             mFastMixerFutex = 0;
   3658             if (kUseFastMixer == FastMixer_Dynamic) {
   3659                 mNormalSink = mOutputSink;
   3660             }
   3661             // If we go into cold idle, need to wait for acknowledgement
   3662             // so that fast mixer stops doing I/O.
   3663             block = FastMixerStateQueue::BLOCK_UNTIL_ACKED;
   3664             pauseAudioWatchdog = true;
   3665         }
   3666     }
   3667     if (sq != NULL) {
   3668         sq->end(didModify);
   3669         sq->push(block);
   3670     }
   3671 #ifdef AUDIO_WATCHDOG
   3672     if (pauseAudioWatchdog && mAudioWatchdog != 0) {
   3673         mAudioWatchdog->pause();
   3674     }
   3675 #endif
   3676 
   3677     // Now perform the deferred reset on fast tracks that have stopped
   3678     while (resetMask != 0) {
   3679         size_t i = __builtin_ctz(resetMask);
   3680         ALOG_ASSERT(i < count);
   3681         resetMask &= ~(1 << i);
   3682         sp<Track> t = mActiveTracks[i].promote();
   3683         if (t == 0) {
   3684             continue;
   3685         }
   3686         Track* track = t.get();
   3687         ALOG_ASSERT(track->isFastTrack() && track->isStopped());
   3688         track->reset();
   3689     }
   3690 
   3691     // remove all the tracks that need to be...
   3692     removeTracks_l(*tracksToRemove);
   3693 
   3694     if (getEffectChain_l(AUDIO_SESSION_OUTPUT_MIX) != 0) {
   3695         mEffectBufferValid = true;
   3696     }
   3697 
   3698     if (mEffectBufferValid) {
   3699         // as long as there are effects we should clear the effects buffer, to avoid
   3700         // passing a non-clean buffer to the effect chain
   3701         memset(mEffectBuffer, 0, mEffectBufferSize);
   3702     }
   3703     // sink or mix buffer must be cleared if all tracks are connected to an
   3704     // effect chain as in this case the mixer will not write to the sink or mix buffer
   3705     // and track effects will accumulate into it
   3706     if ((mBytesRemaining == 0) && ((mixedTracks != 0 && mixedTracks == tracksWithEffect) ||
   3707             (mixedTracks == 0 && fastTracks > 0))) {
   3708         // FIXME as a performance optimization, should remember previous zero status
   3709         if (mMixerBufferValid) {
   3710             memset(mMixerBuffer, 0, mMixerBufferSize);
   3711             // TODO: In testing, mSinkBuffer below need not be cleared because
   3712             // the PlaybackThread::threadLoop() copies mMixerBuffer into mSinkBuffer
   3713             // after mixing.
   3714             //
   3715             // To enforce this guarantee:
   3716             // ((mixedTracks != 0 && mixedTracks == tracksWithEffect) ||
   3717             // (mixedTracks == 0 && fastTracks > 0))
   3718             // must imply MIXER_TRACKS_READY.
   3719             // Later, we may clear buffers regardless, and skip much of this logic.
   3720         }
   3721         // FIXME as a performance optimization, should remember previous zero status
   3722         memset(mSinkBuffer, 0, mNormalFrameCount * mFrameSize);
   3723     }
   3724 
   3725     // if any fast tracks, then status is ready
   3726     mMixerStatusIgnoringFastTracks = mixerStatus;
   3727     if (fastTracks > 0) {
   3728         mixerStatus = MIXER_TRACKS_READY;
   3729     }
   3730     return mixerStatus;
   3731 }
   3732 
   3733 // getTrackName_l() must be called with ThreadBase::mLock held
   3734 int AudioFlinger::MixerThread::getTrackName_l(audio_channel_mask_t channelMask,
   3735         audio_format_t format, int sessionId)
   3736 {
   3737     return mAudioMixer->getTrackName(channelMask, format, sessionId);
   3738 }
   3739 
   3740 // deleteTrackName_l() must be called with ThreadBase::mLock held
   3741 void AudioFlinger::MixerThread::deleteTrackName_l(int name)
   3742 {
   3743     ALOGV("remove track (%d) and delete from mixer", name);
   3744     mAudioMixer->deleteTrackName(name);
   3745 }
   3746 
   3747 // checkForNewParameter_l() must be called with ThreadBase::mLock held
   3748 bool AudioFlinger::MixerThread::checkForNewParameter_l(const String8& keyValuePair,
   3749                                                        status_t& status)
   3750 {
   3751     bool reconfig = false;
   3752 
   3753     status = NO_ERROR;
   3754 
   3755     // if !&IDLE, holds the FastMixer state to restore after new parameters processed
   3756     FastMixerState::Command previousCommand = FastMixerState::HOT_IDLE;
   3757     if (mFastMixer != 0) {
   3758         FastMixerStateQueue *sq = mFastMixer->sq();
   3759         FastMixerState *state = sq->begin();
   3760         if (!(state->mCommand & FastMixerState::IDLE)) {
   3761             previousCommand = state->mCommand;
   3762             state->mCommand = FastMixerState::HOT_IDLE;
   3763             sq->end();
   3764             sq->push(FastMixerStateQueue::BLOCK_UNTIL_ACKED);
   3765         } else {
   3766             sq->end(false /*didModify*/);
   3767         }
   3768     }
   3769 
   3770     AudioParameter param = AudioParameter(keyValuePair);
   3771     int value;
   3772     if (param.getInt(String8(AudioParameter::keySamplingRate), value) == NO_ERROR) {
   3773         reconfig = true;
   3774     }
   3775     if (param.getInt(String8(AudioParameter::keyFormat), value) == NO_ERROR) {
   3776         if (!isValidPcmSinkFormat((audio_format_t) value)) {
   3777             status = BAD_VALUE;
   3778         } else {
   3779             // no need to save value, since it's constant
   3780             reconfig = true;
   3781         }
   3782     }
   3783     if (param.getInt(String8(AudioParameter::keyChannels), value) == NO_ERROR) {
   3784         if (!isValidPcmSinkChannelMask((audio_channel_mask_t) value)) {
   3785             status = BAD_VALUE;
   3786         } else {
   3787             // no need to save value, since it's constant
   3788             reconfig = true;
   3789         }
   3790     }
   3791     if (param.getInt(String8(AudioParameter::keyFrameCount), value) == NO_ERROR) {
   3792         // do not accept frame count changes if tracks are open as the track buffer
   3793         // size depends on frame count and correct behavior would not be guaranteed
   3794         // if frame count is changed after track creation
   3795         if (!mTracks.isEmpty()) {
   3796             status = INVALID_OPERATION;
   3797         } else {
   3798             reconfig = true;
   3799         }
   3800     }
   3801     if (param.getInt(String8(AudioParameter::keyRouting), value) == NO_ERROR) {
   3802 #ifdef ADD_BATTERY_DATA
   3803         // when changing the audio output device, call addBatteryData to notify
   3804         // the change
   3805         if (mOutDevice != value) {
   3806             uint32_t params = 0;
   3807             // check whether speaker is on
   3808             if (value & AUDIO_DEVICE_OUT_SPEAKER) {
   3809                 params |= IMediaPlayerService::kBatteryDataSpeakerOn;
   3810             }
   3811 
   3812             audio_devices_t deviceWithoutSpeaker
   3813                 = AUDIO_DEVICE_OUT_ALL & ~AUDIO_DEVICE_OUT_SPEAKER;
   3814             // check if any other device (except speaker) is on
   3815             if (value & deviceWithoutSpeaker ) {
   3816                 params |= IMediaPlayerService::kBatteryDataOtherAudioDeviceOn;
   3817             }
   3818 
   3819             if (params != 0) {
   3820                 addBatteryData(params);
   3821             }
   3822         }
   3823 #endif
   3824 
   3825         // forward device change to effects that have requested to be
   3826         // aware of attached audio device.
   3827         if (value != AUDIO_DEVICE_NONE) {
   3828             mOutDevice = value;
   3829             for (size_t i = 0; i < mEffectChains.size(); i++) {
   3830                 mEffectChains[i]->setDevice_l(mOutDevice);
   3831             }
   3832         }
   3833     }
   3834 
   3835     if (status == NO_ERROR) {
   3836         status = mOutput->stream->common.set_parameters(&mOutput->stream->common,
   3837                                                 keyValuePair.string());
   3838         if (!mStandby && status == INVALID_OPERATION) {
   3839             mOutput->stream->common.standby(&mOutput->stream->common);
   3840             mStandby = true;
   3841             mBytesWritten = 0;
   3842             status = mOutput->stream->common.set_parameters(&mOutput->stream->common,
   3843                                                    keyValuePair.string());
   3844         }
   3845         if (status == NO_ERROR && reconfig) {
   3846             readOutputParameters_l();
   3847             delete mAudioMixer;
   3848             mAudioMixer = new AudioMixer(mNormalFrameCount, mSampleRate);
   3849             for (size_t i = 0; i < mTracks.size() ; i++) {
   3850                 int name = getTrackName_l(mTracks[i]->mChannelMask,
   3851                         mTracks[i]->mFormat, mTracks[i]->mSessionId);
   3852                 if (name < 0) {
   3853                     break;
   3854                 }
   3855                 mTracks[i]->mName = name;
   3856             }
   3857             sendIoConfigEvent_l(AudioSystem::OUTPUT_CONFIG_CHANGED);
   3858         }
   3859     }
   3860 
   3861     if (!(previousCommand & FastMixerState::IDLE)) {
   3862         ALOG_ASSERT(mFastMixer != 0);
   3863         FastMixerStateQueue *sq = mFastMixer->sq();
   3864         FastMixerState *state = sq->begin();
   3865         ALOG_ASSERT(state->mCommand == FastMixerState::HOT_IDLE);
   3866         state->mCommand = previousCommand;
   3867         sq->end();
   3868         sq->push(FastMixerStateQueue::BLOCK_UNTIL_PUSHED);
   3869     }
   3870 
   3871     return reconfig;
   3872 }
   3873 
   3874 
   3875 void AudioFlinger::MixerThread::dumpInternals(int fd, const Vector<String16>& args)
   3876 {
   3877     const size_t SIZE = 256;
   3878     char buffer[SIZE];
   3879     String8 result;
   3880 
   3881     PlaybackThread::dumpInternals(fd, args);
   3882 
   3883     dprintf(fd, "  AudioMixer tracks: 0x%08x\n", mAudioMixer->trackNames());
   3884 
   3885     // Make a non-atomic copy of fast mixer dump state so it won't change underneath us
   3886     const FastMixerDumpState copy(mFastMixerDumpState);
   3887     copy.dump(fd);
   3888 
   3889 #ifdef STATE_QUEUE_DUMP
   3890     // Similar for state queue
   3891     StateQueueObserverDump observerCopy = mStateQueueObserverDump;
   3892     observerCopy.dump(fd);
   3893     StateQueueMutatorDump mutatorCopy = mStateQueueMutatorDump;
   3894     mutatorCopy.dump(fd);
   3895 #endif
   3896 
   3897 #ifdef TEE_SINK
   3898     // Write the tee output to a .wav file
   3899     dumpTee(fd, mTeeSource, mId);
   3900 #endif
   3901 
   3902 #ifdef AUDIO_WATCHDOG
   3903     if (mAudioWatchdog != 0) {
   3904         // Make a non-atomic copy of audio watchdog dump so it won't change underneath us
   3905         AudioWatchdogDump wdCopy = mAudioWatchdogDump;
   3906         wdCopy.dump(fd);
   3907     }
   3908 #endif
   3909 }
   3910 
   3911 uint32_t AudioFlinger::MixerThread::idleSleepTimeUs() const
   3912 {
   3913     return (uint32_t)(((mNormalFrameCount * 1000) / mSampleRate) * 1000) / 2;
   3914 }
   3915 
   3916 uint32_t AudioFlinger::MixerThread::suspendSleepTimeUs() const
   3917 {
   3918     return (uint32_t)(((mNormalFrameCount * 1000) / mSampleRate) * 1000);
   3919 }
   3920 
   3921 void AudioFlinger::MixerThread::cacheParameters_l()
   3922 {
   3923     PlaybackThread::cacheParameters_l();
   3924 
   3925     // FIXME: Relaxed timing because of a certain device that can't meet latency
   3926     // Should be reduced to 2x after the vendor fixes the driver issue
   3927     // increase threshold again due to low power audio mode. The way this warning
   3928     // threshold is calculated and its usefulness should be reconsidered anyway.
   3929     maxPeriod = seconds(mNormalFrameCount) / mSampleRate * 15;
   3930 }
   3931 
   3932 // ----------------------------------------------------------------------------
   3933 
   3934 AudioFlinger::DirectOutputThread::DirectOutputThread(const sp<AudioFlinger>& audioFlinger,
   3935         AudioStreamOut* output, audio_io_handle_t id, audio_devices_t device)
   3936     :   PlaybackThread(audioFlinger, output, id, device, DIRECT)
   3937         // mLeftVolFloat, mRightVolFloat
   3938 {
   3939 }
   3940 
   3941 AudioFlinger::DirectOutputThread::DirectOutputThread(const sp<AudioFlinger>& audioFlinger,
   3942         AudioStreamOut* output, audio_io_handle_t id, uint32_t device,
   3943         ThreadBase::type_t type)
   3944     :   PlaybackThread(audioFlinger, output, id, device, type)
   3945         // mLeftVolFloat, mRightVolFloat
   3946 {
   3947 }
   3948 
   3949 AudioFlinger::DirectOutputThread::~DirectOutputThread()
   3950 {
   3951 }
   3952 
   3953 void AudioFlinger::DirectOutputThread::processVolume_l(Track *track, bool lastTrack)
   3954 {
   3955     audio_track_cblk_t* cblk = track->cblk();
   3956     float left, right;
   3957 
   3958     if (mMasterMute || mStreamTypes[track->streamType()].mute) {
   3959         left = right = 0;
   3960     } else {
   3961         float typeVolume = mStreamTypes[track->streamType()].volume;
   3962         float v = mMasterVolume * typeVolume;
   3963         AudioTrackServerProxy *proxy = track->mAudioTrackServerProxy;
   3964         gain_minifloat_packed_t vlr = proxy->getVolumeLR();
   3965         left = float_from_gain(gain_minifloat_unpack_left(vlr));
   3966         if (left > GAIN_FLOAT_UNITY) {
   3967             left = GAIN_FLOAT_UNITY;
   3968         }
   3969         left *= v;
   3970         right = float_from_gain(gain_minifloat_unpack_right(vlr));
   3971         if (right > GAIN_FLOAT_UNITY) {
   3972             right = GAIN_FLOAT_UNITY;
   3973         }
   3974         right *= v;
   3975     }
   3976 
   3977     if (lastTrack) {
   3978         if (left != mLeftVolFloat || right != mRightVolFloat) {
   3979             mLeftVolFloat = left;
   3980             mRightVolFloat = right;
   3981 
   3982             // Convert volumes from float to 8.24
   3983             uint32_t vl = (uint32_t)(left * (1 << 24));
   3984             uint32_t vr = (uint32_t)(right * (1 << 24));
   3985 
   3986             // Delegate volume control to effect in track effect chain if needed
   3987             // only one effect chain can be present on DirectOutputThread, so if
   3988             // there is one, the track is connected to it
   3989             if (!mEffectChains.isEmpty()) {
   3990                 mEffectChains[0]->setVolume_l(&vl, &vr);
   3991                 left = (float)vl / (1 << 24);
   3992                 right = (float)vr / (1 << 24);
   3993             }
   3994             if (mOutput->stream->set_volume) {
   3995                 mOutput->stream->set_volume(mOutput->stream, left, right);
   3996             }
   3997         }
   3998     }
   3999 }
   4000 
   4001 
   4002 AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prepareTracks_l(
   4003     Vector< sp<Track> > *tracksToRemove
   4004 )
   4005 {
   4006     size_t count = mActiveTracks.size();
   4007     mixer_state mixerStatus = MIXER_IDLE;
   4008     bool doHwPause = false;
   4009     bool doHwResume = false;
   4010     bool flushPending = false;
   4011 
   4012     // find out which tracks need to be processed
   4013     for (size_t i = 0; i < count; i++) {
   4014         sp<Track> t = mActiveTracks[i].promote();
   4015         // The track died recently
   4016         if (t == 0) {
   4017             continue;
   4018         }
   4019 
   4020         Track* const track = t.get();
   4021         audio_track_cblk_t* cblk = track->cblk();
   4022         // Only consider last track started for volume and mixer state control.
   4023         // In theory an older track could underrun and restart after the new one starts
   4024         // but as we only care about the transition phase between two tracks on a
   4025         // direct output, it is not a problem to ignore the underrun case.
   4026         sp<Track> l = mLatestActiveTrack.promote();
   4027         bool last = l.get() == track;
   4028 
   4029         if (mHwSupportsPause && track->isPausing()) {
   4030             track->setPaused();
   4031             if (last && !mHwPaused) {
   4032                 doHwPause = true;
   4033                 mHwPaused = true;
   4034             }
   4035             tracksToRemove->add(track);
   4036         } else if (track->isFlushPending()) {
   4037             track->flushAck();
   4038             if (last) {
   4039                 flushPending = true;
   4040             }
   4041         } else if (mHwSupportsPause && track->isResumePending()){
   4042             track->resumeAck();
   4043             if (last) {
   4044                 if (mHwPaused) {
   4045                     doHwResume = true;
   4046                     mHwPaused = false;
   4047                 }
   4048             }
   4049         }
   4050 
   4051         // The first time a track is added we wait
   4052         // for all its buffers to be filled before processing it.
   4053         // Allow draining the buffer in case the client
   4054         // app does not call stop() and relies on underrun to stop:
   4055         // hence the test on (track->mRetryCount > 1).
   4056         // If retryCount<=1 then track is about to underrun and be removed.
   4057         uint32_t minFrames;
   4058         if ((track->sharedBuffer() == 0) && !track->isStopping_1() && !track->isPausing()
   4059             && (track->mRetryCount > 1)) {
   4060             minFrames = mNormalFrameCount;
   4061         } else {
   4062             minFrames = 1;
   4063         }
   4064 
   4065         if ((track->framesReady() >= minFrames) && track->isReady() && !track->isPaused() &&
   4066                 !track->isStopping_2() && !track->isStopped())
   4067         {
   4068             ALOGVV("track %d s=%08x [OK]", track->name(), cblk->mServer);
   4069 
   4070             if (track->mFillingUpStatus == Track::FS_FILLED) {
   4071                 track->mFillingUpStatus = Track::FS_ACTIVE;
   4072                 // make sure processVolume_l() will apply new volume even if 0
   4073                 mLeftVolFloat = mRightVolFloat = -1.0;
   4074                 if (!mHwSupportsPause) {
   4075                     track->resumeAck();
   4076                 }
   4077             }
   4078 
   4079             // compute volume for this track
   4080             processVolume_l(track, last);
   4081             if (last) {
   4082                 // reset retry count
   4083                 track->mRetryCount = kMaxTrackRetriesDirect;
   4084                 mActiveTrack = t;
   4085                 mixerStatus = MIXER_TRACKS_READY;
   4086                 if (usesHwAvSync() && mHwPaused) {
   4087                     doHwResume = true;
   4088                     mHwPaused = false;
   4089                 }
   4090             }
   4091         } else {
   4092             // clear effect chain input buffer if the last active track started underruns
   4093             // to avoid sending previous audio buffer again to effects
   4094             if (!mEffectChains.isEmpty() && last) {
   4095                 mEffectChains[0]->clearInputBuffer();
   4096             }
   4097             if (track->isStopping_1()) {
   4098                 track->mState = TrackBase::STOPPING_2;
   4099             }
   4100             if ((track->sharedBuffer() != 0) || track->isStopped() ||
   4101                     track->isStopping_2() || track->isPaused()) {
   4102                 // We have consumed all the buffers of this track.
   4103                 // Remove it from the list of active tracks.
   4104                 size_t audioHALFrames;
   4105                 if (audio_is_linear_pcm(mFormat)) {
   4106                     audioHALFrames = (latency_l() * mSampleRate) / 1000;
   4107                 } else {
   4108                     audioHALFrames = 0;
   4109                 }
   4110 
   4111                 size_t framesWritten = mBytesWritten / mFrameSize;
   4112                 if (mStandby || !last ||
   4113                         track->presentationComplete(framesWritten, audioHALFrames)) {
   4114                     if (track->isStopping_2()) {
   4115                         track->mState = TrackBase::STOPPED;
   4116                     }
   4117                     if (track->isStopped()) {
   4118                         track->reset();
   4119                     }
   4120                     tracksToRemove->add(track);
   4121                 }
   4122             } else {
   4123                 // No buffers for this track. Give it a few chances to
   4124                 // fill a buffer, then remove it from active list.
   4125                 // Only consider last track started for mixer state control
   4126                 if (--(track->mRetryCount) <= 0) {
   4127                     ALOGV("BUFFER TIMEOUT: remove(%d) from active list", track->name());
   4128                     tracksToRemove->add(track);
   4129                     // indicate to client process that the track was disabled because of underrun;
   4130                     // it will then automatically call start() when data is available
   4131                     android_atomic_or(CBLK_DISABLED, &cblk->mFlags);
   4132                 } else if (last) {
   4133                     mixerStatus = MIXER_TRACKS_ENABLED;
   4134                     if (usesHwAvSync() && !mHwPaused && !mStandby) {
   4135                         doHwPause = true;
   4136                         mHwPaused = true;
   4137                     }
   4138                 }
   4139             }
   4140         }
   4141     }
   4142 
   4143     // if an active track did not command a flush, check for pending flush on stopped tracks
   4144     if (!flushPending) {
   4145         for (size_t i = 0; i < mTracks.size(); i++) {
   4146             if (mTracks[i]->isFlushPending()) {
   4147                 mTracks[i]->flushAck();
   4148                 flushPending = true;
   4149             }
   4150         }
   4151     }
   4152 
   4153     // make sure the pause/flush/resume sequence is executed in the right order.
   4154     // If a flush is pending and a track is active but the HW is not paused, force a HW pause
   4155     // before flush and then resume HW. This can happen in case of pause/flush/resume
   4156     // if resume is received before pause is executed.
   4157     if (mHwSupportsPause && !mStandby &&
   4158             (doHwPause || (flushPending && !mHwPaused && (count != 0)))) {
   4159         mOutput->stream->pause(mOutput->stream);
   4160     }
   4161     if (flushPending) {
   4162         flushHw_l();
   4163     }
   4164     if (mHwSupportsPause && !mStandby && doHwResume) {
   4165         mOutput->stream->resume(mOutput->stream);
   4166     }
   4167     // remove all the tracks that need to be...
   4168     removeTracks_l(*tracksToRemove);
   4169 
   4170     return mixerStatus;
   4171 }
   4172 
   4173 void AudioFlinger::DirectOutputThread::threadLoop_mix()
   4174 {
   4175     size_t frameCount = mFrameCount;
   4176     int8_t *curBuf = (int8_t *)mSinkBuffer;
   4177     // output audio to hardware
   4178     while (frameCount) {
   4179         AudioBufferProvider::Buffer buffer;
   4180         buffer.frameCount = frameCount;
   4181         mActiveTrack->getNextBuffer(&buffer);
   4182         if (buffer.raw == NULL) {
   4183             memset(curBuf, 0, frameCount * mFrameSize);
   4184             break;
   4185         }
   4186         memcpy(curBuf, buffer.raw, buffer.frameCount * mFrameSize);
   4187         frameCount -= buffer.frameCount;
   4188         curBuf += buffer.frameCount * mFrameSize;
   4189         mActiveTrack->releaseBuffer(&buffer);
   4190     }
   4191     mCurrentWriteLength = curBuf - (int8_t *)mSinkBuffer;
   4192     sleepTime = 0;
   4193     standbyTime = systemTime() + standbyDelay;
   4194     mActiveTrack.clear();
   4195 }
   4196 
   4197 void AudioFlinger::DirectOutputThread::threadLoop_sleepTime()
   4198 {
   4199     // do not write to HAL when paused
   4200     if (mHwPaused || (usesHwAvSync() && mStandby)) {
   4201         sleepTime = idleSleepTime;
   4202         return;
   4203     }
   4204     if (sleepTime == 0) {
   4205         if (mMixerStatus == MIXER_TRACKS_ENABLED) {
   4206             sleepTime = activeSleepTime;
   4207         } else {
   4208             sleepTime = idleSleepTime;
   4209         }
   4210     } else if (mBytesWritten != 0 && audio_is_linear_pcm(mFormat)) {
   4211         memset(mSinkBuffer, 0, mFrameCount * mFrameSize);
   4212         sleepTime = 0;
   4213     }
   4214 }
   4215 
   4216 void AudioFlinger::DirectOutputThread::threadLoop_exit()
   4217 {
   4218     {
   4219         Mutex::Autolock _l(mLock);
   4220         bool flushPending = false;
   4221         for (size_t i = 0; i < mTracks.size(); i++) {
   4222             if (mTracks[i]->isFlushPending()) {
   4223                 mTracks[i]->flushAck();
   4224                 flushPending = true;
   4225             }
   4226         }
   4227         if (flushPending) {
   4228             flushHw_l();
   4229         }
   4230     }
   4231     PlaybackThread::threadLoop_exit();
   4232 }
   4233 
   4234 // must be called with thread mutex locked
   4235 bool AudioFlinger::DirectOutputThread::shouldStandby_l()
   4236 {
   4237     bool trackPaused = false;
   4238 
   4239     // do not put the HAL in standby when paused. AwesomePlayer clear the offloaded AudioTrack
   4240     // after a timeout and we will enter standby then.
   4241     if (mTracks.size() > 0) {
   4242         trackPaused = mTracks[mTracks.size() - 1]->isPaused();
   4243     }
   4244 
   4245     return !mStandby && !(trackPaused || (usesHwAvSync() && mHwPaused));
   4246 }
   4247 
   4248 // getTrackName_l() must be called with ThreadBase::mLock held
   4249 int AudioFlinger::DirectOutputThread::getTrackName_l(audio_channel_mask_t channelMask __unused,
   4250         audio_format_t format __unused, int sessionId __unused)
   4251 {
   4252     return 0;
   4253 }
   4254 
   4255 // deleteTrackName_l() must be called with ThreadBase::mLock held
   4256 void AudioFlinger::DirectOutputThread::deleteTrackName_l(int name __unused)
   4257 {
   4258 }
   4259 
   4260 // checkForNewParameter_l() must be called with ThreadBase::mLock held
   4261 bool AudioFlinger::DirectOutputThread::checkForNewParameter_l(const String8& keyValuePair,
   4262                                                               status_t& status)
   4263 {
   4264     bool reconfig = false;
   4265 
   4266     status = NO_ERROR;
   4267 
   4268     AudioParameter param = AudioParameter(keyValuePair);
   4269     int value;
   4270     if (param.getInt(String8(AudioParameter::keyRouting), value) == NO_ERROR) {
   4271         // forward device change to effects that have requested to be
   4272         // aware of attached audio device.
   4273         if (value != AUDIO_DEVICE_NONE) {
   4274             mOutDevice = value;
   4275             for (size_t i = 0; i < mEffectChains.size(); i++) {
   4276                 mEffectChains[i]->setDevice_l(mOutDevice);
   4277             }
   4278         }
   4279     }
   4280     if (param.getInt(String8(AudioParameter::keyFrameCount), value) == NO_ERROR) {
   4281         // do not accept frame count changes if tracks are open as the track buffer
   4282         // size depends on frame count and correct behavior would not be garantied
   4283         // if frame count is changed after track creation
   4284         if (!mTracks.isEmpty()) {
   4285             status = INVALID_OPERATION;
   4286         } else {
   4287             reconfig = true;
   4288         }
   4289     }
   4290     if (status == NO_ERROR) {
   4291         status = mOutput->stream->common.set_parameters(&mOutput->stream->common,
   4292                                                 keyValuePair.string());
   4293         if (!mStandby && status == INVALID_OPERATION) {
   4294             mOutput->stream->common.standby(&mOutput->stream->common);
   4295             mStandby = true;
   4296             mBytesWritten = 0;
   4297             status = mOutput->stream->common.set_parameters(&mOutput->stream->common,
   4298                                                    keyValuePair.string());
   4299         }
   4300         if (status == NO_ERROR && reconfig) {
   4301             readOutputParameters_l();
   4302             sendIoConfigEvent_l(AudioSystem::OUTPUT_CONFIG_CHANGED);
   4303         }
   4304     }
   4305 
   4306     return reconfig;
   4307 }
   4308 
   4309 uint32_t AudioFlinger::DirectOutputThread::activeSleepTimeUs() const
   4310 {
   4311     uint32_t time;
   4312     if (audio_is_linear_pcm(mFormat)) {
   4313         time = PlaybackThread::activeSleepTimeUs();
   4314     } else {
   4315         time = 10000;
   4316     }
   4317     return time;
   4318 }
   4319 
   4320 uint32_t AudioFlinger::DirectOutputThread::idleSleepTimeUs() const
   4321 {
   4322     uint32_t time;
   4323     if (audio_is_linear_pcm(mFormat)) {
   4324         time = (uint32_t)(((mFrameCount * 1000) / mSampleRate) * 1000) / 2;
   4325     } else {
   4326         time = 10000;
   4327     }
   4328     return time;
   4329 }
   4330 
   4331 uint32_t AudioFlinger::DirectOutputThread::suspendSleepTimeUs() const
   4332 {
   4333     uint32_t time;
   4334     if (audio_is_linear_pcm(mFormat)) {
   4335         time = (uint32_t)(((mFrameCount * 1000) / mSampleRate) * 1000);
   4336     } else {
   4337         time = 10000;
   4338     }
   4339     return time;
   4340 }
   4341 
   4342 void AudioFlinger::DirectOutputThread::cacheParameters_l()
   4343 {
   4344     PlaybackThread::cacheParameters_l();
   4345 
   4346     // use shorter standby delay as on normal output to release
   4347     // hardware resources as soon as possible
   4348     if (audio_is_linear_pcm(mFormat)) {
   4349         standbyDelay = microseconds(activeSleepTime*2);
   4350     } else {
   4351         standbyDelay = kOffloadStandbyDelayNs;
   4352     }
   4353 }
   4354 
   4355 void AudioFlinger::DirectOutputThread::flushHw_l()
   4356 {
   4357     if (mOutput->stream->flush != NULL) {
   4358         mOutput->stream->flush(mOutput->stream);
   4359     }
   4360     mHwPaused = false;
   4361 }
   4362 
   4363 // ----------------------------------------------------------------------------
   4364 
   4365 AudioFlinger::AsyncCallbackThread::AsyncCallbackThread(
   4366         const wp<AudioFlinger::PlaybackThread>& playbackThread)
   4367     :   Thread(false /*canCallJava*/),
   4368         mPlaybackThread(playbackThread),
   4369         mWriteAckSequence(0),
   4370         mDrainSequence(0)
   4371 {
   4372 }
   4373 
   4374 AudioFlinger::AsyncCallbackThread::~AsyncCallbackThread()
   4375 {
   4376 }
   4377 
   4378 void AudioFlinger::AsyncCallbackThread::onFirstRef()
   4379 {
   4380     run("Offload Cbk", ANDROID_PRIORITY_URGENT_AUDIO);
   4381 }
   4382 
   4383 bool AudioFlinger::AsyncCallbackThread::threadLoop()
   4384 {
   4385     while (!exitPending()) {
   4386         uint32_t writeAckSequence;
   4387         uint32_t drainSequence;
   4388 
   4389         {
   4390             Mutex::Autolock _l(mLock);
   4391             while (!((mWriteAckSequence & 1) ||
   4392                      (mDrainSequence & 1) ||
   4393                      exitPending())) {
   4394                 mWaitWorkCV.wait(mLock);
   4395             }
   4396 
   4397             if (exitPending()) {
   4398                 break;
   4399             }
   4400             ALOGV("AsyncCallbackThread mWriteAckSequence %d mDrainSequence %d",
   4401                   mWriteAckSequence, mDrainSequence);
   4402             writeAckSequence = mWriteAckSequence;
   4403             mWriteAckSequence &= ~1;
   4404             drainSequence = mDrainSequence;
   4405             mDrainSequence &= ~1;
   4406         }
   4407         {
   4408             sp<AudioFlinger::PlaybackThread> playbackThread = mPlaybackThread.promote();
   4409             if (playbackThread != 0) {
   4410                 if (writeAckSequence & 1) {
   4411                     playbackThread->resetWriteBlocked(writeAckSequence >> 1);
   4412                 }
   4413                 if (drainSequence & 1) {
   4414                     playbackThread->resetDraining(drainSequence >> 1);
   4415                 }
   4416             }
   4417         }
   4418     }
   4419     return false;
   4420 }
   4421 
   4422 void AudioFlinger::AsyncCallbackThread::exit()
   4423 {
   4424     ALOGV("AsyncCallbackThread::exit");
   4425     Mutex::Autolock _l(mLock);
   4426     requestExit();
   4427     mWaitWorkCV.broadcast();
   4428 }
   4429 
   4430 void AudioFlinger::AsyncCallbackThread::setWriteBlocked(uint32_t sequence)
   4431 {
   4432     Mutex::Autolock _l(mLock);
   4433     // bit 0 is cleared
   4434     mWriteAckSequence = sequence << 1;
   4435 }
   4436 
   4437 void AudioFlinger::AsyncCallbackThread::resetWriteBlocked()
   4438 {
   4439     Mutex::Autolock _l(mLock);
   4440     // ignore unexpected callbacks
   4441     if (mWriteAckSequence & 2) {
   4442         mWriteAckSequence |= 1;
   4443         mWaitWorkCV.signal();
   4444     }
   4445 }
   4446 
   4447 void AudioFlinger::AsyncCallbackThread::setDraining(uint32_t sequence)
   4448 {
   4449     Mutex::Autolock _l(mLock);
   4450     // bit 0 is cleared
   4451     mDrainSequence = sequence << 1;
   4452 }
   4453 
   4454 void AudioFlinger::AsyncCallbackThread::resetDraining()
   4455 {
   4456     Mutex::Autolock _l(mLock);
   4457     // ignore unexpected callbacks
   4458     if (mDrainSequence & 2) {
   4459         mDrainSequence |= 1;
   4460         mWaitWorkCV.signal();
   4461     }
   4462 }
   4463 
   4464 
   4465 // ----------------------------------------------------------------------------
   4466 AudioFlinger::OffloadThread::OffloadThread(const sp<AudioFlinger>& audioFlinger,
   4467         AudioStreamOut* output, audio_io_handle_t id, uint32_t device)
   4468     :   DirectOutputThread(audioFlinger, output, id, device, OFFLOAD),
   4469         mPausedBytesRemaining(0)
   4470 {
   4471     //FIXME: mStandby should be set to true by ThreadBase constructor
   4472     mStandby = true;
   4473 }
   4474 
   4475 void AudioFlinger::OffloadThread::threadLoop_exit()
   4476 {
   4477     if (mFlushPending || mHwPaused) {
   4478         // If a flush is pending or track was paused, just discard buffered data
   4479         flushHw_l();
   4480     } else {
   4481         mMixerStatus = MIXER_DRAIN_ALL;
   4482         threadLoop_drain();
   4483     }
   4484     if (mUseAsyncWrite) {
   4485         ALOG_ASSERT(mCallbackThread != 0);
   4486         mCallbackThread->exit();
   4487     }
   4488     PlaybackThread::threadLoop_exit();
   4489 }
   4490 
   4491 AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTracks_l(
   4492     Vector< sp<Track> > *tracksToRemove
   4493 )
   4494 {
   4495     size_t count = mActiveTracks.size();
   4496 
   4497     mixer_state mixerStatus = MIXER_IDLE;
   4498     bool doHwPause = false;
   4499     bool doHwResume = false;
   4500 
   4501     ALOGV("OffloadThread::prepareTracks_l active tracks %d", count);
   4502 
   4503     // find out which tracks need to be processed
   4504     for (size_t i = 0; i < count; i++) {
   4505         sp<Track> t = mActiveTracks[i].promote();
   4506         // The track died recently
   4507         if (t == 0) {
   4508             continue;
   4509         }
   4510         Track* const track = t.get();
   4511         audio_track_cblk_t* cblk = track->cblk();
   4512         // Only consider last track started for volume and mixer state control.
   4513         // In theory an older track could underrun and restart after the new one starts
   4514         // but as we only care about the transition phase between two tracks on a
   4515         // direct output, it is not a problem to ignore the underrun case.
   4516         sp<Track> l = mLatestActiveTrack.promote();
   4517         bool last = l.get() == track;
   4518 
   4519         if (track->isInvalid()) {
   4520             ALOGW("An invalidated track shouldn't be in active list");
   4521             tracksToRemove->add(track);
   4522             continue;
   4523         }
   4524 
   4525         if (track->mState == TrackBase::IDLE) {
   4526             ALOGW("An idle track shouldn't be in active list");
   4527             continue;
   4528         }
   4529 
   4530         if (track->isPausing()) {
   4531             track->setPaused();
   4532             if (last) {
   4533                 if (!mHwPaused) {
   4534                     doHwPause = true;
   4535                     mHwPaused = true;
   4536                 }
   4537                 // If we were part way through writing the mixbuffer to
   4538                 // the HAL we must save this until we resume
   4539                 // BUG - this will be wrong if a different track is made active,
   4540                 // in that case we want to discard the pending data in the
   4541                 // mixbuffer and tell the client to present it again when the
   4542                 // track is resumed
   4543                 mPausedWriteLength = mCurrentWriteLength;
   4544                 mPausedBytesRemaining = mBytesRemaining;
   4545                 mBytesRemaining = 0;    // stop writing
   4546             }
   4547             tracksToRemove->add(track);
   4548         } else if (track->isFlushPending()) {
   4549             track->flushAck();
   4550             if (last) {
   4551                 mFlushPending = true;
   4552             }
   4553         } else if (track->isResumePending()){
   4554             track->resumeAck();
   4555             if (last) {
   4556                 if (mPausedBytesRemaining) {
   4557                     // Need to continue write that was interrupted
   4558                     mCurrentWriteLength = mPausedWriteLength;
   4559                     mBytesRemaining = mPausedBytesRemaining;
   4560                     mPausedBytesRemaining = 0;
   4561                 }
   4562                 if (mHwPaused) {
   4563                     doHwResume = true;
   4564                     mHwPaused = false;
   4565                     // threadLoop_mix() will handle the case that we need to
   4566                     // resume an interrupted write
   4567                 }
   4568                 // enable write to audio HAL
   4569                 sleepTime = 0;
   4570 
   4571                 // Do not handle new data in this iteration even if track->framesReady()
   4572                 mixerStatus = MIXER_TRACKS_ENABLED;
   4573             }
   4574         }  else if (track->framesReady() && track->isReady() &&
   4575                 !track->isPaused() && !track->isTerminated() && !track->isStopping_2()) {
   4576             ALOGVV("OffloadThread: track %d s=%08x [OK]", track->name(), cblk->mServer);
   4577             if (track->mFillingUpStatus == Track::FS_FILLED) {
   4578                 track->mFillingUpStatus = Track::FS_ACTIVE;
   4579                 // make sure processVolume_l() will apply new volume even if 0
   4580                 mLeftVolFloat = mRightVolFloat = -1.0;
   4581             }
   4582 
   4583             if (last) {
   4584                 sp<Track> previousTrack = mPreviousTrack.promote();
   4585                 if (previousTrack != 0) {
   4586                     if (track != previousTrack.get()) {
   4587                         // Flush any data still being written from last track
   4588                         mBytesRemaining = 0;
   4589                         if (mPausedBytesRemaining) {
   4590                             // Last track was paused so we also need to flush saved
   4591                             // mixbuffer state and invalidate track so that it will
   4592                             // re-submit that unwritten data when it is next resumed
   4593                             mPausedBytesRemaining = 0;
   4594                             // Invalidate is a bit drastic - would be more efficient
   4595                             // to have a flag to tell client that some of the
   4596                             // previously written data was lost
   4597                             previousTrack->invalidate();
   4598                         }
   4599                         // flush data already sent to the DSP if changing audio session as audio
   4600                         // comes from a different source. Also invalidate previous track to force a
   4601                         // seek when resuming.
   4602                         if (previousTrack->sessionId() != track->sessionId()) {
   4603                             previousTrack->invalidate();
   4604                         }
   4605                     }
   4606                 }
   4607                 mPreviousTrack = track;
   4608                 // reset retry count
   4609                 track->mRetryCount = kMaxTrackRetriesOffload;
   4610                 mActiveTrack = t;
   4611                 mixerStatus = MIXER_TRACKS_READY;
   4612             }
   4613         } else {
   4614             ALOGVV("OffloadThread: track %d s=%08x [NOT READY]", track->name(), cblk->mServer);
   4615             if (track->isStopping_1()) {
   4616                 // Hardware buffer can hold a large amount of audio so we must
   4617                 // wait for all current track's data to drain before we say
   4618                 // that the track is stopped.
   4619                 if (mBytesRemaining == 0) {
   4620                     // Only start draining when all data in mixbuffer
   4621                     // has been written
   4622                     ALOGV("OffloadThread: underrun and STOPPING_1 -> draining, STOPPING_2");
   4623                     track->mState = TrackBase::STOPPING_2; // so presentation completes after drain
   4624                     // do not drain if no data was ever sent to HAL (mStandby == true)
   4625                     if (last && !mStandby) {
   4626                         // do not modify drain sequence if we are already draining. This happens
   4627                         // when resuming from pause after drain.
   4628                         if ((mDrainSequence & 1) == 0) {
   4629                             sleepTime = 0;
   4630                             standbyTime = systemTime() + standbyDelay;
   4631                             mixerStatus = MIXER_DRAIN_TRACK;
   4632                             mDrainSequence += 2;
   4633                         }
   4634                         if (mHwPaused) {
   4635                             // It is possible to move from PAUSED to STOPPING_1 without
   4636                             // a resume so we must ensure hardware is running
   4637                             doHwResume = true;
   4638                             mHwPaused = false;
   4639                         }
   4640                     }
   4641                 }
   4642             } else if (track->isStopping_2()) {
   4643                 // Drain has completed or we are in standby, signal presentation complete
   4644                 if (!(mDrainSequence & 1) || !last || mStandby) {
   4645                     track->mState = TrackBase::STOPPED;
   4646                     size_t audioHALFrames =
   4647                             (mOutput->stream->get_latency(mOutput->stream)*mSampleRate) / 1000;
   4648                     size_t framesWritten =
   4649                             mBytesWritten / audio_stream_out_frame_size(mOutput->stream);
   4650                     track->presentationComplete(framesWritten, audioHALFrames);
   4651                     track->reset();
   4652                     tracksToRemove->add(track);
   4653                 }
   4654             } else {
   4655                 // No buffers for this track. Give it a few chances to
   4656                 // fill a buffer, then remove it from active list.
   4657                 if (--(track->mRetryCount) <= 0) {
   4658                     ALOGV("OffloadThread: BUFFER TIMEOUT: remove(%d) from active list",
   4659                           track->name());
   4660                     tracksToRemove->add(track);
   4661                     // indicate to client process that the track was disabled because of underrun;
   4662                     // it will then automatically call start() when data is available
   4663                     android_atomic_or(CBLK_DISABLED, &cblk->mFlags);
   4664                 } else if (last){
   4665                     mixerStatus = MIXER_TRACKS_ENABLED;
   4666                 }
   4667             }
   4668         }
   4669         // compute volume for this track
   4670         processVolume_l(track, last);
   4671     }
   4672 
   4673     // make sure the pause/flush/resume sequence is executed in the right order.
   4674     // If a flush is pending and a track is active but the HW is not paused, force a HW pause
   4675     // before flush and then resume HW. This can happen in case of pause/flush/resume
   4676     // if resume is received before pause is executed.
   4677     if (!mStandby && (doHwPause || (mFlushPending && !mHwPaused && (count != 0)))) {
   4678         mOutput->stream->pause(mOutput->stream);
   4679     }
   4680     if (mFlushPending) {
   4681         flushHw_l();
   4682         mFlushPending = false;
   4683     }
   4684     if (!mStandby && doHwResume) {
   4685         mOutput->stream->resume(mOutput->stream);
   4686     }
   4687 
   4688     // remove all the tracks that need to be...
   4689     removeTracks_l(*tracksToRemove);
   4690 
   4691     return mixerStatus;
   4692 }
   4693 
   4694 // must be called with thread mutex locked
   4695 bool AudioFlinger::OffloadThread::waitingAsyncCallback_l()
   4696 {
   4697     ALOGVV("waitingAsyncCallback_l mWriteAckSequence %d mDrainSequence %d",
   4698           mWriteAckSequence, mDrainSequence);
   4699     if (mUseAsyncWrite && ((mWriteAckSequence & 1) || (mDrainSequence & 1))) {
   4700         return true;
   4701     }
   4702     return false;
   4703 }
   4704 
   4705 bool AudioFlinger::OffloadThread::waitingAsyncCallback()
   4706 {
   4707     Mutex::Autolock _l(mLock);
   4708     return waitingAsyncCallback_l();
   4709 }
   4710 
   4711 void AudioFlinger::OffloadThread::flushHw_l()
   4712 {
   4713     DirectOutputThread::flushHw_l();
   4714     // Flush anything still waiting in the mixbuffer
   4715     mCurrentWriteLength = 0;
   4716     mBytesRemaining = 0;
   4717     mPausedWriteLength = 0;
   4718     mPausedBytesRemaining = 0;
   4719 
   4720     if (mUseAsyncWrite) {
   4721         // discard any pending drain or write ack by incrementing sequence
   4722         mWriteAckSequence = (mWriteAckSequence + 2) & ~1;
   4723         mDrainSequence = (mDrainSequence + 2) & ~1;
   4724         ALOG_ASSERT(mCallbackThread != 0);
   4725         mCallbackThread->setWriteBlocked(mWriteAckSequence);
   4726         mCallbackThread->setDraining(mDrainSequence);
   4727     }
   4728 }
   4729 
   4730 void AudioFlinger::OffloadThread::onAddNewTrack_l()
   4731 {
   4732     sp<Track> previousTrack = mPreviousTrack.promote();
   4733     sp<Track> latestTrack = mLatestActiveTrack.promote();
   4734 
   4735     if (previousTrack != 0 && latestTrack != 0 &&
   4736         (previousTrack->sessionId() != latestTrack->sessionId())) {
   4737         mFlushPending = true;
   4738     }
   4739     PlaybackThread::onAddNewTrack_l();
   4740 }
   4741 
   4742 // ----------------------------------------------------------------------------
   4743 
   4744 AudioFlinger::DuplicatingThread::DuplicatingThread(const sp<AudioFlinger>& audioFlinger,
   4745         AudioFlinger::MixerThread* mainThread, audio_io_handle_t id)
   4746     :   MixerThread(audioFlinger, mainThread->getOutput(), id, mainThread->outDevice(),
   4747                 DUPLICATING),
   4748         mWaitTimeMs(UINT_MAX)
   4749 {
   4750     addOutputTrack(mainThread);
   4751 }
   4752 
   4753 AudioFlinger::DuplicatingThread::~DuplicatingThread()
   4754 {
   4755     for (size_t i = 0; i < mOutputTracks.size(); i++) {
   4756         mOutputTracks[i]->destroy();
   4757     }
   4758 }
   4759 
   4760 void AudioFlinger::DuplicatingThread::threadLoop_mix()
   4761 {
   4762     // mix buffers...
   4763     if (outputsReady(outputTracks)) {
   4764         mAudioMixer->process(AudioBufferProvider::kInvalidPTS);
   4765     } else {
   4766         if (mMixerBufferValid) {
   4767             memset(mMixerBuffer, 0, mMixerBufferSize);
   4768         } else {
   4769             memset(mSinkBuffer, 0, mSinkBufferSize);
   4770         }
   4771     }
   4772     sleepTime = 0;
   4773     writeFrames = mNormalFrameCount;
   4774     mCurrentWriteLength = mSinkBufferSize;
   4775     standbyTime = systemTime() + standbyDelay;
   4776 }
   4777 
   4778 void AudioFlinger::DuplicatingThread::threadLoop_sleepTime()
   4779 {
   4780     if (sleepTime == 0) {
   4781         if (mMixerStatus == MIXER_TRACKS_ENABLED) {
   4782             sleepTime = activeSleepTime;
   4783         } else {
   4784             sleepTime = idleSleepTime;
   4785         }
   4786     } else if (mBytesWritten != 0) {
   4787         if (mMixerStatus == MIXER_TRACKS_ENABLED) {
   4788             writeFrames = mNormalFrameCount;
   4789             memset(mSinkBuffer, 0, mSinkBufferSize);
   4790         } else {
   4791             // flush remaining overflow buffers in output tracks
   4792             writeFrames = 0;
   4793         }
   4794         sleepTime = 0;
   4795     }
   4796 }
   4797 
   4798 ssize_t AudioFlinger::DuplicatingThread::threadLoop_write()
   4799 {
   4800     // We convert the duplicating thread format to AUDIO_FORMAT_PCM_16_BIT
   4801     // for delivery downstream as needed. This in-place conversion is safe as
   4802     // AUDIO_FORMAT_PCM_16_BIT is smaller than any other supported format
   4803     // (AUDIO_FORMAT_PCM_8_BIT is not allowed here).
   4804     if (mFormat != AUDIO_FORMAT_PCM_16_BIT) {
   4805         memcpy_by_audio_format(mSinkBuffer, AUDIO_FORMAT_PCM_16_BIT,
   4806                                mSinkBuffer, mFormat, writeFrames * mChannelCount);
   4807     }
   4808     for (size_t i = 0; i < outputTracks.size(); i++) {
   4809         outputTracks[i]->write(reinterpret_cast<int16_t*>(mSinkBuffer), writeFrames);
   4810     }
   4811     mStandby = false;
   4812     return (ssize_t)mSinkBufferSize;
   4813 }
   4814 
   4815 void AudioFlinger::DuplicatingThread::threadLoop_standby()
   4816 {
   4817     // DuplicatingThread implements standby by stopping all tracks
   4818     for (size_t i = 0; i < outputTracks.size(); i++) {
   4819         outputTracks[i]->stop();
   4820     }
   4821 }
   4822 
   4823 void AudioFlinger::DuplicatingThread::saveOutputTracks()
   4824 {
   4825     outputTracks = mOutputTracks;
   4826 }
   4827 
   4828 void AudioFlinger::DuplicatingThread::clearOutputTracks()
   4829 {
   4830     outputTracks.clear();
   4831 }
   4832 
   4833 void AudioFlinger::DuplicatingThread::addOutputTrack(MixerThread *thread)
   4834 {
   4835     Mutex::Autolock _l(mLock);
   4836     // FIXME explain this formula
   4837     size_t frameCount = (3 * mNormalFrameCount * mSampleRate) / thread->sampleRate();
   4838     // OutputTrack is forced to AUDIO_FORMAT_PCM_16_BIT regardless of mFormat
   4839     // due to current usage case and restrictions on the AudioBufferProvider.
   4840     // Actual buffer conversion is done in threadLoop_write().
   4841     //
   4842     // TODO: This may change in the future, depending on multichannel
   4843     // (and non int16_t*) support on AF::PlaybackThread::OutputTrack
   4844     OutputTrack *outputTrack = new OutputTrack(thread,
   4845                                             this,
   4846                                             mSampleRate,
   4847                                             AUDIO_FORMAT_PCM_16_BIT,
   4848                                             mChannelMask,
   4849                                             frameCount,
   4850                                             IPCThreadState::self()->getCallingUid());
   4851     if (outputTrack->cblk() != NULL) {
   4852         thread->setStreamVolume(AUDIO_STREAM_PATCH, 1.0f);
   4853         mOutputTracks.add(outputTrack);
   4854         ALOGV("addOutputTrack() track %p, on thread %p", outputTrack, thread);
   4855         updateWaitTime_l();
   4856     }
   4857 }
   4858 
   4859 void AudioFlinger::DuplicatingThread::removeOutputTrack(MixerThread *thread)
   4860 {
   4861     Mutex::Autolock _l(mLock);
   4862     for (size_t i = 0; i < mOutputTracks.size(); i++) {
   4863         if (mOutputTracks[i]->thread() == thread) {
   4864             mOutputTracks[i]->destroy();
   4865             mOutputTracks.removeAt(i);
   4866             updateWaitTime_l();
   4867             return;
   4868         }
   4869     }
   4870     ALOGV("removeOutputTrack(): unkonwn thread: %p", thread);
   4871 }
   4872 
   4873 // caller must hold mLock
   4874 void AudioFlinger::DuplicatingThread::updateWaitTime_l()
   4875 {
   4876     mWaitTimeMs = UINT_MAX;
   4877     for (size_t i = 0; i < mOutputTracks.size(); i++) {
   4878         sp<ThreadBase> strong = mOutputTracks[i]->thread().promote();
   4879         if (strong != 0) {
   4880             uint32_t waitTimeMs = (strong->frameCount() * 2 * 1000) / strong->sampleRate();
   4881             if (waitTimeMs < mWaitTimeMs) {
   4882                 mWaitTimeMs = waitTimeMs;
   4883             }
   4884         }
   4885     }
   4886 }
   4887 
   4888 
   4889 bool AudioFlinger::DuplicatingThread::outputsReady(
   4890         const SortedVector< sp<OutputTrack> > &outputTracks)
   4891 {
   4892     for (size_t i = 0; i < outputTracks.size(); i++) {
   4893         sp<ThreadBase> thread = outputTracks[i]->thread().promote();
   4894         if (thread == 0) {
   4895             ALOGW("DuplicatingThread::outputsReady() could not promote thread on output track %p",
   4896                     outputTracks[i].get());
   4897             return false;
   4898         }
   4899         PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
   4900         // see note at standby() declaration
   4901         if (playbackThread->standby() && !playbackThread->isSuspended()) {
   4902             ALOGV("DuplicatingThread output track %p on thread %p Not Ready", outputTracks[i].get(),
   4903                     thread.get());
   4904             return false;
   4905         }
   4906     }
   4907     return true;
   4908 }
   4909 
   4910 uint32_t AudioFlinger::DuplicatingThread::activeSleepTimeUs() const
   4911 {
   4912     return (mWaitTimeMs * 1000) / 2;
   4913 }
   4914 
   4915 void AudioFlinger::DuplicatingThread::cacheParameters_l()
   4916 {
   4917     // updateWaitTime_l() sets mWaitTimeMs, which affects activeSleepTimeUs(), so call it first
   4918     updateWaitTime_l();
   4919 
   4920     MixerThread::cacheParameters_l();
   4921 }
   4922 
   4923 // ----------------------------------------------------------------------------
   4924 //      Record
   4925 // ----------------------------------------------------------------------------
   4926 
   4927 AudioFlinger::RecordThread::RecordThread(const sp<AudioFlinger>& audioFlinger,
   4928                                          AudioStreamIn *input,
   4929                                          audio_io_handle_t id,
   4930                                          audio_devices_t outDevice,
   4931                                          audio_devices_t inDevice
   4932 #ifdef TEE_SINK
   4933                                          , const sp<NBAIO_Sink>& teeSink
   4934 #endif
   4935                                          ) :
   4936     ThreadBase(audioFlinger, id, outDevice, inDevice, RECORD),
   4937     mInput(input), mActiveTracksGen(0), mRsmpInBuffer(NULL),
   4938     // mRsmpInFrames and mRsmpInFramesP2 are set by readInputParameters_l()
   4939     mRsmpInRear(0)
   4940 #ifdef TEE_SINK
   4941     , mTeeSink(teeSink)
   4942 #endif
   4943     , mReadOnlyHeap(new MemoryDealer(kRecordThreadReadOnlyHeapSize,
   4944             "RecordThreadRO", MemoryHeapBase::READ_ONLY))
   4945     // mFastCapture below
   4946     , mFastCaptureFutex(0)
   4947     // mInputSource
   4948     // mPipeSink
   4949     // mPipeSource
   4950     , mPipeFramesP2(0)
   4951     // mPipeMemory
   4952     // mFastCaptureNBLogWriter
   4953     , mFastTrackAvail(false)
   4954 {
   4955     snprintf(mName, kNameLength, "AudioIn_%X", id);
   4956     mNBLogWriter = audioFlinger->newWriter_l(kLogSize, mName);
   4957 
   4958     readInputParameters_l();
   4959 
   4960     // create an NBAIO source for the HAL input stream, and negotiate
   4961     mInputSource = new AudioStreamInSource(input->stream);
   4962     size_t numCounterOffers = 0;
   4963     const NBAIO_Format offers[1] = {Format_from_SR_C(mSampleRate, mChannelCount, mFormat)};
   4964     ssize_t index = mInputSource->negotiate(offers, 1, NULL, numCounterOffers);
   4965     ALOG_ASSERT(index == 0);
   4966 
   4967     // initialize fast capture depending on configuration
   4968     bool initFastCapture;
   4969     switch (kUseFastCapture) {
   4970     case FastCapture_Never:
   4971         initFastCapture = false;
   4972         break;
   4973     case FastCapture_Always:
   4974         initFastCapture = true;
   4975         break;
   4976     case FastCapture_Static:
   4977         uint32_t primaryOutputSampleRate;
   4978         {
   4979             AutoMutex _l(audioFlinger->mHardwareLock);
   4980             primaryOutputSampleRate = audioFlinger->mPrimaryOutputSampleRate;
   4981         }
   4982         initFastCapture =
   4983                 // either capture sample rate is same as (a reasonable) primary output sample rate
   4984                 (((primaryOutputSampleRate == 44100 || primaryOutputSampleRate == 48000) &&
   4985                     (mSampleRate == primaryOutputSampleRate)) ||
   4986                 // or primary output sample rate is unknown, and capture sample rate is reasonable
   4987                 ((primaryOutputSampleRate == 0) &&
   4988                     ((mSampleRate == 44100 || mSampleRate == 48000)))) &&
   4989                 // and the buffer size is < 12 ms
   4990                 (mFrameCount * 1000) / mSampleRate < 12;
   4991         break;
   4992     // case FastCapture_Dynamic:
   4993     }
   4994 
   4995     if (initFastCapture) {
   4996         // create a Pipe for FastMixer to write to, and for us and fast tracks to read from
   4997         NBAIO_Format format = mInputSource->format();
   4998         size_t pipeFramesP2 = roundup(mSampleRate / 25);    // double-buffering of 20 ms each
   4999         size_t pipeSize = pipeFramesP2 * Format_frameSize(format);
   5000         void *pipeBuffer;
   5001         const sp<MemoryDealer> roHeap(readOnlyHeap());
   5002         sp<IMemory> pipeMemory;
   5003         if ((roHeap == 0) ||
   5004                 (pipeMemory = roHeap->allocate(pipeSize)) == 0 ||
   5005                 (pipeBuffer = pipeMemory->pointer()) == NULL) {
   5006             ALOGE("not enough memory for pipe buffer size=%zu", pipeSize);
   5007             goto failed;
   5008         }
   5009         // pipe will be shared directly with fast clients, so clear to avoid leaking old information
   5010         memset(pipeBuffer, 0, pipeSize);
   5011         Pipe *pipe = new Pipe(pipeFramesP2, format, pipeBuffer);
   5012         const NBAIO_Format offers[1] = {format};
   5013         size_t numCounterOffers = 0;
   5014         ssize_t index = pipe->negotiate(offers, 1, NULL, numCounterOffers);
   5015         ALOG_ASSERT(index == 0);
   5016         mPipeSink = pipe;
   5017         PipeReader *pipeReader = new PipeReader(*pipe);
   5018         numCounterOffers = 0;
   5019         index = pipeReader->negotiate(offers, 1, NULL, numCounterOffers);
   5020         ALOG_ASSERT(index == 0);
   5021         mPipeSource = pipeReader;
   5022         mPipeFramesP2 = pipeFramesP2;
   5023         mPipeMemory = pipeMemory;
   5024 
   5025         // create fast capture
   5026         mFastCapture = new FastCapture();
   5027         FastCaptureStateQueue *sq = mFastCapture->sq();
   5028 #ifdef STATE_QUEUE_DUMP
   5029         // FIXME
   5030 #endif
   5031         FastCaptureState *state = sq->begin();
   5032         state->mCblk = NULL;
   5033         state->mInputSource = mInputSource.get();
   5034         state->mInputSourceGen++;
   5035         state->mPipeSink = pipe;
   5036         state->mPipeSinkGen++;
   5037         state->mFrameCount = mFrameCount;
   5038         state->mCommand = FastCaptureState::COLD_IDLE;
   5039         // already done in constructor initialization list
   5040         //mFastCaptureFutex = 0;
   5041         state->mColdFutexAddr = &mFastCaptureFutex;
   5042         state->mColdGen++;
   5043         state->mDumpState = &mFastCaptureDumpState;
   5044 #ifdef TEE_SINK
   5045         // FIXME
   5046 #endif
   5047         mFastCaptureNBLogWriter = audioFlinger->newWriter_l(kFastCaptureLogSize, "FastCapture");
   5048         state->mNBLogWriter = mFastCaptureNBLogWriter.get();
   5049         sq->end();
   5050         sq->push(FastCaptureStateQueue::BLOCK_UNTIL_PUSHED);
   5051 
   5052         // start the fast capture
   5053         mFastCapture->run("FastCapture", ANDROID_PRIORITY_URGENT_AUDIO);
   5054         pid_t tid = mFastCapture->getTid();
   5055         int err = requestPriority(getpid_cached, tid, kPriorityFastMixer);
   5056         if (err != 0) {
   5057             ALOGW("Policy SCHED_FIFO priority %d is unavailable for pid %d tid %d; error %d",
   5058                     kPriorityFastCapture, getpid_cached, tid, err);
   5059         }
   5060 
   5061 #ifdef AUDIO_WATCHDOG
   5062         // FIXME
   5063 #endif
   5064 
   5065         mFastTrackAvail = true;
   5066     }
   5067 failed: ;
   5068 
   5069     // FIXME mNormalSource
   5070 }
   5071 
   5072 
   5073 AudioFlinger::RecordThread::~RecordThread()
   5074 {
   5075     if (mFastCapture != 0) {
   5076         FastCaptureStateQueue *sq = mFastCapture->sq();
   5077         FastCaptureState *state = sq->begin();
   5078         if (state->mCommand == FastCaptureState::COLD_IDLE) {
   5079             int32_t old = android_atomic_inc(&mFastCaptureFutex);
   5080             if (old == -1) {
   5081                 (void) syscall(__NR_futex, &mFastCaptureFutex, FUTEX_WAKE_PRIVATE, 1);
   5082             }
   5083         }
   5084         state->mCommand = FastCaptureState::EXIT;
   5085         sq->end();
   5086         sq->push(FastCaptureStateQueue::BLOCK_UNTIL_PUSHED);
   5087         mFastCapture->join();
   5088         mFastCapture.clear();
   5089     }
   5090     mAudioFlinger->unregisterWriter(mFastCaptureNBLogWriter);
   5091     mAudioFlinger->unregisterWriter(mNBLogWriter);
   5092     delete[] mRsmpInBuffer;
   5093 }
   5094 
   5095 void AudioFlinger::RecordThread::onFirstRef()
   5096 {
   5097     run(mName, PRIORITY_URGENT_AUDIO);
   5098 }
   5099 
   5100 bool AudioFlinger::RecordThread::threadLoop()
   5101 {
   5102     nsecs_t lastWarning = 0;
   5103 
   5104     inputStandBy();
   5105 
   5106 reacquire_wakelock:
   5107     sp<RecordTrack> activeTrack;
   5108     int activeTracksGen;
   5109     {
   5110         Mutex::Autolock _l(mLock);
   5111         size_t size = mActiveTracks.size();
   5112         activeTracksGen = mActiveTracksGen;
   5113         if (size > 0) {
   5114             // FIXME an arbitrary choice
   5115             activeTrack = mActiveTracks[0];
   5116             acquireWakeLock_l(activeTrack->uid());
   5117             if (size > 1) {
   5118                 SortedVector<int> tmp;
   5119                 for (size_t i = 0; i < size; i++) {
   5120                     tmp.add(mActiveTracks[i]->uid());
   5121                 }
   5122                 updateWakeLockUids_l(tmp);
   5123             }
   5124         } else {
   5125             acquireWakeLock_l(-1);
   5126         }
   5127     }
   5128 
   5129     // used to request a deferred sleep, to be executed later while mutex is unlocked
   5130     uint32_t sleepUs = 0;
   5131 
   5132     // loop while there is work to do
   5133     for (;;) {
   5134         Vector< sp<EffectChain> > effectChains;
   5135 
   5136         // sleep with mutex unlocked
   5137         if (sleepUs > 0) {
   5138             usleep(sleepUs);
   5139             sleepUs = 0;
   5140         }
   5141 
   5142         // activeTracks accumulates a copy of a subset of mActiveTracks
   5143         Vector< sp<RecordTrack> > activeTracks;
   5144 
   5145         // reference to the (first and only) active fast track
   5146         sp<RecordTrack> fastTrack;
   5147 
   5148         // reference to a fast track which is about to be removed
   5149         sp<RecordTrack> fastTrackToRemove;
   5150 
   5151         { // scope for mLock
   5152             Mutex::Autolock _l(mLock);
   5153 
   5154             processConfigEvents_l();
   5155 
   5156             // check exitPending here because checkForNewParameters_l() and
   5157             // checkForNewParameters_l() can temporarily release mLock
   5158             if (exitPending()) {
   5159                 break;
   5160             }
   5161 
   5162             // if no active track(s), then standby and release wakelock
   5163             size_t size = mActiveTracks.size();
   5164             if (size == 0) {
   5165                 standbyIfNotAlreadyInStandby();
   5166                 // exitPending() can't become true here
   5167                 releaseWakeLock_l();
   5168                 ALOGV("RecordThread: loop stopping");
   5169                 // go to sleep
   5170                 mWaitWorkCV.wait(mLock);
   5171                 ALOGV("RecordThread: loop starting");
   5172                 goto reacquire_wakelock;
   5173             }
   5174 
   5175             if (mActiveTracksGen != activeTracksGen) {
   5176                 activeTracksGen = mActiveTracksGen;
   5177                 SortedVector<int> tmp;
   5178                 for (size_t i = 0; i < size; i++) {
   5179                     tmp.add(mActiveTracks[i]->uid());
   5180                 }
   5181                 updateWakeLockUids_l(tmp);
   5182             }
   5183 
   5184             bool doBroadcast = false;
   5185             for (size_t i = 0; i < size; ) {
   5186 
   5187                 activeTrack = mActiveTracks[i];
   5188                 if (activeTrack->isTerminated()) {
   5189                     if (activeTrack->isFastTrack()) {
   5190                         ALOG_ASSERT(fastTrackToRemove == 0);
   5191                         fastTrackToRemove = activeTrack;
   5192                     }
   5193                     removeTrack_l(activeTrack);
   5194                     mActiveTracks.remove(activeTrack);
   5195                     mActiveTracksGen++;
   5196                     size--;
   5197                     continue;
   5198                 }
   5199 
   5200                 TrackBase::track_state activeTrackState = activeTrack->mState;
   5201                 switch (activeTrackState) {
   5202 
   5203                 case TrackBase::PAUSING:
   5204                     mActiveTracks.remove(activeTrack);
   5205                     mActiveTracksGen++;
   5206                     doBroadcast = true;
   5207                     size--;
   5208                     continue;
   5209 
   5210                 case TrackBase::STARTING_1:
   5211                     sleepUs = 10000;
   5212                     i++;
   5213                     continue;
   5214 
   5215                 case TrackBase::STARTING_2:
   5216                     doBroadcast = true;
   5217                     mStandby = false;
   5218                     activeTrack->mState = TrackBase::ACTIVE;
   5219                     break;
   5220 
   5221                 case TrackBase::ACTIVE:
   5222                     break;
   5223 
   5224                 case TrackBase::IDLE:
   5225                     i++;
   5226                     continue;
   5227 
   5228                 default:
   5229                     LOG_ALWAYS_FATAL("Unexpected activeTrackState %d", activeTrackState);
   5230                 }
   5231 
   5232                 activeTracks.add(activeTrack);
   5233                 i++;
   5234 
   5235                 if (activeTrack->isFastTrack()) {
   5236                     ALOG_ASSERT(!mFastTrackAvail);
   5237                     ALOG_ASSERT(fastTrack == 0);
   5238                     fastTrack = activeTrack;
   5239                 }
   5240             }
   5241             if (doBroadcast) {
   5242                 mStartStopCond.broadcast();
   5243             }
   5244 
   5245             // sleep if there are no active tracks to process
   5246             if (activeTracks.size() == 0) {
   5247                 if (sleepUs == 0) {
   5248                     sleepUs = kRecordThreadSleepUs;
   5249                 }
   5250                 continue;
   5251             }
   5252             sleepUs = 0;
   5253 
   5254             lockEffectChains_l(effectChains);
   5255         }
   5256 
   5257         // thread mutex is now unlocked, mActiveTracks unknown, activeTracks.size() > 0
   5258 
   5259         size_t size = effectChains.size();
   5260         for (size_t i = 0; i < size; i++) {
   5261             // thread mutex is not locked, but effect chain is locked
   5262             effectChains[i]->process_l();
   5263         }
   5264 
   5265         // Push a new fast capture state if fast capture is not already running, or cblk change
   5266         if (mFastCapture != 0) {
   5267             FastCaptureStateQueue *sq = mFastCapture->sq();
   5268             FastCaptureState *state = sq->begin();
   5269             bool didModify = false;
   5270             FastCaptureStateQueue::block_t block = FastCaptureStateQueue::BLOCK_UNTIL_PUSHED;
   5271             if (state->mCommand != FastCaptureState::READ_WRITE /* FIXME &&
   5272                     (kUseFastMixer != FastMixer_Dynamic || state->mTrackMask > 1)*/) {
   5273                 if (state->mCommand == FastCaptureState::COLD_IDLE) {
   5274                     int32_t old = android_atomic_inc(&mFastCaptureFutex);
   5275                     if (old == -1) {
   5276                         (void) syscall(__NR_futex, &mFastCaptureFutex, FUTEX_WAKE_PRIVATE, 1);
   5277                     }
   5278                 }
   5279                 state->mCommand = FastCaptureState::READ_WRITE;
   5280 #if 0   // FIXME
   5281                 mFastCaptureDumpState.increaseSamplingN(mAudioFlinger->isLowRamDevice() ?
   5282                         FastCaptureDumpState::kSamplingNforLowRamDevice : FastMixerDumpState::kSamplingN);
   5283 #endif
   5284                 didModify = true;
   5285             }
   5286             audio_track_cblk_t *cblkOld = state->mCblk;
   5287             audio_track_cblk_t *cblkNew = fastTrack != 0 ? fastTrack->cblk() : NULL;
   5288             if (cblkNew != cblkOld) {
   5289                 state->mCblk = cblkNew;
   5290                 // block until acked if removing a fast track
   5291                 if (cblkOld != NULL) {
   5292                     block = FastCaptureStateQueue::BLOCK_UNTIL_ACKED;
   5293                 }
   5294                 didModify = true;
   5295             }
   5296             sq->end(didModify);
   5297             if (didModify) {
   5298                 sq->push(block);
   5299 #if 0
   5300                 if (kUseFastCapture == FastCapture_Dynamic) {
   5301                     mNormalSource = mPipeSource;
   5302                 }
   5303 #endif
   5304             }
   5305         }
   5306 
   5307         // now run the fast track destructor with thread mutex unlocked
   5308         fastTrackToRemove.clear();
   5309 
   5310         // Read from HAL to keep up with fastest client if multiple active tracks, not slowest one.
   5311         // Only the client(s) that are too slow will overrun. But if even the fastest client is too
   5312         // slow, then this RecordThread will overrun by not calling HAL read often enough.
   5313         // If destination is non-contiguous, first read past the nominal end of buffer, then
   5314         // copy to the right place.  Permitted because mRsmpInBuffer was over-allocated.
   5315 
   5316         int32_t rear = mRsmpInRear & (mRsmpInFramesP2 - 1);
   5317         ssize_t framesRead;
   5318 
   5319         // If an NBAIO source is present, use it to read the normal capture's data
   5320         if (mPipeSource != 0) {
   5321             size_t framesToRead = mBufferSize / mFrameSize;
   5322             framesRead = mPipeSource->read(&mRsmpInBuffer[rear * mChannelCount],
   5323                     framesToRead, AudioBufferProvider::kInvalidPTS);
   5324             if (framesRead == 0) {
   5325                 // since pipe is non-blocking, simulate blocking input
   5326                 sleepUs = (framesToRead * 1000000LL) / mSampleRate;
   5327             }
   5328         // otherwise use the HAL / AudioStreamIn directly
   5329         } else {
   5330             ssize_t bytesRead = mInput->stream->read(mInput->stream,
   5331                     &mRsmpInBuffer[rear * mChannelCount], mBufferSize);
   5332             if (bytesRead < 0) {
   5333                 framesRead = bytesRead;
   5334             } else {
   5335                 framesRead = bytesRead / mFrameSize;
   5336             }
   5337         }
   5338 
   5339         if (framesRead < 0 || (framesRead == 0 && mPipeSource == 0)) {
   5340             ALOGE("read failed: framesRead=%d", framesRead);
   5341             // Force input into standby so that it tries to recover at next read attempt
   5342             inputStandBy();
   5343             sleepUs = kRecordThreadSleepUs;
   5344         }
   5345         if (framesRead <= 0) {
   5346             goto unlock;
   5347         }
   5348         ALOG_ASSERT(framesRead > 0);
   5349 
   5350         if (mTeeSink != 0) {
   5351             (void) mTeeSink->write(&mRsmpInBuffer[rear * mChannelCount], framesRead);
   5352         }
   5353         // If destination is non-contiguous, we now correct for reading past end of buffer.
   5354         {
   5355             size_t part1 = mRsmpInFramesP2 - rear;
   5356             if ((size_t) framesRead > part1) {
   5357                 memcpy(mRsmpInBuffer, &mRsmpInBuffer[mRsmpInFramesP2 * mChannelCount],
   5358                         (framesRead - part1) * mFrameSize);
   5359             }
   5360         }
   5361         rear = mRsmpInRear += framesRead;
   5362 
   5363         size = activeTracks.size();
   5364         // loop over each active track
   5365         for (size_t i = 0; i < size; i++) {
   5366             activeTrack = activeTracks[i];
   5367 
   5368             // skip fast tracks, as those are handled directly by FastCapture
   5369             if (activeTrack->isFastTrack()) {
   5370                 continue;
   5371             }
   5372 
   5373             enum {
   5374                 OVERRUN_UNKNOWN,
   5375                 OVERRUN_TRUE,
   5376                 OVERRUN_FALSE
   5377             } overrun = OVERRUN_UNKNOWN;
   5378 
   5379             // loop over getNextBuffer to handle circular sink
   5380             for (;;) {
   5381 
   5382                 activeTrack->mSink.frameCount = ~0;
   5383                 status_t status = activeTrack->getNextBuffer(&activeTrack->mSink);
   5384                 size_t framesOut = activeTrack->mSink.frameCount;
   5385                 LOG_ALWAYS_FATAL_IF((status == OK) != (framesOut > 0));
   5386 
   5387                 int32_t front = activeTrack->mRsmpInFront;
   5388                 ssize_t filled = rear - front;
   5389                 size_t framesIn;
   5390 
   5391                 if (filled < 0) {
   5392                     // should not happen, but treat like a massive overrun and re-sync
   5393                     framesIn = 0;
   5394                     activeTrack->mRsmpInFront = rear;
   5395                     overrun = OVERRUN_TRUE;
   5396                 } else if ((size_t) filled <= mRsmpInFrames) {
   5397                     framesIn = (size_t) filled;
   5398                 } else {
   5399                     // client is not keeping up with server, but give it latest data
   5400                     framesIn = mRsmpInFrames;
   5401                     activeTrack->mRsmpInFront = front = rear - framesIn;
   5402                     overrun = OVERRUN_TRUE;
   5403                 }
   5404 
   5405                 if (framesOut == 0 || framesIn == 0) {
   5406                     break;
   5407                 }
   5408 
   5409                 if (activeTrack->mResampler == NULL) {
   5410                     // no resampling
   5411                     if (framesIn > framesOut) {
   5412                         framesIn = framesOut;
   5413                     } else {
   5414                         framesOut = framesIn;
   5415                     }
   5416                     int8_t *dst = activeTrack->mSink.i8;
   5417                     while (framesIn > 0) {
   5418                         front &= mRsmpInFramesP2 - 1;
   5419                         size_t part1 = mRsmpInFramesP2 - front;
   5420                         if (part1 > framesIn) {
   5421                             part1 = framesIn;
   5422                         }
   5423                         int8_t *src = (int8_t *)mRsmpInBuffer + (front * mFrameSize);
   5424                         if (mChannelCount == activeTrack->mChannelCount) {
   5425                             memcpy(dst, src, part1 * mFrameSize);
   5426                         } else if (mChannelCount == 1) {
   5427                             upmix_to_stereo_i16_from_mono_i16((int16_t *)dst, (const int16_t *)src,
   5428                                     part1);
   5429                         } else {
   5430                             downmix_to_mono_i16_from_stereo_i16((int16_t *)dst, (const int16_t *)src,
   5431                                     part1);
   5432                         }
   5433                         dst += part1 * activeTrack->mFrameSize;
   5434                         front += part1;
   5435                         framesIn -= part1;
   5436                     }
   5437                     activeTrack->mRsmpInFront += framesOut;
   5438 
   5439                 } else {
   5440                     // resampling
   5441                     // FIXME framesInNeeded should really be part of resampler API, and should
   5442                     //       depend on the SRC ratio
   5443                     //       to keep mRsmpInBuffer full so resampler always has sufficient input
   5444                     size_t framesInNeeded;
   5445                     // FIXME only re-calculate when it changes, and optimize for common ratios
   5446                     // Do not precompute in/out because floating point is not associative
   5447                     // e.g. a*b/c != a*(b/c).
   5448                     const double in(mSampleRate);
   5449                     const double out(activeTrack->mSampleRate);
   5450                     framesInNeeded = ceil(framesOut * in / out) + 1;
   5451                     ALOGV("need %u frames in to produce %u out given in/out ratio of %.4g",
   5452                                 framesInNeeded, framesOut, in / out);
   5453                     // Although we theoretically have framesIn in circular buffer, some of those are
   5454                     // unreleased frames, and thus must be discounted for purpose of budgeting.
   5455                     size_t unreleased = activeTrack->mRsmpInUnrel;
   5456                     framesIn = framesIn > unreleased ? framesIn - unreleased : 0;
   5457                     if (framesIn < framesInNeeded) {
   5458                         ALOGV("not enough to resample: have %u frames in but need %u in to "
   5459                                 "produce %u out given in/out ratio of %.4g",
   5460                                 framesIn, framesInNeeded, framesOut, in / out);
   5461                         size_t newFramesOut = framesIn > 0 ? floor((framesIn - 1) * out / in) : 0;
   5462                         LOG_ALWAYS_FATAL_IF(newFramesOut >= framesOut);
   5463                         if (newFramesOut == 0) {
   5464                             break;
   5465                         }
   5466                         framesInNeeded = ceil(newFramesOut * in / out) + 1;
   5467                         ALOGV("now need %u frames in to produce %u out given out/in ratio of %.4g",
   5468                                 framesInNeeded, newFramesOut, out / in);
   5469                         LOG_ALWAYS_FATAL_IF(framesIn < framesInNeeded);
   5470                         ALOGV("success 2: have %u frames in and need %u in to produce %u out "
   5471                               "given in/out ratio of %.4g",
   5472                               framesIn, framesInNeeded, newFramesOut, in / out);
   5473                         framesOut = newFramesOut;
   5474                     } else {
   5475                         ALOGV("success 1: have %u in and need %u in to produce %u out "
   5476                             "given in/out ratio of %.4g",
   5477                             framesIn, framesInNeeded, framesOut, in / out);
   5478                     }
   5479 
   5480                     // reallocate mRsmpOutBuffer as needed; we will grow but never shrink
   5481                     if (activeTrack->mRsmpOutFrameCount < framesOut) {
   5482                         // FIXME why does each track need it's own mRsmpOutBuffer? can't they share?
   5483                         delete[] activeTrack->mRsmpOutBuffer;
   5484                         // resampler always outputs stereo
   5485                         activeTrack->mRsmpOutBuffer = new int32_t[framesOut * FCC_2];
   5486                         activeTrack->mRsmpOutFrameCount = framesOut;
   5487                     }
   5488 
   5489                     // resampler accumulates, but we only have one source track
   5490                     memset(activeTrack->mRsmpOutBuffer, 0, framesOut * FCC_2 * sizeof(int32_t));
   5491                     activeTrack->mResampler->resample(activeTrack->mRsmpOutBuffer, framesOut,
   5492                             // FIXME how about having activeTrack implement this interface itself?
   5493                             activeTrack->mResamplerBufferProvider
   5494                             /*this*/ /* AudioBufferProvider* */);
   5495                     // ditherAndClamp() works as long as all buffers returned by
   5496                     // activeTrack->getNextBuffer() are 32 bit aligned which should be always true.
   5497                     if (activeTrack->mChannelCount == 1) {
   5498                         // temporarily type pun mRsmpOutBuffer from Q4.27 to int16_t
   5499                         ditherAndClamp(activeTrack->mRsmpOutBuffer, activeTrack->mRsmpOutBuffer,
   5500                                 framesOut);
   5501                         // the resampler always outputs stereo samples:
   5502                         // do post stereo to mono conversion
   5503                         downmix_to_mono_i16_from_stereo_i16(activeTrack->mSink.i16,
   5504                                 (const int16_t *)activeTrack->mRsmpOutBuffer, framesOut);
   5505                     } else {
   5506                         ditherAndClamp((int32_t *)activeTrack->mSink.raw,
   5507                                 activeTrack->mRsmpOutBuffer, framesOut);
   5508                     }
   5509                     // now done with mRsmpOutBuffer
   5510 
   5511                 }
   5512 
   5513                 if (framesOut > 0 && (overrun == OVERRUN_UNKNOWN)) {
   5514                     overrun = OVERRUN_FALSE;
   5515                 }
   5516 
   5517                 if (activeTrack->mFramesToDrop == 0) {
   5518                     if (framesOut > 0) {
   5519                         activeTrack->mSink.frameCount = framesOut;
   5520                         activeTrack->releaseBuffer(&activeTrack->mSink);
   5521                     }
   5522                 } else {
   5523                     // FIXME could do a partial drop of framesOut
   5524                     if (activeTrack->mFramesToDrop > 0) {
   5525                         activeTrack->mFramesToDrop -= framesOut;
   5526                         if (activeTrack->mFramesToDrop <= 0) {
   5527                             activeTrack->clearSyncStartEvent();
   5528                         }
   5529                     } else {
   5530                         activeTrack->mFramesToDrop += framesOut;
   5531                         if (activeTrack->mFramesToDrop >= 0 || activeTrack->mSyncStartEvent == 0 ||
   5532                                 activeTrack->mSyncStartEvent->isCancelled()) {
   5533                             ALOGW("Synced record %s, session %d, trigger session %d",
   5534                                   (activeTrack->mFramesToDrop >= 0) ? "timed out" : "cancelled",
   5535                                   activeTrack->sessionId(),
   5536                                   (activeTrack->mSyncStartEvent != 0) ?
   5537                                           activeTrack->mSyncStartEvent->triggerSession() : 0);
   5538                             activeTrack->clearSyncStartEvent();
   5539                         }
   5540                     }
   5541                 }
   5542 
   5543                 if (framesOut == 0) {
   5544                     break;
   5545                 }
   5546             }
   5547 
   5548             switch (overrun) {
   5549             case OVERRUN_TRUE:
   5550                 // client isn't retrieving buffers fast enough
   5551                 if (!activeTrack->setOverflow()) {
   5552                     nsecs_t now = systemTime();
   5553                     // FIXME should lastWarning per track?
   5554                     if ((now - lastWarning) > kWarningThrottleNs) {
   5555                         ALOGW("RecordThread: buffer overflow");
   5556                         lastWarning = now;
   5557                     }
   5558                 }
   5559                 break;
   5560             case OVERRUN_FALSE:
   5561                 activeTrack->clearOverflow();
   5562                 break;
   5563             case OVERRUN_UNKNOWN:
   5564                 break;
   5565             }
   5566 
   5567         }
   5568 
   5569 unlock:
   5570         // enable changes in effect chain
   5571         unlockEffectChains(effectChains);
   5572         // effectChains doesn't need to be cleared, since it is cleared by destructor at scope end
   5573     }
   5574 
   5575     standbyIfNotAlreadyInStandby();
   5576 
   5577     {
   5578         Mutex::Autolock _l(mLock);
   5579         for (size_t i = 0; i < mTracks.size(); i++) {
   5580             sp<RecordTrack> track = mTracks[i];
   5581             track->invalidate();
   5582         }
   5583         mActiveTracks.clear();
   5584         mActiveTracksGen++;
   5585         mStartStopCond.broadcast();
   5586     }
   5587 
   5588     releaseWakeLock();
   5589 
   5590     ALOGV("RecordThread %p exiting", this);
   5591     return false;
   5592 }
   5593 
   5594 void AudioFlinger::RecordThread::standbyIfNotAlreadyInStandby()
   5595 {
   5596     if (!mStandby) {
   5597         inputStandBy();
   5598         mStandby = true;
   5599     }
   5600 }
   5601 
   5602 void AudioFlinger::RecordThread::inputStandBy()
   5603 {
   5604     // Idle the fast capture if it's currently running
   5605     if (mFastCapture != 0) {
   5606         FastCaptureStateQueue *sq = mFastCapture->sq();
   5607         FastCaptureState *state = sq->begin();
   5608         if (!(state->mCommand & FastCaptureState::IDLE)) {
   5609             state->mCommand = FastCaptureState::COLD_IDLE;
   5610             state->mColdFutexAddr = &mFastCaptureFutex;
   5611             state->mColdGen++;
   5612             mFastCaptureFutex = 0;
   5613             sq->end();
   5614             // BLOCK_UNTIL_PUSHED would be insufficient, as we need it to stop doing I/O now
   5615             sq->push(FastCaptureStateQueue::BLOCK_UNTIL_ACKED);
   5616 #if 0
   5617             if (kUseFastCapture == FastCapture_Dynamic) {
   5618                 // FIXME
   5619             }
   5620 #endif
   5621 #ifdef AUDIO_WATCHDOG
   5622             // FIXME
   5623 #endif
   5624         } else {
   5625             sq->end(false /*didModify*/);
   5626         }
   5627     }
   5628     mInput->stream->common.standby(&mInput->stream->common);
   5629 }
   5630 
   5631 // RecordThread::createRecordTrack_l() must be called with AudioFlinger::mLock held
   5632 sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createRecordTrack_l(
   5633         const sp<AudioFlinger::Client>& client,
   5634         uint32_t sampleRate,
   5635         audio_format_t format,
   5636         audio_channel_mask_t channelMask,
   5637         size_t *pFrameCount,
   5638         int sessionId,
   5639         size_t *notificationFrames,
   5640         int uid,
   5641         IAudioFlinger::track_flags_t *flags,
   5642         pid_t tid,
   5643         status_t *status)
   5644 {
   5645     size_t frameCount = *pFrameCount;
   5646     sp<RecordTrack> track;
   5647     status_t lStatus;
   5648 
   5649     // client expresses a preference for FAST, but we get the final say
   5650     if (*flags & IAudioFlinger::TRACK_FAST) {
   5651       if (
   5652             // use case: callback handler
   5653             (tid != -1) &&
   5654             // frame count is not specified, or is exactly the pipe depth
   5655             ((frameCount == 0) || (frameCount == mPipeFramesP2)) &&
   5656             // PCM data
   5657             audio_is_linear_pcm(format) &&
   5658             // native format
   5659             (format == mFormat) &&
   5660             // native channel mask
   5661             (channelMask == mChannelMask) &&
   5662             // native hardware sample rate
   5663             (sampleRate == mSampleRate) &&
   5664             // record thread has an associated fast capture
   5665             hasFastCapture() &&
   5666             // there are sufficient fast track slots available
   5667             mFastTrackAvail
   5668         ) {
   5669         ALOGV("AUDIO_INPUT_FLAG_FAST accepted: frameCount=%u mFrameCount=%u",
   5670                 frameCount, mFrameCount);
   5671       } else {
   5672         ALOGV("AUDIO_INPUT_FLAG_FAST denied: frameCount=%u mFrameCount=%u mPipeFramesP2=%u "
   5673                 "format=%#x isLinear=%d channelMask=%#x sampleRate=%u mSampleRate=%u "
   5674                 "hasFastCapture=%d tid=%d mFastTrackAvail=%d",
   5675                 frameCount, mFrameCount, mPipeFramesP2,
   5676                 format, audio_is_linear_pcm(format), channelMask, sampleRate, mSampleRate,
   5677                 hasFastCapture(), tid, mFastTrackAvail);
   5678         *flags &= ~IAudioFlinger::TRACK_FAST;
   5679       }
   5680     }
   5681 
   5682     // compute track buffer size in frames, and suggest the notification frame count
   5683     if (*flags & IAudioFlinger::TRACK_FAST) {
   5684         // fast track: frame count is exactly the pipe depth
   5685         frameCount = mPipeFramesP2;
   5686         // ignore requested notificationFrames, and always notify exactly once every HAL buffer
   5687         *notificationFrames = mFrameCount;
   5688     } else {
   5689         // not fast track: max notification period is resampled equivalent of one HAL buffer time
   5690         //                 or 20 ms if there is a fast capture
   5691         // TODO This could be a roundupRatio inline, and const
   5692         size_t maxNotificationFrames = ((int64_t) (hasFastCapture() ? mSampleRate/50 : mFrameCount)
   5693                 * sampleRate + mSampleRate - 1) / mSampleRate;
   5694         // minimum number of notification periods is at least kMinNotifications,
   5695         // and at least kMinMs rounded up to a whole notification period (minNotificationsByMs)
   5696         static const size_t kMinNotifications = 3;
   5697         static const uint32_t kMinMs = 30;
   5698         // TODO This could be a roundupRatio inline
   5699         const size_t minFramesByMs = (sampleRate * kMinMs + 1000 - 1) / 1000;
   5700         // TODO This could be a roundupRatio inline
   5701         const size_t minNotificationsByMs = (minFramesByMs + maxNotificationFrames - 1) /
   5702                 maxNotificationFrames;
   5703         const size_t minFrameCount = maxNotificationFrames *
   5704                 max(kMinNotifications, minNotificationsByMs);
   5705         frameCount = max(frameCount, minFrameCount);
   5706         if (*notificationFrames == 0 || *notificationFrames > maxNotificationFrames) {
   5707             *notificationFrames = maxNotificationFrames;
   5708         }
   5709     }
   5710     *pFrameCount = frameCount;
   5711 
   5712     lStatus = initCheck();
   5713     if (lStatus != NO_ERROR) {
   5714         ALOGE("createRecordTrack_l() audio driver not initialized");
   5715         goto Exit;
   5716     }
   5717 
   5718     { // scope for mLock
   5719         Mutex::Autolock _l(mLock);
   5720 
   5721         track = new RecordTrack(this, client, sampleRate,
   5722                       format, channelMask, frameCount, NULL, sessionId, uid,
   5723                       *flags, TrackBase::TYPE_DEFAULT);
   5724 
   5725         lStatus = track->initCheck();
   5726         if (lStatus != NO_ERROR) {
   5727             ALOGE("createRecordTrack_l() initCheck failed %d; no control block?", lStatus);
   5728             // track must be cleared from the caller as the caller has the AF lock
   5729             goto Exit;
   5730         }
   5731         mTracks.add(track);
   5732 
   5733         // disable AEC and NS if the device is a BT SCO headset supporting those pre processings
   5734         bool suspend = audio_is_bluetooth_sco_device(mInDevice) &&
   5735                         mAudioFlinger->btNrecIsOff();
   5736         setEffectSuspended_l(FX_IID_AEC, suspend, sessionId);
   5737         setEffectSuspended_l(FX_IID_NS, suspend, sessionId);
   5738 
   5739         if ((*flags & IAudioFlinger::TRACK_FAST) && (tid != -1)) {
   5740             pid_t callingPid = IPCThreadState::self()->getCallingPid();
   5741             // we don't have CAP_SYS_NICE, nor do we want to have it as it's too powerful,
   5742             // so ask activity manager to do this on our behalf
   5743             sendPrioConfigEvent_l(callingPid, tid, kPriorityAudioApp);
   5744         }
   5745     }
   5746 
   5747     lStatus = NO_ERROR;
   5748 
   5749 Exit:
   5750     *status = lStatus;
   5751     return track;
   5752 }
   5753 
   5754 status_t AudioFlinger::RecordThread::start(RecordThread::RecordTrack* recordTrack,
   5755                                            AudioSystem::sync_event_t event,
   5756                                            int triggerSession)
   5757 {
   5758     ALOGV("RecordThread::start event %d, triggerSession %d", event, triggerSession);
   5759     sp<ThreadBase> strongMe = this;
   5760     status_t status = NO_ERROR;
   5761 
   5762     if (event == AudioSystem::SYNC_EVENT_NONE) {
   5763         recordTrack->clearSyncStartEvent();
   5764     } else if (event != AudioSystem::SYNC_EVENT_SAME) {
   5765         recordTrack->mSyncStartEvent = mAudioFlinger->createSyncEvent(event,
   5766                                        triggerSession,
   5767                                        recordTrack->sessionId(),
   5768                                        syncStartEventCallback,
   5769                                        recordTrack);
   5770         // Sync event can be cancelled by the trigger session if the track is not in a
   5771         // compatible state in which case we start record immediately
   5772         if (recordTrack->mSyncStartEvent->isCancelled()) {
   5773             recordTrack->clearSyncStartEvent();
   5774         } else {
   5775             // do not wait for the event for more than AudioSystem::kSyncRecordStartTimeOutMs
   5776             recordTrack->mFramesToDrop = -
   5777                     ((AudioSystem::kSyncRecordStartTimeOutMs * recordTrack->mSampleRate) / 1000);
   5778         }
   5779     }
   5780 
   5781     {
   5782         // This section is a rendezvous between binder thread executing start() and RecordThread
   5783         AutoMutex lock(mLock);
   5784         if (mActiveTracks.indexOf(recordTrack) >= 0) {
   5785             if (recordTrack->mState == TrackBase::PAUSING) {
   5786                 ALOGV("active record track PAUSING -> ACTIVE");
   5787                 recordTrack->mState = TrackBase::ACTIVE;
   5788             } else {
   5789                 ALOGV("active record track state %d", recordTrack->mState);
   5790             }
   5791             return status;
   5792         }
   5793 
   5794         // TODO consider other ways of handling this, such as changing the state to :STARTING and
   5795         //      adding the track to mActiveTracks after returning from AudioSystem::startInput(),
   5796         //      or using a separate command thread
   5797         recordTrack->mState = TrackBase::STARTING_1;
   5798         mActiveTracks.add(recordTrack);
   5799         mActiveTracksGen++;
   5800         status_t status = NO_ERROR;
   5801         if (recordTrack->isExternalTrack()) {
   5802             mLock.unlock();
   5803             status = AudioSystem::startInput(mId, (audio_session_t)recordTrack->sessionId());
   5804             mLock.lock();
   5805             // FIXME should verify that recordTrack is still in mActiveTracks
   5806             if (status != NO_ERROR) {
   5807                 mActiveTracks.remove(recordTrack);
   5808                 mActiveTracksGen++;
   5809                 recordTrack->clearSyncStartEvent();
   5810                 ALOGV("RecordThread::start error %d", status);
   5811                 return status;
   5812             }
   5813         }
   5814         // Catch up with current buffer indices if thread is already running.
   5815         // This is what makes a new client discard all buffered data.  If the track's mRsmpInFront
   5816         // was initialized to some value closer to the thread's mRsmpInFront, then the track could
   5817         // see previously buffered data before it called start(), but with greater risk of overrun.
   5818 
   5819         recordTrack->mRsmpInFront = mRsmpInRear;
   5820         recordTrack->mRsmpInUnrel = 0;
   5821         // FIXME why reset?
   5822         if (recordTrack->mResampler != NULL) {
   5823             recordTrack->mResampler->reset();
   5824         }
   5825         recordTrack->mState = TrackBase::STARTING_2;
   5826         // signal thread to start
   5827         mWaitWorkCV.broadcast();
   5828         if (mActiveTracks.indexOf(recordTrack) < 0) {
   5829             ALOGV("Record failed to start");
   5830             status = BAD_VALUE;
   5831             goto startError;
   5832         }
   5833         return status;
   5834     }
   5835 
   5836 startError:
   5837     if (recordTrack->isExternalTrack()) {
   5838         AudioSystem::stopInput(mId, (audio_session_t)recordTrack->sessionId());
   5839     }
   5840     recordTrack->clearSyncStartEvent();
   5841     // FIXME I wonder why we do not reset the state here?
   5842     return status;
   5843 }
   5844 
   5845 void AudioFlinger::RecordThread::syncStartEventCallback(const wp<SyncEvent>& event)
   5846 {
   5847     sp<SyncEvent> strongEvent = event.promote();
   5848 
   5849     if (strongEvent != 0) {
   5850         sp<RefBase> ptr = strongEvent->cookie().promote();
   5851         if (ptr != 0) {
   5852             RecordTrack *recordTrack = (RecordTrack *)ptr.get();
   5853             recordTrack->handleSyncStartEvent(strongEvent);
   5854         }
   5855     }
   5856 }
   5857 
   5858 bool AudioFlinger::RecordThread::stop(RecordThread::RecordTrack* recordTrack) {
   5859     ALOGV("RecordThread::stop");
   5860     AutoMutex _l(mLock);
   5861     if (mActiveTracks.indexOf(recordTrack) != 0 || recordTrack->mState == TrackBase::PAUSING) {
   5862         return false;
   5863     }
   5864     // note that threadLoop may still be processing the track at this point [without lock]
   5865     recordTrack->mState = TrackBase::PAUSING;
   5866     // do not wait for mStartStopCond if exiting
   5867     if (exitPending()) {
   5868         return true;
   5869     }
   5870     // FIXME incorrect usage of wait: no explicit predicate or loop
   5871     mStartStopCond.wait(mLock);
   5872     // if we have been restarted, recordTrack is in mActiveTracks here
   5873     if (exitPending() || mActiveTracks.indexOf(recordTrack) != 0) {
   5874         ALOGV("Record stopped OK");
   5875         return true;
   5876     }
   5877     return false;
   5878 }
   5879 
   5880 bool AudioFlinger::RecordThread::isValidSyncEvent(const sp<SyncEvent>& event __unused) const
   5881 {
   5882     return false;
   5883 }
   5884 
   5885 status_t AudioFlinger::RecordThread::setSyncEvent(const sp<SyncEvent>& event __unused)
   5886 {
   5887 #if 0   // This branch is currently dead code, but is preserved in case it will be needed in future
   5888     if (!isValidSyncEvent(event)) {
   5889         return BAD_VALUE;
   5890     }
   5891 
   5892     int eventSession = event->triggerSession();
   5893     status_t ret = NAME_NOT_FOUND;
   5894 
   5895     Mutex::Autolock _l(mLock);
   5896 
   5897     for (size_t i = 0; i < mTracks.size(); i++) {
   5898         sp<RecordTrack> track = mTracks[i];
   5899         if (eventSession == track->sessionId()) {
   5900             (void) track->setSyncEvent(event);
   5901             ret = NO_ERROR;
   5902         }
   5903     }
   5904     return ret;
   5905 #else
   5906     return BAD_VALUE;
   5907 #endif
   5908 }
   5909 
   5910 // destroyTrack_l() must be called with ThreadBase::mLock held
   5911 void AudioFlinger::RecordThread::destroyTrack_l(const sp<RecordTrack>& track)
   5912 {
   5913     track->terminate();
   5914     track->mState = TrackBase::STOPPED;
   5915     // active tracks are removed by threadLoop()
   5916     if (mActiveTracks.indexOf(track) < 0) {
   5917         removeTrack_l(track);
   5918     }
   5919 }
   5920 
   5921 void AudioFlinger::RecordThread::removeTrack_l(const sp<RecordTrack>& track)
   5922 {
   5923     mTracks.remove(track);
   5924     // need anything related to effects here?
   5925     if (track->isFastTrack()) {
   5926         ALOG_ASSERT(!mFastTrackAvail);
   5927         mFastTrackAvail = true;
   5928     }
   5929 }
   5930 
   5931 void AudioFlinger::RecordThread::dump(int fd, const Vector<String16>& args)
   5932 {
   5933     dumpInternals(fd, args);
   5934     dumpTracks(fd, args);
   5935     dumpEffectChains(fd, args);
   5936 }
   5937 
   5938 void AudioFlinger::RecordThread::dumpInternals(int fd, const Vector<String16>& args)
   5939 {
   5940     dprintf(fd, "\nInput thread %p:\n", this);
   5941 
   5942     if (mActiveTracks.size() > 0) {
   5943         dprintf(fd, "  Buffer size: %zu bytes\n", mBufferSize);
   5944     } else {
   5945         dprintf(fd, "  No active record clients\n");
   5946     }
   5947     dprintf(fd, "  Fast capture thread: %s\n", hasFastCapture() ? "yes" : "no");
   5948     dprintf(fd, "  Fast track available: %s\n", mFastTrackAvail ? "yes" : "no");
   5949 
   5950     dumpBase(fd, args);
   5951 }
   5952 
   5953 void AudioFlinger::RecordThread::dumpTracks(int fd, const Vector<String16>& args __unused)
   5954 {
   5955     const size_t SIZE = 256;
   5956     char buffer[SIZE];
   5957     String8 result;
   5958 
   5959     size_t numtracks = mTracks.size();
   5960     size_t numactive = mActiveTracks.size();
   5961     size_t numactiveseen = 0;
   5962     dprintf(fd, "  %d Tracks", numtracks);
   5963     if (numtracks) {
   5964         dprintf(fd, " of which %d are active\n", numactive);
   5965         RecordTrack::appendDumpHeader(result);
   5966         for (size_t i = 0; i < numtracks ; ++i) {
   5967             sp<RecordTrack> track = mTracks[i];
   5968             if (track != 0) {
   5969                 bool active = mActiveTracks.indexOf(track) >= 0;
   5970                 if (active) {
   5971                     numactiveseen++;
   5972                 }
   5973                 track->dump(buffer, SIZE, active);
   5974                 result.append(buffer);
   5975             }
   5976         }
   5977     } else {
   5978         dprintf(fd, "\n");
   5979     }
   5980 
   5981     if (numactiveseen != numactive) {
   5982         snprintf(buffer, SIZE, "  The following tracks are in the active list but"
   5983                 " not in the track list\n");
   5984         result.append(buffer);
   5985         RecordTrack::appendDumpHeader(result);
   5986         for (size_t i = 0; i < numactive; ++i) {
   5987             sp<RecordTrack> track = mActiveTracks[i];
   5988             if (mTracks.indexOf(track) < 0) {
   5989                 track->dump(buffer, SIZE, true);
   5990                 result.append(buffer);
   5991             }
   5992         }
   5993 
   5994     }
   5995     write(fd, result.string(), result.size());
   5996 }
   5997 
   5998 // AudioBufferProvider interface
   5999 status_t AudioFlinger::RecordThread::ResamplerBufferProvider::getNextBuffer(
   6000         AudioBufferProvider::Buffer* buffer, int64_t pts __unused)
   6001 {
   6002     RecordTrack *activeTrack = mRecordTrack;
   6003     sp<ThreadBase> threadBase = activeTrack->mThread.promote();
   6004     if (threadBase == 0) {
   6005         buffer->frameCount = 0;
   6006         buffer->raw = NULL;
   6007         return NOT_ENOUGH_DATA;
   6008     }
   6009     RecordThread *recordThread = (RecordThread *) threadBase.get();
   6010     int32_t rear = recordThread->mRsmpInRear;
   6011     int32_t front = activeTrack->mRsmpInFront;
   6012     ssize_t filled = rear - front;
   6013     // FIXME should not be P2 (don't want to increase latency)
   6014     // FIXME if client not keeping up, discard
   6015     LOG_ALWAYS_FATAL_IF(!(0 <= filled && (size_t) filled <= recordThread->mRsmpInFrames));
   6016     // 'filled' may be non-contiguous, so return only the first contiguous chunk
   6017     front &= recordThread->mRsmpInFramesP2 - 1;
   6018     size_t part1 = recordThread->mRsmpInFramesP2 - front;
   6019     if (part1 > (size_t) filled) {
   6020         part1 = filled;
   6021     }
   6022     size_t ask = buffer->frameCount;
   6023     ALOG_ASSERT(ask > 0);
   6024     if (part1 > ask) {
   6025         part1 = ask;
   6026     }
   6027     if (part1 == 0) {
   6028         // Higher-level should keep mRsmpInBuffer full, and not call resampler if empty
   6029         LOG_ALWAYS_FATAL("RecordThread::getNextBuffer() starved");
   6030         buffer->raw = NULL;
   6031         buffer->frameCount = 0;
   6032         activeTrack->mRsmpInUnrel = 0;
   6033         return NOT_ENOUGH_DATA;
   6034     }
   6035 
   6036     buffer->raw = recordThread->mRsmpInBuffer + front * recordThread->mChannelCount;
   6037     buffer->frameCount = part1;
   6038     activeTrack->mRsmpInUnrel = part1;
   6039     return NO_ERROR;
   6040 }
   6041 
   6042 // AudioBufferProvider interface
   6043 void AudioFlinger::RecordThread::ResamplerBufferProvider::releaseBuffer(
   6044         AudioBufferProvider::Buffer* buffer)
   6045 {
   6046     RecordTrack *activeTrack = mRecordTrack;
   6047     size_t stepCount = buffer->frameCount;
   6048     if (stepCount == 0) {
   6049         return;
   6050     }
   6051     ALOG_ASSERT(stepCount <= activeTrack->mRsmpInUnrel);
   6052     activeTrack->mRsmpInUnrel -= stepCount;
   6053     activeTrack->mRsmpInFront += stepCount;
   6054     buffer->raw = NULL;
   6055     buffer->frameCount = 0;
   6056 }
   6057 
   6058 bool AudioFlinger::RecordThread::checkForNewParameter_l(const String8& keyValuePair,
   6059                                                         status_t& status)
   6060 {
   6061     bool reconfig = false;
   6062 
   6063     status = NO_ERROR;
   6064 
   6065     audio_format_t reqFormat = mFormat;
   6066     uint32_t samplingRate = mSampleRate;
   6067     audio_channel_mask_t channelMask = audio_channel_in_mask_from_count(mChannelCount);
   6068 
   6069     AudioParameter param = AudioParameter(keyValuePair);
   6070     int value;
   6071     // TODO Investigate when this code runs. Check with audio policy when a sample rate and
   6072     //      channel count change can be requested. Do we mandate the first client defines the
   6073     //      HAL sampling rate and channel count or do we allow changes on the fly?
   6074     if (param.getInt(String8(AudioParameter::keySamplingRate), value) == NO_ERROR) {
   6075         samplingRate = value;
   6076         reconfig = true;
   6077     }
   6078     if (param.getInt(String8(AudioParameter::keyFormat), value) == NO_ERROR) {
   6079         if ((audio_format_t) value != AUDIO_FORMAT_PCM_16_BIT) {
   6080             status = BAD_VALUE;
   6081         } else {
   6082             reqFormat = (audio_format_t) value;
   6083             reconfig = true;
   6084         }
   6085     }
   6086     if (param.getInt(String8(AudioParameter::keyChannels), value) == NO_ERROR) {
   6087         audio_channel_mask_t mask = (audio_channel_mask_t) value;
   6088         if (mask != AUDIO_CHANNEL_IN_MONO && mask != AUDIO_CHANNEL_IN_STEREO) {
   6089             status = BAD_VALUE;
   6090         } else {
   6091             channelMask = mask;
   6092             reconfig = true;
   6093         }
   6094     }
   6095     if (param.getInt(String8(AudioParameter::keyFrameCount), value) == NO_ERROR) {
   6096         // do not accept frame count changes if tracks are open as the track buffer
   6097         // size depends on frame count and correct behavior would not be guaranteed
   6098         // if frame count is changed after track creation
   6099         if (mActiveTracks.size() > 0) {
   6100             status = INVALID_OPERATION;
   6101         } else {
   6102             reconfig = true;
   6103         }
   6104     }
   6105     if (param.getInt(String8(AudioParameter::keyRouting), value) == NO_ERROR) {
   6106         // forward device change to effects that have requested to be
   6107         // aware of attached audio device.
   6108         for (size_t i = 0; i < mEffectChains.size(); i++) {
   6109             mEffectChains[i]->setDevice_l(value);
   6110         }
   6111 
   6112         // store input device and output device but do not forward output device to audio HAL.
   6113         // Note that status is ignored by the caller for output device
   6114         // (see AudioFlinger::setParameters()
   6115         if (audio_is_output_devices(value)) {
   6116             mOutDevice = value;
   6117             status = BAD_VALUE;
   6118         } else {
   6119             mInDevice = value;
   6120             // disable AEC and NS if the device is a BT SCO headset supporting those
   6121             // pre processings
   6122             if (mTracks.size() > 0) {
   6123                 bool suspend = audio_is_bluetooth_sco_device(mInDevice) &&
   6124                                     mAudioFlinger->btNrecIsOff();
   6125                 for (size_t i = 0; i < mTracks.size(); i++) {
   6126                     sp<RecordTrack> track = mTracks[i];
   6127                     setEffectSuspended_l(FX_IID_AEC, suspend, track->sessionId());
   6128                     setEffectSuspended_l(FX_IID_NS, suspend, track->sessionId());
   6129                 }
   6130             }
   6131         }
   6132     }
   6133     if (param.getInt(String8(AudioParameter::keyInputSource), value) == NO_ERROR &&
   6134             mAudioSource != (audio_source_t)value) {
   6135         // forward device change to effects that have requested to be
   6136         // aware of attached audio device.
   6137         for (size_t i = 0; i < mEffectChains.size(); i++) {
   6138             mEffectChains[i]->setAudioSource_l((audio_source_t)value);
   6139         }
   6140         mAudioSource = (audio_source_t)value;
   6141     }
   6142 
   6143     if (status == NO_ERROR) {
   6144         status = mInput->stream->common.set_parameters(&mInput->stream->common,
   6145                 keyValuePair.string());
   6146         if (status == INVALID_OPERATION) {
   6147             inputStandBy();
   6148             status = mInput->stream->common.set_parameters(&mInput->stream->common,
   6149                     keyValuePair.string());
   6150         }
   6151         if (reconfig) {
   6152             if (status == BAD_VALUE &&
   6153                 reqFormat == mInput->stream->common.get_format(&mInput->stream->common) &&
   6154                 reqFormat == AUDIO_FORMAT_PCM_16_BIT &&
   6155                 (mInput->stream->common.get_sample_rate(&mInput->stream->common)
   6156                         <= (2 * samplingRate)) &&
   6157                 audio_channel_count_from_in_mask(
   6158                         mInput->stream->common.get_channels(&mInput->stream->common)) <= FCC_2 &&
   6159                 (channelMask == AUDIO_CHANNEL_IN_MONO ||
   6160                         channelMask == AUDIO_CHANNEL_IN_STEREO)) {
   6161                 status = NO_ERROR;
   6162             }
   6163             if (status == NO_ERROR) {
   6164                 readInputParameters_l();
   6165                 sendIoConfigEvent_l(AudioSystem::INPUT_CONFIG_CHANGED);
   6166             }
   6167         }
   6168     }
   6169 
   6170     return reconfig;
   6171 }
   6172 
   6173 String8 AudioFlinger::RecordThread::getParameters(const String8& keys)
   6174 {
   6175     Mutex::Autolock _l(mLock);
   6176     if (initCheck() != NO_ERROR) {
   6177         return String8();
   6178     }
   6179 
   6180     char *s = mInput->stream->common.get_parameters(&mInput->stream->common, keys.string());
   6181     const String8 out_s8(s);
   6182     free(s);
   6183     return out_s8;
   6184 }
   6185 
   6186 void AudioFlinger::RecordThread::audioConfigChanged(int event, int param __unused) {
   6187     AudioSystem::OutputDescriptor desc;
   6188     const void *param2 = NULL;
   6189 
   6190     switch (event) {
   6191     case AudioSystem::INPUT_OPENED:
   6192     case AudioSystem::INPUT_CONFIG_CHANGED:
   6193         desc.channelMask = mChannelMask;
   6194         desc.samplingRate = mSampleRate;
   6195         desc.format = mFormat;
   6196         desc.frameCount = mFrameCount;
   6197         desc.latency = 0;
   6198         param2 = &desc;
   6199         break;
   6200 
   6201     case AudioSystem::INPUT_CLOSED:
   6202     default:
   6203         break;
   6204     }
   6205     mAudioFlinger->audioConfigChanged(event, mId, param2);
   6206 }
   6207 
   6208 void AudioFlinger::RecordThread::readInputParameters_l()
   6209 {
   6210     mSampleRate = mInput->stream->common.get_sample_rate(&mInput->stream->common);
   6211     mChannelMask = mInput->stream->common.get_channels(&mInput->stream->common);
   6212     mChannelCount = audio_channel_count_from_in_mask(mChannelMask);
   6213     mHALFormat = mInput->stream->common.get_format(&mInput->stream->common);
   6214     mFormat = mHALFormat;
   6215     if (mFormat != AUDIO_FORMAT_PCM_16_BIT) {
   6216         ALOGE("HAL format %#x not supported; must be AUDIO_FORMAT_PCM_16_BIT", mFormat);
   6217     }
   6218     mFrameSize = audio_stream_in_frame_size(mInput->stream);
   6219     mBufferSize = mInput->stream->common.get_buffer_size(&mInput->stream->common);
   6220     mFrameCount = mBufferSize / mFrameSize;
   6221     // This is the formula for calculating the temporary buffer size.
   6222     // With 7 HAL buffers, we can guarantee ability to down-sample the input by ratio of 6:1 to
   6223     // 1 full output buffer, regardless of the alignment of the available input.
   6224     // The value is somewhat arbitrary, and could probably be even larger.
   6225     // A larger value should allow more old data to be read after a track calls start(),
   6226     // without increasing latency.
   6227     mRsmpInFrames = mFrameCount * 7;
   6228     mRsmpInFramesP2 = roundup(mRsmpInFrames);
   6229     delete[] mRsmpInBuffer;
   6230 
   6231     // TODO optimize audio capture buffer sizes ...
   6232     // Here we calculate the size of the sliding buffer used as a source
   6233     // for resampling.  mRsmpInFramesP2 is currently roundup(mFrameCount * 7).
   6234     // For current HAL frame counts, this is usually 2048 = 40 ms.  It would
   6235     // be better to have it derived from the pipe depth in the long term.
   6236     // The current value is higher than necessary.  However it should not add to latency.
   6237 
   6238     // Over-allocate beyond mRsmpInFramesP2 to permit a HAL read past end of buffer
   6239     mRsmpInBuffer = new int16_t[(mRsmpInFramesP2 + mFrameCount - 1) * mChannelCount];
   6240 
   6241     // AudioRecord mSampleRate and mChannelCount are constant due to AudioRecord API constraints.
   6242     // But if thread's mSampleRate or mChannelCount changes, how will that affect active tracks?
   6243 }
   6244 
   6245 uint32_t AudioFlinger::RecordThread::getInputFramesLost()
   6246 {
   6247     Mutex::Autolock _l(mLock);
   6248     if (initCheck() != NO_ERROR) {
   6249         return 0;
   6250     }
   6251 
   6252     return mInput->stream->get_input_frames_lost(mInput->stream);
   6253 }
   6254 
   6255 uint32_t AudioFlinger::RecordThread::hasAudioSession(int sessionId) const
   6256 {
   6257     Mutex::Autolock _l(mLock);
   6258     uint32_t result = 0;
   6259     if (getEffectChain_l(sessionId) != 0) {
   6260         result = EFFECT_SESSION;
   6261     }
   6262 
   6263     for (size_t i = 0; i < mTracks.size(); ++i) {
   6264         if (sessionId == mTracks[i]->sessionId()) {
   6265             result |= TRACK_SESSION;
   6266             break;
   6267         }
   6268     }
   6269 
   6270     return result;
   6271 }
   6272 
   6273 KeyedVector<int, bool> AudioFlinger::RecordThread::sessionIds() const
   6274 {
   6275     KeyedVector<int, bool> ids;
   6276     Mutex::Autolock _l(mLock);
   6277     for (size_t j = 0; j < mTracks.size(); ++j) {
   6278         sp<RecordThread::RecordTrack> track = mTracks[j];
   6279         int sessionId = track->sessionId();
   6280         if (ids.indexOfKey(sessionId) < 0) {
   6281             ids.add(sessionId, true);
   6282         }
   6283     }
   6284     return ids;
   6285 }
   6286 
   6287 AudioFlinger::AudioStreamIn* AudioFlinger::RecordThread::clearInput()
   6288 {
   6289     Mutex::Autolock _l(mLock);
   6290     AudioStreamIn *input = mInput;
   6291     mInput = NULL;
   6292     return input;
   6293 }
   6294 
   6295 // this method must always be called either with ThreadBase mLock held or inside the thread loop
   6296 audio_stream_t* AudioFlinger::RecordThread::stream() const
   6297 {
   6298     if (mInput == NULL) {
   6299         return NULL;
   6300     }
   6301     return &mInput->stream->common;
   6302 }
   6303 
   6304 status_t AudioFlinger::RecordThread::addEffectChain_l(const sp<EffectChain>& chain)
   6305 {
   6306     // only one chain per input thread
   6307     if (mEffectChains.size() != 0) {
   6308         ALOGW("addEffectChain_l() already one chain %p on thread %p", chain.get(), this);
   6309         return INVALID_OPERATION;
   6310     }
   6311     ALOGV("addEffectChain_l() %p on thread %p", chain.get(), this);
   6312     chain->setThread(this);
   6313     chain->setInBuffer(NULL);
   6314     chain->setOutBuffer(NULL);
   6315 
   6316     checkSuspendOnAddEffectChain_l(chain);
   6317 
   6318     // make sure enabled pre processing effects state is communicated to the HAL as we
   6319     // just moved them to a new input stream.
   6320     chain->syncHalEffectsState();
   6321 
   6322     mEffectChains.add(chain);
   6323 
   6324     return NO_ERROR;
   6325 }
   6326 
   6327 size_t AudioFlinger::RecordThread::removeEffectChain_l(const sp<EffectChain>& chain)
   6328 {
   6329     ALOGV("removeEffectChain_l() %p from thread %p", chain.get(), this);
   6330     ALOGW_IF(mEffectChains.size() != 1,
   6331             "removeEffectChain_l() %p invalid chain size %d on thread %p",
   6332             chain.get(), mEffectChains.size(), this);
   6333     if (mEffectChains.size() == 1) {
   6334         mEffectChains.removeAt(0);
   6335     }
   6336     return 0;
   6337 }
   6338 
   6339 status_t AudioFlinger::RecordThread::createAudioPatch_l(const struct audio_patch *patch,
   6340                                                           audio_patch_handle_t *handle)
   6341 {
   6342     status_t status = NO_ERROR;
   6343     if (mInput->audioHwDev->version() >= AUDIO_DEVICE_API_VERSION_3_0) {
   6344         // store new device and send to effects
   6345         mInDevice = patch->sources[0].ext.device.type;
   6346         for (size_t i = 0; i < mEffectChains.size(); i++) {
   6347             mEffectChains[i]->setDevice_l(mInDevice);
   6348         }
   6349 
   6350         // disable AEC and NS if the device is a BT SCO headset supporting those
   6351         // pre processings
   6352         if (mTracks.size() > 0) {
   6353             bool suspend = audio_is_bluetooth_sco_device(mInDevice) &&
   6354                                 mAudioFlinger->btNrecIsOff();
   6355             for (size_t i = 0; i < mTracks.size(); i++) {
   6356                 sp<RecordTrack> track = mTracks[i];
   6357                 setEffectSuspended_l(FX_IID_AEC, suspend, track->sessionId());
   6358                 setEffectSuspended_l(FX_IID_NS, suspend, track->sessionId());
   6359             }
   6360         }
   6361 
   6362         // store new source and send to effects
   6363         if (mAudioSource != patch->sinks[0].ext.mix.usecase.source) {
   6364             mAudioSource = patch->sinks[0].ext.mix.usecase.source;
   6365             for (size_t i = 0; i < mEffectChains.size(); i++) {
   6366                 mEffectChains[i]->setAudioSource_l(mAudioSource);
   6367             }
   6368         }
   6369 
   6370         audio_hw_device_t *hwDevice = mInput->audioHwDev->hwDevice();
   6371         status = hwDevice->create_audio_patch(hwDevice,
   6372                                                patch->num_sources,
   6373                                                patch->sources,
   6374                                                patch->num_sinks,
   6375                                                patch->sinks,
   6376                                                handle);
   6377     } else {
   6378         ALOG_ASSERT(false, "createAudioPatch_l() called on a pre 3.0 HAL");
   6379     }
   6380     return status;
   6381 }
   6382 
   6383 status_t AudioFlinger::RecordThread::releaseAudioPatch_l(const audio_patch_handle_t handle)
   6384 {
   6385     status_t status = NO_ERROR;
   6386     if (mInput->audioHwDev->version() >= AUDIO_DEVICE_API_VERSION_3_0) {
   6387         audio_hw_device_t *hwDevice = mInput->audioHwDev->hwDevice();
   6388         status = hwDevice->release_audio_patch(hwDevice, handle);
   6389     } else {
   6390         ALOG_ASSERT(false, "releaseAudioPatch_l() called on a pre 3.0 HAL");
   6391     }
   6392     return status;
   6393 }
   6394 
   6395 void AudioFlinger::RecordThread::addPatchRecord(const sp<PatchRecord>& record)
   6396 {
   6397     Mutex::Autolock _l(mLock);
   6398     mTracks.add(record);
   6399 }
   6400 
   6401 void AudioFlinger::RecordThread::deletePatchRecord(const sp<PatchRecord>& record)
   6402 {
   6403     Mutex::Autolock _l(mLock);
   6404     destroyTrack_l(record);
   6405 }
   6406 
   6407 void AudioFlinger::RecordThread::getAudioPortConfig(struct audio_port_config *config)
   6408 {
   6409     ThreadBase::getAudioPortConfig(config);
   6410     config->role = AUDIO_PORT_ROLE_SINK;
   6411     config->ext.mix.hw_module = mInput->audioHwDev->handle();
   6412     config->ext.mix.usecase.source = mAudioSource;
   6413 }
   6414 
   6415 }; // namespace android
   6416