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