Threads.cpp revision 98ef978df4e928f486d244c4d7f7ad9f13111e98
181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent/*
281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent**
381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent** Copyright 2012, The Android Open Source Project
481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent**
581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent** Licensed under the Apache License, Version 2.0 (the "License");
681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent** you may not use this file except in compliance with the License.
781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent** You may obtain a copy of the License at
881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent**
981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent**     http://www.apache.org/licenses/LICENSE-2.0
1081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent**
1181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent** Unless required by applicable law or agreed to in writing, software
1281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent** distributed under the License is distributed on an "AS IS" BASIS,
1381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent** See the License for the specific language governing permissions and
1581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent** limitations under the License.
1681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent*/
1781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
1881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
1981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#define LOG_TAG "AudioFlinger"
2081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent//#define LOG_NDEBUG 0
21371eb9756c32109ea572b91216b19bb623f6d3fdAlex Ray#define ATRACE_TAG ATRACE_TAG_AUDIO
2281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
23153b9fe667e6e78e0218ff0159353097428c7657Glenn Kasten#include "Configuration.h"
2481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <math.h>
2581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <fcntl.h>
2681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <sys/stat.h>
2781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <cutils/properties.h>
281ab85ec401801ef9a9184650d0f5a1639b45eeb9Glenn Kasten#include <media/AudioParameter.h>
2981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <utils/Log.h>
30371eb9756c32109ea572b91216b19bb623f6d3fdAlex Ray#include <utils/Trace.h>
3181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
3281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <private/media/AudioTrackShared.h>
3381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <hardware/audio.h>
3481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <audio_effects/effect_ns.h>
3581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <audio_effects/effect_aec.h>
3681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <audio_utils/primitives.h>
3798ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung#include <audio_utils/format.h>
3881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
3981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// NBAIO implementations
4081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <media/nbaio/AudioStreamOutSink.h>
4181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <media/nbaio/MonoPipe.h>
4281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <media/nbaio/MonoPipeReader.h>
4381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <media/nbaio/Pipe.h>
4481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <media/nbaio/PipeReader.h>
4581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <media/nbaio/SourceAudioBufferProvider.h>
4681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
4781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <powermanager/PowerManager.h>
4881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
4981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <common_time/cc_helper.h>
5081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <common_time/local_clock.h>
5181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
5281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include "AudioFlinger.h"
5381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include "AudioMixer.h"
5481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include "FastMixer.h"
5581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include "ServiceUtilities.h"
5681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include "SchedulingPolicyService.h"
5781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
5881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#ifdef ADD_BATTERY_DATA
5981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <media/IMediaPlayerService.h>
6081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <media/IMediaDeathNotifier.h>
6181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#endif
6281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
6381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#ifdef DEBUG_CPU_USAGE
6481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <cpustats/CentralTendencyStatistics.h>
6581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <cpustats/ThreadCpuUsage.h>
6681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#endif
6781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
6881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// ----------------------------------------------------------------------------
6981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
7081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// Note: the following macro is used for extremely verbose logging message.  In
7181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// order to run with ALOG_ASSERT turned on, we need to have LOG_NDEBUG set to
7281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// 0; but one side effect of this is to turn all LOGV's as well.  Some messages
7381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// are so verbose that we want to suppress them even when we have ALOG_ASSERT
7481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// turned on.  Do not uncomment the #def below unless you really know what you
7581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// are doing and want to see all of the extremely verbose messages.
7681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent//#define VERY_VERY_VERBOSE_LOGGING
7781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#ifdef VERY_VERY_VERBOSE_LOGGING
7881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#define ALOGVV ALOGV
7981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#else
8081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#define ALOGVV(a...) do { } while(0)
8181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#endif
8281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
8381784c37c61b09289654b979567a42bf73cd2b12Eric Laurentnamespace android {
8481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
8581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// retry counts for buffer fill timeout
8681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// 50 * ~20msecs = 1 second
8781784c37c61b09289654b979567a42bf73cd2b12Eric Laurentstatic const int8_t kMaxTrackRetries = 50;
8881784c37c61b09289654b979567a42bf73cd2b12Eric Laurentstatic const int8_t kMaxTrackStartupRetries = 50;
8981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// allow less retry attempts on direct output thread.
9081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// direct outputs can be a scarce resource in audio hardware and should
9181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// be released as quickly as possible.
9281784c37c61b09289654b979567a42bf73cd2b12Eric Laurentstatic const int8_t kMaxTrackRetriesDirect = 2;
9381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
9481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// don't warn about blocked writes or record buffer overflows more often than this
9581784c37c61b09289654b979567a42bf73cd2b12Eric Laurentstatic const nsecs_t kWarningThrottleNs = seconds(5);
9681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
9781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// RecordThread loop sleep time upon application overrun or audio HAL read error
9881784c37c61b09289654b979567a42bf73cd2b12Eric Laurentstatic const int kRecordThreadSleepUs = 5000;
9981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
10081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// maximum time to wait for setParameters to complete
10181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentstatic const nsecs_t kSetParametersTimeoutNs = seconds(2);
10281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
10381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// minimum sleep time for the mixer thread loop when tracks are active but in underrun
10481784c37c61b09289654b979567a42bf73cd2b12Eric Laurentstatic const uint32_t kMinThreadSleepTimeUs = 5000;
10581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// maximum divider applied to the active sleep time in the mixer thread loop
10681784c37c61b09289654b979567a42bf73cd2b12Eric Laurentstatic const uint32_t kMaxThreadSleepTimeShift = 2;
10781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
10809a5007b17acb49d25cfa386a2e2534d942e8854Andy Hung// minimum normal sink buffer size, expressed in milliseconds rather than frames
10909a5007b17acb49d25cfa386a2e2534d942e8854Andy Hungstatic const uint32_t kMinNormalSinkBufferSizeMs = 20;
11009a5007b17acb49d25cfa386a2e2534d942e8854Andy Hung// maximum normal sink buffer size
11109a5007b17acb49d25cfa386a2e2534d942e8854Andy Hungstatic const uint32_t kMaxNormalSinkBufferSizeMs = 24;
11281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
113972a173d7d1de1a3b5a617aae3e2abb6e05ae02dEric Laurent// Offloaded output thread standby delay: allows track transition without going to standby
114972a173d7d1de1a3b5a617aae3e2abb6e05ae02dEric Laurentstatic const nsecs_t kOffloadStandbyDelayNs = seconds(1);
115972a173d7d1de1a3b5a617aae3e2abb6e05ae02dEric Laurent
11681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// Whether to use fast mixer
11781784c37c61b09289654b979567a42bf73cd2b12Eric Laurentstatic const enum {
11881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    FastMixer_Never,    // never initialize or use: for debugging only
11981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    FastMixer_Always,   // always initialize and use, even if not needed: for debugging only
12081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        // normal mixer multiplier is 1
12181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    FastMixer_Static,   // initialize if needed, then use all the time if initialized,
12281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        // multiplier is calculated based on min & max normal mixer buffer size
12381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    FastMixer_Dynamic,  // initialize if needed, then use dynamically depending on track load,
12481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        // multiplier is calculated based on min & max normal mixer buffer size
12581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // FIXME for FastMixer_Dynamic:
12681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    //  Supporting this option will require fixing HALs that can't handle large writes.
12781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    //  For example, one HAL implementation returns an error from a large write,
12881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    //  and another HAL implementation corrupts memory, possibly in the sample rate converter.
12981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    //  We could either fix the HAL implementations, or provide a wrapper that breaks
13081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    //  up large writes into smaller ones, and the wrapper would need to deal with scheduler.
13181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent} kUseFastMixer = FastMixer_Static;
13281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
13381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// Priorities for requestPriority
13481784c37c61b09289654b979567a42bf73cd2b12Eric Laurentstatic const int kPriorityAudioApp = 2;
13581784c37c61b09289654b979567a42bf73cd2b12Eric Laurentstatic const int kPriorityFastMixer = 3;
13681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
13781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// IAudioFlinger::createTrack() reports back to client the total size of shared memory area
13881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// for the track.  The client then sub-divides this into smaller buffers for its use.
139b5fed68bcdd6f44424c9e4d12bfe9a3ff51bd62eGlenn Kasten// Currently the client uses N-buffering by default, but doesn't tell us about the value of N.
140b5fed68bcdd6f44424c9e4d12bfe9a3ff51bd62eGlenn Kasten// So for now we just assume that client is double-buffered for fast tracks.
141b5fed68bcdd6f44424c9e4d12bfe9a3ff51bd62eGlenn Kasten// FIXME It would be better for client to tell AudioFlinger the value of N,
142b5fed68bcdd6f44424c9e4d12bfe9a3ff51bd62eGlenn Kasten// so AudioFlinger could allocate the right amount of memory.
14381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// See the client's minBufCount and mNotificationFramesAct calculations for details.
144b5fed68bcdd6f44424c9e4d12bfe9a3ff51bd62eGlenn Kastenstatic const int kFastTrackMultiplier = 2;
14581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
14681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// ----------------------------------------------------------------------------
14781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
14881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#ifdef ADD_BATTERY_DATA
14981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// To collect the amplifier usage
15081784c37c61b09289654b979567a42bf73cd2b12Eric Laurentstatic void addBatteryData(uint32_t params) {
15181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    sp<IMediaPlayerService> service = IMediaDeathNotifier::getMediaPlayerService();
15281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (service == NULL) {
15381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // it already logged
15481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return;
15581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
15681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
15781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    service->addBatteryData(params);
15881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
15981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#endif
16081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
16181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
16281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// ----------------------------------------------------------------------------
16381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent//      CPU Stats
16481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// ----------------------------------------------------------------------------
16581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
16681784c37c61b09289654b979567a42bf73cd2b12Eric Laurentclass CpuStats {
16781784c37c61b09289654b979567a42bf73cd2b12Eric Laurentpublic:
16881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    CpuStats();
16981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    void sample(const String8 &title);
17081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#ifdef DEBUG_CPU_USAGE
17181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentprivate:
17281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ThreadCpuUsage mCpuUsage;           // instantaneous thread CPU usage in wall clock ns
17381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    CentralTendencyStatistics mWcStats; // statistics on thread CPU usage in wall clock ns
17481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
17581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    CentralTendencyStatistics mHzStats; // statistics on thread CPU usage in cycles
17681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
17781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    int mCpuNum;                        // thread's current CPU number
17881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    int mCpukHz;                        // frequency of thread's current CPU in kHz
17981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#endif
18081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent};
18181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
18281784c37c61b09289654b979567a42bf73cd2b12Eric LaurentCpuStats::CpuStats()
18381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#ifdef DEBUG_CPU_USAGE
18481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    : mCpuNum(-1), mCpukHz(-1)
18581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#endif
18681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
18781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
18881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
1890f11b51a57bc9062c4fe8af73747319cedabc5d6Glenn Kastenvoid CpuStats::sample(const String8 &title
1900f11b51a57bc9062c4fe8af73747319cedabc5d6Glenn Kasten#ifndef DEBUG_CPU_USAGE
1910f11b51a57bc9062c4fe8af73747319cedabc5d6Glenn Kasten                __unused
1920f11b51a57bc9062c4fe8af73747319cedabc5d6Glenn Kasten#endif
1930f11b51a57bc9062c4fe8af73747319cedabc5d6Glenn Kasten        ) {
19481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#ifdef DEBUG_CPU_USAGE
19581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // get current thread's delta CPU time in wall clock ns
19681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    double wcNs;
19781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    bool valid = mCpuUsage.sampleAndEnable(wcNs);
19881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
19981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // record sample for wall clock statistics
20081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (valid) {
20181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mWcStats.sample(wcNs);
20281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
20381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
20481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // get the current CPU number
20581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    int cpuNum = sched_getcpu();
20681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
20781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // get the current CPU frequency in kHz
20881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    int cpukHz = mCpuUsage.getCpukHz(cpuNum);
20981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
21081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // check if either CPU number or frequency changed
21181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (cpuNum != mCpuNum || cpukHz != mCpukHz) {
21281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mCpuNum = cpuNum;
21381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mCpukHz = cpukHz;
21481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // ignore sample for purposes of cycles
21581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        valid = false;
21681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
21781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
21881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // if no change in CPU number or frequency, then record sample for cycle statistics
21981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (valid && mCpukHz > 0) {
22081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        double cycles = wcNs * cpukHz * 0.000001;
22181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mHzStats.sample(cycles);
22281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
22381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
22481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    unsigned n = mWcStats.n();
22581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // mCpuUsage.elapsed() is expensive, so don't call it every loop
22681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if ((n & 127) == 1) {
22781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        long long elapsed = mCpuUsage.elapsed();
22881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (elapsed >= DEBUG_CPU_USAGE * 1000000000LL) {
22981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            double perLoop = elapsed / (double) n;
23081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            double perLoop100 = perLoop * 0.01;
23181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            double perLoop1k = perLoop * 0.001;
23281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            double mean = mWcStats.mean();
23381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            double stddev = mWcStats.stddev();
23481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            double minimum = mWcStats.minimum();
23581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            double maximum = mWcStats.maximum();
23681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            double meanCycles = mHzStats.mean();
23781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            double stddevCycles = mHzStats.stddev();
23881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            double minCycles = mHzStats.minimum();
23981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            double maxCycles = mHzStats.maximum();
24081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mCpuUsage.resetElapsed();
24181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mWcStats.reset();
24281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mHzStats.reset();
24381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            ALOGD("CPU usage for %s over past %.1f secs\n"
24481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                "  (%u mixer loops at %.1f mean ms per loop):\n"
24581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                "  us per mix loop: mean=%.0f stddev=%.0f min=%.0f max=%.0f\n"
24681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                "  %% of wall: mean=%.1f stddev=%.1f min=%.1f max=%.1f\n"
24781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                "  MHz: mean=%.1f, stddev=%.1f, min=%.1f max=%.1f",
24881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    title.string(),
24981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    elapsed * .000000001, n, perLoop * .000001,
25081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    mean * .001,
25181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    stddev * .001,
25281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    minimum * .001,
25381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    maximum * .001,
25481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    mean / perLoop100,
25581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    stddev / perLoop100,
25681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    minimum / perLoop100,
25781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    maximum / perLoop100,
25881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    meanCycles / perLoop1k,
25981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    stddevCycles / perLoop1k,
26081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    minCycles / perLoop1k,
26181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    maxCycles / perLoop1k);
26281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
26381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
26481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
26581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#endif
26681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent};
26781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
26881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// ----------------------------------------------------------------------------
26981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent//      ThreadBase
27081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// ----------------------------------------------------------------------------
27181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
27281784c37c61b09289654b979567a42bf73cd2b12Eric LaurentAudioFlinger::ThreadBase::ThreadBase(const sp<AudioFlinger>& audioFlinger, audio_io_handle_t id,
27381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        audio_devices_t outDevice, audio_devices_t inDevice, type_t type)
27481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    :   Thread(false /*canCallJava*/),
27581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mType(type),
2769b58f63e45ef2fdfb839b9b9bb3411d81eb96128Glenn Kasten        mAudioFlinger(audioFlinger),
27770949c47fbae3f836d15f040551d7631be3ed7c2Glenn Kasten        // mSampleRate, mFrameCount, mChannelMask, mChannelCount, mFrameSize, mFormat, mBufferSize
278deca2ae0a7cf8bc54ff3f30b7dc39bbc78b94c0dGlenn Kasten        // are set by PlaybackThread::readOutputParameters_l() or
279deca2ae0a7cf8bc54ff3f30b7dc39bbc78b94c0dGlenn Kasten        // RecordThread::readInputParameters_l()
28081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mParamStatus(NO_ERROR),
281fd4779740ec3e9e865d5514464df26d015354388Eric Laurent        //FIXME: mStandby should be true here. Is this some kind of hack?
28281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mStandby(false), mOutDevice(outDevice), mInDevice(inDevice),
28381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mAudioSource(AUDIO_SOURCE_DEFAULT), mId(id),
28481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // mName will be set by concrete (non-virtual) subclass
28581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mDeathRecipient(new PMDeathRecipient(this))
28681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
28781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
28881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
28981784c37c61b09289654b979567a42bf73cd2b12Eric LaurentAudioFlinger::ThreadBase::~ThreadBase()
29081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
291c6ae3c8a261794fd4445e4e152d1ada074a3f92fGlenn Kasten    // mConfigEvents should be empty, but just in case it isn't, free the memory it owns
292c6ae3c8a261794fd4445e4e152d1ada074a3f92fGlenn Kasten    for (size_t i = 0; i < mConfigEvents.size(); i++) {
293c6ae3c8a261794fd4445e4e152d1ada074a3f92fGlenn Kasten        delete mConfigEvents[i];
294c6ae3c8a261794fd4445e4e152d1ada074a3f92fGlenn Kasten    }
295c6ae3c8a261794fd4445e4e152d1ada074a3f92fGlenn Kasten    mConfigEvents.clear();
296c6ae3c8a261794fd4445e4e152d1ada074a3f92fGlenn Kasten
29781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mParamCond.broadcast();
29881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // do not lock the mutex in destructor
29981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    releaseWakeLock_l();
30081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mPowerManager != 0) {
30181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sp<IBinder> binder = mPowerManager->asBinder();
30281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        binder->unlinkToDeath(mDeathRecipient);
30381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
30481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
30581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
306cf04c2cb8e031acc03c1c91cb1ccab15098c89b6Glenn Kastenstatus_t AudioFlinger::ThreadBase::readyToRun()
307cf04c2cb8e031acc03c1c91cb1ccab15098c89b6Glenn Kasten{
308cf04c2cb8e031acc03c1c91cb1ccab15098c89b6Glenn Kasten    status_t status = initCheck();
309cf04c2cb8e031acc03c1c91cb1ccab15098c89b6Glenn Kasten    if (status == NO_ERROR) {
310cf04c2cb8e031acc03c1c91cb1ccab15098c89b6Glenn Kasten        ALOGI("AudioFlinger's thread %p ready to run", this);
311cf04c2cb8e031acc03c1c91cb1ccab15098c89b6Glenn Kasten    } else {
312cf04c2cb8e031acc03c1c91cb1ccab15098c89b6Glenn Kasten        ALOGE("No working audio driver found.");
313cf04c2cb8e031acc03c1c91cb1ccab15098c89b6Glenn Kasten    }
314cf04c2cb8e031acc03c1c91cb1ccab15098c89b6Glenn Kasten    return status;
315cf04c2cb8e031acc03c1c91cb1ccab15098c89b6Glenn Kasten}
316cf04c2cb8e031acc03c1c91cb1ccab15098c89b6Glenn Kasten
31781784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::ThreadBase::exit()
31881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
31981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOGV("ThreadBase::exit");
32081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // do any cleanup required for exit to succeed
32181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    preExit();
32281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    {
32381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // This lock prevents the following race in thread (uniprocessor for illustration):
32481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        //  if (!exitPending()) {
32581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        //      // context switch from here to exit()
32681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        //      // exit() calls requestExit(), what exitPending() observes
32781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        //      // exit() calls signal(), which is dropped since no waiters
32881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        //      // context switch back from exit() to here
32981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        //      mWaitWorkCV.wait(...);
33081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        //      // now thread is hung
33181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        //  }
33281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        AutoMutex lock(mLock);
33381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        requestExit();
33481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mWaitWorkCV.broadcast();
33581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
33681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // When Thread::requestExitAndWait is made virtual and this method is renamed to
33781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // "virtual status_t requestExitAndWait()", replace by "return Thread::requestExitAndWait();"
33881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    requestExitAndWait();
33981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
34081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
34181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentstatus_t AudioFlinger::ThreadBase::setParameters(const String8& keyValuePairs)
34281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
34381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    status_t status;
34481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
34581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOGV("ThreadBase::setParameters() %s", keyValuePairs.string());
34681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
34781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
34881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mNewParameters.add(keyValuePairs);
34981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mWaitWorkCV.signal();
35081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // wait condition with timeout in case the thread loop has exited
35181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // before the request could be processed
35281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mParamCond.waitRelative(mLock, kSetParametersTimeoutNs) == NO_ERROR) {
35381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        status = mParamStatus;
35481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mWaitWorkCV.signal();
35581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    } else {
35681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        status = TIMED_OUT;
35781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
35881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return status;
35981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
36081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
36181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::ThreadBase::sendIoConfigEvent(int event, int param)
36281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
36381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
36481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    sendIoConfigEvent_l(event, param);
36581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
36681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
36781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// sendIoConfigEvent_l() must be called with ThreadBase::mLock held
36881784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::ThreadBase::sendIoConfigEvent_l(int event, int param)
36981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
37081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    IoConfigEvent *ioEvent = new IoConfigEvent(event, param);
37181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mConfigEvents.add(static_cast<ConfigEvent *>(ioEvent));
37281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOGV("sendIoConfigEvent() num events %d event %d, param %d", mConfigEvents.size(), event,
37381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            param);
37481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mWaitWorkCV.signal();
37581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
37681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
37781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// sendPrioConfigEvent_l() must be called with ThreadBase::mLock held
37881784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::ThreadBase::sendPrioConfigEvent_l(pid_t pid, pid_t tid, int32_t prio)
37981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
38081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    PrioConfigEvent *prioEvent = new PrioConfigEvent(pid, tid, prio);
38181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mConfigEvents.add(static_cast<ConfigEvent *>(prioEvent));
38281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOGV("sendPrioConfigEvent_l() num events %d pid %d, tid %d prio %d",
38381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent          mConfigEvents.size(), pid, tid, prio);
38481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mWaitWorkCV.signal();
38581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
38681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
38781784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::ThreadBase::processConfigEvents()
38881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
389f777331418a86cd9fd709af898ef24a69967aeb4Glenn Kasten    Mutex::Autolock _l(mLock);
390f777331418a86cd9fd709af898ef24a69967aeb4Glenn Kasten    processConfigEvents_l();
391f777331418a86cd9fd709af898ef24a69967aeb4Glenn Kasten}
392f777331418a86cd9fd709af898ef24a69967aeb4Glenn Kasten
3932cfbf88b89854f30b295e8ae26a031edb8d712f8Glenn Kasten// post condition: mConfigEvents.isEmpty()
394f777331418a86cd9fd709af898ef24a69967aeb4Glenn Kastenvoid AudioFlinger::ThreadBase::processConfigEvents_l()
395f777331418a86cd9fd709af898ef24a69967aeb4Glenn Kasten{
39681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    while (!mConfigEvents.isEmpty()) {
39781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOGV("processConfigEvents() remaining events %d", mConfigEvents.size());
39881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ConfigEvent *event = mConfigEvents[0];
39981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mConfigEvents.removeAt(0);
40081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // release mLock before locking AudioFlinger mLock: lock order is always
40181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // AudioFlinger then ThreadBase to avoid cross deadlock
40281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mLock.unlock();
403e198c360d5e75a9b2097844c495c10902e7e8500Glenn Kasten        switch (event->type()) {
4043468e8a4d79cc6a7bb0f03f8382426195bed44dfGlenn Kasten        case CFG_EVENT_PRIO: {
4053468e8a4d79cc6a7bb0f03f8382426195bed44dfGlenn Kasten            PrioConfigEvent *prioEvent = static_cast<PrioConfigEvent *>(event);
4063468e8a4d79cc6a7bb0f03f8382426195bed44dfGlenn Kasten            // FIXME Need to understand why this has be done asynchronously
4073468e8a4d79cc6a7bb0f03f8382426195bed44dfGlenn Kasten            int err = requestPriority(prioEvent->pid(), prioEvent->tid(), prioEvent->prio(),
4083468e8a4d79cc6a7bb0f03f8382426195bed44dfGlenn Kasten                    true /*asynchronous*/);
4093468e8a4d79cc6a7bb0f03f8382426195bed44dfGlenn Kasten            if (err != 0) {
4103468e8a4d79cc6a7bb0f03f8382426195bed44dfGlenn Kasten                ALOGW("Policy SCHED_FIFO priority %d is unavailable for pid %d tid %d; error %d",
4113468e8a4d79cc6a7bb0f03f8382426195bed44dfGlenn Kasten                      prioEvent->prio(), prioEvent->pid(), prioEvent->tid(), err);
4123468e8a4d79cc6a7bb0f03f8382426195bed44dfGlenn Kasten            }
4133468e8a4d79cc6a7bb0f03f8382426195bed44dfGlenn Kasten        } break;
4143468e8a4d79cc6a7bb0f03f8382426195bed44dfGlenn Kasten        case CFG_EVENT_IO: {
4153468e8a4d79cc6a7bb0f03f8382426195bed44dfGlenn Kasten            IoConfigEvent *ioEvent = static_cast<IoConfigEvent *>(event);
416d5418eb594435c958d6c37fa9938161a0112adbdGlenn Kasten            {
417d5418eb594435c958d6c37fa9938161a0112adbdGlenn Kasten                Mutex::Autolock _l(mAudioFlinger->mLock);
418d5418eb594435c958d6c37fa9938161a0112adbdGlenn Kasten                audioConfigChanged_l(ioEvent->event(), ioEvent->param());
419d5418eb594435c958d6c37fa9938161a0112adbdGlenn Kasten            }
4203468e8a4d79cc6a7bb0f03f8382426195bed44dfGlenn Kasten        } break;
4213468e8a4d79cc6a7bb0f03f8382426195bed44dfGlenn Kasten        default:
4223468e8a4d79cc6a7bb0f03f8382426195bed44dfGlenn Kasten            ALOGE("processConfigEvents() unknown event type %d", event->type());
4233468e8a4d79cc6a7bb0f03f8382426195bed44dfGlenn Kasten            break;
42481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
42581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        delete event;
42681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mLock.lock();
42781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
42881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
42981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
430b220884bf3129253cc5bc8d030bc475411ea4911Marco NelissenString8 channelMaskToString(audio_channel_mask_t mask, bool output) {
431b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    String8 s;
432b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    if (output) {
433b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_OUT_FRONT_LEFT) s.append("front-left, ");
434b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_OUT_FRONT_RIGHT) s.append("front-right, ");
435b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_OUT_FRONT_CENTER) s.append("front-center, ");
436b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_OUT_LOW_FREQUENCY) s.append("low freq, ");
437b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_OUT_BACK_LEFT) s.append("back-left, ");
438b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_OUT_BACK_RIGHT) s.append("back-right, ");
439b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER) s.append("front-left-of-center, ");
440b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER) s.append("front-right-of-center, ");
441b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_OUT_BACK_CENTER) s.append("back-center, ");
442b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_OUT_SIDE_LEFT) s.append("side-left, ");
443b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_OUT_SIDE_RIGHT) s.append("side-right, ");
444b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_OUT_TOP_CENTER) s.append("top-center ,");
445b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT) s.append("top-front-left, ");
446b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER) s.append("top-front-center, ");
447b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT) s.append("top-front-right, ");
448b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_OUT_TOP_BACK_LEFT) s.append("top-back-left, ");
449b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_OUT_TOP_BACK_CENTER) s.append("top-back-center, " );
450b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT) s.append("top-back-right, " );
451b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & ~AUDIO_CHANNEL_OUT_ALL) s.append("unknown,  ");
452b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    } else {
453b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_IN_LEFT) s.append("left, ");
454b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_IN_RIGHT) s.append("right, ");
455b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_IN_FRONT) s.append("front, ");
456b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_IN_BACK) s.append("back, ");
457b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_IN_LEFT_PROCESSED) s.append("left-processed, ");
458b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_IN_RIGHT_PROCESSED) s.append("right-processed, ");
459b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_IN_FRONT_PROCESSED) s.append("front-processed, ");
460b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_IN_BACK_PROCESSED) s.append("back-processed, ");
461b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_IN_PRESSURE) s.append("pressure, ");
462b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_IN_X_AXIS) s.append("X, ");
463b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_IN_Y_AXIS) s.append("Y, ");
464b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_IN_Z_AXIS) s.append("Z, ");
465b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_IN_VOICE_UPLINK) s.append("voice-uplink, ");
466b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & AUDIO_CHANNEL_IN_VOICE_DNLINK) s.append("voice-dnlink, ");
467b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        if (mask & ~AUDIO_CHANNEL_IN_ALL) s.append("unknown,  ");
468b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    }
469b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    int len = s.length();
470b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    if (s.length() > 2) {
471b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        char *str = s.lockBuffer(len);
472b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        s.unlockBuffer(len - 2);
473b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    }
474b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    return s;
475b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen}
476b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen
4770f11b51a57bc9062c4fe8af73747319cedabc5d6Glenn Kastenvoid AudioFlinger::ThreadBase::dumpBase(int fd, const Vector<String16>& args __unused)
47881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
47981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    const size_t SIZE = 256;
48081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    char buffer[SIZE];
48181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    String8 result;
48281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
48381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    bool locked = AudioFlinger::dumpTryLock(mLock);
48481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (!locked) {
485b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        fdprintf(fd, "thread %p maybe dead locked\n", this);
486b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    }
487b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen
488b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    fdprintf(fd, "  I/O handle: %d\n", mId);
489b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    fdprintf(fd, "  TID: %d\n", getTid());
490b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    fdprintf(fd, "  Standby: %s\n", mStandby ? "yes" : "no");
491b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    fdprintf(fd, "  Sample rate: %u\n", mSampleRate);
4921d6fa7af1288b550faabe4ec2cf98684236723dbNarayan Kamath    fdprintf(fd, "  HAL frame count: %zu\n", mFrameCount);
493b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    fdprintf(fd, "  HAL buffer size: %u bytes\n", mBufferSize);
494b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    fdprintf(fd, "  Channel Count: %u\n", mChannelCount);
495b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    fdprintf(fd, "  Channel Mask: 0x%08x (%s)\n", mChannelMask,
496b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen            channelMaskToString(mChannelMask, mType != RECORD).string());
497b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    fdprintf(fd, "  Format: 0x%x (%s)\n", mFormat, formatToString(mFormat));
4981d6fa7af1288b550faabe4ec2cf98684236723dbNarayan Kamath    fdprintf(fd, "  Frame size: %zu\n", mFrameSize);
499b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    fdprintf(fd, "  Pending setParameters commands:");
500b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    size_t numParams = mNewParameters.size();
501b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    if (numParams) {
502b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        fdprintf(fd, "\n   Index Command");
503b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        for (size_t i = 0; i < numParams; ++i) {
5041d6fa7af1288b550faabe4ec2cf98684236723dbNarayan Kamath            fdprintf(fd, "\n   %02zu    ", i);
505b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen            fdprintf(fd, mNewParameters[i]);
506b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        }
507b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        fdprintf(fd, "\n");
508b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    } else {
509b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        fdprintf(fd, " none\n");
51081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
511b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    fdprintf(fd, "  Pending config events:");
512b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    size_t numConfig = mConfigEvents.size();
513b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    if (numConfig) {
514b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        for (size_t i = 0; i < numConfig; i++) {
515b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen            mConfigEvents[i]->dump(buffer, SIZE);
516b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen            fdprintf(fd, "\n    %s", buffer);
517b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        }
518b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        fdprintf(fd, "\n");
519b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    } else {
520b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        fdprintf(fd, " none\n");
52181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
52281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
52381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (locked) {
52481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mLock.unlock();
52581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
52681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
52781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
52881784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::ThreadBase::dumpEffectChains(int fd, const Vector<String16>& args)
52981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
53081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    const size_t SIZE = 256;
53181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    char buffer[SIZE];
53281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    String8 result;
53381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
534b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    size_t numEffectChains = mEffectChains.size();
5351d6fa7af1288b550faabe4ec2cf98684236723dbNarayan Kamath    snprintf(buffer, SIZE, "  %zu Effect Chains\n", numEffectChains);
53681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    write(fd, buffer, strlen(buffer));
53781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
538b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    for (size_t i = 0; i < numEffectChains; ++i) {
53981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sp<EffectChain> chain = mEffectChains[i];
54081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (chain != 0) {
54181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            chain->dump(fd, args);
54281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
54381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
54481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
54581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
546e14a5d6d2cc91dd2fc09ffdf7aa670b37da0795dMarco Nelissenvoid AudioFlinger::ThreadBase::acquireWakeLock(int uid)
54781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
54881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
549e14a5d6d2cc91dd2fc09ffdf7aa670b37da0795dMarco Nelissen    acquireWakeLock_l(uid);
55081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
55181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
552014e7fa2e90827d911c37bb0ce4d2e10e14d0bb3Narayan KamathString16 AudioFlinger::ThreadBase::getWakeLockTag()
553014e7fa2e90827d911c37bb0ce4d2e10e14d0bb3Narayan Kamath{
554014e7fa2e90827d911c37bb0ce4d2e10e14d0bb3Narayan Kamath    switch (mType) {
555014e7fa2e90827d911c37bb0ce4d2e10e14d0bb3Narayan Kamath        case MIXER:
556014e7fa2e90827d911c37bb0ce4d2e10e14d0bb3Narayan Kamath            return String16("AudioMix");
557014e7fa2e90827d911c37bb0ce4d2e10e14d0bb3Narayan Kamath        case DIRECT:
558014e7fa2e90827d911c37bb0ce4d2e10e14d0bb3Narayan Kamath            return String16("AudioDirectOut");
559014e7fa2e90827d911c37bb0ce4d2e10e14d0bb3Narayan Kamath        case DUPLICATING:
560014e7fa2e90827d911c37bb0ce4d2e10e14d0bb3Narayan Kamath            return String16("AudioDup");
561014e7fa2e90827d911c37bb0ce4d2e10e14d0bb3Narayan Kamath        case RECORD:
562014e7fa2e90827d911c37bb0ce4d2e10e14d0bb3Narayan Kamath            return String16("AudioIn");
563014e7fa2e90827d911c37bb0ce4d2e10e14d0bb3Narayan Kamath        case OFFLOAD:
564014e7fa2e90827d911c37bb0ce4d2e10e14d0bb3Narayan Kamath            return String16("AudioOffload");
565014e7fa2e90827d911c37bb0ce4d2e10e14d0bb3Narayan Kamath        default:
566014e7fa2e90827d911c37bb0ce4d2e10e14d0bb3Narayan Kamath            ALOG_ASSERT(false);
567014e7fa2e90827d911c37bb0ce4d2e10e14d0bb3Narayan Kamath            return String16("AudioUnknown");
568014e7fa2e90827d911c37bb0ce4d2e10e14d0bb3Narayan Kamath    }
569014e7fa2e90827d911c37bb0ce4d2e10e14d0bb3Narayan Kamath}
570014e7fa2e90827d911c37bb0ce4d2e10e14d0bb3Narayan Kamath
571e14a5d6d2cc91dd2fc09ffdf7aa670b37da0795dMarco Nelissenvoid AudioFlinger::ThreadBase::acquireWakeLock_l(int uid)
57281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
573462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen    getPowerManager_l();
57481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mPowerManager != 0) {
57581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sp<IBinder> binder = new BBinder();
576e14a5d6d2cc91dd2fc09ffdf7aa670b37da0795dMarco Nelissen        status_t status;
577e14a5d6d2cc91dd2fc09ffdf7aa670b37da0795dMarco Nelissen        if (uid >= 0) {
578547789d25dc6bd6561553bcf6b384fb0d4fee834Eric Laurent            status = mPowerManager->acquireWakeLockWithUid(POWERMANAGER_PARTIAL_WAKE_LOCK,
579e14a5d6d2cc91dd2fc09ffdf7aa670b37da0795dMarco Nelissen                    binder,
580014e7fa2e90827d911c37bb0ce4d2e10e14d0bb3Narayan Kamath                    getWakeLockTag(),
581e14a5d6d2cc91dd2fc09ffdf7aa670b37da0795dMarco Nelissen                    String16("media"),
582e14a5d6d2cc91dd2fc09ffdf7aa670b37da0795dMarco Nelissen                    uid);
583e14a5d6d2cc91dd2fc09ffdf7aa670b37da0795dMarco Nelissen        } else {
584547789d25dc6bd6561553bcf6b384fb0d4fee834Eric Laurent            status = mPowerManager->acquireWakeLock(POWERMANAGER_PARTIAL_WAKE_LOCK,
585e14a5d6d2cc91dd2fc09ffdf7aa670b37da0795dMarco Nelissen                    binder,
586014e7fa2e90827d911c37bb0ce4d2e10e14d0bb3Narayan Kamath                    getWakeLockTag(),
587e14a5d6d2cc91dd2fc09ffdf7aa670b37da0795dMarco Nelissen                    String16("media"));
588e14a5d6d2cc91dd2fc09ffdf7aa670b37da0795dMarco Nelissen        }
58981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (status == NO_ERROR) {
59081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mWakeLockToken = binder;
59181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
59281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOGV("acquireWakeLock_l() %s status %d", mName, status);
59381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
59481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
59581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
59681784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::ThreadBase::releaseWakeLock()
59781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
59881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
59981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    releaseWakeLock_l();
60081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
60181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
60281784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::ThreadBase::releaseWakeLock_l()
60381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
60481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mWakeLockToken != 0) {
60581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOGV("releaseWakeLock_l() %s", mName);
60681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (mPowerManager != 0) {
60781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mPowerManager->releaseWakeLock(mWakeLockToken, 0);
60881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
60981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mWakeLockToken.clear();
61081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
61181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
61281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
613462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissenvoid AudioFlinger::ThreadBase::updateWakeLockUids(const SortedVector<int> &uids) {
614462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen    Mutex::Autolock _l(mLock);
615462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen    updateWakeLockUids_l(uids);
616462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen}
617462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen
618462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissenvoid AudioFlinger::ThreadBase::getPowerManager_l() {
619462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen
620462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen    if (mPowerManager == 0) {
621462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen        // use checkService() to avoid blocking if power service is not up yet
622462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen        sp<IBinder> binder =
623462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen            defaultServiceManager()->checkService(String16("power"));
624462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen        if (binder == 0) {
625462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen            ALOGW("Thread %s cannot connect to the power manager service", mName);
626462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen        } else {
627462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen            mPowerManager = interface_cast<IPowerManager>(binder);
628462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen            binder->linkToDeath(mDeathRecipient);
629462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen        }
630462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen    }
631462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen}
632462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen
633462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissenvoid AudioFlinger::ThreadBase::updateWakeLockUids_l(const SortedVector<int> &uids) {
634462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen
635462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen    getPowerManager_l();
636462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen    if (mWakeLockToken == NULL) {
637462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen        ALOGE("no wake lock to update!");
638462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen        return;
639462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen    }
640462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen    if (mPowerManager != 0) {
641462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen        sp<IBinder> binder = new BBinder();
642462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen        status_t status;
643462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen        status = mPowerManager->updateWakeLockUids(mWakeLockToken, uids.size(), uids.array());
644462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen        ALOGV("acquireWakeLock_l() %s status %d", mName, status);
645462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen    }
646462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen}
647462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen
64881784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::ThreadBase::clearPowerManager()
64981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
65081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
65181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    releaseWakeLock_l();
65281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mPowerManager.clear();
65381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
65481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
6550f11b51a57bc9062c4fe8af73747319cedabc5d6Glenn Kastenvoid AudioFlinger::ThreadBase::PMDeathRecipient::binderDied(const wp<IBinder>& who __unused)
65681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
65781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    sp<ThreadBase> thread = mThread.promote();
65881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (thread != 0) {
65981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        thread->clearPowerManager();
66081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
66181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOGW("power manager service died !!!");
66281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
66381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
66481784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::ThreadBase::setEffectSuspended(
66581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        const effect_uuid_t *type, bool suspend, int sessionId)
66681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
66781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
66881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    setEffectSuspended_l(type, suspend, sessionId);
66981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
67081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
67181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::ThreadBase::setEffectSuspended_l(
67281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        const effect_uuid_t *type, bool suspend, int sessionId)
67381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
67481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    sp<EffectChain> chain = getEffectChain_l(sessionId);
67581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (chain != 0) {
67681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (type != NULL) {
67781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            chain->setEffectSuspended_l(type, suspend);
67881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        } else {
67981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            chain->setEffectSuspendedAll_l(suspend);
68081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
68181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
68281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
68381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    updateSuspendedSessions_l(type, suspend, sessionId);
68481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
68581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
68681784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::ThreadBase::checkSuspendOnAddEffectChain_l(const sp<EffectChain>& chain)
68781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
68881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ssize_t index = mSuspendedSessions.indexOfKey(chain->sessionId());
68981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (index < 0) {
69081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return;
69181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
69281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
69381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    const KeyedVector <int, sp<SuspendedSessionDesc> >& sessionEffects =
69481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mSuspendedSessions.valueAt(index);
69581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
69681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (size_t i = 0; i < sessionEffects.size(); i++) {
69781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sp<SuspendedSessionDesc> desc = sessionEffects.valueAt(i);
69881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        for (int j = 0; j < desc->mRefCount; j++) {
69981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (sessionEffects.keyAt(i) == EffectChain::kKeyForSuspendAll) {
70081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                chain->setEffectSuspendedAll_l(true);
70181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            } else {
70281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                ALOGV("checkSuspendOnAddEffectChain_l() suspending effects %08x",
70381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    desc->mType.timeLow);
70481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                chain->setEffectSuspended_l(&desc->mType, true);
70581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
70681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
70781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
70881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
70981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
71081784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::ThreadBase::updateSuspendedSessions_l(const effect_uuid_t *type,
71181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                                         bool suspend,
71281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                                         int sessionId)
71381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
71481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ssize_t index = mSuspendedSessions.indexOfKey(sessionId);
71581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
71681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    KeyedVector <int, sp<SuspendedSessionDesc> > sessionEffects;
71781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
71881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (suspend) {
71981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (index >= 0) {
72081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            sessionEffects = mSuspendedSessions.valueAt(index);
72181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        } else {
72281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mSuspendedSessions.add(sessionId, sessionEffects);
72381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
72481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    } else {
72581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (index < 0) {
72681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            return;
72781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
72881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sessionEffects = mSuspendedSessions.valueAt(index);
72981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
73081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
73181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
73281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    int key = EffectChain::kKeyForSuspendAll;
73381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (type != NULL) {
73481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        key = type->timeLow;
73581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
73681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    index = sessionEffects.indexOfKey(key);
73781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
73881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    sp<SuspendedSessionDesc> desc;
73981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (suspend) {
74081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (index >= 0) {
74181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            desc = sessionEffects.valueAt(index);
74281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        } else {
74381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            desc = new SuspendedSessionDesc();
74481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (type != NULL) {
74581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                desc->mType = *type;
74681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
74781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            sessionEffects.add(key, desc);
74881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            ALOGV("updateSuspendedSessions_l() suspend adding effect %08x", key);
74981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
75081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        desc->mRefCount++;
75181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    } else {
75281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (index < 0) {
75381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            return;
75481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
75581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        desc = sessionEffects.valueAt(index);
75681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (--desc->mRefCount == 0) {
75781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            ALOGV("updateSuspendedSessions_l() restore removing effect %08x", key);
75881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            sessionEffects.removeItemsAt(index);
75981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (sessionEffects.isEmpty()) {
76081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                ALOGV("updateSuspendedSessions_l() restore removing session %d",
76181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                 sessionId);
76281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                mSuspendedSessions.removeItem(sessionId);
76381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
76481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
76581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
76681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (!sessionEffects.isEmpty()) {
76781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mSuspendedSessions.replaceValueFor(sessionId, sessionEffects);
76881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
76981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
77081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
77181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::ThreadBase::checkSuspendOnEffectEnabled(const sp<EffectModule>& effect,
77281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                                            bool enabled,
77381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                                            int sessionId)
77481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
77581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
77681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    checkSuspendOnEffectEnabled_l(effect, enabled, sessionId);
77781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
77881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
77981784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::ThreadBase::checkSuspendOnEffectEnabled_l(const sp<EffectModule>& effect,
78081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                                            bool enabled,
78181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                                            int sessionId)
78281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
78381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mType != RECORD) {
78481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // suspend all effects in AUDIO_SESSION_OUTPUT_MIX when enabling any effect on
78581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // another session. This gives the priority to well behaved effect control panels
78681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // and applications not using global effects.
78781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // Enabling post processing in AUDIO_SESSION_OUTPUT_STAGE session does not affect
78881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // global effects
78981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if ((sessionId != AUDIO_SESSION_OUTPUT_MIX) && (sessionId != AUDIO_SESSION_OUTPUT_STAGE)) {
79081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            setEffectSuspended_l(NULL, enabled, AUDIO_SESSION_OUTPUT_MIX);
79181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
79281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
79381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
79481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    sp<EffectChain> chain = getEffectChain_l(sessionId);
79581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (chain != 0) {
79681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        chain->checkSuspendOnEffectEnabled(effect, enabled);
79781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
79881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
79981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
80081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// ThreadBase::createEffect_l() must be called with AudioFlinger::mLock held
80181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentsp<AudioFlinger::EffectHandle> AudioFlinger::ThreadBase::createEffect_l(
80281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        const sp<AudioFlinger::Client>& client,
80381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        const sp<IEffectClient>& effectClient,
80481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        int32_t priority,
80581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        int sessionId,
80681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        effect_descriptor_t *desc,
80781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        int *enabled,
8089156ef3e11b68cc4b6d3cea77f1f63673855a6d1Glenn Kasten        status_t *status)
80981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
81081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    sp<EffectModule> effect;
81181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    sp<EffectHandle> handle;
81281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    status_t lStatus;
81381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    sp<EffectChain> chain;
81481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    bool chainCreated = false;
81581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    bool effectCreated = false;
81681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    bool effectRegistered = false;
81781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
81881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    lStatus = initCheck();
81981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (lStatus != NO_ERROR) {
82081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOGW("createEffect_l() Audio driver not initialized.");
82181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        goto Exit;
82281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
82381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
82498ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung    // Reject any effect on Direct output threads for now, since the format of
82598ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung    // mSinkBuffer is not guaranteed to be compatible with effect processing (PCM 16 stereo).
82698ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung    if (mType == DIRECT) {
82798ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        ALOGW("createEffect_l() Cannot add effect %s on Direct output type thread %s",
82898ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung                desc->name, mName);
82998ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        lStatus = BAD_VALUE;
83098ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        goto Exit;
83198ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung    }
83298ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung
8335baf2af52cd186633b7173196c1e4a4cd3435f22Eric Laurent    // Allow global effects only on offloaded and mixer threads
8345baf2af52cd186633b7173196c1e4a4cd3435f22Eric Laurent    if (sessionId == AUDIO_SESSION_OUTPUT_MIX) {
8355baf2af52cd186633b7173196c1e4a4cd3435f22Eric Laurent        switch (mType) {
8365baf2af52cd186633b7173196c1e4a4cd3435f22Eric Laurent        case MIXER:
8375baf2af52cd186633b7173196c1e4a4cd3435f22Eric Laurent        case OFFLOAD:
8385baf2af52cd186633b7173196c1e4a4cd3435f22Eric Laurent            break;
8395baf2af52cd186633b7173196c1e4a4cd3435f22Eric Laurent        case DIRECT:
8405baf2af52cd186633b7173196c1e4a4cd3435f22Eric Laurent        case DUPLICATING:
8415baf2af52cd186633b7173196c1e4a4cd3435f22Eric Laurent        case RECORD:
8425baf2af52cd186633b7173196c1e4a4cd3435f22Eric Laurent        default:
8435baf2af52cd186633b7173196c1e4a4cd3435f22Eric Laurent            ALOGW("createEffect_l() Cannot add global effect %s on thread %s", desc->name, mName);
8445baf2af52cd186633b7173196c1e4a4cd3435f22Eric Laurent            lStatus = BAD_VALUE;
8455baf2af52cd186633b7173196c1e4a4cd3435f22Eric Laurent            goto Exit;
8465baf2af52cd186633b7173196c1e4a4cd3435f22Eric Laurent        }
84781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
8485baf2af52cd186633b7173196c1e4a4cd3435f22Eric Laurent
84981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // Only Pre processor effects are allowed on input threads and only on input threads
85081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if ((mType == RECORD) != ((desc->flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_PRE_PROC)) {
85181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOGW("createEffect_l() effect %s (flags %08x) created on wrong thread type %d",
85281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                desc->name, desc->flags, mType);
85381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        lStatus = BAD_VALUE;
85481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        goto Exit;
85581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
85681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
85781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOGV("createEffect_l() thread %p effect %s on session %d", this, desc->name, sessionId);
85881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
85981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    { // scope for mLock
86081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        Mutex::Autolock _l(mLock);
86181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
86281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // check for existing effect chain with the requested audio session
86381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        chain = getEffectChain_l(sessionId);
86481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (chain == 0) {
86581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // create a new chain for this session
86681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            ALOGV("createEffect_l() new effect chain for session %d", sessionId);
86781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            chain = new EffectChain(this, sessionId);
86881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            addEffectChain_l(chain);
86981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            chain->setStrategy(getStrategyForSession_l(sessionId));
87081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            chainCreated = true;
87181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        } else {
87281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            effect = chain->getEffectFromDesc_l(desc);
87381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
87481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
87581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOGV("createEffect_l() got effect %p on chain %p", effect.get(), chain.get());
87681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
87781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (effect == 0) {
87881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            int id = mAudioFlinger->nextUniqueId();
87981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // Check CPU and memory usage
88081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            lStatus = AudioSystem::registerEffect(desc, mId, chain->strategy(), sessionId, id);
88181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (lStatus != NO_ERROR) {
88281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                goto Exit;
88381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
88481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            effectRegistered = true;
88581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // create a new effect module if none present in the chain
88681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            effect = new EffectModule(this, chain, desc, id, sessionId);
88781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            lStatus = effect->status();
88881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (lStatus != NO_ERROR) {
88981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                goto Exit;
89081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
8915baf2af52cd186633b7173196c1e4a4cd3435f22Eric Laurent            effect->setOffloaded(mType == OFFLOAD, mId);
8925baf2af52cd186633b7173196c1e4a4cd3435f22Eric Laurent
89381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            lStatus = chain->addEffect_l(effect);
89481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (lStatus != NO_ERROR) {
89581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                goto Exit;
89681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
89781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            effectCreated = true;
89881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
89981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            effect->setDevice(mOutDevice);
90081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            effect->setDevice(mInDevice);
90181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            effect->setMode(mAudioFlinger->getMode());
90281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            effect->setAudioSource(mAudioSource);
90381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
90481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // create effect handle and connect it to effect module
90581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        handle = new EffectHandle(effect, client, effectClient, priority);
906e75da4004b2c814987aa2adf8a76190f92d99c65Glenn Kasten        lStatus = handle->initCheck();
907e75da4004b2c814987aa2adf8a76190f92d99c65Glenn Kasten        if (lStatus == OK) {
908e75da4004b2c814987aa2adf8a76190f92d99c65Glenn Kasten            lStatus = effect->addHandle(handle.get());
909e75da4004b2c814987aa2adf8a76190f92d99c65Glenn Kasten        }
91081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (enabled != NULL) {
91181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            *enabled = (int)effect->isEnabled();
91281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
91381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
91481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
91581784c37c61b09289654b979567a42bf73cd2b12Eric LaurentExit:
91681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (lStatus != NO_ERROR && lStatus != ALREADY_EXISTS) {
91781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        Mutex::Autolock _l(mLock);
91881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (effectCreated) {
91981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            chain->removeEffect_l(effect);
92081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
92181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (effectRegistered) {
92281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            AudioSystem::unregisterEffect(effect->id());
92381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
92481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (chainCreated) {
92581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            removeEffectChain_l(chain);
92681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
92781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        handle.clear();
92881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
92981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
9309156ef3e11b68cc4b6d3cea77f1f63673855a6d1Glenn Kasten    *status = lStatus;
93181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return handle;
93281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
93381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
93481784c37c61b09289654b979567a42bf73cd2b12Eric Laurentsp<AudioFlinger::EffectModule> AudioFlinger::ThreadBase::getEffect(int sessionId, int effectId)
93581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
93681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
93781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return getEffect_l(sessionId, effectId);
93881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
93981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
94081784c37c61b09289654b979567a42bf73cd2b12Eric Laurentsp<AudioFlinger::EffectModule> AudioFlinger::ThreadBase::getEffect_l(int sessionId, int effectId)
94181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
94281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    sp<EffectChain> chain = getEffectChain_l(sessionId);
94381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return chain != 0 ? chain->getEffectFromId_l(effectId) : 0;
94481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
94581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
94681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// PlaybackThread::addEffect_l() must be called with AudioFlinger::mLock and
94781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// PlaybackThread::mLock held
94881784c37c61b09289654b979567a42bf73cd2b12Eric Laurentstatus_t AudioFlinger::ThreadBase::addEffect_l(const sp<EffectModule>& effect)
94981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
95081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // check for existing effect chain with the requested audio session
95181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    int sessionId = effect->sessionId();
95281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    sp<EffectChain> chain = getEffectChain_l(sessionId);
95381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    bool chainCreated = false;
95481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
9555baf2af52cd186633b7173196c1e4a4cd3435f22Eric Laurent    ALOGD_IF((mType == OFFLOAD) && !effect->isOffloadable(),
9565baf2af52cd186633b7173196c1e4a4cd3435f22Eric Laurent             "addEffect_l() on offloaded thread %p: effect %s does not support offload flags %x",
9575baf2af52cd186633b7173196c1e4a4cd3435f22Eric Laurent                    this, effect->desc().name, effect->desc().flags);
9585baf2af52cd186633b7173196c1e4a4cd3435f22Eric Laurent
95981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (chain == 0) {
96081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // create a new chain for this session
96181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOGV("addEffect_l() new effect chain for session %d", sessionId);
96281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        chain = new EffectChain(this, sessionId);
96381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        addEffectChain_l(chain);
96481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        chain->setStrategy(getStrategyForSession_l(sessionId));
96581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        chainCreated = true;
96681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
96781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOGV("addEffect_l() %p chain %p effect %p", this, chain.get(), effect.get());
96881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
96981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (chain->getEffectFromId_l(effect->id()) != 0) {
97081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOGW("addEffect_l() %p effect %s already present in chain %p",
97181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                this, effect->desc().name, chain.get());
97281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return BAD_VALUE;
97381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
97481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
9755baf2af52cd186633b7173196c1e4a4cd3435f22Eric Laurent    effect->setOffloaded(mType == OFFLOAD, mId);
9765baf2af52cd186633b7173196c1e4a4cd3435f22Eric Laurent
97781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    status_t status = chain->addEffect_l(effect);
97881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (status != NO_ERROR) {
97981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (chainCreated) {
98081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            removeEffectChain_l(chain);
98181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
98281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return status;
98381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
98481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
98581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    effect->setDevice(mOutDevice);
98681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    effect->setDevice(mInDevice);
98781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    effect->setMode(mAudioFlinger->getMode());
98881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    effect->setAudioSource(mAudioSource);
98981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return NO_ERROR;
99081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
99181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
99281784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::ThreadBase::removeEffect_l(const sp<EffectModule>& effect) {
99381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
99481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOGV("removeEffect_l() %p effect %p", this, effect.get());
99581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    effect_descriptor_t desc = effect->desc();
99681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if ((desc.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
99781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        detachAuxEffect_l(effect->id());
99881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
99981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
100081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    sp<EffectChain> chain = effect->chain().promote();
100181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (chain != 0) {
100281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // remove effect chain if removing last effect
100381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (chain->removeEffect_l(effect) == 0) {
100481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            removeEffectChain_l(chain);
100581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
100681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    } else {
100781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOGW("removeEffect_l() %p cannot promote chain for effect %p", this, effect.get());
100881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
100981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
101081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
101181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::ThreadBase::lockEffectChains_l(
101281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        Vector< sp<AudioFlinger::EffectChain> >& effectChains)
101381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
101481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    effectChains = mEffectChains;
101581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (size_t i = 0; i < mEffectChains.size(); i++) {
101681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mEffectChains[i]->lock();
101781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
101881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
101981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
102081784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::ThreadBase::unlockEffectChains(
102181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        const Vector< sp<AudioFlinger::EffectChain> >& effectChains)
102281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
102381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (size_t i = 0; i < effectChains.size(); i++) {
102481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        effectChains[i]->unlock();
102581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
102681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
102781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
102881784c37c61b09289654b979567a42bf73cd2b12Eric Laurentsp<AudioFlinger::EffectChain> AudioFlinger::ThreadBase::getEffectChain(int sessionId)
102981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
103081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
103181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return getEffectChain_l(sessionId);
103281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
103381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
103481784c37c61b09289654b979567a42bf73cd2b12Eric Laurentsp<AudioFlinger::EffectChain> AudioFlinger::ThreadBase::getEffectChain_l(int sessionId) const
103581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
103681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    size_t size = mEffectChains.size();
103781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (size_t i = 0; i < size; i++) {
103881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (mEffectChains[i]->sessionId() == sessionId) {
103981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            return mEffectChains[i];
104081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
104181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
104281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return 0;
104381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
104481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
104581784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::ThreadBase::setMode(audio_mode_t mode)
104681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
104781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
104881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    size_t size = mEffectChains.size();
104981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (size_t i = 0; i < size; i++) {
105081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mEffectChains[i]->setMode_l(mode);
105181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
105281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
105381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
105481784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::ThreadBase::disconnectEffect(const sp<EffectModule>& effect,
105581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                                    EffectHandle *handle,
105681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                                    bool unpinIfLast) {
105781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
105881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
105981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOGV("disconnectEffect() %p effect %p", this, effect.get());
106081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // delete the effect module if removing last handle on it
106181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (effect->removeHandle(handle) == 0) {
106281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (!effect->isPinned() || unpinIfLast) {
106381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            removeEffect_l(effect);
106481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            AudioSystem::unregisterEffect(effect->id());
106581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
106681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
106781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
106881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
106981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// ----------------------------------------------------------------------------
107081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent//      Playback
107181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// ----------------------------------------------------------------------------
107281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
107381784c37c61b09289654b979567a42bf73cd2b12Eric LaurentAudioFlinger::PlaybackThread::PlaybackThread(const sp<AudioFlinger>& audioFlinger,
107481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                             AudioStreamOut* output,
107581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                             audio_io_handle_t id,
107681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                             audio_devices_t device,
107781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                             type_t type)
107881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    :   ThreadBase(audioFlinger, id, device, AUDIO_DEVICE_NONE, type),
10792098f2744cedf2dc3fa36f608aa965a34602e7c0Andy Hung        mNormalFrameCount(0), mSinkBuffer(NULL),
108069aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung        mMixerBufferEnabled(false),
108169aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung        mMixerBuffer(NULL),
108269aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung        mMixerBufferSize(0),
108369aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung        mMixerBufferFormat(AUDIO_FORMAT_INVALID),
108469aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung        mMixerBufferValid(false),
108598ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        mEffectBufferEnabled(false),
108698ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        mEffectBuffer(NULL),
108798ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        mEffectBufferSize(0),
108898ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        mEffectBufferFormat(AUDIO_FORMAT_INVALID),
108998ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        mEffectBufferValid(false),
1090c1fac191069774c7bfcb062edbb821ea56e7dbc0Glenn Kasten        mSuspended(0), mBytesWritten(0),
1091462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen        mActiveTracksGeneration(0),
109281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // mStreamTypes[] initialized in constructor body
109381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mOutput(output),
109481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mLastWriteTime(0), mNumWrites(0), mNumDelayedWrites(0), mInWrite(false),
109581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mMixerStatus(MIXER_IDLE),
109681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mMixerStatusIgnoringFastTracks(MIXER_IDLE),
109781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        standbyDelay(AudioFlinger::mStandbyTimeInNsecs),
1098bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        mBytesRemaining(0),
1099bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        mCurrentWriteLength(0),
1100bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        mUseAsyncWrite(false),
11013b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent        mWriteAckSequence(0),
11023b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent        mDrainSequence(0),
1103ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent        mSignalPending(false),
110481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mScreenState(AudioFlinger::mScreenState),
110581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // index 0 is reserved for normal mixer's submix
1106bd096fd9d8e5fc0e62f98807f4818a06f70d0812Glenn Kasten        mFastTrackAvailMask(((1 << FastMixerState::kMaxFastTracks) - 1) & ~1),
1107bd096fd9d8e5fc0e62f98807f4818a06f70d0812Glenn Kasten        // mLatchD, mLatchQ,
1108bd096fd9d8e5fc0e62f98807f4818a06f70d0812Glenn Kasten        mLatchDValid(false), mLatchQValid(false)
110981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
111081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    snprintf(mName, kNameLength, "AudioOut_%X", id);
11119e58b552f51b00b3b674102876bd6c77ef3da806Glenn Kasten    mNBLogWriter = audioFlinger->newWriter_l(kLogSize, mName);
111281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
111381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // Assumes constructor is called by AudioFlinger with it's mLock held, but
111481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // it would be safer to explicitly pass initial masterVolume/masterMute as
111581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // parameter.
111681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    //
111781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // If the HAL we are using has support for master volume or master mute,
111881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // then do not attenuate or mute during mixing (just leave the volume at 1.0
111981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // and the mute set to false).
112081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mMasterVolume = audioFlinger->masterVolume_l();
112181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mMasterMute = audioFlinger->masterMute_l();
112281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mOutput && mOutput->audioHwDev) {
112381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (mOutput->audioHwDev->canSetMasterVolume()) {
112481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mMasterVolume = 1.0;
112581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
112681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
112781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (mOutput->audioHwDev->canSetMasterMute()) {
112881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mMasterMute = false;
112981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
113081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
113181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
1132deca2ae0a7cf8bc54ff3f30b7dc39bbc78b94c0dGlenn Kasten    readOutputParameters_l();
113381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
113481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // mStreamTypes[AUDIO_STREAM_CNT] is initialized by stream_type_t default constructor
113581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // There is no AUDIO_STREAM_MIN, and ++ operator does not compile
113681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (audio_stream_type_t stream = (audio_stream_type_t) 0; stream < AUDIO_STREAM_CNT;
113781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            stream = (audio_stream_type_t) (stream + 1)) {
113881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mStreamTypes[stream].volume = mAudioFlinger->streamVolume_l(stream);
113981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mStreamTypes[stream].mute = mAudioFlinger->streamMute_l(stream);
114081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
114181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // mStreamTypes[AUDIO_STREAM_CNT] exists but isn't explicitly initialized here,
114281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // because mAudioFlinger doesn't have one to copy from
114381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
114481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
114581784c37c61b09289654b979567a42bf73cd2b12Eric LaurentAudioFlinger::PlaybackThread::~PlaybackThread()
114681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
11479e58b552f51b00b3b674102876bd6c77ef3da806Glenn Kasten    mAudioFlinger->unregisterWriter(mNBLogWriter);
11482098f2744cedf2dc3fa36f608aa965a34602e7c0Andy Hung    delete[] mSinkBuffer;
114969aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung    free(mMixerBuffer);
115098ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung    free(mEffectBuffer);
115181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
115281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
115381784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::PlaybackThread::dump(int fd, const Vector<String16>& args)
115481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
115581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    dumpInternals(fd, args);
115681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    dumpTracks(fd, args);
115781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    dumpEffectChains(fd, args);
115881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
115981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
11600f11b51a57bc9062c4fe8af73747319cedabc5d6Glenn Kastenvoid AudioFlinger::PlaybackThread::dumpTracks(int fd, const Vector<String16>& args __unused)
116181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
116281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    const size_t SIZE = 256;
116381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    char buffer[SIZE];
116481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    String8 result;
116581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
1166b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    result.appendFormat("  Stream volumes in dB: ");
116781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (int i = 0; i < AUDIO_STREAM_CNT; ++i) {
116881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        const stream_type_t *st = &mStreamTypes[i];
116981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (i > 0) {
117081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            result.appendFormat(", ");
117181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
117281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        result.appendFormat("%d:%.2g", i, 20.0 * log10(st->volume));
117381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (st->mute) {
117481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            result.append("M");
117581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
117681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
117781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    result.append("\n");
117881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    write(fd, result.string(), result.length());
117981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    result.clear();
118081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
1181b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    // These values are "raw"; they will wrap around.  See prepareTracks_l() for a better way.
1182b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    FastTrackUnderruns underruns = getFastTrackUnderruns(0);
1183b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    fdprintf(fd, "  Normal mixer raw underrun counters: partial=%u empty=%u\n",
1184b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen            underruns.mBitFields.mPartial, underruns.mBitFields.mEmpty);
1185b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen
1186b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    size_t numtracks = mTracks.size();
1187b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    size_t numactive = mActiveTracks.size();
1188b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    fdprintf(fd, "  %d Tracks", numtracks);
1189b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    size_t numactiveseen = 0;
1190b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    if (numtracks) {
1191b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        fdprintf(fd, " of which %d are active\n", numactive);
1192b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        Track::appendDumpHeader(result);
1193b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        for (size_t i = 0; i < numtracks; ++i) {
1194b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen            sp<Track> track = mTracks[i];
1195b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen            if (track != 0) {
1196b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen                bool active = mActiveTracks.indexOf(track) >= 0;
1197b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen                if (active) {
1198b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen                    numactiveseen++;
1199b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen                }
1200b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen                track->dump(buffer, SIZE, active);
1201b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen                result.append(buffer);
1202b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen            }
120381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
1204b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    } else {
1205b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        result.append("\n");
120681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
1207b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    if (numactiveseen != numactive) {
1208b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        // some tracks in the active list were not in the tracks list
1209b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        snprintf(buffer, SIZE, "  The following tracks are in the active list but"
1210b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen                " not in the track list\n");
1211b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        result.append(buffer);
1212b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        Track::appendDumpHeader(result);
1213b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        for (size_t i = 0; i < numactive; ++i) {
1214b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen            sp<Track> track = mActiveTracks[i].promote();
1215b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen            if (track != 0 && mTracks.indexOf(track) < 0) {
1216b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen                track->dump(buffer, SIZE, true);
1217b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen                result.append(buffer);
1218b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen            }
121981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
122081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
1221b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen
122281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    write(fd, result.string(), result.size());
122381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
122481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
122581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
122681784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::PlaybackThread::dumpInternals(int fd, const Vector<String16>& args)
122781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
1228b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    fdprintf(fd, "\nOutput thread %p:\n", this);
12291d6fa7af1288b550faabe4ec2cf98684236723dbNarayan Kamath    fdprintf(fd, "  Normal frame count: %zu\n", mNormalFrameCount);
1230b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    fdprintf(fd, "  Last write occurred (msecs): %llu\n", ns2ms(systemTime() - mLastWriteTime));
1231b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    fdprintf(fd, "  Total writes: %d\n", mNumWrites);
1232b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    fdprintf(fd, "  Delayed writes: %d\n", mNumDelayedWrites);
1233b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    fdprintf(fd, "  Blocked in write: %s\n", mInWrite ? "yes" : "no");
1234b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    fdprintf(fd, "  Suspend count: %d\n", mSuspended);
12352098f2744cedf2dc3fa36f608aa965a34602e7c0Andy Hung    fdprintf(fd, "  Sink buffer : %p\n", mSinkBuffer);
123669aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung    fdprintf(fd, "  Mixer buffer: %p\n", mMixerBuffer);
123798ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung    fdprintf(fd, "  Effect buffer: %p\n", mEffectBuffer);
1238b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    fdprintf(fd, "  Fast track availMask=%#x\n", mFastTrackAvailMask);
123981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
124081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    dumpBase(fd, args);
124181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
124281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
124381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// Thread virtuals
124481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
124581784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::PlaybackThread::onFirstRef()
124681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
124781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    run(mName, ANDROID_PRIORITY_URGENT_AUDIO);
124881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
124981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
125081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// ThreadBase virtuals
125181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::PlaybackThread::preExit()
125281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
125381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOGV("  preExit()");
125481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // FIXME this is using hard-coded strings but in the future, this functionality will be
125581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    //       converted to use audio HAL extensions required to support tunneling
125681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mOutput->stream->common.set_parameters(&mOutput->stream->common, "exiting=1");
125781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
125881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
125981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// PlaybackThread::createTrack_l() must be called with AudioFlinger::mLock held
126081784c37c61b09289654b979567a42bf73cd2b12Eric Laurentsp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTrack_l(
126181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        const sp<AudioFlinger::Client>& client,
126281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        audio_stream_type_t streamType,
126381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        uint32_t sampleRate,
126481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        audio_format_t format,
126581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        audio_channel_mask_t channelMask,
126674935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten        size_t *pFrameCount,
126781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        const sp<IMemory>& sharedBuffer,
126881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        int sessionId,
126981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        IAudioFlinger::track_flags_t *flags,
127081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        pid_t tid,
1271462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen        int uid,
127281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        status_t *status)
127381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
127474935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten    size_t frameCount = *pFrameCount;
127581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    sp<Track> track;
127681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    status_t lStatus;
127781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
127881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    bool isTimed = (*flags & IAudioFlinger::TRACK_TIMED) != 0;
127981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
128081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // client expresses a preference for FAST, but we get the final say
128181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (*flags & IAudioFlinger::TRACK_FAST) {
128281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent      if (
128381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // not timed
128481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            (!isTimed) &&
128581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // either of these use cases:
128681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            (
128781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent              // use case 1: shared buffer with any frame count
128881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent              (
128981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                (sharedBuffer != 0)
129081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent              ) ||
129181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent              // use case 2: callback handler and frame count is default or at least as large as HAL
129281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent              (
129381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                (tid != -1) &&
129481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                ((frameCount == 0) ||
1295b5fed68bcdd6f44424c9e4d12bfe9a3ff51bd62eGlenn Kasten                (frameCount >= mFrameCount))
129681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent              )
129781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            ) &&
129881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // PCM data
129981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            audio_is_linear_pcm(format) &&
130081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // mono or stereo
130181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            ( (channelMask == AUDIO_CHANNEL_OUT_MONO) ||
130281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent              (channelMask == AUDIO_CHANNEL_OUT_STEREO) ) &&
130381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // hardware sample rate
130481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            (sampleRate == mSampleRate) &&
130581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // normal mixer has an associated fast mixer
130681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            hasFastMixer() &&
130781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // there are sufficient fast track slots available
130881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            (mFastTrackAvailMask != 0)
130981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // FIXME test that MixerThread for this fast track has a capable output HAL
131081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // FIXME add a permission test also?
131181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ) {
131281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // if frameCount not specified, then it defaults to fast mixer (HAL) frame count
131381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (frameCount == 0) {
131481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            frameCount = mFrameCount * kFastTrackMultiplier;
131581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
131681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOGV("AUDIO_OUTPUT_FLAG_FAST accepted: frameCount=%d mFrameCount=%d",
131781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                frameCount, mFrameCount);
131881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent      } else {
131981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOGV("AUDIO_OUTPUT_FLAG_FAST denied: isTimed=%d sharedBuffer=%p frameCount=%d "
132081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                "mFrameCount=%d format=%d isLinear=%d channelMask=%#x sampleRate=%u mSampleRate=%u "
132181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                "hasFastMixer=%d tid=%d fastTrackAvailMask=%#x",
132281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                isTimed, sharedBuffer.get(), frameCount, mFrameCount, format,
132381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                audio_is_linear_pcm(format),
132481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                channelMask, sampleRate, mSampleRate, hasFastMixer(), tid, mFastTrackAvailMask);
132581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        *flags &= ~IAudioFlinger::TRACK_FAST;
132681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // For compatibility with AudioTrack calculation, buffer depth is forced
132781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // to be at least 2 x the normal mixer frame count and cover audio hardware latency.
132881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // This is probably too conservative, but legacy application code may depend on it.
132981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // If you change this calculation, also review the start threshold which is related.
133081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        uint32_t latencyMs = mOutput->stream->get_latency(mOutput->stream);
133181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        uint32_t minBufCount = latencyMs / ((1000 * mNormalFrameCount) / mSampleRate);
133281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (minBufCount < 2) {
133381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            minBufCount = 2;
133481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
133581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        size_t minFrameCount = mNormalFrameCount * minBufCount;
133681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (frameCount < minFrameCount) {
133781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            frameCount = minFrameCount;
133881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
133981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent      }
134081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
134174935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten    *pFrameCount = frameCount;
134281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
134381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mType == DIRECT) {
134481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if ((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_PCM) {
134581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (sampleRate != mSampleRate || format != mFormat || channelMask != mChannelMask) {
1346cac3daa6332bf6d1f7d26adc4a9915f3d7992dd9Glenn Kasten                ALOGE("createTrack_l() Bad parameter: sampleRate %u format %#x, channelMask 0x%08x "
1347cac3daa6332bf6d1f7d26adc4a9915f3d7992dd9Glenn Kasten                        "for output %p with format %#x",
134881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        sampleRate, format, channelMask, mOutput, mFormat);
134981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                lStatus = BAD_VALUE;
135081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                goto Exit;
135181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
135281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
1353bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    } else if (mType == OFFLOAD) {
1354bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        if (sampleRate != mSampleRate || format != mFormat || channelMask != mChannelMask) {
1355cac3daa6332bf6d1f7d26adc4a9915f3d7992dd9Glenn Kasten            ALOGE("createTrack_l() Bad parameter: sampleRate %d format %#x, channelMask 0x%08x \""
1356cac3daa6332bf6d1f7d26adc4a9915f3d7992dd9Glenn Kasten                    "for output %p with format %#x",
1357bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    sampleRate, format, channelMask, mOutput, mFormat);
1358bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            lStatus = BAD_VALUE;
1359bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            goto Exit;
1360bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        }
136181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    } else {
1362bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        if ((format & AUDIO_FORMAT_MAIN_MASK) != AUDIO_FORMAT_PCM) {
1363cac3daa6332bf6d1f7d26adc4a9915f3d7992dd9Glenn Kasten                ALOGE("createTrack_l() Bad parameter: format %#x \""
1364cac3daa6332bf6d1f7d26adc4a9915f3d7992dd9Glenn Kasten                        "for output %p with format %#x",
1365bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                        format, mOutput, mFormat);
1366bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                lStatus = BAD_VALUE;
1367bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                goto Exit;
1368bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        }
136981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // Resampler implementation limits input sampling rate to 2 x output sampling rate.
137081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (sampleRate > mSampleRate*2) {
137181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            ALOGE("Sample rate out of range: %u mSampleRate %u", sampleRate, mSampleRate);
137281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            lStatus = BAD_VALUE;
137381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            goto Exit;
137481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
137581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
137681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
137781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    lStatus = initCheck();
137881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (lStatus != NO_ERROR) {
137981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOGE("Audio driver not initialized.");
138081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        goto Exit;
138181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
138281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
138381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    { // scope for mLock
138481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        Mutex::Autolock _l(mLock);
138581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
138681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // all tracks in same audio session must share the same routing strategy otherwise
138781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // conflicts will happen when tracks are moved from one output to another by audio policy
138881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // manager
138981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        uint32_t strategy = AudioSystem::getStrategyForStream(streamType);
139081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        for (size_t i = 0; i < mTracks.size(); ++i) {
139181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            sp<Track> t = mTracks[i];
139281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (t != 0 && !t->isOutputTrack()) {
139381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                uint32_t actual = AudioSystem::getStrategyForStream(t->streamType());
139481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (sessionId == t->sessionId() && strategy != actual) {
139581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    ALOGE("createTrack_l() mismatched strategy; expected %u but found %u",
139681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                            strategy, actual);
139781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    lStatus = BAD_VALUE;
139881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    goto Exit;
139981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
140081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
140181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
140281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
140381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (!isTimed) {
140481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            track = new Track(this, client, streamType, sampleRate, format,
1405462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen                    channelMask, frameCount, sharedBuffer, sessionId, uid, *flags);
140681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        } else {
140781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            track = TimedTrack::create(this, client, streamType, sampleRate, format,
1408462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen                    channelMask, frameCount, sharedBuffer, sessionId, uid);
140981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
1410030033342a6ea17003e6af38a56c7edc6d2ead01Glenn Kasten
1411030033342a6ea17003e6af38a56c7edc6d2ead01Glenn Kasten        // new Track always returns non-NULL,
1412030033342a6ea17003e6af38a56c7edc6d2ead01Glenn Kasten        // but TimedTrack::create() is a factory that could fail by returning NULL
1413030033342a6ea17003e6af38a56c7edc6d2ead01Glenn Kasten        lStatus = track != 0 ? track->initCheck() : (status_t) NO_MEMORY;
1414030033342a6ea17003e6af38a56c7edc6d2ead01Glenn Kasten        if (lStatus != NO_ERROR) {
14150cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten            ALOGE("createTrack_l() initCheck failed %d; no control block?", lStatus);
141603e9e83c47ab4a518da0a1f36b8f702f59221c95Haynes Mathew George            // track must be cleared from the caller as the caller has the AF lock
141781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            goto Exit;
141881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
1419bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
142081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mTracks.add(track);
142181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
142281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sp<EffectChain> chain = getEffectChain_l(sessionId);
142381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (chain != 0) {
142481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            ALOGV("createTrack_l() setting main buffer %p", chain->inBuffer());
142581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            track->setMainBuffer(chain->inBuffer());
142681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            chain->setStrategy(AudioSystem::getStrategyForStream(track->streamType()));
142781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            chain->incTrackCnt();
142881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
142981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
143081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if ((*flags & IAudioFlinger::TRACK_FAST) && (tid != -1)) {
143181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            pid_t callingPid = IPCThreadState::self()->getCallingPid();
143281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // we don't have CAP_SYS_NICE, nor do we want to have it as it's too powerful,
143381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // so ask activity manager to do this on our behalf
143481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            sendPrioConfigEvent_l(callingPid, tid, kPriorityAudioApp);
143581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
143681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
143781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
143881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    lStatus = NO_ERROR;
143981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
144081784c37c61b09289654b979567a42bf73cd2b12Eric LaurentExit:
14419156ef3e11b68cc4b6d3cea77f1f63673855a6d1Glenn Kasten    *status = lStatus;
144281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return track;
144381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
144481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
144581784c37c61b09289654b979567a42bf73cd2b12Eric Laurentuint32_t AudioFlinger::PlaybackThread::correctLatency_l(uint32_t latency) const
144681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
144781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return latency;
144881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
144981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
145081784c37c61b09289654b979567a42bf73cd2b12Eric Laurentuint32_t AudioFlinger::PlaybackThread::latency() const
145181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
145281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
145381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return latency_l();
145481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
145581784c37c61b09289654b979567a42bf73cd2b12Eric Laurentuint32_t AudioFlinger::PlaybackThread::latency_l() const
145681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
145781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (initCheck() == NO_ERROR) {
145881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return correctLatency_l(mOutput->stream->get_latency(mOutput->stream));
145981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    } else {
146081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return 0;
146181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
146281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
146381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
146481784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::PlaybackThread::setMasterVolume(float value)
146581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
146681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
146781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // Don't apply master volume in SW if our HAL can do it for us.
146881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mOutput && mOutput->audioHwDev &&
146981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mOutput->audioHwDev->canSetMasterVolume()) {
147081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mMasterVolume = 1.0;
147181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    } else {
147281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mMasterVolume = value;
147381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
147481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
147581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
147681784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::PlaybackThread::setMasterMute(bool muted)
147781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
147881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
147981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // Don't apply master mute in SW if our HAL can do it for us.
148081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mOutput && mOutput->audioHwDev &&
148181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mOutput->audioHwDev->canSetMasterMute()) {
148281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mMasterMute = false;
148381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    } else {
148481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mMasterMute = muted;
148581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
148681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
148781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
148881784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::PlaybackThread::setStreamVolume(audio_stream_type_t stream, float value)
148981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
149081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
149181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mStreamTypes[stream].volume = value;
1492ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent    broadcast_l();
149381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
149481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
149581784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::PlaybackThread::setStreamMute(audio_stream_type_t stream, bool muted)
149681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
149781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
149881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mStreamTypes[stream].mute = muted;
1499ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent    broadcast_l();
150081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
150181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
150281784c37c61b09289654b979567a42bf73cd2b12Eric Laurentfloat AudioFlinger::PlaybackThread::streamVolume(audio_stream_type_t stream) const
150381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
150481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
150581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return mStreamTypes[stream].volume;
150681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
150781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
150881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// addTrack_l() must be called with ThreadBase::mLock held
150981784c37c61b09289654b979567a42bf73cd2b12Eric Laurentstatus_t AudioFlinger::PlaybackThread::addTrack_l(const sp<Track>& track)
151081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
151181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    status_t status = ALREADY_EXISTS;
151281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
151381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // set retry count for buffer fill
151481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    track->mRetryCount = kMaxTrackStartupRetries;
151581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mActiveTracks.indexOf(track) < 0) {
151681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // the track is newly added, make sure it fills up all its
151781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // buffers before playing. This is to ensure the client will
151881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // effectively get the latency it requested.
1519bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        if (!track->isOutputTrack()) {
1520bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            TrackBase::track_state state = track->mState;
1521bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            mLock.unlock();
1522bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            status = AudioSystem::startOutput(mId, track->streamType(), track->sessionId());
1523bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            mLock.lock();
1524bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            // abort track was stopped/paused while we released the lock
1525bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            if (state != track->mState) {
1526bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                if (status == NO_ERROR) {
1527bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    mLock.unlock();
1528bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    AudioSystem::stopOutput(mId, track->streamType(), track->sessionId());
1529bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    mLock.lock();
1530bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                }
1531bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                return INVALID_OPERATION;
1532bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            }
1533bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            // abort if start is rejected by audio policy manager
1534bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            if (status != NO_ERROR) {
1535bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                return PERMISSION_DENIED;
1536bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            }
1537bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent#ifdef ADD_BATTERY_DATA
1538bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            // to track the speaker usage
1539bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            addBatteryData(IMediaPlayerService::kBatteryDataAudioFlingerStart);
1540bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent#endif
1541bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        }
1542bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
15439f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        track->mFillingUpStatus = track->sharedBuffer() != 0 ? Track::FS_FILLED : Track::FS_FILLING;
154481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        track->mResetDone = false;
154581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        track->mPresentationCompleteFrames = 0;
154681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mActiveTracks.add(track);
1547462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen        mWakeLockUids.add(track->uid());
1548462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen        mActiveTracksGeneration++;
1549fd4779740ec3e9e865d5514464df26d015354388Eric Laurent        mLatestActiveTrack = track;
1550d0107bcd44fe608b0c00a8843d19fb6356c4cb69Eric Laurent        sp<EffectChain> chain = getEffectChain_l(track->sessionId());
1551d0107bcd44fe608b0c00a8843d19fb6356c4cb69Eric Laurent        if (chain != 0) {
1552d0107bcd44fe608b0c00a8843d19fb6356c4cb69Eric Laurent            ALOGV("addTrack_l() starting track on chain %p for session %d", chain.get(),
1553d0107bcd44fe608b0c00a8843d19fb6356c4cb69Eric Laurent                    track->sessionId());
1554d0107bcd44fe608b0c00a8843d19fb6356c4cb69Eric Laurent            chain->incActiveTrackCnt();
155581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
155681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
155781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        status = NO_ERROR;
155881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
155981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
15604c6a433d74d5ae8b9bc0557207e3ced43bf34a25Haynes Mathew George    onAddNewTrack_l();
156181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return status;
156281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
156381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
1564bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurentbool AudioFlinger::PlaybackThread::destroyTrack_l(const sp<Track>& track)
156581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
1566bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    track->terminate();
156781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // active tracks are removed by threadLoop()
1568bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    bool trackActive = (mActiveTracks.indexOf(track) >= 0);
1569bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    track->mState = TrackBase::STOPPED;
1570bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    if (!trackActive) {
157181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        removeTrack_l(track);
1572bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    } else if (track->isFastTrack() || track->isOffloaded()) {
1573bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        track->mState = TrackBase::STOPPING_1;
157481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
1575bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
1576bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    return trackActive;
157781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
157881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
157981784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::PlaybackThread::removeTrack_l(const sp<Track>& track)
158081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
158181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    track->triggerEvents(AudioSystem::SYNC_EVENT_PRESENTATION_COMPLETE);
158281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mTracks.remove(track);
158381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    deleteTrackName_l(track->name());
158481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // redundant as track is about to be destroyed, for dumpsys only
158581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    track->mName = -1;
158681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (track->isFastTrack()) {
158781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        int index = track->mFastIndex;
158881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOG_ASSERT(0 < index && index < (int)FastMixerState::kMaxFastTracks);
158981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOG_ASSERT(!(mFastTrackAvailMask & (1 << index)));
159081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mFastTrackAvailMask |= 1 << index;
159181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // redundant as track is about to be destroyed, for dumpsys only
159281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        track->mFastIndex = -1;
159381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
159481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    sp<EffectChain> chain = getEffectChain_l(track->sessionId());
159581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (chain != 0) {
159681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        chain->decTrackCnt();
159781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
159881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
159981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
1600ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurentvoid AudioFlinger::PlaybackThread::broadcast_l()
1601bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
1602bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    // Thread could be blocked waiting for async
1603bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    // so signal it to handle state changes immediately
1604bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    // If threadLoop is currently unlocked a signal of mWaitWorkCV will
1605bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    // be lost so we also flag to prevent it blocking on mWaitWorkCV
1606bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    mSignalPending = true;
1607ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent    mWaitWorkCV.broadcast();
1608bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
1609bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
161081784c37c61b09289654b979567a42bf73cd2b12Eric LaurentString8 AudioFlinger::PlaybackThread::getParameters(const String8& keys)
161181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
161281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
161381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (initCheck() != NO_ERROR) {
1614d8ea699dc8e7dac58bb32e9cdb31b0758da25817Glenn Kasten        return String8();
161581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
161681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
1617d8ea699dc8e7dac58bb32e9cdb31b0758da25817Glenn Kasten    char *s = mOutput->stream->common.get_parameters(&mOutput->stream->common, keys.string());
1618d8ea699dc8e7dac58bb32e9cdb31b0758da25817Glenn Kasten    const String8 out_s8(s);
161981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    free(s);
162081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return out_s8;
162181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
162281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
162381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// audioConfigChanged_l() must be called with AudioFlinger::mLock held
162481784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::PlaybackThread::audioConfigChanged_l(int event, int param) {
162581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    AudioSystem::OutputDescriptor desc;
162681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    void *param2 = NULL;
162781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
162881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOGV("PlaybackThread::audioConfigChanged_l, thread %p, event %d, param %d", this, event,
162981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            param);
163081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
163181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    switch (event) {
163281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    case AudioSystem::OUTPUT_OPENED:
163381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    case AudioSystem::OUTPUT_CONFIG_CHANGED:
1634fad226abd12435dbcd232f7de396f1a097b2bd5fGlenn Kasten        desc.channelMask = mChannelMask;
163581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        desc.samplingRate = mSampleRate;
163681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        desc.format = mFormat;
163781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        desc.frameCount = mNormalFrameCount; // FIXME see
163881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                             // AudioFlinger::frameCount(audio_io_handle_t)
163981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        desc.latency = latency();
164081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        param2 = &desc;
164181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        break;
164281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
164381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    case AudioSystem::STREAM_CONFIG_CHANGED:
164481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        param2 = &param;
164581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    case AudioSystem::OUTPUT_CLOSED:
164681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    default:
164781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        break;
164881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
164981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mAudioFlinger->audioConfigChanged_l(event, mId, param2);
165081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
165181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
1652bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurentvoid AudioFlinger::PlaybackThread::writeCallback()
1653bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
1654bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    ALOG_ASSERT(mCallbackThread != 0);
16553b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent    mCallbackThread->resetWriteBlocked();
1656bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
1657bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
1658bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurentvoid AudioFlinger::PlaybackThread::drainCallback()
1659bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
1660bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    ALOG_ASSERT(mCallbackThread != 0);
16613b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent    mCallbackThread->resetDraining();
1662bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
1663bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
16643b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurentvoid AudioFlinger::PlaybackThread::resetWriteBlocked(uint32_t sequence)
1665bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
1666bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    Mutex::Autolock _l(mLock);
16673b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent    // reject out of sequence requests
16683b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent    if ((mWriteAckSequence & 1) && (sequence == mWriteAckSequence)) {
16693b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent        mWriteAckSequence &= ~1;
1670bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        mWaitWorkCV.signal();
1671bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    }
1672bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
1673bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
16743b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurentvoid AudioFlinger::PlaybackThread::resetDraining(uint32_t sequence)
1675bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
1676bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    Mutex::Autolock _l(mLock);
16773b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent    // reject out of sequence requests
16783b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent    if ((mDrainSequence & 1) && (sequence == mDrainSequence)) {
16793b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent        mDrainSequence &= ~1;
1680bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        mWaitWorkCV.signal();
1681bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    }
1682bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
1683bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
1684bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent// static
1685bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurentint AudioFlinger::PlaybackThread::asyncCallback(stream_callback_event_t event,
16860f11b51a57bc9062c4fe8af73747319cedabc5d6Glenn Kasten                                                void *param __unused,
1687bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                                                void *cookie)
1688bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
1689bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    AudioFlinger::PlaybackThread *me = (AudioFlinger::PlaybackThread *)cookie;
1690bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    ALOGV("asyncCallback() event %d", event);
1691bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    switch (event) {
1692bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    case STREAM_CBK_EVENT_WRITE_READY:
1693bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        me->writeCallback();
1694bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        break;
1695bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    case STREAM_CBK_EVENT_DRAIN_READY:
1696bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        me->drainCallback();
1697bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        break;
1698bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    default:
1699bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        ALOGW("asyncCallback() unknown event %d", event);
1700bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        break;
1701bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    }
1702bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    return 0;
1703bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
1704bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
1705deca2ae0a7cf8bc54ff3f30b7dc39bbc78b94c0dGlenn Kastenvoid AudioFlinger::PlaybackThread::readOutputParameters_l()
170681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
17077fc97ba08e2850f3f16db704b78ce78e3dbe1ff0Glenn Kasten    // unfortunately we have no way of recovering from errors here, hence the LOG_FATAL
170881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mSampleRate = mOutput->stream->common.get_sample_rate(&mOutput->stream->common);
170981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mChannelMask = mOutput->stream->common.get_channels(&mOutput->stream->common);
17107fc97ba08e2850f3f16db704b78ce78e3dbe1ff0Glenn Kasten    if (!audio_is_output_channel(mChannelMask)) {
17117fc97ba08e2850f3f16db704b78ce78e3dbe1ff0Glenn Kasten        LOG_FATAL("HAL channel mask %#x not valid for output", mChannelMask);
17127fc97ba08e2850f3f16db704b78ce78e3dbe1ff0Glenn Kasten    }
17137fc97ba08e2850f3f16db704b78ce78e3dbe1ff0Glenn Kasten    if ((mType == MIXER || mType == DUPLICATING) && mChannelMask != AUDIO_CHANNEL_OUT_STEREO) {
17147fc97ba08e2850f3f16db704b78ce78e3dbe1ff0Glenn Kasten        LOG_FATAL("HAL channel mask %#x not supported for mixed output; "
17157fc97ba08e2850f3f16db704b78ce78e3dbe1ff0Glenn Kasten                "must be AUDIO_CHANNEL_OUT_STEREO", mChannelMask);
17167fc97ba08e2850f3f16db704b78ce78e3dbe1ff0Glenn Kasten    }
1717f6ed423af92a56ef54bba23eba883b1f21448b54Glenn Kasten    mChannelCount = popcount(mChannelMask);
171881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mFormat = mOutput->stream->common.get_format(&mOutput->stream->common);
17197fc97ba08e2850f3f16db704b78ce78e3dbe1ff0Glenn Kasten    if (!audio_is_valid_format(mFormat)) {
1720cac3daa6332bf6d1f7d26adc4a9915f3d7992dd9Glenn Kasten        LOG_FATAL("HAL format %#x not valid for output", mFormat);
17217fc97ba08e2850f3f16db704b78ce78e3dbe1ff0Glenn Kasten    }
17227fc97ba08e2850f3f16db704b78ce78e3dbe1ff0Glenn Kasten    if ((mType == MIXER || mType == DUPLICATING) && mFormat != AUDIO_FORMAT_PCM_16_BIT) {
1723cac3daa6332bf6d1f7d26adc4a9915f3d7992dd9Glenn Kasten        LOG_FATAL("HAL format %#x not supported for mixed output; must be AUDIO_FORMAT_PCM_16_BIT",
17247fc97ba08e2850f3f16db704b78ce78e3dbe1ff0Glenn Kasten                mFormat);
17257fc97ba08e2850f3f16db704b78ce78e3dbe1ff0Glenn Kasten    }
172681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mFrameSize = audio_stream_frame_size(&mOutput->stream->common);
172770949c47fbae3f836d15f040551d7631be3ed7c2Glenn Kasten    mBufferSize = mOutput->stream->common.get_buffer_size(&mOutput->stream->common);
172870949c47fbae3f836d15f040551d7631be3ed7c2Glenn Kasten    mFrameCount = mBufferSize / mFrameSize;
172981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mFrameCount & 15) {
173081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOGW("HAL output buffer size is %u frames but AudioMixer requires multiples of 16 frames",
173181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                mFrameCount);
173281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
173381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
1734bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    if ((mOutput->flags & AUDIO_OUTPUT_FLAG_NON_BLOCKING) &&
1735bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            (mOutput->stream->set_callback != NULL)) {
1736bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        if (mOutput->stream->set_callback(mOutput->stream,
1737bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                                      AudioFlinger::PlaybackThread::asyncCallback, this) == 0) {
1738bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            mUseAsyncWrite = true;
17394de95592980dba88a35b3dc8f3fd045588387a4fEric Laurent            mCallbackThread = new AudioFlinger::AsyncCallbackThread(this);
1740bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        }
1741bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    }
1742bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
174309a5007b17acb49d25cfa386a2e2534d942e8854Andy Hung    // Calculate size of normal sink buffer relative to the HAL output buffer size
174481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    double multiplier = 1.0;
174581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mType == MIXER && (kUseFastMixer == FastMixer_Static ||
174681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            kUseFastMixer == FastMixer_Dynamic)) {
174709a5007b17acb49d25cfa386a2e2534d942e8854Andy Hung        size_t minNormalFrameCount = (kMinNormalSinkBufferSizeMs * mSampleRate) / 1000;
174809a5007b17acb49d25cfa386a2e2534d942e8854Andy Hung        size_t maxNormalFrameCount = (kMaxNormalSinkBufferSizeMs * mSampleRate) / 1000;
174981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // round up minimum and round down maximum to nearest 16 frames to satisfy AudioMixer
175081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        minNormalFrameCount = (minNormalFrameCount + 15) & ~15;
175181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        maxNormalFrameCount = maxNormalFrameCount & ~15;
175281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (maxNormalFrameCount < minNormalFrameCount) {
175381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            maxNormalFrameCount = minNormalFrameCount;
175481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
175581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        multiplier = (double) minNormalFrameCount / (double) mFrameCount;
175681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (multiplier <= 1.0) {
175781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            multiplier = 1.0;
175881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        } else if (multiplier <= 2.0) {
175981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (2 * mFrameCount <= maxNormalFrameCount) {
176081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                multiplier = 2.0;
176181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            } else {
176281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                multiplier = (double) maxNormalFrameCount / (double) mFrameCount;
176381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
176481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        } else {
176581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // prefer an even multiplier, for compatibility with doubling of fast tracks due to HAL
176609a5007b17acb49d25cfa386a2e2534d942e8854Andy Hung            // SRC (it would be unusual for the normal sink buffer size to not be a multiple of fast
176781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // track, but we sometimes have to do this to satisfy the maximum frame count
176881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // constraint)
176981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // FIXME this rounding up should not be done if no HAL SRC
177081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            uint32_t truncMult = (uint32_t) multiplier;
177181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if ((truncMult & 1)) {
177281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if ((truncMult + 1) * mFrameCount <= maxNormalFrameCount) {
177381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    ++truncMult;
177481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
177581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
177681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            multiplier = (double) truncMult;
177781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
177881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
177981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mNormalFrameCount = multiplier * mFrameCount;
178081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // round up to nearest 16 frames to satisfy AudioMixer
178181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mNormalFrameCount = (mNormalFrameCount + 15) & ~15;
178209a5007b17acb49d25cfa386a2e2534d942e8854Andy Hung    ALOGI("HAL output buffer size %u frames, normal sink buffer size %u frames", mFrameCount,
178381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mNormalFrameCount);
178481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
17852098f2744cedf2dc3fa36f608aa965a34602e7c0Andy Hung    delete[] mSinkBuffer;
1786c1fac191069774c7bfcb062edbb821ea56e7dbc0Glenn Kasten    size_t normalBufferSize = mNormalFrameCount * mFrameSize;
17872098f2744cedf2dc3fa36f608aa965a34602e7c0Andy Hung    // For historical reasons mSinkBuffer is int16_t[], but mFrameSize can be odd (such as 1)
17882098f2744cedf2dc3fa36f608aa965a34602e7c0Andy Hung    mSinkBuffer = new int16_t[(normalBufferSize + 1) >> 1];
17892098f2744cedf2dc3fa36f608aa965a34602e7c0Andy Hung    memset(mSinkBuffer, 0, normalBufferSize);
179081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
179169aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung    // We resize the mMixerBuffer according to the requirements of the sink buffer which
179269aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung    // drives the output.
179369aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung    free(mMixerBuffer);
179469aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung    mMixerBuffer = NULL;
179569aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung    if (mMixerBufferEnabled) {
179669aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung        mMixerBufferFormat = AUDIO_FORMAT_PCM_FLOAT; // also valid: AUDIO_FORMAT_PCM_16_BIT.
179769aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung        mMixerBufferSize = mNormalFrameCount * mChannelCount
179869aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung                * audio_bytes_per_sample(mMixerBufferFormat);
179969aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung        (void)posix_memalign(&mMixerBuffer, 32, mMixerBufferSize);
180069aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung    }
180198ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung    free(mEffectBuffer);
180298ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung    mEffectBuffer = NULL;
180398ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung    if (mEffectBufferEnabled) {
180498ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        mEffectBufferFormat = AUDIO_FORMAT_PCM_16_BIT; // Note: Effects support 16b only
180598ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        mEffectBufferSize = mNormalFrameCount * mChannelCount
180698ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung                * audio_bytes_per_sample(mEffectBufferFormat);
180798ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        (void)posix_memalign(&mEffectBuffer, 32, mEffectBufferSize);
180898ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung    }
180969aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung
181081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // force reconfiguration of effect chains and engines to take new buffer size and audio
181181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // parameters into account
1812deca2ae0a7cf8bc54ff3f30b7dc39bbc78b94c0dGlenn Kasten    // Note that mLock is not held when readOutputParameters_l() is called from the constructor
181381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // but in this case nothing is done below as no audio sessions have effect yet so it doesn't
181481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // matter.
181581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // create a copy of mEffectChains as calling moveEffectChain_l() can reorder some effect chains
181681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Vector< sp<EffectChain> > effectChains = mEffectChains;
181781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (size_t i = 0; i < effectChains.size(); i ++) {
181881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mAudioFlinger->moveEffectChain_l(effectChains[i]->sessionId(), this, this, false);
181981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
182081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
182181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
182281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
1823377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETITstatus_t AudioFlinger::PlaybackThread::getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames)
182481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
182581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (halFrames == NULL || dspFrames == NULL) {
182681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return BAD_VALUE;
182781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
182881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
182981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (initCheck() != NO_ERROR) {
183081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return INVALID_OPERATION;
183181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
183281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    size_t framesWritten = mBytesWritten / mFrameSize;
183381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    *halFrames = framesWritten;
183481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
183581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (isSuspended()) {
183681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // return an estimation of rendered frames when the output is suspended
183781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        size_t latencyFrames = (latency_l() * mSampleRate) / 1000;
183881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        *dspFrames = framesWritten >= latencyFrames ? framesWritten - latencyFrames : 0;
183981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return NO_ERROR;
184081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    } else {
1841377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT        status_t status;
1842377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT        uint32_t frames;
1843377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT        status = mOutput->stream->get_render_position(mOutput->stream, &frames);
1844377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT        *dspFrames = (size_t)frames;
1845377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT        return status;
184681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
184781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
184881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
184981784c37c61b09289654b979567a42bf73cd2b12Eric Laurentuint32_t AudioFlinger::PlaybackThread::hasAudioSession(int sessionId) const
185081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
185181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
185281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    uint32_t result = 0;
185381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (getEffectChain_l(sessionId) != 0) {
185481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        result = EFFECT_SESSION;
185581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
185681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
185781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (size_t i = 0; i < mTracks.size(); ++i) {
185881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sp<Track> track = mTracks[i];
18595736c35b841de56ce394b4879389f669b61425e6Glenn Kasten        if (sessionId == track->sessionId() && !track->isInvalid()) {
186081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            result |= TRACK_SESSION;
186181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            break;
186281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
186381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
186481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
186581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return result;
186681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
186781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
186881784c37c61b09289654b979567a42bf73cd2b12Eric Laurentuint32_t AudioFlinger::PlaybackThread::getStrategyForSession_l(int sessionId)
186981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
187081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // session AUDIO_SESSION_OUTPUT_MIX is placed in same strategy as MUSIC stream so that
187181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // it is moved to correct output by audio policy manager when A2DP is connected or disconnected
187281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (sessionId == AUDIO_SESSION_OUTPUT_MIX) {
187381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return AudioSystem::getStrategyForStream(AUDIO_STREAM_MUSIC);
187481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
187581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (size_t i = 0; i < mTracks.size(); i++) {
187681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sp<Track> track = mTracks[i];
18775736c35b841de56ce394b4879389f669b61425e6Glenn Kasten        if (sessionId == track->sessionId() && !track->isInvalid()) {
187881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            return AudioSystem::getStrategyForStream(track->streamType());
187981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
188081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
188181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return AudioSystem::getStrategyForStream(AUDIO_STREAM_MUSIC);
188281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
188381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
188481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
188581784c37c61b09289654b979567a42bf73cd2b12Eric LaurentAudioFlinger::AudioStreamOut* AudioFlinger::PlaybackThread::getOutput() const
188681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
188781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
188881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return mOutput;
188981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
189081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
189181784c37c61b09289654b979567a42bf73cd2b12Eric LaurentAudioFlinger::AudioStreamOut* AudioFlinger::PlaybackThread::clearOutput()
189281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
189381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
189481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    AudioStreamOut *output = mOutput;
189581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mOutput = NULL;
189681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // FIXME FastMixer might also have a raw ptr to mOutputSink;
189781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    //       must push a NULL and wait for ack
189881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mOutputSink.clear();
189981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mPipeSink.clear();
190081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mNormalSink.clear();
190181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return output;
190281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
190381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
190481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// this method must always be called either with ThreadBase mLock held or inside the thread loop
190581784c37c61b09289654b979567a42bf73cd2b12Eric Laurentaudio_stream_t* AudioFlinger::PlaybackThread::stream() const
190681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
190781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mOutput == NULL) {
190881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return NULL;
190981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
191081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return &mOutput->stream->common;
191181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
191281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
191381784c37c61b09289654b979567a42bf73cd2b12Eric Laurentuint32_t AudioFlinger::PlaybackThread::activeSleepTimeUs() const
191481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
191581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return (uint32_t)((uint32_t)((mNormalFrameCount * 1000) / mSampleRate) * 1000);
191681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
191781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
191881784c37c61b09289654b979567a42bf73cd2b12Eric Laurentstatus_t AudioFlinger::PlaybackThread::setSyncEvent(const sp<SyncEvent>& event)
191981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
192081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (!isValidSyncEvent(event)) {
192181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return BAD_VALUE;
192281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
192381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
192481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
192581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
192681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (size_t i = 0; i < mTracks.size(); ++i) {
192781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sp<Track> track = mTracks[i];
192881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (event->triggerSession() == track->sessionId()) {
192981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            (void) track->setSyncEvent(event);
193081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            return NO_ERROR;
193181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
193281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
193381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
193481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return NAME_NOT_FOUND;
193581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
193681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
193781784c37c61b09289654b979567a42bf73cd2b12Eric Laurentbool AudioFlinger::PlaybackThread::isValidSyncEvent(const sp<SyncEvent>& event) const
193881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
193981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return event->type() == AudioSystem::SYNC_EVENT_PRESENTATION_COMPLETE;
194081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
194181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
194281784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::PlaybackThread::threadLoop_removeTracks(
194381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        const Vector< sp<Track> >& tracksToRemove)
194481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
194581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    size_t count = tracksToRemove.size();
194634fca34606b448e6b71c2942f63cb13a0aebd620Glenn Kasten    if (count > 0) {
194781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        for (size_t i = 0 ; i < count ; i++) {
194881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            const sp<Track>& track = tracksToRemove.itemAt(i);
1949bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            if (!track->isOutputTrack()) {
195081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                AudioSystem::stopOutput(mId, track->streamType(), track->sessionId());
1951bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent#ifdef ADD_BATTERY_DATA
1952bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                // to track the speaker usage
1953bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                addBatteryData(IMediaPlayerService::kBatteryDataAudioFlingerStop);
1954bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent#endif
1955bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                if (track->isTerminated()) {
1956bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    AudioSystem::releaseOutput(mId);
1957bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                }
195881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
195981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
196081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
196181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
196281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
196381784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::PlaybackThread::checkSilentMode_l()
196481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
196581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (!mMasterMute) {
196681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        char value[PROPERTY_VALUE_MAX];
196781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (property_get("ro.audio.silent", value, "0") > 0) {
196881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            char *endptr;
196981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            unsigned long ul = strtoul(value, &endptr, 0);
197081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (*endptr == '\0' && ul != 0) {
197181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                ALOGD("Silence is golden");
197281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // The setprop command will not allow a property to be changed after
197381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // the first time it is set, so we don't have to worry about un-muting.
197481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                setMasterMute_l(true);
197581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
197681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
197781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
197881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
197981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
198081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// shared by MIXER and DIRECT, overridden by DUPLICATING
1981bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurentssize_t AudioFlinger::PlaybackThread::threadLoop_write()
198281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
198381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // FIXME rewrite to reduce number of system calls
198481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mLastWriteTime = systemTime();
198581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mInWrite = true;
1986bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    ssize_t bytesWritten;
198781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
198881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // If an NBAIO sink is present, use it to write the normal mixer's submix
198981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mNormalSink != 0) {
199081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#define mBitShift 2 // FIXME
1991bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        size_t count = mBytesRemaining >> mBitShift;
1992bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        size_t offset = (mCurrentWriteLength - mBytesRemaining) >> 1;
19932d590964aa58e137d17a43e095e6443dd0fe2e98Simon Wilson        ATRACE_BEGIN("write");
199481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // update the setpoint when AudioFlinger::mScreenState changes
199581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        uint32_t screenState = AudioFlinger::mScreenState;
199681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (screenState != mScreenState) {
199781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mScreenState = screenState;
199881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            MonoPipe *pipe = (MonoPipe *)mPipeSink.get();
199981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (pipe != NULL) {
200081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                pipe->setAvgFrames((mScreenState & 1) ?
200181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        (pipe->maxFrames() * 7) / 8 : mNormalFrameCount * 2);
200281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
200381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
20042098f2744cedf2dc3fa36f608aa965a34602e7c0Andy Hung        ssize_t framesWritten = mNormalSink->write(mSinkBuffer + offset, count);
20052d590964aa58e137d17a43e095e6443dd0fe2e98Simon Wilson        ATRACE_END();
200681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (framesWritten > 0) {
200781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            bytesWritten = framesWritten << mBitShift;
200881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        } else {
200981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            bytesWritten = framesWritten;
201081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
2011767094dd98b01baf21de2ad09c27b3c98776cf73Glenn Kasten        status_t status = mNormalSink->getTimestamp(mLatchD.mTimestamp);
2012bd096fd9d8e5fc0e62f98807f4818a06f70d0812Glenn Kasten        if (status == NO_ERROR) {
2013bd096fd9d8e5fc0e62f98807f4818a06f70d0812Glenn Kasten            size_t totalFramesWritten = mNormalSink->framesWritten();
2014bd096fd9d8e5fc0e62f98807f4818a06f70d0812Glenn Kasten            if (totalFramesWritten >= mLatchD.mTimestamp.mPosition) {
2015bd096fd9d8e5fc0e62f98807f4818a06f70d0812Glenn Kasten                mLatchD.mUnpresentedFrames = totalFramesWritten - mLatchD.mTimestamp.mPosition;
2016bd096fd9d8e5fc0e62f98807f4818a06f70d0812Glenn Kasten                mLatchDValid = true;
2017bd096fd9d8e5fc0e62f98807f4818a06f70d0812Glenn Kasten            }
2018bd096fd9d8e5fc0e62f98807f4818a06f70d0812Glenn Kasten        }
201981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // otherwise use the HAL / AudioStreamOut directly
202081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    } else {
2021bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        // Direct output and offload threads
202204733dbdede313fc5e291070014c1a0641fe6166Eric Laurent        size_t offset = (mCurrentWriteLength - mBytesRemaining);
2023bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        if (mUseAsyncWrite) {
20243b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent            ALOGW_IF(mWriteAckSequence & 1, "threadLoop_write(): out of sequence write request");
20253b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent            mWriteAckSequence += 2;
20263b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent            mWriteAckSequence |= 1;
2027bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            ALOG_ASSERT(mCallbackThread != 0);
20283b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent            mCallbackThread->setWriteBlocked(mWriteAckSequence);
2029bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        }
2030767094dd98b01baf21de2ad09c27b3c98776cf73Glenn Kasten        // FIXME We should have an implementation of timestamps for direct output threads.
2031767094dd98b01baf21de2ad09c27b3c98776cf73Glenn Kasten        // They are used e.g for multichannel PCM playback over HDMI.
2032bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        bytesWritten = mOutput->stream->write(mOutput->stream,
20332098f2744cedf2dc3fa36f608aa965a34602e7c0Andy Hung                                                   (char *)mSinkBuffer + offset, mBytesRemaining);
2034bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        if (mUseAsyncWrite &&
2035bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                ((bytesWritten < 0) || (bytesWritten == (ssize_t)mBytesRemaining))) {
2036bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            // do not wait for async callback in case of error of full write
20373b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent            mWriteAckSequence &= ~1;
2038bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            ALOG_ASSERT(mCallbackThread != 0);
20393b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent            mCallbackThread->setWriteBlocked(mWriteAckSequence);
2040bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        }
204181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
204281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
204381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mNumWrites++;
204481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mInWrite = false;
2045fd4779740ec3e9e865d5514464df26d015354388Eric Laurent    mStandby = false;
2046bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    return bytesWritten;
2047bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
2048bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
2049bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurentvoid AudioFlinger::PlaybackThread::threadLoop_drain()
2050bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
2051bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    if (mOutput->stream->drain) {
2052bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        ALOGV("draining %s", (mMixerStatus == MIXER_DRAIN_TRACK) ? "early" : "full");
2053bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        if (mUseAsyncWrite) {
20543b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent            ALOGW_IF(mDrainSequence & 1, "threadLoop_drain(): out of sequence drain request");
20553b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent            mDrainSequence |= 1;
2056bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            ALOG_ASSERT(mCallbackThread != 0);
20573b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent            mCallbackThread->setDraining(mDrainSequence);
2058bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        }
2059bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        mOutput->stream->drain(mOutput->stream,
2060bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            (mMixerStatus == MIXER_DRAIN_TRACK) ? AUDIO_DRAIN_EARLY_NOTIFY
2061bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                                                : AUDIO_DRAIN_ALL);
2062bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    }
2063bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
2064bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
2065bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurentvoid AudioFlinger::PlaybackThread::threadLoop_exit()
2066bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
2067bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    // Default implementation has nothing to do
206881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
206981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
207081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent/*
207181784c37c61b09289654b979567a42bf73cd2b12Eric LaurentThe derived values that are cached:
207225c2dac12114699e90deb1c579cadebce7b91a97Andy Hung - mSinkBufferSize from frame count * frame size
207381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent - activeSleepTime from activeSleepTimeUs()
207481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent - idleSleepTime from idleSleepTimeUs()
207581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent - standbyDelay from mActiveSleepTimeUs (DIRECT only)
207681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent - maxPeriod from frame count and sample rate (MIXER only)
207781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
207881784c37c61b09289654b979567a42bf73cd2b12Eric LaurentThe parameters that affect these derived values are:
207981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent - frame count
208081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent - frame size
208181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent - sample rate
208281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent - device type: A2DP or not
208381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent - device latency
208481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent - format: PCM or not
208581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent - active sleep time
208681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent - idle sleep time
208781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent*/
208881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
208981784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::PlaybackThread::cacheParameters_l()
209081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
209125c2dac12114699e90deb1c579cadebce7b91a97Andy Hung    mSinkBufferSize = mNormalFrameCount * mFrameSize;
209281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    activeSleepTime = activeSleepTimeUs();
209381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    idleSleepTime = idleSleepTimeUs();
209481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
209581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
209681784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::PlaybackThread::invalidateTracks(audio_stream_type_t streamType)
209781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
20987c027248e1a4ccd5b22bc4deafb03e2d87ac8f38Glenn Kasten    ALOGV("MixerThread::invalidateTracks() mixer %p, streamType %d, mTracks.size %d",
209981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            this,  streamType, mTracks.size());
210081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
210181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
210281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    size_t size = mTracks.size();
210381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (size_t i = 0; i < size; i++) {
210481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sp<Track> t = mTracks[i];
210581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (t->streamType() == streamType) {
21065736c35b841de56ce394b4879389f669b61425e6Glenn Kasten            t->invalidate();
210781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
210881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
210981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
211081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
211181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentstatus_t AudioFlinger::PlaybackThread::addEffectChain_l(const sp<EffectChain>& chain)
211281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
211381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    int session = chain->sessionId();
211498ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung    int16_t *buffer = mEffectBufferEnabled
211598ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung            ? reinterpret_cast<int16_t*>(mEffectBuffer) : mSinkBuffer;
211681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    bool ownsBuffer = false;
211781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
211881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOGV("addEffectChain_l() %p on thread %p for session %d", chain.get(), this, session);
211981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (session > 0) {
212081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // Only one effect chain can be present in direct output thread and it uses
21212098f2744cedf2dc3fa36f608aa965a34602e7c0Andy Hung        // the sink buffer as input
212281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (mType != DIRECT) {
212381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            size_t numSamples = mNormalFrameCount * mChannelCount;
212481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            buffer = new int16_t[numSamples];
212581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            memset(buffer, 0, numSamples * sizeof(int16_t));
212681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            ALOGV("addEffectChain_l() creating new input buffer %p session %d", buffer, session);
212781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            ownsBuffer = true;
212881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
212981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
213081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // Attach all tracks with same session ID to this chain.
213181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        for (size_t i = 0; i < mTracks.size(); ++i) {
213281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            sp<Track> track = mTracks[i];
213381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (session == track->sessionId()) {
213481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                ALOGV("addEffectChain_l() track->setMainBuffer track %p buffer %p", track.get(),
213581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        buffer);
213681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                track->setMainBuffer(buffer);
213781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                chain->incTrackCnt();
213881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
213981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
214081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
214181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // indicate all active tracks in the chain
214281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        for (size_t i = 0 ; i < mActiveTracks.size() ; ++i) {
214381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            sp<Track> track = mActiveTracks[i].promote();
214481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (track == 0) {
214581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                continue;
214681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
214781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (session == track->sessionId()) {
214881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                ALOGV("addEffectChain_l() activating track %p on session %d", track.get(), session);
214981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                chain->incActiveTrackCnt();
215081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
215181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
215281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
215381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
215481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    chain->setInBuffer(buffer, ownsBuffer);
215598ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung    chain->setOutBuffer(mEffectBufferEnabled
215698ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung            ? reinterpret_cast<int16_t*>(mEffectBuffer) : mSinkBuffer);
215781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // Effect chain for session AUDIO_SESSION_OUTPUT_STAGE is inserted at end of effect
215881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // chains list in order to be processed last as it contains output stage effects
215981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // Effect chain for session AUDIO_SESSION_OUTPUT_MIX is inserted before
216081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // session AUDIO_SESSION_OUTPUT_STAGE to be processed
216181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // after track specific effects and before output stage
216281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // It is therefore mandatory that AUDIO_SESSION_OUTPUT_MIX == 0 and
216381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // that AUDIO_SESSION_OUTPUT_STAGE < AUDIO_SESSION_OUTPUT_MIX
216481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // Effect chain for other sessions are inserted at beginning of effect
216581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // chains list to be processed before output mix effects. Relative order between other
216681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // sessions is not important
216781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    size_t size = mEffectChains.size();
216881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    size_t i = 0;
216981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (i = 0; i < size; i++) {
217081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (mEffectChains[i]->sessionId() < session) {
217181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            break;
217281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
217381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
217481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mEffectChains.insertAt(chain, i);
217581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    checkSuspendOnAddEffectChain_l(chain);
217681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
217781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return NO_ERROR;
217881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
217981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
218081784c37c61b09289654b979567a42bf73cd2b12Eric Laurentsize_t AudioFlinger::PlaybackThread::removeEffectChain_l(const sp<EffectChain>& chain)
218181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
218281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    int session = chain->sessionId();
218381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
218481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOGV("removeEffectChain_l() %p from thread %p for session %d", chain.get(), this, session);
218581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
218681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (size_t i = 0; i < mEffectChains.size(); i++) {
218781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (chain == mEffectChains[i]) {
218881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mEffectChains.removeAt(i);
218981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // detach all active tracks from the chain
219081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            for (size_t i = 0 ; i < mActiveTracks.size() ; ++i) {
219181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                sp<Track> track = mActiveTracks[i].promote();
219281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (track == 0) {
219381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    continue;
219481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
219581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (session == track->sessionId()) {
219681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    ALOGV("removeEffectChain_l(): stopping track on chain %p for session Id: %d",
219781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                            chain.get(), session);
219881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    chain->decActiveTrackCnt();
219981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
220081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
220181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
220281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // detach all tracks with same session ID from this chain
220381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            for (size_t i = 0; i < mTracks.size(); ++i) {
220481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                sp<Track> track = mTracks[i];
220581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (session == track->sessionId()) {
22062098f2744cedf2dc3fa36f608aa965a34602e7c0Andy Hung                    track->setMainBuffer(mSinkBuffer);
220781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    chain->decTrackCnt();
220881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
220981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
221081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            break;
221181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
221281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
221381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return mEffectChains.size();
221481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
221581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
221681784c37c61b09289654b979567a42bf73cd2b12Eric Laurentstatus_t AudioFlinger::PlaybackThread::attachAuxEffect(
221781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        const sp<AudioFlinger::PlaybackThread::Track> track, int EffectId)
221881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
221981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
222081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return attachAuxEffect_l(track, EffectId);
222181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
222281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
222381784c37c61b09289654b979567a42bf73cd2b12Eric Laurentstatus_t AudioFlinger::PlaybackThread::attachAuxEffect_l(
222481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        const sp<AudioFlinger::PlaybackThread::Track> track, int EffectId)
222581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
222681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    status_t status = NO_ERROR;
222781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
222881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (EffectId == 0) {
222981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        track->setAuxBuffer(0, NULL);
223081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    } else {
223181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // Auxiliary effects are always in audio session AUDIO_SESSION_OUTPUT_MIX
223281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sp<EffectModule> effect = getEffect_l(AUDIO_SESSION_OUTPUT_MIX, EffectId);
223381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (effect != 0) {
223481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if ((effect->desc().flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
223581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                track->setAuxBuffer(EffectId, (int32_t *)effect->inBuffer());
223681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            } else {
223781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                status = INVALID_OPERATION;
223881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
223981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        } else {
224081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            status = BAD_VALUE;
224181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
224281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
224381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return status;
224481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
224581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
224681784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::PlaybackThread::detachAuxEffect_l(int effectId)
224781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
224881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (size_t i = 0; i < mTracks.size(); ++i) {
224981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sp<Track> track = mTracks[i];
225081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (track->auxEffectId() == effectId) {
225181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            attachAuxEffect_l(track, 0);
225281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
225381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
225481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
225581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
225681784c37c61b09289654b979567a42bf73cd2b12Eric Laurentbool AudioFlinger::PlaybackThread::threadLoop()
225781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
225881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Vector< sp<Track> > tracksToRemove;
225981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
226081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    standbyTime = systemTime();
226181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
226281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // MIXER
226381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    nsecs_t lastWarning = 0;
226481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
226581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // DUPLICATING
226681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // FIXME could this be made local to while loop?
226781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    writeFrames = 0;
226881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
2269462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen    int lastGeneration = 0;
2270462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen
227181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    cacheParameters_l();
227281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    sleepTime = idleSleepTime;
227381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
227481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mType == MIXER) {
227581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sleepTimeShift = 0;
227681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
227781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
227881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    CpuStats cpuStats;
227981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    const String8 myName(String8::format("thread %p type %d TID %d", this, mType, gettid()));
228081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
228181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    acquireWakeLock();
228281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
22839e58b552f51b00b3b674102876bd6c77ef3da806Glenn Kasten    // mNBLogWriter->log can only be called while thread mutex mLock is held.
22849e58b552f51b00b3b674102876bd6c77ef3da806Glenn Kasten    // So if you need to log when mutex is unlocked, set logString to a non-NULL string,
22859e58b552f51b00b3b674102876bd6c77ef3da806Glenn Kasten    // and then that string will be logged at the next convenient opportunity.
22869e58b552f51b00b3b674102876bd6c77ef3da806Glenn Kasten    const char *logString = NULL;
22879e58b552f51b00b3b674102876bd6c77ef3da806Glenn Kasten
2288664539d25180ab8f77e0521533ea2821cf28985fEric Laurent    checkSilentMode_l();
2289664539d25180ab8f77e0521533ea2821cf28985fEric Laurent
229081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    while (!exitPending())
229181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    {
229281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        cpuStats.sample(myName);
229381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
229481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        Vector< sp<EffectChain> > effectChains;
229581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
229681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        processConfigEvents();
229781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
229881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        { // scope for mLock
229981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
230081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            Mutex::Autolock _l(mLock);
230181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
23029e58b552f51b00b3b674102876bd6c77ef3da806Glenn Kasten            if (logString != NULL) {
23039e58b552f51b00b3b674102876bd6c77ef3da806Glenn Kasten                mNBLogWriter->logTimestamp();
23049e58b552f51b00b3b674102876bd6c77ef3da806Glenn Kasten                mNBLogWriter->log(logString);
23059e58b552f51b00b3b674102876bd6c77ef3da806Glenn Kasten                logString = NULL;
23069e58b552f51b00b3b674102876bd6c77ef3da806Glenn Kasten            }
23079e58b552f51b00b3b674102876bd6c77ef3da806Glenn Kasten
2308bd096fd9d8e5fc0e62f98807f4818a06f70d0812Glenn Kasten            if (mLatchDValid) {
2309bd096fd9d8e5fc0e62f98807f4818a06f70d0812Glenn Kasten                mLatchQ = mLatchD;
2310bd096fd9d8e5fc0e62f98807f4818a06f70d0812Glenn Kasten                mLatchDValid = false;
2311bd096fd9d8e5fc0e62f98807f4818a06f70d0812Glenn Kasten                mLatchQValid = true;
2312bd096fd9d8e5fc0e62f98807f4818a06f70d0812Glenn Kasten            }
2313bd096fd9d8e5fc0e62f98807f4818a06f70d0812Glenn Kasten
231481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (checkForNewParameters_l()) {
231581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                cacheParameters_l();
231681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
231781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
231881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            saveOutputTracks();
2319bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            if (mSignalPending) {
2320bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                // A signal was raised while we were unlocked
2321bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                mSignalPending = false;
2322bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            } else if (waitingAsyncCallback_l()) {
2323bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                if (exitPending()) {
2324bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    break;
2325bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                }
2326bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                releaseWakeLock_l();
2327462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen                mWakeLockUids.clear();
2328462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen                mActiveTracksGeneration++;
2329bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                ALOGV("wait async completion");
2330bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                mWaitWorkCV.wait(mLock);
2331bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                ALOGV("async completion/wake");
2332bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                acquireWakeLock_l();
2333972a173d7d1de1a3b5a617aae3e2abb6e05ae02dEric Laurent                standbyTime = systemTime() + standbyDelay;
2334972a173d7d1de1a3b5a617aae3e2abb6e05ae02dEric Laurent                sleepTime = 0;
2335ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent
2336ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent                continue;
2337ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent            }
2338ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent            if ((!mActiveTracks.size() && systemTime() > standbyTime) ||
2339bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                                   isSuspended()) {
2340bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                // put audio hardware into standby after short delay
2341bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                if (shouldStandby_l()) {
234281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
234381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    threadLoop_standby();
234481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
234581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    mStandby = true;
234681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
234781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
234881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (!mActiveTracks.size() && mConfigEvents.isEmpty()) {
234981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    // we're about to wait, flush the binder command buffer
235081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    IPCThreadState::self()->flushCommands();
235181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
235281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    clearOutputTracks();
235381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
235481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    if (exitPending()) {
235581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        break;
235681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    }
235781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
235881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    releaseWakeLock_l();
2359462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen                    mWakeLockUids.clear();
2360462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen                    mActiveTracksGeneration++;
236181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    // wait until we have something to do...
236281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    ALOGV("%s going to sleep", myName.string());
236381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    mWaitWorkCV.wait(mLock);
236481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    ALOGV("%s waking up", myName.string());
236581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    acquireWakeLock_l();
236681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
236781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    mMixerStatus = MIXER_IDLE;
236881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    mMixerStatusIgnoringFastTracks = MIXER_IDLE;
236981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    mBytesWritten = 0;
2370bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    mBytesRemaining = 0;
237181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    checkSilentMode_l();
237281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
237381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    standbyTime = systemTime() + standbyDelay;
237481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    sleepTime = idleSleepTime;
237581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    if (mType == MIXER) {
237681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        sleepTimeShift = 0;
237781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    }
237881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
237981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    continue;
238081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
238181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
238281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // mMixerStatusIgnoringFastTracks is also updated internally
238381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mMixerStatus = prepareTracks_l(&tracksToRemove);
238481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
2385462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen            // compare with previously applied list
2386462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen            if (lastGeneration != mActiveTracksGeneration) {
2387462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen                // update wakelock
2388462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen                updateWakeLockUids_l(mWakeLockUids);
2389462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen                lastGeneration = mActiveTracksGeneration;
2390462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen            }
2391462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen
239281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // prevent any changes in effect chain list and in each effect chain
239381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // during mixing and effect process as the audio buffers could be deleted
239481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // or modified if an effect is created or deleted
239581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            lockEffectChains_l(effectChains);
2396462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen        } // mLock scope ends
239781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
2398bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        if (mBytesRemaining == 0) {
2399bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            mCurrentWriteLength = 0;
2400bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            if (mMixerStatus == MIXER_TRACKS_READY) {
2401bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                // threadLoop_mix() sets mCurrentWriteLength
2402bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                threadLoop_mix();
2403bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            } else if ((mMixerStatus != MIXER_DRAIN_TRACK)
2404bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                        && (mMixerStatus != MIXER_DRAIN_ALL)) {
2405bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                // threadLoop_sleepTime sets sleepTime to 0 if data
2406bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                // must be written to HAL
2407bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                threadLoop_sleepTime();
2408bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                if (sleepTime == 0) {
240925c2dac12114699e90deb1c579cadebce7b91a97Andy Hung                    mCurrentWriteLength = mSinkBufferSize;
2410bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                }
2411bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            }
241298ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung            // Either threadLoop_mix() or threadLoop_sleepTime() should have set
241398ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung            // mMixerBuffer with data if mMixerBufferValid is true and sleepTime == 0.
241498ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung            // Merge mMixerBuffer data into mEffectBuffer (if any effects are valid)
241598ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung            // or mSinkBuffer (if there are no effects).
241698ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung            //
241798ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung            // This is done pre-effects computation; if effects change to
241898ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung            // support higher precision, this needs to move.
241998ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung            //
242098ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung            // mMixerBufferValid is only set true by MixerThread::prepareTracks_l().
242198ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung            // TODO use sleepTime == 0 as an additional condition.
242298ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung            if (mMixerBufferValid) {
242398ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung                void *buffer = mEffectBufferValid ? mEffectBuffer : mSinkBuffer;
242498ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung                audio_format_t format = mEffectBufferValid ? mEffectBufferFormat : mFormat;
242598ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung
242698ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung                memcpy_by_audio_format(buffer, format, mMixerBuffer, mMixerBufferFormat,
242798ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung                        mNormalFrameCount * mChannelCount);
242898ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung            }
242998ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung
2430bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            mBytesRemaining = mCurrentWriteLength;
2431bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            if (isSuspended()) {
2432bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                sleepTime = suspendSleepTimeUs();
2433bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                // simulate write to HAL when suspended
243425c2dac12114699e90deb1c579cadebce7b91a97Andy Hung                mBytesWritten += mSinkBufferSize;
2435bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                mBytesRemaining = 0;
2436bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            }
243781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
2438bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            // only process effects if we're going to write
243959fe010bcc072597852454a2ec53d7b0a2002a3bEric Laurent            if (sleepTime == 0 && mType != OFFLOAD) {
2440bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                for (size_t i = 0; i < effectChains.size(); i ++) {
2441bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    effectChains[i]->process_l();
2442bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                }
244381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
244481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
244559fe010bcc072597852454a2ec53d7b0a2002a3bEric Laurent        // Process effect chains for offloaded thread even if no audio
244659fe010bcc072597852454a2ec53d7b0a2002a3bEric Laurent        // was read from audio track: process only updates effect state
244759fe010bcc072597852454a2ec53d7b0a2002a3bEric Laurent        // and thus does have to be synchronized with audio writes but may have
244859fe010bcc072597852454a2ec53d7b0a2002a3bEric Laurent        // to be called while waiting for async write callback
244959fe010bcc072597852454a2ec53d7b0a2002a3bEric Laurent        if (mType == OFFLOAD) {
245059fe010bcc072597852454a2ec53d7b0a2002a3bEric Laurent            for (size_t i = 0; i < effectChains.size(); i ++) {
245159fe010bcc072597852454a2ec53d7b0a2002a3bEric Laurent                effectChains[i]->process_l();
245259fe010bcc072597852454a2ec53d7b0a2002a3bEric Laurent            }
245359fe010bcc072597852454a2ec53d7b0a2002a3bEric Laurent        }
245481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
245598ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        // Only if the Effects buffer is enabled and there is data in the
245698ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        // Effects buffer (buffer valid), we need to
245798ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        // copy into the sink buffer.
245898ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        // TODO use sleepTime == 0 as an additional condition.
245998ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        if (mEffectBufferValid) {
246098ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung            //ALOGV("writing effect buffer to sink buffer format %#x", mFormat);
246198ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung            memcpy_by_audio_format(mSinkBuffer, mFormat, mEffectBuffer, mEffectBufferFormat,
246298ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung                    mNormalFrameCount * mChannelCount);
246398ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        }
246498ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung
246581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // enable changes in effect chain
246681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        unlockEffectChains(effectChains);
246781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
2468bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        if (!waitingAsyncCallback()) {
2469bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            // sleepTime == 0 means we must write to audio hardware
2470bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            if (sleepTime == 0) {
2471bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                if (mBytesRemaining) {
2472bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    ssize_t ret = threadLoop_write();
2473bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    if (ret < 0) {
2474bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                        mBytesRemaining = 0;
2475bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    } else {
2476bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                        mBytesWritten += ret;
2477bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                        mBytesRemaining -= ret;
2478bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    }
2479bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                } else if ((mMixerStatus == MIXER_DRAIN_TRACK) ||
2480bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                        (mMixerStatus == MIXER_DRAIN_ALL)) {
2481bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    threadLoop_drain();
2482bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                }
24834944acb7355b3aa25748fd25945a363a69d65444Glenn Kasten                if (mType == MIXER) {
24844944acb7355b3aa25748fd25945a363a69d65444Glenn Kasten                    // write blocked detection
24854944acb7355b3aa25748fd25945a363a69d65444Glenn Kasten                    nsecs_t now = systemTime();
24864944acb7355b3aa25748fd25945a363a69d65444Glenn Kasten                    nsecs_t delta = now - mLastWriteTime;
24874944acb7355b3aa25748fd25945a363a69d65444Glenn Kasten                    if (!mStandby && delta > maxPeriod) {
24884944acb7355b3aa25748fd25945a363a69d65444Glenn Kasten                        mNumDelayedWrites++;
24894944acb7355b3aa25748fd25945a363a69d65444Glenn Kasten                        if ((now - lastWarning) > kWarningThrottleNs) {
24904944acb7355b3aa25748fd25945a363a69d65444Glenn Kasten                            ATRACE_NAME("underrun");
24914944acb7355b3aa25748fd25945a363a69d65444Glenn Kasten                            ALOGW("write blocked for %llu msecs, %d delayed writes, thread %p",
24924944acb7355b3aa25748fd25945a363a69d65444Glenn Kasten                                    ns2ms(delta), mNumDelayedWrites, this);
24934944acb7355b3aa25748fd25945a363a69d65444Glenn Kasten                            lastWarning = now;
24944944acb7355b3aa25748fd25945a363a69d65444Glenn Kasten                        }
2495bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    }
249681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
249781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
2498bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            } else {
2499bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                usleep(sleepTime);
2500bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            }
250181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
250281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
250381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // Finally let go of removed track(s), without the lock held
250481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // since we can't guarantee the destructors won't acquire that
250581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // same lock.  This will also mutate and push a new fast mixer state.
250681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        threadLoop_removeTracks(tracksToRemove);
250781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        tracksToRemove.clear();
250881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
250981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // FIXME I don't understand the need for this here;
251081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        //       it was in the original code but maybe the
251181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        //       assignment in saveOutputTracks() makes this unnecessary?
251281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        clearOutputTracks();
251381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
251481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // Effect chains will be actually deleted here if they were removed from
251581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // mEffectChains list during mixing or effects processing
251681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        effectChains.clear();
251781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
251881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // FIXME Note that the above .clear() is no longer necessary since effectChains
251981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // is now local to this block, but will keep it for now (at least until merge done).
252081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
252181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
2522bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    threadLoop_exit();
2523bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
252481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // for DuplicatingThread, standby mode is handled by the outputTracks, otherwise ...
2525bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    if (mType == MIXER || mType == DIRECT || mType == OFFLOAD) {
252681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // put output stream into standby mode
252781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (!mStandby) {
252881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mOutput->stream->common.standby(&mOutput->stream->common);
252981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
253081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
253181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
253281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    releaseWakeLock();
2533462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen    mWakeLockUids.clear();
2534462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen    mActiveTracksGeneration++;
253581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
253681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOGV("Thread %p type %d exiting", this, mType);
253781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return false;
253881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
253981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
2540bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent// removeTracks_l() must be called with ThreadBase::mLock held
2541bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurentvoid AudioFlinger::PlaybackThread::removeTracks_l(const Vector< sp<Track> >& tracksToRemove)
2542bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
2543bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    size_t count = tracksToRemove.size();
254434fca34606b448e6b71c2942f63cb13a0aebd620Glenn Kasten    if (count > 0) {
2545bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        for (size_t i=0 ; i<count ; i++) {
2546bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            const sp<Track>& track = tracksToRemove.itemAt(i);
2547bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            mActiveTracks.remove(track);
2548462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen            mWakeLockUids.remove(track->uid());
2549462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen            mActiveTracksGeneration++;
2550bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            ALOGV("removeTracks_l removing track on session %d", track->sessionId());
2551bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            sp<EffectChain> chain = getEffectChain_l(track->sessionId());
2552bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            if (chain != 0) {
2553bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                ALOGV("stopping track on chain %p for session Id: %d", chain.get(),
2554bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                        track->sessionId());
2555bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                chain->decActiveTrackCnt();
2556bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            }
2557bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            if (track->isTerminated()) {
2558bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                removeTrack_l(track);
2559bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            }
2560bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        }
2561bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    }
2562bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
2563bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
256481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
2565accc147666bfd37fc8b4ef745f18a8c751555ec2Eric Laurentstatus_t AudioFlinger::PlaybackThread::getTimestamp_l(AudioTimestamp& timestamp)
2566accc147666bfd37fc8b4ef745f18a8c751555ec2Eric Laurent{
2567accc147666bfd37fc8b4ef745f18a8c751555ec2Eric Laurent    if (mNormalSink != 0) {
2568accc147666bfd37fc8b4ef745f18a8c751555ec2Eric Laurent        return mNormalSink->getTimestamp(timestamp);
2569accc147666bfd37fc8b4ef745f18a8c751555ec2Eric Laurent    }
2570accc147666bfd37fc8b4ef745f18a8c751555ec2Eric Laurent    if (mType == OFFLOAD && mOutput->stream->get_presentation_position) {
2571accc147666bfd37fc8b4ef745f18a8c751555ec2Eric Laurent        uint64_t position64;
2572accc147666bfd37fc8b4ef745f18a8c751555ec2Eric Laurent        int ret = mOutput->stream->get_presentation_position(
2573accc147666bfd37fc8b4ef745f18a8c751555ec2Eric Laurent                                                mOutput->stream, &position64, &timestamp.mTime);
2574accc147666bfd37fc8b4ef745f18a8c751555ec2Eric Laurent        if (ret == 0) {
2575accc147666bfd37fc8b4ef745f18a8c751555ec2Eric Laurent            timestamp.mPosition = (uint32_t)position64;
2576accc147666bfd37fc8b4ef745f18a8c751555ec2Eric Laurent            return NO_ERROR;
2577accc147666bfd37fc8b4ef745f18a8c751555ec2Eric Laurent        }
2578accc147666bfd37fc8b4ef745f18a8c751555ec2Eric Laurent    }
2579accc147666bfd37fc8b4ef745f18a8c751555ec2Eric Laurent    return INVALID_OPERATION;
2580accc147666bfd37fc8b4ef745f18a8c751555ec2Eric Laurent}
258181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// ----------------------------------------------------------------------------
258281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
258381784c37c61b09289654b979567a42bf73cd2b12Eric LaurentAudioFlinger::MixerThread::MixerThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output,
258481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        audio_io_handle_t id, audio_devices_t device, type_t type)
258581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    :   PlaybackThread(audioFlinger, output, id, device, type),
258681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // mAudioMixer below
258781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // mFastMixer below
258881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mFastMixerFutex(0)
258981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // mOutputSink below
259081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // mPipeSink below
259181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // mNormalSink below
259281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
259381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOGV("MixerThread() id=%d device=%#x type=%d", id, device, type);
2594f6ed423af92a56ef54bba23eba883b1f21448b54Glenn Kasten    ALOGV("mSampleRate=%u, mChannelMask=%#x, mChannelCount=%u, mFormat=%d, mFrameSize=%u, "
259581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            "mFrameCount=%d, mNormalFrameCount=%d",
259681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mSampleRate, mChannelMask, mChannelCount, mFormat, mFrameSize, mFrameCount,
259781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mNormalFrameCount);
259881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mAudioMixer = new AudioMixer(mNormalFrameCount, mSampleRate);
259981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
260081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // FIXME - Current mixer implementation only supports stereo output
260181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mChannelCount != FCC_2) {
260281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOGE("Invalid audio hardware channel count %d", mChannelCount);
260381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
260481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
260581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // create an NBAIO sink for the HAL output stream, and negotiate
260681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mOutputSink = new AudioStreamOutSink(output->stream);
260781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    size_t numCounterOffers = 0;
2608f69f9869514730aebe5724c461768507084dfff7Glenn Kasten    const NBAIO_Format offers[1] = {Format_from_SR_C(mSampleRate, mChannelCount, mFormat)};
260981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ssize_t index = mOutputSink->negotiate(offers, 1, NULL, numCounterOffers);
261081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOG_ASSERT(index == 0);
261181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
261281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // initialize fast mixer depending on configuration
261381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    bool initFastMixer;
261481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    switch (kUseFastMixer) {
261581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    case FastMixer_Never:
261681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        initFastMixer = false;
261781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        break;
261881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    case FastMixer_Always:
261981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        initFastMixer = true;
262081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        break;
262181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    case FastMixer_Static:
262281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    case FastMixer_Dynamic:
262381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        initFastMixer = mFrameCount < mNormalFrameCount;
262481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        break;
262581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
262681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (initFastMixer) {
262781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
262881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // create a MonoPipe to connect our submix to FastMixer
262981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        NBAIO_Format format = mOutputSink->format();
263081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // This pipe depth compensates for scheduling latency of the normal mixer thread.
263181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // When it wakes up after a maximum latency, it runs a few cycles quickly before
263281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // finally blocking.  Note the pipe implementation rounds up the request to a power of 2.
263381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        MonoPipe *monoPipe = new MonoPipe(mNormalFrameCount * 4, format, true /*writeCanBlock*/);
263481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        const NBAIO_Format offers[1] = {format};
263581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        size_t numCounterOffers = 0;
263681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ssize_t index = monoPipe->negotiate(offers, 1, NULL, numCounterOffers);
263781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOG_ASSERT(index == 0);
263881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        monoPipe->setAvgFrames((mScreenState & 1) ?
263981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                (monoPipe->maxFrames() * 7) / 8 : mNormalFrameCount * 2);
264081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mPipeSink = monoPipe;
264181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
264246909e7eb074ce1b95b8a411eb71154f53f84f77Glenn Kasten#ifdef TEE_SINK
2643da6ef1320d0161b1640dc84d7a9c5a25860c3619Glenn Kasten        if (mTeeSinkOutputEnabled) {
2644da6ef1320d0161b1640dc84d7a9c5a25860c3619Glenn Kasten            // create a Pipe to archive a copy of FastMixer's output for dumpsys
2645da6ef1320d0161b1640dc84d7a9c5a25860c3619Glenn Kasten            Pipe *teeSink = new Pipe(mTeeSinkOutputFrames, format);
2646da6ef1320d0161b1640dc84d7a9c5a25860c3619Glenn Kasten            numCounterOffers = 0;
2647da6ef1320d0161b1640dc84d7a9c5a25860c3619Glenn Kasten            index = teeSink->negotiate(offers, 1, NULL, numCounterOffers);
2648da6ef1320d0161b1640dc84d7a9c5a25860c3619Glenn Kasten            ALOG_ASSERT(index == 0);
2649da6ef1320d0161b1640dc84d7a9c5a25860c3619Glenn Kasten            mTeeSink = teeSink;
2650da6ef1320d0161b1640dc84d7a9c5a25860c3619Glenn Kasten            PipeReader *teeSource = new PipeReader(*teeSink);
2651da6ef1320d0161b1640dc84d7a9c5a25860c3619Glenn Kasten            numCounterOffers = 0;
2652da6ef1320d0161b1640dc84d7a9c5a25860c3619Glenn Kasten            index = teeSource->negotiate(offers, 1, NULL, numCounterOffers);
2653da6ef1320d0161b1640dc84d7a9c5a25860c3619Glenn Kasten            ALOG_ASSERT(index == 0);
2654da6ef1320d0161b1640dc84d7a9c5a25860c3619Glenn Kasten            mTeeSource = teeSource;
2655da6ef1320d0161b1640dc84d7a9c5a25860c3619Glenn Kasten        }
265646909e7eb074ce1b95b8a411eb71154f53f84f77Glenn Kasten#endif
265781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
265881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // create fast mixer and configure it initially with just one fast track for our submix
265981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mFastMixer = new FastMixer();
266081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        FastMixerStateQueue *sq = mFastMixer->sq();
266181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#ifdef STATE_QUEUE_DUMP
266281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sq->setObserverDump(&mStateQueueObserverDump);
266381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sq->setMutatorDump(&mStateQueueMutatorDump);
266481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#endif
266581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        FastMixerState *state = sq->begin();
266681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        FastTrack *fastTrack = &state->mFastTracks[0];
266781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // wrap the source side of the MonoPipe to make it an AudioBufferProvider
266881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        fastTrack->mBufferProvider = new SourceAudioBufferProvider(new MonoPipeReader(monoPipe));
266981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        fastTrack->mVolumeProvider = NULL;
267081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        fastTrack->mGeneration++;
267181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        state->mFastTracksGen++;
267281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        state->mTrackMask = 1;
267381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // fast mixer will use the HAL output sink
267481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        state->mOutputSink = mOutputSink.get();
267581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        state->mOutputSinkGen++;
267681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        state->mFrameCount = mFrameCount;
267781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        state->mCommand = FastMixerState::COLD_IDLE;
267881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // already done in constructor initialization list
267981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        //mFastMixerFutex = 0;
268081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        state->mColdFutexAddr = &mFastMixerFutex;
268181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        state->mColdGen++;
268281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        state->mDumpState = &mFastMixerDumpState;
268346909e7eb074ce1b95b8a411eb71154f53f84f77Glenn Kasten#ifdef TEE_SINK
268481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        state->mTeeSink = mTeeSink.get();
268546909e7eb074ce1b95b8a411eb71154f53f84f77Glenn Kasten#endif
26869e58b552f51b00b3b674102876bd6c77ef3da806Glenn Kasten        mFastMixerNBLogWriter = audioFlinger->newWriter_l(kFastMixerLogSize, "FastMixer");
26879e58b552f51b00b3b674102876bd6c77ef3da806Glenn Kasten        state->mNBLogWriter = mFastMixerNBLogWriter.get();
268881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sq->end();
268981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sq->push(FastMixerStateQueue::BLOCK_UNTIL_PUSHED);
269081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
269181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // start the fast mixer
269281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mFastMixer->run("FastMixer", PRIORITY_URGENT_AUDIO);
269381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        pid_t tid = mFastMixer->getTid();
269481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        int err = requestPriority(getpid_cached, tid, kPriorityFastMixer);
269581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (err != 0) {
269681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            ALOGW("Policy SCHED_FIFO priority %d is unavailable for pid %d tid %d; error %d",
269781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    kPriorityFastMixer, getpid_cached, tid, err);
269881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
269981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
270081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#ifdef AUDIO_WATCHDOG
270181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // create and start the watchdog
270281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mAudioWatchdog = new AudioWatchdog();
270381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mAudioWatchdog->setDump(&mAudioWatchdogDump);
270481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mAudioWatchdog->run("AudioWatchdog", PRIORITY_URGENT_AUDIO);
270581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        tid = mAudioWatchdog->getTid();
270681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        err = requestPriority(getpid_cached, tid, kPriorityFastMixer);
270781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (err != 0) {
270881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            ALOGW("Policy SCHED_FIFO priority %d is unavailable for pid %d tid %d; error %d",
270981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    kPriorityFastMixer, getpid_cached, tid, err);
271081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
271181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#endif
271281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
271381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    } else {
271481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mFastMixer = NULL;
271581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
271681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
271781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    switch (kUseFastMixer) {
271881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    case FastMixer_Never:
271981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    case FastMixer_Dynamic:
272081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mNormalSink = mOutputSink;
272181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        break;
272281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    case FastMixer_Always:
272381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mNormalSink = mPipeSink;
272481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        break;
272581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    case FastMixer_Static:
272681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mNormalSink = initFastMixer ? mPipeSink : mOutputSink;
272781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        break;
272881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
272981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
273081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
273181784c37c61b09289654b979567a42bf73cd2b12Eric LaurentAudioFlinger::MixerThread::~MixerThread()
273281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
273381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mFastMixer != NULL) {
273481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        FastMixerStateQueue *sq = mFastMixer->sq();
273581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        FastMixerState *state = sq->begin();
273681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (state->mCommand == FastMixerState::COLD_IDLE) {
273781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            int32_t old = android_atomic_inc(&mFastMixerFutex);
273881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (old == -1) {
273981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                __futex_syscall3(&mFastMixerFutex, FUTEX_WAKE_PRIVATE, 1);
274081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
274181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
274281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        state->mCommand = FastMixerState::EXIT;
274381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sq->end();
274481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sq->push(FastMixerStateQueue::BLOCK_UNTIL_PUSHED);
274581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mFastMixer->join();
274681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // Though the fast mixer thread has exited, it's state queue is still valid.
274781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // We'll use that extract the final state which contains one remaining fast track
274881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // corresponding to our sub-mix.
274981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        state = sq->begin();
275081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOG_ASSERT(state->mTrackMask == 1);
275181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        FastTrack *fastTrack = &state->mFastTracks[0];
275281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOG_ASSERT(fastTrack->mBufferProvider != NULL);
275381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        delete fastTrack->mBufferProvider;
275481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sq->end(false /*didModify*/);
275581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        delete mFastMixer;
275681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#ifdef AUDIO_WATCHDOG
275781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (mAudioWatchdog != 0) {
275881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mAudioWatchdog->requestExit();
275981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mAudioWatchdog->requestExitAndWait();
276081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mAudioWatchdog.clear();
276181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
276281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#endif
276381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
27649e58b552f51b00b3b674102876bd6c77ef3da806Glenn Kasten    mAudioFlinger->unregisterWriter(mFastMixerNBLogWriter);
276581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    delete mAudioMixer;
276681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
276781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
276881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
276981784c37c61b09289654b979567a42bf73cd2b12Eric Laurentuint32_t AudioFlinger::MixerThread::correctLatency_l(uint32_t latency) const
277081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
277181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mFastMixer != NULL) {
277281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        MonoPipe *pipe = (MonoPipe *)mPipeSink.get();
277381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        latency += (pipe->getAvgFrames() * 1000) / mSampleRate;
277481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
277581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return latency;
277681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
277781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
277881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
277981784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::MixerThread::threadLoop_removeTracks(const Vector< sp<Track> >& tracksToRemove)
278081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
278181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    PlaybackThread::threadLoop_removeTracks(tracksToRemove);
278281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
278381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
2784bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurentssize_t AudioFlinger::MixerThread::threadLoop_write()
278581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
278681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // FIXME we should only do one push per cycle; confirm this is true
278781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // Start the fast mixer if it's not already running
278881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mFastMixer != NULL) {
278981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        FastMixerStateQueue *sq = mFastMixer->sq();
279081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        FastMixerState *state = sq->begin();
279181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (state->mCommand != FastMixerState::MIX_WRITE &&
279281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                (kUseFastMixer != FastMixer_Dynamic || state->mTrackMask > 1)) {
279381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (state->mCommand == FastMixerState::COLD_IDLE) {
279481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                int32_t old = android_atomic_inc(&mFastMixerFutex);
279581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (old == -1) {
279681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    __futex_syscall3(&mFastMixerFutex, FUTEX_WAKE_PRIVATE, 1);
279781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
279881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#ifdef AUDIO_WATCHDOG
279981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (mAudioWatchdog != 0) {
280081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    mAudioWatchdog->resume();
280181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
280281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#endif
280381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
280481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            state->mCommand = FastMixerState::MIX_WRITE;
28054182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            mFastMixerDumpState.increaseSamplingN(mAudioFlinger->isLowRamDevice() ?
28064182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten                    FastMixerDumpState::kSamplingNforLowRamDevice : FastMixerDumpState::kSamplingN);
280781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            sq->end();
280881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            sq->push(FastMixerStateQueue::BLOCK_UNTIL_PUSHED);
280981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (kUseFastMixer == FastMixer_Dynamic) {
281081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                mNormalSink = mPipeSink;
281181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
281281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        } else {
281381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            sq->end(false /*didModify*/);
281481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
281581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
2816bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    return PlaybackThread::threadLoop_write();
281781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
281881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
281981784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::MixerThread::threadLoop_standby()
282081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
282181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // Idle the fast mixer if it's currently running
282281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mFastMixer != NULL) {
282381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        FastMixerStateQueue *sq = mFastMixer->sq();
282481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        FastMixerState *state = sq->begin();
282581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (!(state->mCommand & FastMixerState::IDLE)) {
282681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            state->mCommand = FastMixerState::COLD_IDLE;
282781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            state->mColdFutexAddr = &mFastMixerFutex;
282881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            state->mColdGen++;
282981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mFastMixerFutex = 0;
283081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            sq->end();
283181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // BLOCK_UNTIL_PUSHED would be insufficient, as we need it to stop doing I/O now
283281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            sq->push(FastMixerStateQueue::BLOCK_UNTIL_ACKED);
283381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (kUseFastMixer == FastMixer_Dynamic) {
283481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                mNormalSink = mOutputSink;
283581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
283681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#ifdef AUDIO_WATCHDOG
283781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (mAudioWatchdog != 0) {
283881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                mAudioWatchdog->pause();
283981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
284081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#endif
284181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        } else {
284281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            sq->end(false /*didModify*/);
284381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
284481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
284581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    PlaybackThread::threadLoop_standby();
284681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
284781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
2848bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurentbool AudioFlinger::PlaybackThread::waitingAsyncCallback_l()
2849bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
2850bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    return false;
2851bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
2852bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
2853bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurentbool AudioFlinger::PlaybackThread::shouldStandby_l()
2854bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
2855bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    return !mStandby;
2856bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
2857bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
2858bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurentbool AudioFlinger::PlaybackThread::waitingAsyncCallback()
2859bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
2860bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    Mutex::Autolock _l(mLock);
2861bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    return waitingAsyncCallback_l();
2862bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
2863bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
286481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// shared by MIXER and DIRECT, overridden by DUPLICATING
286581784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::PlaybackThread::threadLoop_standby()
286681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
286781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOGV("Audio hardware entering standby, mixer %p, suspend count %d", this, mSuspended);
286881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mOutput->stream->common.standby(&mOutput->stream->common);
2869bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    if (mUseAsyncWrite != 0) {
28703b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent        // discard any pending drain or write ack by incrementing sequence
28713b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent        mWriteAckSequence = (mWriteAckSequence + 2) & ~1;
28723b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent        mDrainSequence = (mDrainSequence + 2) & ~1;
2873bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        ALOG_ASSERT(mCallbackThread != 0);
28743b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent        mCallbackThread->setWriteBlocked(mWriteAckSequence);
28753b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent        mCallbackThread->setDraining(mDrainSequence);
2876bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    }
287781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
287881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
28794c6a433d74d5ae8b9bc0557207e3ced43bf34a25Haynes Mathew Georgevoid AudioFlinger::PlaybackThread::onAddNewTrack_l()
28804c6a433d74d5ae8b9bc0557207e3ced43bf34a25Haynes Mathew George{
28814c6a433d74d5ae8b9bc0557207e3ced43bf34a25Haynes Mathew George    ALOGV("signal playback thread");
28824c6a433d74d5ae8b9bc0557207e3ced43bf34a25Haynes Mathew George    broadcast_l();
28834c6a433d74d5ae8b9bc0557207e3ced43bf34a25Haynes Mathew George}
28844c6a433d74d5ae8b9bc0557207e3ced43bf34a25Haynes Mathew George
288581784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::MixerThread::threadLoop_mix()
288681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
288781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // obtain the presentation timestamp of the next output buffer
288881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    int64_t pts;
288981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    status_t status = INVALID_OPERATION;
289081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
289181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mNormalSink != 0) {
289281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        status = mNormalSink->getNextWriteTimestamp(&pts);
289381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    } else {
289481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        status = mOutputSink->getNextWriteTimestamp(&pts);
289581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
289681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
289781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (status != NO_ERROR) {
289881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        pts = AudioBufferProvider::kInvalidPTS;
289981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
290081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
290181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // mix buffers...
290281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mAudioMixer->process(pts);
290325c2dac12114699e90deb1c579cadebce7b91a97Andy Hung    mCurrentWriteLength = mSinkBufferSize;
290481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // increase sleep time progressively when application underrun condition clears.
290581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // Only increase sleep time if the mixer is ready for two consecutive times to avoid
290681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // that a steady state of alternating ready/not ready conditions keeps the sleep time
290781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // such that we would underrun the audio HAL.
290881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if ((sleepTime == 0) && (sleepTimeShift > 0)) {
290981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sleepTimeShift--;
291081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
291181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    sleepTime = 0;
291281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    standbyTime = systemTime() + standbyDelay;
291381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    //TODO: delay standby when effects have a tail
291481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
291581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
291681784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::MixerThread::threadLoop_sleepTime()
291781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
291881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // If no tracks are ready, sleep once for the duration of an output
291981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // buffer size, then write 0s to the output
292081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (sleepTime == 0) {
292181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (mMixerStatus == MIXER_TRACKS_ENABLED) {
292281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            sleepTime = activeSleepTime >> sleepTimeShift;
292381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (sleepTime < kMinThreadSleepTimeUs) {
292481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                sleepTime = kMinThreadSleepTimeUs;
292581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
292681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // reduce sleep time in case of consecutive application underruns to avoid
292781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // starving the audio HAL. As activeSleepTimeUs() is larger than a buffer
292881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // duration we would end up writing less data than needed by the audio HAL if
292981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // the condition persists.
293081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (sleepTimeShift < kMaxThreadSleepTimeShift) {
293181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                sleepTimeShift++;
293281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
293381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        } else {
293481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            sleepTime = idleSleepTime;
293581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
293681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    } else if (mBytesWritten != 0 || (mMixerStatus == MIXER_TRACKS_ENABLED)) {
293798ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        // clear out mMixerBuffer or mSinkBuffer, to ensure buffers are cleared
293898ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        // before effects processing or output.
293998ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        if (mMixerBufferValid) {
294098ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung            memset(mMixerBuffer, 0, mMixerBufferSize);
294198ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        } else {
294298ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung            memset(mSinkBuffer, 0, mSinkBufferSize);
294398ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        }
294481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sleepTime = 0;
294581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOGV_IF(mBytesWritten == 0 && (mMixerStatus == MIXER_TRACKS_ENABLED),
294681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                "anticipated start");
294781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
294881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // TODO add standby time extension fct of effect tail
294981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
295081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
295181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// prepareTracks_l() must be called with ThreadBase::mLock held
295281784c37c61b09289654b979567a42bf73cd2b12Eric LaurentAudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTracks_l(
295381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        Vector< sp<Track> > *tracksToRemove)
295481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
295581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
295681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mixer_state mixerStatus = MIXER_IDLE;
295781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // find out which tracks need to be processed
295881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    size_t count = mActiveTracks.size();
295981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    size_t mixedTracks = 0;
296081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    size_t tracksWithEffect = 0;
296181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // counts only _active_ fast tracks
296281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    size_t fastTracks = 0;
296381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    uint32_t resetMask = 0; // bit mask of fast tracks that need to be reset
296481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
296581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    float masterVolume = mMasterVolume;
296681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    bool masterMute = mMasterMute;
296781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
296881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (masterMute) {
296981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        masterVolume = 0;
297081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
297181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // Delegate master volume control to effect in output mix effect chain if needed
297281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    sp<EffectChain> chain = getEffectChain_l(AUDIO_SESSION_OUTPUT_MIX);
297381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (chain != 0) {
297481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        uint32_t v = (uint32_t)(masterVolume * (1 << 24));
297581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        chain->setVolume_l(&v, &v);
297681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        masterVolume = (float)((v + (1 << 23)) >> 24);
297781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        chain.clear();
297881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
297981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
298081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // prepare a new state to push
298181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    FastMixerStateQueue *sq = NULL;
298281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    FastMixerState *state = NULL;
298381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    bool didModify = false;
298481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    FastMixerStateQueue::block_t block = FastMixerStateQueue::BLOCK_UNTIL_PUSHED;
298581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mFastMixer != NULL) {
298681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sq = mFastMixer->sq();
298781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        state = sq->begin();
298881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
298981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
299069aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung    mMixerBufferValid = false;  // mMixerBuffer has no valid data until appropriate tracks found.
299198ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung    mEffectBufferValid = false; // mEffectBuffer has no valid data until tracks found.
299269aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung
299381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (size_t i=0 ; i<count ; i++) {
29949fdcb0a9497ca290bcf364b10868587b6bde3a34Glenn Kasten        const sp<Track> t = mActiveTracks[i].promote();
299581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (t == 0) {
299681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            continue;
299781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
299881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
299981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // this const just means the local variable doesn't change
300081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        Track* const track = t.get();
300181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
300281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // process fast tracks
300381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (track->isFastTrack()) {
300481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
300581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // It's theoretically possible (though unlikely) for a fast track to be created
300681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // and then removed within the same normal mix cycle.  This is not a problem, as
300781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // the track never becomes active so it's fast mixer slot is never touched.
300881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // The converse, of removing an (active) track and then creating a new track
300981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // at the identical fast mixer slot within the same normal mix cycle,
301081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // is impossible because the slot isn't marked available until the end of each cycle.
301181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            int j = track->mFastIndex;
301281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            ALOG_ASSERT(0 < j && j < (int)FastMixerState::kMaxFastTracks);
301381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            ALOG_ASSERT(!(mFastTrackAvailMask & (1 << j)));
301481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            FastTrack *fastTrack = &state->mFastTracks[j];
301581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
301681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // Determine whether the track is currently in underrun condition,
301781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // and whether it had a recent underrun.
301881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            FastTrackDump *ftDump = &mFastMixerDumpState.mTracks[j];
301981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            FastTrackUnderruns underruns = ftDump->mUnderruns;
302081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            uint32_t recentFull = (underruns.mBitFields.mFull -
302181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    track->mObservedUnderruns.mBitFields.mFull) & UNDERRUN_MASK;
302281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            uint32_t recentPartial = (underruns.mBitFields.mPartial -
302381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    track->mObservedUnderruns.mBitFields.mPartial) & UNDERRUN_MASK;
302481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            uint32_t recentEmpty = (underruns.mBitFields.mEmpty -
302581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    track->mObservedUnderruns.mBitFields.mEmpty) & UNDERRUN_MASK;
302681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            uint32_t recentUnderruns = recentPartial + recentEmpty;
302781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            track->mObservedUnderruns = underruns;
302881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // don't count underruns that occur while stopping or pausing
302981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // or stopped which can occur when flush() is called while active
303082aaf94a5b18939e4d790bbc752031f3070704a3Glenn Kasten            if (!(track->isStopping() || track->isPausing() || track->isStopped()) &&
303182aaf94a5b18939e4d790bbc752031f3070704a3Glenn Kasten                    recentUnderruns > 0) {
303282aaf94a5b18939e4d790bbc752031f3070704a3Glenn Kasten                // FIXME fast mixer will pull & mix partial buffers, but we count as a full underrun
303382aaf94a5b18939e4d790bbc752031f3070704a3Glenn Kasten                track->mAudioTrackServerProxy->tallyUnderrunFrames(recentUnderruns * mFrameCount);
303481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
303581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
303681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // This is similar to the state machine for normal tracks,
303781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // with a few modifications for fast tracks.
303881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            bool isActive = true;
303981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            switch (track->mState) {
304081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            case TrackBase::STOPPING_1:
304181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // track stays active in STOPPING_1 state until first underrun
3042bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                if (recentUnderruns > 0 || track->isTerminated()) {
304381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    track->mState = TrackBase::STOPPING_2;
304481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
304581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                break;
304681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            case TrackBase::PAUSING:
304781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // ramp down is not yet implemented
304881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                track->setPaused();
304981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                break;
305081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            case TrackBase::RESUMING:
305181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // ramp up is not yet implemented
305281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                track->mState = TrackBase::ACTIVE;
305381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                break;
305481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            case TrackBase::ACTIVE:
305581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (recentFull > 0 || recentPartial > 0) {
305681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    // track has provided at least some frames recently: reset retry count
305781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    track->mRetryCount = kMaxTrackRetries;
305881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
305981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (recentUnderruns == 0) {
306081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    // no recent underruns: stay active
306181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    break;
306281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
306381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // there has recently been an underrun of some kind
306481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (track->sharedBuffer() == 0) {
306581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    // were any of the recent underruns "empty" (no frames available)?
306681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    if (recentEmpty == 0) {
306781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        // no, then ignore the partial underruns as they are allowed indefinitely
306881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        break;
306981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    }
307081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    // there has recently been an "empty" underrun: decrement the retry counter
307181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    if (--(track->mRetryCount) > 0) {
307281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        break;
307381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    }
307481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    // indicate to client process that the track was disabled because of underrun;
307581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    // it will then automatically call start() when data is available
307696f60d8f04432a1ed503b3e24d5736d28c63c9a2Glenn Kasten                    android_atomic_or(CBLK_DISABLED, &track->mCblk->mFlags);
307781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    // remove from active list, but state remains ACTIVE [confusing but true]
307881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    isActive = false;
307981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    break;
308081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
308181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // fall through
308281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            case TrackBase::STOPPING_2:
308381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            case TrackBase::PAUSED:
308481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            case TrackBase::STOPPED:
308581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            case TrackBase::FLUSHED:   // flush() while active
308681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // Check for presentation complete if track is inactive
308781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // We have consumed all the buffers of this track.
308881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // This would be incomplete if we auto-paused on underrun
308981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                {
309081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    size_t audioHALFrames =
309181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                            (mOutput->stream->get_latency(mOutput->stream)*mSampleRate) / 1000;
309281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    size_t framesWritten = mBytesWritten / mFrameSize;
309381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    if (!(mStandby || track->presentationComplete(framesWritten, audioHALFrames))) {
309481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        // track stays in active list until presentation is complete
309581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        break;
309681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    }
309781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
309881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (track->isStopping_2()) {
309981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    track->mState = TrackBase::STOPPED;
310081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
310181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (track->isStopped()) {
310281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    // Can't reset directly, as fast mixer is still polling this track
310381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    //   track->reset();
310481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    // So instead mark this track as needing to be reset after push with ack
310581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    resetMask |= 1 << i;
310681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
310781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                isActive = false;
310881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                break;
310981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            case TrackBase::IDLE:
311081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            default:
311181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                LOG_FATAL("unexpected track state %d", track->mState);
311281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
311381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
311481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (isActive) {
311581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // was it previously inactive?
311681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (!(state->mTrackMask & (1 << j))) {
311781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    ExtendedAudioBufferProvider *eabp = track;
311881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    VolumeProvider *vp = track;
311981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    fastTrack->mBufferProvider = eabp;
312081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    fastTrack->mVolumeProvider = vp;
312181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    fastTrack->mChannelMask = track->mChannelMask;
312281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    fastTrack->mGeneration++;
312381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    state->mTrackMask |= 1 << j;
312481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    didModify = true;
312581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    // no acknowledgement required for newly active tracks
312681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
312781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // cache the combined master volume and stream type volume for fast mixer; this
312881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // lacks any synchronization or barrier so VolumeProvider may read a stale value
3129e4756fe3a387615acb63c6a05788c8db9b5786cbGlenn Kasten                track->mCachedVolume = masterVolume * mStreamTypes[track->streamType()].volume;
313081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                ++fastTracks;
313181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            } else {
313281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // was it previously active?
313381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (state->mTrackMask & (1 << j)) {
313481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    fastTrack->mBufferProvider = NULL;
313581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    fastTrack->mGeneration++;
313681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    state->mTrackMask &= ~(1 << j);
313781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    didModify = true;
313881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    // If any fast tracks were removed, we must wait for acknowledgement
313981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    // because we're about to decrement the last sp<> on those tracks.
314081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    block = FastMixerStateQueue::BLOCK_UNTIL_ACKED;
314181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                } else {
314281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    LOG_FATAL("fast track %d should have been active", j);
314381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
314481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                tracksToRemove->add(track);
314581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // Avoids a misleading display in dumpsys
314681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                track->mObservedUnderruns.mBitFields.mMostRecent = UNDERRUN_FULL;
314781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
314881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            continue;
314981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
315081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
315181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        {   // local variable scope to avoid goto warning
315281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
315381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        audio_track_cblk_t* cblk = track->cblk();
315481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
315581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // The first time a track is added we wait
315681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // for all its buffers to be filled before processing it
315781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        int name = track->name();
315881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // make sure that we have enough frames to mix one full buffer.
315981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // enforce this condition only once to enable draining the buffer in case the client
316081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // app does not call stop() and relies on underrun to stop:
316181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // hence the test on (mMixerStatus == MIXER_TRACKS_READY) meaning the track was mixed
316281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // during last round
31639f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        size_t desiredFrames;
31649fdcb0a9497ca290bcf364b10868587b6bde3a34Glenn Kasten        uint32_t sr = track->sampleRate();
31659fdcb0a9497ca290bcf364b10868587b6bde3a34Glenn Kasten        if (sr == mSampleRate) {
31669f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten            desiredFrames = mNormalFrameCount;
31679f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        } else {
31689f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten            // +1 for rounding and +1 for additional sample needed for interpolation
31699fdcb0a9497ca290bcf364b10868587b6bde3a34Glenn Kasten            desiredFrames = (mNormalFrameCount * sr) / mSampleRate + 1 + 1;
31709f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten            // add frames already consumed but not yet released by the resampler
31712fc14730e4697a6f456b4631549c9981f6b0b115Glenn Kasten            // because mAudioTrackServerProxy->framesReady() will include these frames
31729f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten            desiredFrames += mAudioMixer->getUnreleasedFrames(track->name());
317374935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten#if 0
31749f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten            // the minimum track buffer size is normally twice the number of frames necessary
31759f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten            // to fill one buffer and the resampler should not leave more than one buffer worth
31769f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten            // of unreleased frames after each pass, but just in case...
31779f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten            ALOG_ASSERT(desiredFrames <= cblk->frameCount_);
317874935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten#endif
31799f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        }
318081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        uint32_t minFrames = 1;
318181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if ((track->sharedBuffer() == 0) && !track->isStopped() && !track->isPausing() &&
318281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                (mMixerStatusIgnoringFastTracks == MIXER_TRACKS_READY)) {
31839f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten            minFrames = desiredFrames;
31849f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        }
318513e4c960ea3db03a43e084fbd85d52aa77f7b871Eric Laurent
318613e4c960ea3db03a43e084fbd85d52aa77f7b871Eric Laurent        size_t framesReady = track->framesReady();
31879f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        if ((framesReady >= minFrames) && track->isReady() &&
318881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                !track->isPaused() && !track->isTerminated())
318981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        {
3190f20e1d8df84c5fbeeace0052d100982ae39bb7a4Glenn Kasten            ALOGVV("track %d s=%08x [OK] on thread %p", name, cblk->mServer, this);
319181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
319281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mixedTracks++;
319381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
319469aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung            // track->mainBuffer() != mSinkBuffer or mMixerBuffer means
319569aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung            // there is an effect chain connected to the track
319681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            chain.clear();
319769aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung            if (track->mainBuffer() != mSinkBuffer &&
319869aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung                    track->mainBuffer() != mMixerBuffer) {
319998ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung                if (mEffectBufferEnabled) {
320098ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung                    mEffectBufferValid = true; // Later can set directly.
320198ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung                }
320281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                chain = getEffectChain_l(track->sessionId());
320381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // Delegate volume control to effect in track effect chain if needed
320481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (chain != 0) {
320581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    tracksWithEffect++;
320681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                } else {
320781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    ALOGW("prepareTracks_l(): track %d attached to effect but no chain found on "
320881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                            "session %d",
320981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                            name, track->sessionId());
321081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
321181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
321281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
321381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
321481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            int param = AudioMixer::VOLUME;
321581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (track->mFillingUpStatus == Track::FS_FILLED) {
321681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // no ramp for the first volume setting
321781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                track->mFillingUpStatus = Track::FS_ACTIVE;
321881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (track->mState == TrackBase::RESUMING) {
321981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    track->mState = TrackBase::ACTIVE;
322081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    param = AudioMixer::RAMP_VOLUME;
322181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
322281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                mAudioMixer->setParameter(name, AudioMixer::RESAMPLE, AudioMixer::RESET, NULL);
3223f20e1d8df84c5fbeeace0052d100982ae39bb7a4Glenn Kasten            // FIXME should not make a decision based on mServer
3224f20e1d8df84c5fbeeace0052d100982ae39bb7a4Glenn Kasten            } else if (cblk->mServer != 0) {
322581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // If the track is stopped before the first frame was mixed,
322681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // do not apply ramp
322781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                param = AudioMixer::RAMP_VOLUME;
322881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
322981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
323081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // compute volume for this track
323181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            uint32_t vl, vr, va;
3232e4756fe3a387615acb63c6a05788c8db9b5786cbGlenn Kasten            if (track->isPausing() || mStreamTypes[track->streamType()].mute) {
323381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                vl = vr = va = 0;
323481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (track->isPausing()) {
323581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    track->setPaused();
323681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
323781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            } else {
323881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
323981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // read original volumes with volume control
324081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                float typeVolume = mStreamTypes[track->streamType()].volume;
324181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                float v = masterVolume * typeVolume;
32429f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten                AudioTrackServerProxy *proxy = track->mAudioTrackServerProxy;
3243e3aa659e9cee7df5c12a80d285cc29ab3b2cbb39Glenn Kasten                uint32_t vlr = proxy->getVolumeLR();
324481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                vl = vlr & 0xFFFF;
324581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                vr = vlr >> 16;
324681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // track volumes come from shared memory, so can't be trusted and must be clamped
324781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (vl > MAX_GAIN_INT) {
324881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    ALOGV("Track left volume out of range: %04X", vl);
324981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    vl = MAX_GAIN_INT;
325081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
325181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (vr > MAX_GAIN_INT) {
325281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    ALOGV("Track right volume out of range: %04X", vr);
325381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    vr = MAX_GAIN_INT;
325481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
325581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // now apply the master volume and stream type volume
325681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                vl = (uint32_t)(v * vl) << 12;
325781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                vr = (uint32_t)(v * vr) << 12;
325881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // assuming master volume and stream type volume each go up to 1.0,
325981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // vl and vr are now in 8.24 format
326081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
3261e3aa659e9cee7df5c12a80d285cc29ab3b2cbb39Glenn Kasten                uint16_t sendLevel = proxy->getSendLevel_U4_12();
326281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // send level comes from shared memory and so may be corrupt
326381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (sendLevel > MAX_GAIN_INT) {
326481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    ALOGV("Track send level out of range: %04X", sendLevel);
326581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    sendLevel = MAX_GAIN_INT;
326681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
326781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                va = (uint32_t)(v * sendLevel);
326881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
3269bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
327081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // Delegate volume control to effect in track effect chain if needed
327181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (chain != 0 && chain->setVolume_l(&vl, &vr)) {
327281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // Do not ramp volume if volume is controlled by effect
327381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                param = AudioMixer::VOLUME;
327481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                track->mHasVolumeController = true;
327581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            } else {
327681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // force no volume ramp when volume controller was just disabled or removed
327781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // from effect chain to avoid volume spike
327881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (track->mHasVolumeController) {
327981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    param = AudioMixer::VOLUME;
328081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
328181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                track->mHasVolumeController = false;
328281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
328381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
328481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // Convert volumes from 8.24 to 4.12 format
328581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // This additional clamping is needed in case chain->setVolume_l() overshot
328681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            vl = (vl + (1 << 11)) >> 12;
328781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (vl > MAX_GAIN_INT) {
328881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                vl = MAX_GAIN_INT;
328981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
329081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            vr = (vr + (1 << 11)) >> 12;
329181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (vr > MAX_GAIN_INT) {
329281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                vr = MAX_GAIN_INT;
329381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
329481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
329581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (va > MAX_GAIN_INT) {
329681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                va = MAX_GAIN_INT;   // va is uint32_t, so no need to check for -
329781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
329881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
329981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // XXX: these things DON'T need to be done each time
330081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mAudioMixer->setBufferProvider(name, track);
330181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mAudioMixer->enable(name);
330281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
3303377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT            mAudioMixer->setParameter(name, param, AudioMixer::VOLUME0, (void *)(uintptr_t)vl);
3304377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT            mAudioMixer->setParameter(name, param, AudioMixer::VOLUME1, (void *)(uintptr_t)vr);
3305377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT            mAudioMixer->setParameter(name, param, AudioMixer::AUXLEVEL, (void *)(uintptr_t)va);
330681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mAudioMixer->setParameter(
330781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                name,
330881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                AudioMixer::TRACK,
330981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                AudioMixer::FORMAT, (void *)track->format());
331081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mAudioMixer->setParameter(
331181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                name,
331281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                AudioMixer::TRACK,
3313377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT                AudioMixer::CHANNEL_MASK, (void *)(uintptr_t)track->channelMask());
3314e3aa659e9cee7df5c12a80d285cc29ab3b2cbb39Glenn Kasten            // limit track sample rate to 2 x output sample rate, which changes at re-configuration
3315e3aa659e9cee7df5c12a80d285cc29ab3b2cbb39Glenn Kasten            uint32_t maxSampleRate = mSampleRate * 2;
33169f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten            uint32_t reqSampleRate = track->mAudioTrackServerProxy->getSampleRate();
3317e3aa659e9cee7df5c12a80d285cc29ab3b2cbb39Glenn Kasten            if (reqSampleRate == 0) {
3318e3aa659e9cee7df5c12a80d285cc29ab3b2cbb39Glenn Kasten                reqSampleRate = mSampleRate;
3319e3aa659e9cee7df5c12a80d285cc29ab3b2cbb39Glenn Kasten            } else if (reqSampleRate > maxSampleRate) {
3320e3aa659e9cee7df5c12a80d285cc29ab3b2cbb39Glenn Kasten                reqSampleRate = maxSampleRate;
3321e3aa659e9cee7df5c12a80d285cc29ab3b2cbb39Glenn Kasten            }
332281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mAudioMixer->setParameter(
332381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                name,
332481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                AudioMixer::RESAMPLE,
332581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                AudioMixer::SAMPLE_RATE,
3326377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT                (void *)(uintptr_t)reqSampleRate);
332769aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung            /*
332869aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung             * Select the appropriate output buffer for the track.
332969aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung             *
333098ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung             * Tracks with effects go into their own effects chain buffer
333198ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung             * and from there into either mEffectBuffer or mSinkBuffer.
333269aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung             *
333369aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung             * Other tracks can use mMixerBuffer for higher precision
333469aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung             * channel accumulation.  If this buffer is enabled
333569aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung             * (mMixerBufferEnabled true), then selected tracks will accumulate
333669aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung             * into it.
333769aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung             *
333869aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung             */
333969aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung            if (mMixerBufferEnabled
334069aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung                    && (track->mainBuffer() == mSinkBuffer
334169aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung                            || track->mainBuffer() == mMixerBuffer)) {
334269aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung                mAudioMixer->setParameter(
334369aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung                        name,
334469aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung                        AudioMixer::TRACK,
3345788207057ed4b8df4719ed8089f376ef52de9ca1Andy Hung                        AudioMixer::MIXER_FORMAT, (void *)mMixerBufferFormat);
334669aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung                mAudioMixer->setParameter(
334769aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung                        name,
334869aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung                        AudioMixer::TRACK,
334969aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung                        AudioMixer::MAIN_BUFFER, (void *)mMixerBuffer);
335069aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung                // TODO: override track->mainBuffer()?
335169aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung                mMixerBufferValid = true;
335269aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung            } else {
335369aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung                mAudioMixer->setParameter(
335469aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung                        name,
335569aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung                        AudioMixer::TRACK,
3356788207057ed4b8df4719ed8089f376ef52de9ca1Andy Hung                        AudioMixer::MIXER_FORMAT, (void *)AUDIO_FORMAT_PCM_16_BIT);
335769aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung                mAudioMixer->setParameter(
335869aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung                        name,
335969aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung                        AudioMixer::TRACK,
336069aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung                        AudioMixer::MAIN_BUFFER, (void *)track->mainBuffer());
336169aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung            }
336281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mAudioMixer->setParameter(
336381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                name,
336481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                AudioMixer::TRACK,
336581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                AudioMixer::AUX_BUFFER, (void *)track->auxBuffer());
336681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
336781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // reset retry count
336881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            track->mRetryCount = kMaxTrackRetries;
336981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
337081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // If one track is ready, set the mixer ready if:
337181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            //  - the mixer was not ready during previous round OR
337281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            //  - no other track is not ready
337381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (mMixerStatusIgnoringFastTracks != MIXER_TRACKS_READY ||
337481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    mixerStatus != MIXER_TRACKS_ENABLED) {
337581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                mixerStatus = MIXER_TRACKS_READY;
337681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
337781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        } else {
33789f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten            if (framesReady < desiredFrames && !track->isStopped() && !track->isPaused()) {
337982aaf94a5b18939e4d790bbc752031f3070704a3Glenn Kasten                track->mAudioTrackServerProxy->tallyUnderrunFrames(desiredFrames);
33809f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten            }
338181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // clear effect chain input buffer if an active track underruns to avoid sending
338281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // previous audio buffer again to effects
338381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            chain = getEffectChain_l(track->sessionId());
338481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (chain != 0) {
338581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                chain->clearInputBuffer();
338681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
338781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
3388f20e1d8df84c5fbeeace0052d100982ae39bb7a4Glenn Kasten            ALOGVV("track %d s=%08x [NOT READY] on thread %p", name, cblk->mServer, this);
338981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if ((track->sharedBuffer() != 0) || track->isTerminated() ||
339081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    track->isStopped() || track->isPaused()) {
339181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // We have consumed all the buffers of this track.
339281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // Remove it from the list of active tracks.
339381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // TODO: use actual buffer filling status instead of latency when available from
339481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // audio HAL
339581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                size_t audioHALFrames = (latency_l() * mSampleRate) / 1000;
339681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                size_t framesWritten = mBytesWritten / mFrameSize;
339781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (mStandby || track->presentationComplete(framesWritten, audioHALFrames)) {
339881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    if (track->isStopped()) {
339981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        track->reset();
340081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    }
340181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    tracksToRemove->add(track);
340281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
340381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            } else {
340481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // No buffers for this track. Give it a few chances to
340581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // fill a buffer, then remove it from active list.
340681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (--(track->mRetryCount) <= 0) {
3407c9b2e20f7c9a71e07ef398152709c76079decbcdGlenn Kasten                    ALOGI("BUFFER TIMEOUT: remove(%d) from active list on thread %p", name, this);
340881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    tracksToRemove->add(track);
340981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    // indicate to client process that the track was disabled because of underrun;
341081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    // it will then automatically call start() when data is available
341196f60d8f04432a1ed503b3e24d5736d28c63c9a2Glenn Kasten                    android_atomic_or(CBLK_DISABLED, &cblk->mFlags);
341281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // If one track is not ready, mark the mixer also not ready if:
341381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                //  - the mixer was ready during previous round OR
341481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                //  - no other track is ready
341581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                } else if (mMixerStatusIgnoringFastTracks == MIXER_TRACKS_READY ||
341681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                mixerStatus != MIXER_TRACKS_READY) {
341781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    mixerStatus = MIXER_TRACKS_ENABLED;
341881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
341981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
342081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mAudioMixer->disable(name);
342181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
342281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
342381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }   // local variable scope to avoid goto warning
342481784c37c61b09289654b979567a42bf73cd2b12Eric Laurenttrack_is_ready: ;
342581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
342681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
342781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
342881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // Push the new FastMixer state if necessary
342981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    bool pauseAudioWatchdog = false;
343081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (didModify) {
343181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        state->mFastTracksGen++;
343281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // if the fast mixer was active, but now there are no fast tracks, then put it in cold idle
343381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (kUseFastMixer == FastMixer_Dynamic &&
343481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                state->mCommand == FastMixerState::MIX_WRITE && state->mTrackMask <= 1) {
343581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            state->mCommand = FastMixerState::COLD_IDLE;
343681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            state->mColdFutexAddr = &mFastMixerFutex;
343781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            state->mColdGen++;
343881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mFastMixerFutex = 0;
343981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (kUseFastMixer == FastMixer_Dynamic) {
344081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                mNormalSink = mOutputSink;
344181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
344281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // If we go into cold idle, need to wait for acknowledgement
344381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // so that fast mixer stops doing I/O.
344481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            block = FastMixerStateQueue::BLOCK_UNTIL_ACKED;
344581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            pauseAudioWatchdog = true;
344681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
344781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
344881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (sq != NULL) {
344981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sq->end(didModify);
345081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sq->push(block);
345181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
345281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#ifdef AUDIO_WATCHDOG
345381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (pauseAudioWatchdog && mAudioWatchdog != 0) {
345481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mAudioWatchdog->pause();
345581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
345681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#endif
345781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
345881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // Now perform the deferred reset on fast tracks that have stopped
345981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    while (resetMask != 0) {
346081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        size_t i = __builtin_ctz(resetMask);
346181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOG_ASSERT(i < count);
346281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        resetMask &= ~(1 << i);
346381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sp<Track> t = mActiveTracks[i].promote();
346481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (t == 0) {
346581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            continue;
346681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
346781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        Track* track = t.get();
346881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOG_ASSERT(track->isFastTrack() && track->isStopped());
346981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        track->reset();
347081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
347181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
347281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // remove all the tracks that need to be...
3473bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    removeTracks_l(*tracksToRemove);
347481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
347569aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung    // sink or mix buffer must be cleared if all tracks are connected to an
347669aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung    // effect chain as in this case the mixer will not write to the sink or mix buffer
347769aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung    // and track effects will accumulate into it
3478bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    if ((mBytesRemaining == 0) && ((mixedTracks != 0 && mixedTracks == tracksWithEffect) ||
3479bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            (mixedTracks == 0 && fastTracks > 0))) {
348081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // FIXME as a performance optimization, should remember previous zero status
348169aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung        if (mMixerBufferValid) {
348269aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung            memset(mMixerBuffer, 0, mMixerBufferSize);
348369aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung            // TODO: In testing, mSinkBuffer below need not be cleared because
348469aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung            // the PlaybackThread::threadLoop() copies mMixerBuffer into mSinkBuffer
348569aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung            // after mixing.
348669aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung            //
348769aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung            // To enforce this guarantee:
348869aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung            // ((mixedTracks != 0 && mixedTracks == tracksWithEffect) ||
348969aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung            // (mixedTracks == 0 && fastTracks > 0))
349069aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung            // must imply MIXER_TRACKS_READY.
349169aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung            // Later, we may clear buffers regardless, and skip much of this logic.
349269aed5f0f4a3be3996d1e78a0473e1a72c1547daAndy Hung        }
349398ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        // TODO - either mEffectBuffer or mSinkBuffer needs to be cleared.
349498ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        if (mEffectBufferValid) {
349598ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung            memset(mEffectBuffer, 0, mEffectBufferSize);
349698ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        }
349798ef978df4e928f486d244c4d7f7ad9f13111e98Andy Hung        // FIXME as a performance optimization, should remember previous zero status
34982098f2744cedf2dc3fa36f608aa965a34602e7c0Andy Hung        memset(mSinkBuffer, 0, mNormalFrameCount * mChannelCount * sizeof(int16_t));
349981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
350081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
350181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // if any fast tracks, then status is ready
350281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mMixerStatusIgnoringFastTracks = mixerStatus;
350381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (fastTracks > 0) {
350481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mixerStatus = MIXER_TRACKS_READY;
350581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
350681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return mixerStatus;
350781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
350881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
350981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// getTrackName_l() must be called with ThreadBase::mLock held
351081784c37c61b09289654b979567a42bf73cd2b12Eric Laurentint AudioFlinger::MixerThread::getTrackName_l(audio_channel_mask_t channelMask, int sessionId)
351181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
351281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return mAudioMixer->getTrackName(channelMask, sessionId);
351381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
351481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
351581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// deleteTrackName_l() must be called with ThreadBase::mLock held
351681784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::MixerThread::deleteTrackName_l(int name)
351781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
351881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOGV("remove track (%d) and delete from mixer", name);
351981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mAudioMixer->deleteTrackName(name);
352081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
352181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
352281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// checkForNewParameters_l() must be called with ThreadBase::mLock held
352381784c37c61b09289654b979567a42bf73cd2b12Eric Laurentbool AudioFlinger::MixerThread::checkForNewParameters_l()
352481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
352581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // if !&IDLE, holds the FastMixer state to restore after new parameters processed
352681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    FastMixerState::Command previousCommand = FastMixerState::HOT_IDLE;
352781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    bool reconfig = false;
352881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
352981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    while (!mNewParameters.isEmpty()) {
353081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
353181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (mFastMixer != NULL) {
353281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            FastMixerStateQueue *sq = mFastMixer->sq();
353381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            FastMixerState *state = sq->begin();
353481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (!(state->mCommand & FastMixerState::IDLE)) {
353581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                previousCommand = state->mCommand;
353681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                state->mCommand = FastMixerState::HOT_IDLE;
353781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                sq->end();
353881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                sq->push(FastMixerStateQueue::BLOCK_UNTIL_ACKED);
353981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            } else {
354081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                sq->end(false /*didModify*/);
354181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
354281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
354381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
354481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        status_t status = NO_ERROR;
354581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        String8 keyValuePair = mNewParameters[0];
354681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        AudioParameter param = AudioParameter(keyValuePair);
354781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        int value;
354881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
354981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (param.getInt(String8(AudioParameter::keySamplingRate), value) == NO_ERROR) {
355081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            reconfig = true;
355181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
355281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (param.getInt(String8(AudioParameter::keyFormat), value) == NO_ERROR) {
355381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if ((audio_format_t) value != AUDIO_FORMAT_PCM_16_BIT) {
355481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                status = BAD_VALUE;
355581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            } else {
35562fc14730e4697a6f456b4631549c9981f6b0b115Glenn Kasten                // no need to save value, since it's constant
355781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                reconfig = true;
355881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
355981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
356081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (param.getInt(String8(AudioParameter::keyChannels), value) == NO_ERROR) {
3561fad226abd12435dbcd232f7de396f1a097b2bd5fGlenn Kasten            if ((audio_channel_mask_t) value != AUDIO_CHANNEL_OUT_STEREO) {
356281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                status = BAD_VALUE;
356381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            } else {
35642fc14730e4697a6f456b4631549c9981f6b0b115Glenn Kasten                // no need to save value, since it's constant
356581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                reconfig = true;
356681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
356781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
356881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (param.getInt(String8(AudioParameter::keyFrameCount), value) == NO_ERROR) {
356981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // do not accept frame count changes if tracks are open as the track buffer
357081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // size depends on frame count and correct behavior would not be guaranteed
357181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // if frame count is changed after track creation
357281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (!mTracks.isEmpty()) {
357381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                status = INVALID_OPERATION;
357481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            } else {
357581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                reconfig = true;
357681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
357781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
357881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (param.getInt(String8(AudioParameter::keyRouting), value) == NO_ERROR) {
357981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#ifdef ADD_BATTERY_DATA
358081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // when changing the audio output device, call addBatteryData to notify
358181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // the change
358281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (mOutDevice != value) {
358381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                uint32_t params = 0;
358481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // check whether speaker is on
358581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (value & AUDIO_DEVICE_OUT_SPEAKER) {
358681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    params |= IMediaPlayerService::kBatteryDataSpeakerOn;
358781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
358881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
358981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                audio_devices_t deviceWithoutSpeaker
359081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    = AUDIO_DEVICE_OUT_ALL & ~AUDIO_DEVICE_OUT_SPEAKER;
359181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // check if any other device (except speaker) is on
359281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (value & deviceWithoutSpeaker ) {
359381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    params |= IMediaPlayerService::kBatteryDataOtherAudioDeviceOn;
359481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
359581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
359681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (params != 0) {
359781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    addBatteryData(params);
359881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
359981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
360081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#endif
360181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
360281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // forward device change to effects that have requested to be
360381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // aware of attached audio device.
36047e1139c0377b6806942fb2a043737b3b9cf0ae91Eric Laurent            if (value != AUDIO_DEVICE_NONE) {
36057e1139c0377b6806942fb2a043737b3b9cf0ae91Eric Laurent                mOutDevice = value;
36067e1139c0377b6806942fb2a043737b3b9cf0ae91Eric Laurent                for (size_t i = 0; i < mEffectChains.size(); i++) {
36077e1139c0377b6806942fb2a043737b3b9cf0ae91Eric Laurent                    mEffectChains[i]->setDevice_l(mOutDevice);
36087e1139c0377b6806942fb2a043737b3b9cf0ae91Eric Laurent                }
360981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
361081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
361181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
361281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (status == NO_ERROR) {
361381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            status = mOutput->stream->common.set_parameters(&mOutput->stream->common,
361481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                                    keyValuePair.string());
361581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (!mStandby && status == INVALID_OPERATION) {
361681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                mOutput->stream->common.standby(&mOutput->stream->common);
361781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                mStandby = true;
361881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                mBytesWritten = 0;
361981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                status = mOutput->stream->common.set_parameters(&mOutput->stream->common,
362081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                                       keyValuePair.string());
362181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
362281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (status == NO_ERROR && reconfig) {
3623deca2ae0a7cf8bc54ff3f30b7dc39bbc78b94c0dGlenn Kasten                readOutputParameters_l();
36249e8fcbcd8efa51d70d1207ff57bfbfe31324287aGlenn Kasten                delete mAudioMixer;
362581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                mAudioMixer = new AudioMixer(mNormalFrameCount, mSampleRate);
362681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                for (size_t i = 0; i < mTracks.size() ; i++) {
362781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    int name = getTrackName_l(mTracks[i]->mChannelMask, mTracks[i]->mSessionId);
362881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    if (name < 0) {
362981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        break;
363081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    }
363181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    mTracks[i]->mName = name;
363281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
363381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                sendIoConfigEvent_l(AudioSystem::OUTPUT_CONFIG_CHANGED);
363481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
363581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
363681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
363781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mNewParameters.removeAt(0);
363881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
363981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mParamStatus = status;
364081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mParamCond.signal();
364181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // wait for condition with time out in case the thread calling ThreadBase::setParameters()
364281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // already timed out waiting for the status and will never signal the condition.
364381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mWaitWorkCV.waitRelative(mLock, kSetParametersTimeoutNs);
364481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
364581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
364681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (!(previousCommand & FastMixerState::IDLE)) {
364781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOG_ASSERT(mFastMixer != NULL);
364881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        FastMixerStateQueue *sq = mFastMixer->sq();
364981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        FastMixerState *state = sq->begin();
365081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOG_ASSERT(state->mCommand == FastMixerState::HOT_IDLE);
365181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        state->mCommand = previousCommand;
365281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sq->end();
365381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sq->push(FastMixerStateQueue::BLOCK_UNTIL_PUSHED);
365481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
365581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
365681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return reconfig;
365781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
365881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
365981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
366081784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::MixerThread::dumpInternals(int fd, const Vector<String16>& args)
366181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
366281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    const size_t SIZE = 256;
366381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    char buffer[SIZE];
366481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    String8 result;
366581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
366681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    PlaybackThread::dumpInternals(fd, args);
366781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
3668b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    fdprintf(fd, "  AudioMixer tracks: 0x%08x\n", mAudioMixer->trackNames());
366981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
367081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // Make a non-atomic copy of fast mixer dump state so it won't change underneath us
36714182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    const FastMixerDumpState copy(mFastMixerDumpState);
367281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    copy.dump(fd);
367381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
367481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#ifdef STATE_QUEUE_DUMP
367581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // Similar for state queue
367681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    StateQueueObserverDump observerCopy = mStateQueueObserverDump;
367781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    observerCopy.dump(fd);
367881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    StateQueueMutatorDump mutatorCopy = mStateQueueMutatorDump;
367981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mutatorCopy.dump(fd);
368081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#endif
368181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
368246909e7eb074ce1b95b8a411eb71154f53f84f77Glenn Kasten#ifdef TEE_SINK
368381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // Write the tee output to a .wav file
368481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    dumpTee(fd, mTeeSource, mId);
368546909e7eb074ce1b95b8a411eb71154f53f84f77Glenn Kasten#endif
368681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
368781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#ifdef AUDIO_WATCHDOG
368881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mAudioWatchdog != 0) {
368981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // Make a non-atomic copy of audio watchdog dump so it won't change underneath us
369081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        AudioWatchdogDump wdCopy = mAudioWatchdogDump;
369181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        wdCopy.dump(fd);
369281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
369381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#endif
369481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
369581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
369681784c37c61b09289654b979567a42bf73cd2b12Eric Laurentuint32_t AudioFlinger::MixerThread::idleSleepTimeUs() const
369781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
369881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return (uint32_t)(((mNormalFrameCount * 1000) / mSampleRate) * 1000) / 2;
369981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
370081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
370181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentuint32_t AudioFlinger::MixerThread::suspendSleepTimeUs() const
370281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
370381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return (uint32_t)(((mNormalFrameCount * 1000) / mSampleRate) * 1000);
370481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
370581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
370681784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::MixerThread::cacheParameters_l()
370781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
370881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    PlaybackThread::cacheParameters_l();
370981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
371081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // FIXME: Relaxed timing because of a certain device that can't meet latency
371181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // Should be reduced to 2x after the vendor fixes the driver issue
371281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // increase threshold again due to low power audio mode. The way this warning
371381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // threshold is calculated and its usefulness should be reconsidered anyway.
371481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    maxPeriod = seconds(mNormalFrameCount) / mSampleRate * 15;
371581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
371681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
371781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// ----------------------------------------------------------------------------
371881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
371981784c37c61b09289654b979567a42bf73cd2b12Eric LaurentAudioFlinger::DirectOutputThread::DirectOutputThread(const sp<AudioFlinger>& audioFlinger,
372081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        AudioStreamOut* output, audio_io_handle_t id, audio_devices_t device)
372181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    :   PlaybackThread(audioFlinger, output, id, device, DIRECT)
372281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // mLeftVolFloat, mRightVolFloat
372381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
372481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
372581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
3726bfb1b832079bbb9426f72f3863199a54aefd02daEric LaurentAudioFlinger::DirectOutputThread::DirectOutputThread(const sp<AudioFlinger>& audioFlinger,
3727bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        AudioStreamOut* output, audio_io_handle_t id, uint32_t device,
3728bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        ThreadBase::type_t type)
3729bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    :   PlaybackThread(audioFlinger, output, id, device, type)
3730bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        // mLeftVolFloat, mRightVolFloat
3731bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
3732bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
3733bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
373481784c37c61b09289654b979567a42bf73cd2b12Eric LaurentAudioFlinger::DirectOutputThread::~DirectOutputThread()
373581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
373681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
373781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
3738bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurentvoid AudioFlinger::DirectOutputThread::processVolume_l(Track *track, bool lastTrack)
3739bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
3740bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    audio_track_cblk_t* cblk = track->cblk();
3741bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    float left, right;
3742bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
3743bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    if (mMasterMute || mStreamTypes[track->streamType()].mute) {
3744bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        left = right = 0;
3745bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    } else {
3746bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        float typeVolume = mStreamTypes[track->streamType()].volume;
3747bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        float v = mMasterVolume * typeVolume;
3748bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        AudioTrackServerProxy *proxy = track->mAudioTrackServerProxy;
3749bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        uint32_t vlr = proxy->getVolumeLR();
3750bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        float v_clamped = v * (vlr & 0xFFFF);
3751bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        if (v_clamped > MAX_GAIN) v_clamped = MAX_GAIN;
3752bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        left = v_clamped/MAX_GAIN;
3753bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        v_clamped = v * (vlr >> 16);
3754bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        if (v_clamped > MAX_GAIN) v_clamped = MAX_GAIN;
3755bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        right = v_clamped/MAX_GAIN;
3756bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    }
3757bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
3758bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    if (lastTrack) {
3759bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        if (left != mLeftVolFloat || right != mRightVolFloat) {
3760bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            mLeftVolFloat = left;
3761bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            mRightVolFloat = right;
3762bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
3763bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            // Convert volumes from float to 8.24
3764bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            uint32_t vl = (uint32_t)(left * (1 << 24));
3765bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            uint32_t vr = (uint32_t)(right * (1 << 24));
3766bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
3767bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            // Delegate volume control to effect in track effect chain if needed
3768bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            // only one effect chain can be present on DirectOutputThread, so if
3769bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            // there is one, the track is connected to it
3770bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            if (!mEffectChains.isEmpty()) {
3771bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                mEffectChains[0]->setVolume_l(&vl, &vr);
3772bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                left = (float)vl / (1 << 24);
3773bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                right = (float)vr / (1 << 24);
3774bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            }
3775bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            if (mOutput->stream->set_volume) {
3776bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                mOutput->stream->set_volume(mOutput->stream, left, right);
3777bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            }
3778bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        }
3779bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    }
3780bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
3781bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
3782bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
378381784c37c61b09289654b979567a42bf73cd2b12Eric LaurentAudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prepareTracks_l(
378481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Vector< sp<Track> > *tracksToRemove
378581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent)
378681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
3787d595b7c858c481a07745674ce2d8a6690e980e74Eric Laurent    size_t count = mActiveTracks.size();
378881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mixer_state mixerStatus = MIXER_IDLE;
378981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
379081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // find out which tracks need to be processed
3791d595b7c858c481a07745674ce2d8a6690e980e74Eric Laurent    for (size_t i = 0; i < count; i++) {
3792d595b7c858c481a07745674ce2d8a6690e980e74Eric Laurent        sp<Track> t = mActiveTracks[i].promote();
379381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // The track died recently
379481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (t == 0) {
3795d595b7c858c481a07745674ce2d8a6690e980e74Eric Laurent            continue;
379681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
379781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
379881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        Track* const track = t.get();
379981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        audio_track_cblk_t* cblk = track->cblk();
3800fd4779740ec3e9e865d5514464df26d015354388Eric Laurent        // Only consider last track started for volume and mixer state control.
3801fd4779740ec3e9e865d5514464df26d015354388Eric Laurent        // In theory an older track could underrun and restart after the new one starts
3802fd4779740ec3e9e865d5514464df26d015354388Eric Laurent        // but as we only care about the transition phase between two tracks on a
3803fd4779740ec3e9e865d5514464df26d015354388Eric Laurent        // direct output, it is not a problem to ignore the underrun case.
3804fd4779740ec3e9e865d5514464df26d015354388Eric Laurent        sp<Track> l = mLatestActiveTrack.promote();
3805fd4779740ec3e9e865d5514464df26d015354388Eric Laurent        bool last = l.get() == track;
380681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
380781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // The first time a track is added we wait
380881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // for all its buffers to be filled before processing it
380981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        uint32_t minFrames;
381081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if ((track->sharedBuffer() == 0) && !track->isStopped() && !track->isPausing()) {
381181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            minFrames = mNormalFrameCount;
381281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        } else {
381381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            minFrames = 1;
381481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
3815bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
381681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if ((track->framesReady() >= minFrames) && track->isReady() &&
381781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                !track->isPaused() && !track->isTerminated())
381881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        {
3819f20e1d8df84c5fbeeace0052d100982ae39bb7a4Glenn Kasten            ALOGVV("track %d s=%08x [OK]", track->name(), cblk->mServer);
382081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
382181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (track->mFillingUpStatus == Track::FS_FILLED) {
382281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                track->mFillingUpStatus = Track::FS_ACTIVE;
38231abbdb4429479975718421c4fef3f79ce7c820e3Eric Laurent                // make sure processVolume_l() will apply new volume even if 0
38241abbdb4429479975718421c4fef3f79ce7c820e3Eric Laurent                mLeftVolFloat = mRightVolFloat = -1.0;
382581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (track->mState == TrackBase::RESUMING) {
382681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    track->mState = TrackBase::ACTIVE;
382781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
382881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
382981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
383081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // compute volume for this track
3831bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            processVolume_l(track, last);
3832bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            if (last) {
3833d595b7c858c481a07745674ce2d8a6690e980e74Eric Laurent                // reset retry count
3834d595b7c858c481a07745674ce2d8a6690e980e74Eric Laurent                track->mRetryCount = kMaxTrackRetriesDirect;
3835d595b7c858c481a07745674ce2d8a6690e980e74Eric Laurent                mActiveTrack = t;
3836d595b7c858c481a07745674ce2d8a6690e980e74Eric Laurent                mixerStatus = MIXER_TRACKS_READY;
3837d595b7c858c481a07745674ce2d8a6690e980e74Eric Laurent            }
383881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        } else {
3839d595b7c858c481a07745674ce2d8a6690e980e74Eric Laurent            // clear effect chain input buffer if the last active track started underruns
3840d595b7c858c481a07745674ce2d8a6690e980e74Eric Laurent            // to avoid sending previous audio buffer again to effects
3841fd4779740ec3e9e865d5514464df26d015354388Eric Laurent            if (!mEffectChains.isEmpty() && last) {
384281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                mEffectChains[0]->clearInputBuffer();
384381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
384481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
3845f20e1d8df84c5fbeeace0052d100982ae39bb7a4Glenn Kasten            ALOGVV("track %d s=%08x [NOT READY]", track->name(), cblk->mServer);
384681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if ((track->sharedBuffer() != 0) || track->isTerminated() ||
384781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    track->isStopped() || track->isPaused()) {
384881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // We have consumed all the buffers of this track.
384981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // Remove it from the list of active tracks.
385081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // TODO: implement behavior for compressed audio
385181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                size_t audioHALFrames = (latency_l() * mSampleRate) / 1000;
385281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                size_t framesWritten = mBytesWritten / mFrameSize;
3853fd4779740ec3e9e865d5514464df26d015354388Eric Laurent                if (mStandby || !last ||
3854fd4779740ec3e9e865d5514464df26d015354388Eric Laurent                        track->presentationComplete(framesWritten, audioHALFrames)) {
385581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    if (track->isStopped()) {
385681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        track->reset();
385781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    }
3858d595b7c858c481a07745674ce2d8a6690e980e74Eric Laurent                    tracksToRemove->add(track);
385981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
386081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            } else {
386181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // No buffers for this track. Give it a few chances to
386281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // fill a buffer, then remove it from active list.
3863d595b7c858c481a07745674ce2d8a6690e980e74Eric Laurent                // Only consider last track started for mixer state control
386481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (--(track->mRetryCount) <= 0) {
386581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    ALOGV("BUFFER TIMEOUT: remove(%d) from active list", track->name());
3866d595b7c858c481a07745674ce2d8a6690e980e74Eric Laurent                    tracksToRemove->add(track);
3867a23f17ac334ff20a11ee63dd177cb1080e44c483Eric Laurent                    // indicate to client process that the track was disabled because of underrun;
3868a23f17ac334ff20a11ee63dd177cb1080e44c483Eric Laurent                    // it will then automatically call start() when data is available
3869a23f17ac334ff20a11ee63dd177cb1080e44c483Eric Laurent                    android_atomic_or(CBLK_DISABLED, &cblk->mFlags);
3870bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                } else if (last) {
387181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    mixerStatus = MIXER_TRACKS_ENABLED;
387281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
387381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
387481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
387581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
387681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
387781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // remove all the tracks that need to be...
3878bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    removeTracks_l(*tracksToRemove);
387981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
388081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return mixerStatus;
388181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
388281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
388381784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::DirectOutputThread::threadLoop_mix()
388481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
388581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    size_t frameCount = mFrameCount;
38862098f2744cedf2dc3fa36f608aa965a34602e7c0Andy Hung    int8_t *curBuf = (int8_t *)mSinkBuffer;
388781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // output audio to hardware
388881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    while (frameCount) {
388934542acfa25c6413c87a94b6f7cc315a0c496277Glenn Kasten        AudioBufferProvider::Buffer buffer;
389081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        buffer.frameCount = frameCount;
389181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mActiveTrack->getNextBuffer(&buffer);
3892fa319e6d918b84f93fb5457af5d1cca6421ac517Glenn Kasten        if (buffer.raw == NULL) {
389381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            memset(curBuf, 0, frameCount * mFrameSize);
389481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            break;
389581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
389681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        memcpy(curBuf, buffer.raw, buffer.frameCount * mFrameSize);
389781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        frameCount -= buffer.frameCount;
389881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        curBuf += buffer.frameCount * mFrameSize;
389981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mActiveTrack->releaseBuffer(&buffer);
390081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
39012098f2744cedf2dc3fa36f608aa965a34602e7c0Andy Hung    mCurrentWriteLength = curBuf - (int8_t *)mSinkBuffer;
390281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    sleepTime = 0;
390381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    standbyTime = systemTime() + standbyDelay;
390481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mActiveTrack.clear();
390581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
390681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
390781784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::DirectOutputThread::threadLoop_sleepTime()
390881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
390981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (sleepTime == 0) {
391081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (mMixerStatus == MIXER_TRACKS_ENABLED) {
391181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            sleepTime = activeSleepTime;
391281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        } else {
391381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            sleepTime = idleSleepTime;
391481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
391581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    } else if (mBytesWritten != 0 && audio_is_linear_pcm(mFormat)) {
39162098f2744cedf2dc3fa36f608aa965a34602e7c0Andy Hung        memset(mSinkBuffer, 0, mFrameCount * mFrameSize);
391781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sleepTime = 0;
391881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
391981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
392081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
392181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// getTrackName_l() must be called with ThreadBase::mLock held
39220f11b51a57bc9062c4fe8af73747319cedabc5d6Glenn Kastenint AudioFlinger::DirectOutputThread::getTrackName_l(audio_channel_mask_t channelMask __unused,
39230f11b51a57bc9062c4fe8af73747319cedabc5d6Glenn Kasten        int sessionId __unused)
392481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
392581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return 0;
392681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
392781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
392881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// deleteTrackName_l() must be called with ThreadBase::mLock held
39290f11b51a57bc9062c4fe8af73747319cedabc5d6Glenn Kastenvoid AudioFlinger::DirectOutputThread::deleteTrackName_l(int name __unused)
393081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
393181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
393281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
393381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// checkForNewParameters_l() must be called with ThreadBase::mLock held
393481784c37c61b09289654b979567a42bf73cd2b12Eric Laurentbool AudioFlinger::DirectOutputThread::checkForNewParameters_l()
393581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
393681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    bool reconfig = false;
393781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
393881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    while (!mNewParameters.isEmpty()) {
393981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        status_t status = NO_ERROR;
394081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        String8 keyValuePair = mNewParameters[0];
394181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        AudioParameter param = AudioParameter(keyValuePair);
394281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        int value;
394381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
394481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (param.getInt(String8(AudioParameter::keyFrameCount), value) == NO_ERROR) {
394581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // do not accept frame count changes if tracks are open as the track buffer
394681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // size depends on frame count and correct behavior would not be garantied
394781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // if frame count is changed after track creation
394881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (!mTracks.isEmpty()) {
394981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                status = INVALID_OPERATION;
395081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            } else {
395181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                reconfig = true;
395281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
395381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
395481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (status == NO_ERROR) {
395581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            status = mOutput->stream->common.set_parameters(&mOutput->stream->common,
395681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                                    keyValuePair.string());
395781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (!mStandby && status == INVALID_OPERATION) {
395881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                mOutput->stream->common.standby(&mOutput->stream->common);
395981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                mStandby = true;
396081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                mBytesWritten = 0;
396181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                status = mOutput->stream->common.set_parameters(&mOutput->stream->common,
396281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                                       keyValuePair.string());
396381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
396481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (status == NO_ERROR && reconfig) {
3965deca2ae0a7cf8bc54ff3f30b7dc39bbc78b94c0dGlenn Kasten                readOutputParameters_l();
396681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                sendIoConfigEvent_l(AudioSystem::OUTPUT_CONFIG_CHANGED);
396781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
396881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
396981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
397081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mNewParameters.removeAt(0);
397181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
397281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mParamStatus = status;
397381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mParamCond.signal();
397481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // wait for condition with time out in case the thread calling ThreadBase::setParameters()
397581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // already timed out waiting for the status and will never signal the condition.
397681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mWaitWorkCV.waitRelative(mLock, kSetParametersTimeoutNs);
397781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
397881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return reconfig;
397981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
398081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
398181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentuint32_t AudioFlinger::DirectOutputThread::activeSleepTimeUs() const
398281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
398381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    uint32_t time;
398481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (audio_is_linear_pcm(mFormat)) {
398581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        time = PlaybackThread::activeSleepTimeUs();
398681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    } else {
398781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        time = 10000;
398881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
398981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return time;
399081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
399181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
399281784c37c61b09289654b979567a42bf73cd2b12Eric Laurentuint32_t AudioFlinger::DirectOutputThread::idleSleepTimeUs() const
399381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
399481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    uint32_t time;
399581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (audio_is_linear_pcm(mFormat)) {
399681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        time = (uint32_t)(((mFrameCount * 1000) / mSampleRate) * 1000) / 2;
399781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    } else {
399881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        time = 10000;
399981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
400081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return time;
400181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
400281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
400381784c37c61b09289654b979567a42bf73cd2b12Eric Laurentuint32_t AudioFlinger::DirectOutputThread::suspendSleepTimeUs() const
400481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
400581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    uint32_t time;
400681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (audio_is_linear_pcm(mFormat)) {
400781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        time = (uint32_t)(((mFrameCount * 1000) / mSampleRate) * 1000);
400881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    } else {
400981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        time = 10000;
401081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
401181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return time;
401281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
401381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
401481784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::DirectOutputThread::cacheParameters_l()
401581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
401681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    PlaybackThread::cacheParameters_l();
401781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
401881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // use shorter standby delay as on normal output to release
401981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // hardware resources as soon as possible
4020972a173d7d1de1a3b5a617aae3e2abb6e05ae02dEric Laurent    if (audio_is_linear_pcm(mFormat)) {
4021972a173d7d1de1a3b5a617aae3e2abb6e05ae02dEric Laurent        standbyDelay = microseconds(activeSleepTime*2);
4022972a173d7d1de1a3b5a617aae3e2abb6e05ae02dEric Laurent    } else {
4023972a173d7d1de1a3b5a617aae3e2abb6e05ae02dEric Laurent        standbyDelay = kOffloadStandbyDelayNs;
4024972a173d7d1de1a3b5a617aae3e2abb6e05ae02dEric Laurent    }
402581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
402681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
402781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// ----------------------------------------------------------------------------
402881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
4029bfb1b832079bbb9426f72f3863199a54aefd02daEric LaurentAudioFlinger::AsyncCallbackThread::AsyncCallbackThread(
40304de95592980dba88a35b3dc8f3fd045588387a4fEric Laurent        const wp<AudioFlinger::PlaybackThread>& playbackThread)
4031bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    :   Thread(false /*canCallJava*/),
40324de95592980dba88a35b3dc8f3fd045588387a4fEric Laurent        mPlaybackThread(playbackThread),
40333b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent        mWriteAckSequence(0),
40343b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent        mDrainSequence(0)
4035bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
4036bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
4037bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
4038bfb1b832079bbb9426f72f3863199a54aefd02daEric LaurentAudioFlinger::AsyncCallbackThread::~AsyncCallbackThread()
4039bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
4040bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
4041bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
4042bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurentvoid AudioFlinger::AsyncCallbackThread::onFirstRef()
4043bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
4044bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    run("Offload Cbk", ANDROID_PRIORITY_URGENT_AUDIO);
4045bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
4046bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
4047bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurentbool AudioFlinger::AsyncCallbackThread::threadLoop()
4048bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
4049bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    while (!exitPending()) {
40503b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent        uint32_t writeAckSequence;
40513b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent        uint32_t drainSequence;
4052bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
4053bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        {
4054bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            Mutex::Autolock _l(mLock);
405524a325d6f8c4bbf9330e6ce0c769d46e04266ffcHaynes Mathew George            while (!((mWriteAckSequence & 1) ||
405624a325d6f8c4bbf9330e6ce0c769d46e04266ffcHaynes Mathew George                     (mDrainSequence & 1) ||
405724a325d6f8c4bbf9330e6ce0c769d46e04266ffcHaynes Mathew George                     exitPending())) {
405824a325d6f8c4bbf9330e6ce0c769d46e04266ffcHaynes Mathew George                mWaitWorkCV.wait(mLock);
405924a325d6f8c4bbf9330e6ce0c769d46e04266ffcHaynes Mathew George            }
406024a325d6f8c4bbf9330e6ce0c769d46e04266ffcHaynes Mathew George
4061bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            if (exitPending()) {
4062bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                break;
4063bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            }
40643b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent            ALOGV("AsyncCallbackThread mWriteAckSequence %d mDrainSequence %d",
40653b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent                  mWriteAckSequence, mDrainSequence);
40663b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent            writeAckSequence = mWriteAckSequence;
40673b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent            mWriteAckSequence &= ~1;
40683b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent            drainSequence = mDrainSequence;
40693b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent            mDrainSequence &= ~1;
4070bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        }
4071bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        {
40724de95592980dba88a35b3dc8f3fd045588387a4fEric Laurent            sp<AudioFlinger::PlaybackThread> playbackThread = mPlaybackThread.promote();
40734de95592980dba88a35b3dc8f3fd045588387a4fEric Laurent            if (playbackThread != 0) {
40743b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent                if (writeAckSequence & 1) {
40754de95592980dba88a35b3dc8f3fd045588387a4fEric Laurent                    playbackThread->resetWriteBlocked(writeAckSequence >> 1);
4076bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                }
40773b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent                if (drainSequence & 1) {
40784de95592980dba88a35b3dc8f3fd045588387a4fEric Laurent                    playbackThread->resetDraining(drainSequence >> 1);
4079bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                }
4080bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            }
4081bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        }
4082bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    }
4083bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    return false;
4084bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
4085bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
4086bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurentvoid AudioFlinger::AsyncCallbackThread::exit()
4087bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
4088bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    ALOGV("AsyncCallbackThread::exit");
4089bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    Mutex::Autolock _l(mLock);
4090bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    requestExit();
4091bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    mWaitWorkCV.broadcast();
4092bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
4093bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
40943b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurentvoid AudioFlinger::AsyncCallbackThread::setWriteBlocked(uint32_t sequence)
4095bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
4096bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    Mutex::Autolock _l(mLock);
40973b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent    // bit 0 is cleared
40983b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent    mWriteAckSequence = sequence << 1;
40993b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent}
41003b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent
41013b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurentvoid AudioFlinger::AsyncCallbackThread::resetWriteBlocked()
41023b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent{
41033b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent    Mutex::Autolock _l(mLock);
41043b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent    // ignore unexpected callbacks
41053b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent    if (mWriteAckSequence & 2) {
41063b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent        mWriteAckSequence |= 1;
4107bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        mWaitWorkCV.signal();
4108bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    }
4109bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
4110bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
41113b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurentvoid AudioFlinger::AsyncCallbackThread::setDraining(uint32_t sequence)
41123b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent{
41133b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent    Mutex::Autolock _l(mLock);
41143b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent    // bit 0 is cleared
41153b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent    mDrainSequence = sequence << 1;
41163b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent}
41173b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent
41183b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurentvoid AudioFlinger::AsyncCallbackThread::resetDraining()
4119bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
4120bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    Mutex::Autolock _l(mLock);
41213b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent    // ignore unexpected callbacks
41223b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent    if (mDrainSequence & 2) {
41233b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent        mDrainSequence |= 1;
4124bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        mWaitWorkCV.signal();
4125bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    }
4126bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
4127bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
4128bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
4129bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent// ----------------------------------------------------------------------------
4130bfb1b832079bbb9426f72f3863199a54aefd02daEric LaurentAudioFlinger::OffloadThread::OffloadThread(const sp<AudioFlinger>& audioFlinger,
4131bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        AudioStreamOut* output, audio_io_handle_t id, uint32_t device)
4132bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    :   DirectOutputThread(audioFlinger, output, id, device, OFFLOAD),
4133bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        mHwPaused(false),
4134ea0fadeb5d81ef3cb7f9db458c9033d628bdb86aEric Laurent        mFlushPending(false),
4135d7e59228caad3867794d847f6bf163c6495e9506Eric Laurent        mPausedBytesRemaining(0)
4136bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
4137fd4779740ec3e9e865d5514464df26d015354388Eric Laurent    //FIXME: mStandby should be set to true by ThreadBase constructor
4138fd4779740ec3e9e865d5514464df26d015354388Eric Laurent    mStandby = true;
4139bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
4140bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
4141bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurentvoid AudioFlinger::OffloadThread::threadLoop_exit()
4142bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
4143bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    if (mFlushPending || mHwPaused) {
4144bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        // If a flush is pending or track was paused, just discard buffered data
4145bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        flushHw_l();
4146bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    } else {
4147bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        mMixerStatus = MIXER_DRAIN_ALL;
4148bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        threadLoop_drain();
4149bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    }
4150bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    mCallbackThread->exit();
4151bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    PlaybackThread::threadLoop_exit();
4152bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
4153bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
4154bfb1b832079bbb9426f72f3863199a54aefd02daEric LaurentAudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTracks_l(
4155bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    Vector< sp<Track> > *tracksToRemove
4156bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent)
4157bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
4158bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    size_t count = mActiveTracks.size();
4159bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
4160bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    mixer_state mixerStatus = MIXER_IDLE;
4161972a173d7d1de1a3b5a617aae3e2abb6e05ae02dEric Laurent    bool doHwPause = false;
4162972a173d7d1de1a3b5a617aae3e2abb6e05ae02dEric Laurent    bool doHwResume = false;
4163972a173d7d1de1a3b5a617aae3e2abb6e05ae02dEric Laurent
4164ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent    ALOGV("OffloadThread::prepareTracks_l active tracks %d", count);
4165ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent
4166bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    // find out which tracks need to be processed
4167bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    for (size_t i = 0; i < count; i++) {
4168bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        sp<Track> t = mActiveTracks[i].promote();
4169bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        // The track died recently
4170bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        if (t == 0) {
4171bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            continue;
4172bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        }
4173bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        Track* const track = t.get();
4174bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        audio_track_cblk_t* cblk = track->cblk();
4175fd4779740ec3e9e865d5514464df26d015354388Eric Laurent        // Only consider last track started for volume and mixer state control.
4176fd4779740ec3e9e865d5514464df26d015354388Eric Laurent        // In theory an older track could underrun and restart after the new one starts
4177fd4779740ec3e9e865d5514464df26d015354388Eric Laurent        // but as we only care about the transition phase between two tracks on a
4178fd4779740ec3e9e865d5514464df26d015354388Eric Laurent        // direct output, it is not a problem to ignore the underrun case.
4179fd4779740ec3e9e865d5514464df26d015354388Eric Laurent        sp<Track> l = mLatestActiveTrack.promote();
4180fd4779740ec3e9e865d5514464df26d015354388Eric Laurent        bool last = l.get() == track;
4181fd4779740ec3e9e865d5514464df26d015354388Eric Laurent
41827844f679be8d94c5cdf017f53754cb68ee2f00daHaynes Mathew George        if (track->isInvalid()) {
41837844f679be8d94c5cdf017f53754cb68ee2f00daHaynes Mathew George            ALOGW("An invalidated track shouldn't be in active list");
41847844f679be8d94c5cdf017f53754cb68ee2f00daHaynes Mathew George            tracksToRemove->add(track);
41857844f679be8d94c5cdf017f53754cb68ee2f00daHaynes Mathew George            continue;
41867844f679be8d94c5cdf017f53754cb68ee2f00daHaynes Mathew George        }
41877844f679be8d94c5cdf017f53754cb68ee2f00daHaynes Mathew George
41887844f679be8d94c5cdf017f53754cb68ee2f00daHaynes Mathew George        if (track->mState == TrackBase::IDLE) {
41897844f679be8d94c5cdf017f53754cb68ee2f00daHaynes Mathew George            ALOGW("An idle track shouldn't be in active list");
41907844f679be8d94c5cdf017f53754cb68ee2f00daHaynes Mathew George            continue;
41917844f679be8d94c5cdf017f53754cb68ee2f00daHaynes Mathew George        }
41927844f679be8d94c5cdf017f53754cb68ee2f00daHaynes Mathew George
4193bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        if (track->isPausing()) {
4194bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            track->setPaused();
4195bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            if (last) {
4196bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                if (!mHwPaused) {
4197972a173d7d1de1a3b5a617aae3e2abb6e05ae02dEric Laurent                    doHwPause = true;
4198bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    mHwPaused = true;
4199bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                }
4200bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                // If we were part way through writing the mixbuffer to
4201bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                // the HAL we must save this until we resume
4202bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                // BUG - this will be wrong if a different track is made active,
4203bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                // in that case we want to discard the pending data in the
4204bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                // mixbuffer and tell the client to present it again when the
4205bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                // track is resumed
4206bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                mPausedWriteLength = mCurrentWriteLength;
4207bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                mPausedBytesRemaining = mBytesRemaining;
4208bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                mBytesRemaining = 0;    // stop writing
4209bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            }
4210bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            tracksToRemove->add(track);
42117844f679be8d94c5cdf017f53754cb68ee2f00daHaynes Mathew George        } else if (track->isFlushPending()) {
42127844f679be8d94c5cdf017f53754cb68ee2f00daHaynes Mathew George            track->flushAck();
42137844f679be8d94c5cdf017f53754cb68ee2f00daHaynes Mathew George            if (last) {
42147844f679be8d94c5cdf017f53754cb68ee2f00daHaynes Mathew George                mFlushPending = true;
42157844f679be8d94c5cdf017f53754cb68ee2f00daHaynes Mathew George            }
4216bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        } else if (track->framesReady() && track->isReady() &&
42173b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent                !track->isPaused() && !track->isTerminated() && !track->isStopping_2()) {
4218f20e1d8df84c5fbeeace0052d100982ae39bb7a4Glenn Kasten            ALOGVV("OffloadThread: track %d s=%08x [OK]", track->name(), cblk->mServer);
4219bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            if (track->mFillingUpStatus == Track::FS_FILLED) {
4220bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                track->mFillingUpStatus = Track::FS_ACTIVE;
42211abbdb4429479975718421c4fef3f79ce7c820e3Eric Laurent                // make sure processVolume_l() will apply new volume even if 0
42221abbdb4429479975718421c4fef3f79ce7c820e3Eric Laurent                mLeftVolFloat = mRightVolFloat = -1.0;
4223bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                if (track->mState == TrackBase::RESUMING) {
4224bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    track->mState = TrackBase::ACTIVE;
4225ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent                    if (last) {
4226ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent                        if (mPausedBytesRemaining) {
4227ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent                            // Need to continue write that was interrupted
4228ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent                            mCurrentWriteLength = mPausedWriteLength;
4229ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent                            mBytesRemaining = mPausedBytesRemaining;
4230ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent                            mPausedBytesRemaining = 0;
4231ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent                        }
4232ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent                        if (mHwPaused) {
4233ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent                            doHwResume = true;
4234ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent                            mHwPaused = false;
4235ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent                            // threadLoop_mix() will handle the case that we need to
4236ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent                            // resume an interrupted write
4237ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent                        }
4238ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent                        // enable write to audio HAL
4239ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent                        sleepTime = 0;
4240ede6c3b8b1147bc425f7b923882f559a513fe23bEric Laurent                    }
4241bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                }
4242bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            }
4243bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
4244bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            if (last) {
4245d7e59228caad3867794d847f6bf163c6495e9506Eric Laurent                sp<Track> previousTrack = mPreviousTrack.promote();
4246d7e59228caad3867794d847f6bf163c6495e9506Eric Laurent                if (previousTrack != 0) {
4247d7e59228caad3867794d847f6bf163c6495e9506Eric Laurent                    if (track != previousTrack.get()) {
42489da3d9573a18ffe08365557c706cf52f09118d1cEric Laurent                        // Flush any data still being written from last track
42499da3d9573a18ffe08365557c706cf52f09118d1cEric Laurent                        mBytesRemaining = 0;
42509da3d9573a18ffe08365557c706cf52f09118d1cEric Laurent                        if (mPausedBytesRemaining) {
42519da3d9573a18ffe08365557c706cf52f09118d1cEric Laurent                            // Last track was paused so we also need to flush saved
42529da3d9573a18ffe08365557c706cf52f09118d1cEric Laurent                            // mixbuffer state and invalidate track so that it will
42539da3d9573a18ffe08365557c706cf52f09118d1cEric Laurent                            // re-submit that unwritten data when it is next resumed
42549da3d9573a18ffe08365557c706cf52f09118d1cEric Laurent                            mPausedBytesRemaining = 0;
42559da3d9573a18ffe08365557c706cf52f09118d1cEric Laurent                            // Invalidate is a bit drastic - would be more efficient
42569da3d9573a18ffe08365557c706cf52f09118d1cEric Laurent                            // to have a flag to tell client that some of the
42579da3d9573a18ffe08365557c706cf52f09118d1cEric Laurent                            // previously written data was lost
4258d7e59228caad3867794d847f6bf163c6495e9506Eric Laurent                            previousTrack->invalidate();
42599da3d9573a18ffe08365557c706cf52f09118d1cEric Laurent                        }
42609da3d9573a18ffe08365557c706cf52f09118d1cEric Laurent                        // flush data already sent to the DSP if changing audio session as audio
42619da3d9573a18ffe08365557c706cf52f09118d1cEric Laurent                        // comes from a different source. Also invalidate previous track to force a
42629da3d9573a18ffe08365557c706cf52f09118d1cEric Laurent                        // seek when resuming.
4263d7e59228caad3867794d847f6bf163c6495e9506Eric Laurent                        if (previousTrack->sessionId() != track->sessionId()) {
4264d7e59228caad3867794d847f6bf163c6495e9506Eric Laurent                            previousTrack->invalidate();
42659da3d9573a18ffe08365557c706cf52f09118d1cEric Laurent                        }
42669da3d9573a18ffe08365557c706cf52f09118d1cEric Laurent                    }
42679da3d9573a18ffe08365557c706cf52f09118d1cEric Laurent                }
42689da3d9573a18ffe08365557c706cf52f09118d1cEric Laurent                mPreviousTrack = track;
4269bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                // reset retry count
4270bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                track->mRetryCount = kMaxTrackRetriesOffload;
4271bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                mActiveTrack = t;
4272bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                mixerStatus = MIXER_TRACKS_READY;
4273bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            }
4274bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        } else {
4275f20e1d8df84c5fbeeace0052d100982ae39bb7a4Glenn Kasten            ALOGVV("OffloadThread: track %d s=%08x [NOT READY]", track->name(), cblk->mServer);
4276bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            if (track->isStopping_1()) {
4277bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                // Hardware buffer can hold a large amount of audio so we must
4278bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                // wait for all current track's data to drain before we say
4279bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                // that the track is stopped.
4280bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                if (mBytesRemaining == 0) {
4281bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    // Only start draining when all data in mixbuffer
4282bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    // has been written
4283bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    ALOGV("OffloadThread: underrun and STOPPING_1 -> draining, STOPPING_2");
4284bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    track->mState = TrackBase::STOPPING_2; // so presentation completes after drain
42856a51d7ed7062536ccc892c8850a34ed55cbc8d5cEric Laurent                    // do not drain if no data was ever sent to HAL (mStandby == true)
42866a51d7ed7062536ccc892c8850a34ed55cbc8d5cEric Laurent                    if (last && !mStandby) {
42871b9f9b134e732a48198e51f16424f330cbf03143Eric Laurent                        // do not modify drain sequence if we are already draining. This happens
42881b9f9b134e732a48198e51f16424f330cbf03143Eric Laurent                        // when resuming from pause after drain.
42891b9f9b134e732a48198e51f16424f330cbf03143Eric Laurent                        if ((mDrainSequence & 1) == 0) {
42901b9f9b134e732a48198e51f16424f330cbf03143Eric Laurent                            sleepTime = 0;
42911b9f9b134e732a48198e51f16424f330cbf03143Eric Laurent                            standbyTime = systemTime() + standbyDelay;
42921b9f9b134e732a48198e51f16424f330cbf03143Eric Laurent                            mixerStatus = MIXER_DRAIN_TRACK;
42931b9f9b134e732a48198e51f16424f330cbf03143Eric Laurent                            mDrainSequence += 2;
42941b9f9b134e732a48198e51f16424f330cbf03143Eric Laurent                        }
4295bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                        if (mHwPaused) {
4296bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                            // It is possible to move from PAUSED to STOPPING_1 without
4297bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                            // a resume so we must ensure hardware is running
42981b9f9b134e732a48198e51f16424f330cbf03143Eric Laurent                            doHwResume = true;
4299bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                            mHwPaused = false;
4300bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                        }
4301bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    }
4302bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                }
4303bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            } else if (track->isStopping_2()) {
43046a51d7ed7062536ccc892c8850a34ed55cbc8d5cEric Laurent                // Drain has completed or we are in standby, signal presentation complete
43056a51d7ed7062536ccc892c8850a34ed55cbc8d5cEric Laurent                if (!(mDrainSequence & 1) || !last || mStandby) {
4306bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    track->mState = TrackBase::STOPPED;
4307bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    size_t audioHALFrames =
4308bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                            (mOutput->stream->get_latency(mOutput->stream)*mSampleRate) / 1000;
4309bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    size_t framesWritten =
4310bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                            mBytesWritten / audio_stream_frame_size(&mOutput->stream->common);
4311bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    track->presentationComplete(framesWritten, audioHALFrames);
4312bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    track->reset();
4313bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    tracksToRemove->add(track);
4314bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                }
4315bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            } else {
4316bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                // No buffers for this track. Give it a few chances to
4317bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                // fill a buffer, then remove it from active list.
4318bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                if (--(track->mRetryCount) <= 0) {
4319bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    ALOGV("OffloadThread: BUFFER TIMEOUT: remove(%d) from active list",
4320bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                          track->name());
4321bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    tracksToRemove->add(track);
4322a23f17ac334ff20a11ee63dd177cb1080e44c483Eric Laurent                    // indicate to client process that the track was disabled because of underrun;
4323a23f17ac334ff20a11ee63dd177cb1080e44c483Eric Laurent                    // it will then automatically call start() when data is available
4324a23f17ac334ff20a11ee63dd177cb1080e44c483Eric Laurent                    android_atomic_or(CBLK_DISABLED, &cblk->mFlags);
4325bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                } else if (last){
4326bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                    mixerStatus = MIXER_TRACKS_ENABLED;
4327bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent                }
4328bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            }
4329bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        }
4330bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        // compute volume for this track
4331bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        processVolume_l(track, last);
4332bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    }
43336bf9ae20b3bd2dbb8f2e89ee167a6785222301cfEric Laurent
4334ea0fadeb5d81ef3cb7f9db458c9033d628bdb86aEric Laurent    // make sure the pause/flush/resume sequence is executed in the right order.
4335ea0fadeb5d81ef3cb7f9db458c9033d628bdb86aEric Laurent    // If a flush is pending and a track is active but the HW is not paused, force a HW pause
4336ea0fadeb5d81ef3cb7f9db458c9033d628bdb86aEric Laurent    // before flush and then resume HW. This can happen in case of pause/flush/resume
4337ea0fadeb5d81ef3cb7f9db458c9033d628bdb86aEric Laurent    // if resume is received before pause is executed.
4338fd4779740ec3e9e865d5514464df26d015354388Eric Laurent    if (!mStandby && (doHwPause || (mFlushPending && !mHwPaused && (count != 0)))) {
4339972a173d7d1de1a3b5a617aae3e2abb6e05ae02dEric Laurent        mOutput->stream->pause(mOutput->stream);
4340972a173d7d1de1a3b5a617aae3e2abb6e05ae02dEric Laurent    }
43416bf9ae20b3bd2dbb8f2e89ee167a6785222301cfEric Laurent    if (mFlushPending) {
43426bf9ae20b3bd2dbb8f2e89ee167a6785222301cfEric Laurent        flushHw_l();
43436bf9ae20b3bd2dbb8f2e89ee167a6785222301cfEric Laurent        mFlushPending = false;
43446bf9ae20b3bd2dbb8f2e89ee167a6785222301cfEric Laurent    }
4345fd4779740ec3e9e865d5514464df26d015354388Eric Laurent    if (!mStandby && doHwResume) {
4346972a173d7d1de1a3b5a617aae3e2abb6e05ae02dEric Laurent        mOutput->stream->resume(mOutput->stream);
4347972a173d7d1de1a3b5a617aae3e2abb6e05ae02dEric Laurent    }
43486bf9ae20b3bd2dbb8f2e89ee167a6785222301cfEric Laurent
4349bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    // remove all the tracks that need to be...
4350bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    removeTracks_l(*tracksToRemove);
4351bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
4352bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    return mixerStatus;
4353bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
4354bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
4355bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent// must be called with thread mutex locked
4356bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurentbool AudioFlinger::OffloadThread::waitingAsyncCallback_l()
4357bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
43583b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent    ALOGVV("waitingAsyncCallback_l mWriteAckSequence %d mDrainSequence %d",
43593b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent          mWriteAckSequence, mDrainSequence);
43603b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent    if (mUseAsyncWrite && ((mWriteAckSequence & 1) || (mDrainSequence & 1))) {
4361bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        return true;
4362bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    }
4363bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    return false;
4364bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
4365bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
4366bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent// must be called with thread mutex locked
4367bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurentbool AudioFlinger::OffloadThread::shouldStandby_l()
4368bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
4369e6f35b13567d920af19f0b8dc35f9120b7cf1dc9Glenn Kasten    bool trackPaused = false;
4370bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
4371bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    // do not put the HAL in standby when paused. AwesomePlayer clear the offloaded AudioTrack
4372bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    // after a timeout and we will enter standby then.
4373bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    if (mTracks.size() > 0) {
4374e6f35b13567d920af19f0b8dc35f9120b7cf1dc9Glenn Kasten        trackPaused = mTracks[mTracks.size() - 1]->isPaused();
4375bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    }
4376bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
4377e6f35b13567d920af19f0b8dc35f9120b7cf1dc9Glenn Kasten    return !mStandby && !trackPaused;
4378bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
4379bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
4380bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
4381bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurentbool AudioFlinger::OffloadThread::waitingAsyncCallback()
4382bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
4383bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    Mutex::Autolock _l(mLock);
4384bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    return waitingAsyncCallback_l();
4385bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
4386bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
4387bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurentvoid AudioFlinger::OffloadThread::flushHw_l()
4388bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent{
4389bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    mOutput->stream->flush(mOutput->stream);
4390bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    // Flush anything still waiting in the mixbuffer
4391bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    mCurrentWriteLength = 0;
4392bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    mBytesRemaining = 0;
4393bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    mPausedWriteLength = 0;
4394bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    mPausedBytesRemaining = 0;
43950f02f265123b7ef2fd6ac09ff70cde26eb5559adHaynes Mathew George    mHwPaused = false;
43960f02f265123b7ef2fd6ac09ff70cde26eb5559adHaynes Mathew George
4397bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    if (mUseAsyncWrite) {
43983b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent        // discard any pending drain or write ack by incrementing sequence
43993b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent        mWriteAckSequence = (mWriteAckSequence + 2) & ~1;
44003b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent        mDrainSequence = (mDrainSequence + 2) & ~1;
4401bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent        ALOG_ASSERT(mCallbackThread != 0);
44023b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent        mCallbackThread->setWriteBlocked(mWriteAckSequence);
44033b4529e03c5fc7a44c22f9091ad15a269bfca3a8Eric Laurent        mCallbackThread->setDraining(mDrainSequence);
4404bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    }
4405bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent}
4406bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
44074c6a433d74d5ae8b9bc0557207e3ced43bf34a25Haynes Mathew Georgevoid AudioFlinger::OffloadThread::onAddNewTrack_l()
44084c6a433d74d5ae8b9bc0557207e3ced43bf34a25Haynes Mathew George{
44094c6a433d74d5ae8b9bc0557207e3ced43bf34a25Haynes Mathew George    sp<Track> previousTrack = mPreviousTrack.promote();
44104c6a433d74d5ae8b9bc0557207e3ced43bf34a25Haynes Mathew George    sp<Track> latestTrack = mLatestActiveTrack.promote();
44114c6a433d74d5ae8b9bc0557207e3ced43bf34a25Haynes Mathew George
44124c6a433d74d5ae8b9bc0557207e3ced43bf34a25Haynes Mathew George    if (previousTrack != 0 && latestTrack != 0 &&
44134c6a433d74d5ae8b9bc0557207e3ced43bf34a25Haynes Mathew George        (previousTrack->sessionId() != latestTrack->sessionId())) {
44144c6a433d74d5ae8b9bc0557207e3ced43bf34a25Haynes Mathew George        mFlushPending = true;
44154c6a433d74d5ae8b9bc0557207e3ced43bf34a25Haynes Mathew George    }
44164c6a433d74d5ae8b9bc0557207e3ced43bf34a25Haynes Mathew George    PlaybackThread::onAddNewTrack_l();
44174c6a433d74d5ae8b9bc0557207e3ced43bf34a25Haynes Mathew George}
44184c6a433d74d5ae8b9bc0557207e3ced43bf34a25Haynes Mathew George
4419bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent// ----------------------------------------------------------------------------
4420bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent
442181784c37c61b09289654b979567a42bf73cd2b12Eric LaurentAudioFlinger::DuplicatingThread::DuplicatingThread(const sp<AudioFlinger>& audioFlinger,
442281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        AudioFlinger::MixerThread* mainThread, audio_io_handle_t id)
442381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    :   MixerThread(audioFlinger, mainThread->getOutput(), id, mainThread->outDevice(),
442481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                DUPLICATING),
442581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mWaitTimeMs(UINT_MAX)
442681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
442781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    addOutputTrack(mainThread);
442881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
442981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
443081784c37c61b09289654b979567a42bf73cd2b12Eric LaurentAudioFlinger::DuplicatingThread::~DuplicatingThread()
443181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
443281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (size_t i = 0; i < mOutputTracks.size(); i++) {
443381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mOutputTracks[i]->destroy();
443481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
443581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
443681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
443781784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::DuplicatingThread::threadLoop_mix()
443881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
443981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // mix buffers...
444081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (outputsReady(outputTracks)) {
444181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mAudioMixer->process(AudioBufferProvider::kInvalidPTS);
444281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    } else {
444325c2dac12114699e90deb1c579cadebce7b91a97Andy Hung        memset(mSinkBuffer, 0, mSinkBufferSize);
444481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
444581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    sleepTime = 0;
444681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    writeFrames = mNormalFrameCount;
444725c2dac12114699e90deb1c579cadebce7b91a97Andy Hung    mCurrentWriteLength = mSinkBufferSize;
444881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    standbyTime = systemTime() + standbyDelay;
444981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
445081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
445181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::DuplicatingThread::threadLoop_sleepTime()
445281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
445381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (sleepTime == 0) {
445481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (mMixerStatus == MIXER_TRACKS_ENABLED) {
445581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            sleepTime = activeSleepTime;
445681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        } else {
445781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            sleepTime = idleSleepTime;
445881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
445981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    } else if (mBytesWritten != 0) {
446081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (mMixerStatus == MIXER_TRACKS_ENABLED) {
446181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            writeFrames = mNormalFrameCount;
446225c2dac12114699e90deb1c579cadebce7b91a97Andy Hung            memset(mSinkBuffer, 0, mSinkBufferSize);
446381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        } else {
446481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // flush remaining overflow buffers in output tracks
446581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            writeFrames = 0;
446681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
446781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sleepTime = 0;
446881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
446981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
447081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
4471bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurentssize_t AudioFlinger::DuplicatingThread::threadLoop_write()
447281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
447381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (size_t i = 0; i < outputTracks.size(); i++) {
44742098f2744cedf2dc3fa36f608aa965a34602e7c0Andy Hung        outputTracks[i]->write(mSinkBuffer, writeFrames);
447581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
44762c3740f01acca69c3e0bcc5e01bb0edc51b6777fEric Laurent    mStandby = false;
447725c2dac12114699e90deb1c579cadebce7b91a97Andy Hung    return (ssize_t)mSinkBufferSize;
447881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
447981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
448081784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::DuplicatingThread::threadLoop_standby()
448181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
448281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // DuplicatingThread implements standby by stopping all tracks
448381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (size_t i = 0; i < outputTracks.size(); i++) {
448481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        outputTracks[i]->stop();
448581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
448681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
448781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
448881784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::DuplicatingThread::saveOutputTracks()
448981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
449081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    outputTracks = mOutputTracks;
449181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
449281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
449381784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::DuplicatingThread::clearOutputTracks()
449481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
449581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    outputTracks.clear();
449681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
449781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
449881784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::DuplicatingThread::addOutputTrack(MixerThread *thread)
449981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
450081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
450181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // FIXME explain this formula
450281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    size_t frameCount = (3 * mNormalFrameCount * mSampleRate) / thread->sampleRate();
450381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    OutputTrack *outputTrack = new OutputTrack(thread,
450481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                            this,
450581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                            mSampleRate,
450681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                            mFormat,
450781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                            mChannelMask,
4508462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen                                            frameCount,
4509462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen                                            IPCThreadState::self()->getCallingUid());
451081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (outputTrack->cblk() != NULL) {
451181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        thread->setStreamVolume(AUDIO_STREAM_CNT, 1.0f);
451281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mOutputTracks.add(outputTrack);
451381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOGV("addOutputTrack() track %p, on thread %p", outputTrack, thread);
451481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        updateWaitTime_l();
451581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
451681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
451781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
451881784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::DuplicatingThread::removeOutputTrack(MixerThread *thread)
451981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
452081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
452181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (size_t i = 0; i < mOutputTracks.size(); i++) {
452281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (mOutputTracks[i]->thread() == thread) {
452381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mOutputTracks[i]->destroy();
452481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mOutputTracks.removeAt(i);
452581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            updateWaitTime_l();
452681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            return;
452781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
452881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
452981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOGV("removeOutputTrack(): unkonwn thread: %p", thread);
453081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
453181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
453281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// caller must hold mLock
453381784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::DuplicatingThread::updateWaitTime_l()
453481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
453581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mWaitTimeMs = UINT_MAX;
453681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (size_t i = 0; i < mOutputTracks.size(); i++) {
453781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sp<ThreadBase> strong = mOutputTracks[i]->thread().promote();
453881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (strong != 0) {
453981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            uint32_t waitTimeMs = (strong->frameCount() * 2 * 1000) / strong->sampleRate();
454081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (waitTimeMs < mWaitTimeMs) {
454181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                mWaitTimeMs = waitTimeMs;
454281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
454381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
454481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
454581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
454681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
454781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
454881784c37c61b09289654b979567a42bf73cd2b12Eric Laurentbool AudioFlinger::DuplicatingThread::outputsReady(
454981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        const SortedVector< sp<OutputTrack> > &outputTracks)
455081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
455181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (size_t i = 0; i < outputTracks.size(); i++) {
455281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sp<ThreadBase> thread = outputTracks[i]->thread().promote();
455381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (thread == 0) {
455481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            ALOGW("DuplicatingThread::outputsReady() could not promote thread on output track %p",
455581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    outputTracks[i].get());
455681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            return false;
455781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
455881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
455981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // see note at standby() declaration
456081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (playbackThread->standby() && !playbackThread->isSuspended()) {
456181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            ALOGV("DuplicatingThread output track %p on thread %p Not Ready", outputTracks[i].get(),
456281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    thread.get());
456381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            return false;
456481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
456581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
456681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return true;
456781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
456881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
456981784c37c61b09289654b979567a42bf73cd2b12Eric Laurentuint32_t AudioFlinger::DuplicatingThread::activeSleepTimeUs() const
457081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
457181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return (mWaitTimeMs * 1000) / 2;
457281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
457381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
457481784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::DuplicatingThread::cacheParameters_l()
457581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
457681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // updateWaitTime_l() sets mWaitTimeMs, which affects activeSleepTimeUs(), so call it first
457781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    updateWaitTime_l();
457881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
457981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    MixerThread::cacheParameters_l();
458081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
458181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
458281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// ----------------------------------------------------------------------------
458381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent//      Record
458481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// ----------------------------------------------------------------------------
458581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
458681784c37c61b09289654b979567a42bf73cd2b12Eric LaurentAudioFlinger::RecordThread::RecordThread(const sp<AudioFlinger>& audioFlinger,
458781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                         AudioStreamIn *input,
458881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                         audio_io_handle_t id,
4589d3922f72601d82c6fc067a98916fda0bd1291c5fEric Laurent                                         audio_devices_t outDevice,
459046909e7eb074ce1b95b8a411eb71154f53f84f77Glenn Kasten                                         audio_devices_t inDevice
459146909e7eb074ce1b95b8a411eb71154f53f84f77Glenn Kasten#ifdef TEE_SINK
459246909e7eb074ce1b95b8a411eb71154f53f84f77Glenn Kasten                                         , const sp<NBAIO_Sink>& teeSink
459346909e7eb074ce1b95b8a411eb71154f53f84f77Glenn Kasten#endif
459446909e7eb074ce1b95b8a411eb71154f53f84f77Glenn Kasten                                         ) :
4595d3922f72601d82c6fc067a98916fda0bd1291c5fEric Laurent    ThreadBase(audioFlinger, id, outDevice, inDevice, RECORD),
45966dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    mInput(input), mActiveTracksGen(0), mRsmpInBuffer(NULL),
4597deca2ae0a7cf8bc54ff3f30b7dc39bbc78b94c0dGlenn Kasten    // mRsmpInFrames and mRsmpInFramesP2 are set by readInputParameters_l()
45984cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten    mRsmpInRear(0)
459946909e7eb074ce1b95b8a411eb71154f53f84f77Glenn Kasten#ifdef TEE_SINK
460046909e7eb074ce1b95b8a411eb71154f53f84f77Glenn Kasten    , mTeeSink(teeSink)
460146909e7eb074ce1b95b8a411eb71154f53f84f77Glenn Kasten#endif
460281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
460381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    snprintf(mName, kNameLength, "AudioIn_%X", id);
4604481fb67a595f23c5b7f5be84b06db9b84a41a42fGlenn Kasten    mNBLogWriter = audioFlinger->newWriter_l(kLogSize, mName);
460581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
4606deca2ae0a7cf8bc54ff3f30b7dc39bbc78b94c0dGlenn Kasten    readInputParameters_l();
460781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
460881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
460981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
461081784c37c61b09289654b979567a42bf73cd2b12Eric LaurentAudioFlinger::RecordThread::~RecordThread()
461181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
4612481fb67a595f23c5b7f5be84b06db9b84a41a42fGlenn Kasten    mAudioFlinger->unregisterWriter(mNBLogWriter);
461381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    delete[] mRsmpInBuffer;
461481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
461581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
461681784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::RecordThread::onFirstRef()
461781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
461881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    run(mName, PRIORITY_URGENT_AUDIO);
461981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
462081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
462181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentbool AudioFlinger::RecordThread::threadLoop()
462281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
462381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    nsecs_t lastWarning = 0;
462481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
462581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    inputStandBy();
462681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
4627f10ffec18f930d92e1abe9200d60e746831841a7Glenn Kastenreacquire_wakelock:
4628f10ffec18f930d92e1abe9200d60e746831841a7Glenn Kasten    sp<RecordTrack> activeTrack;
46292b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten    int activeTracksGen;
4630f10ffec18f930d92e1abe9200d60e746831841a7Glenn Kasten    {
4631f10ffec18f930d92e1abe9200d60e746831841a7Glenn Kasten        Mutex::Autolock _l(mLock);
46322b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten        size_t size = mActiveTracks.size();
46332b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten        activeTracksGen = mActiveTracksGen;
46342b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten        if (size > 0) {
46352b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten            // FIXME an arbitrary choice
46362b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten            activeTrack = mActiveTracks[0];
46372b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten            acquireWakeLock_l(activeTrack->uid());
46382b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten            if (size > 1) {
46392b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten                SortedVector<int> tmp;
46402b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten                for (size_t i = 0; i < size; i++) {
46412b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten                    tmp.add(mActiveTracks[i]->uid());
46422b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten                }
46432b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten                updateWakeLockUids_l(tmp);
46442b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten            }
46452b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten        } else {
46462b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten            acquireWakeLock_l(-1);
46472b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten        }
4648f10ffec18f930d92e1abe9200d60e746831841a7Glenn Kasten    }
4649f10ffec18f930d92e1abe9200d60e746831841a7Glenn Kasten
46506dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    // used to request a deferred sleep, to be executed later while mutex is unlocked
46516dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    uint32_t sleepUs = 0;
46526dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
46536dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    // loop while there is work to do
46544ef0b463a56c19bad9197aa9f90d792090461429Glenn Kasten    for (;;) {
4655c527a7c2b1bfd26e8f3086e1b653d56e521379d9Glenn Kasten        Vector< sp<EffectChain> > effectChains;
46562cfbf88b89854f30b295e8ae26a031edb8d712f8Glenn Kasten
46575edadd46c76c5ff1c3edabf2ea943c2278e82e1cGlenn Kasten        // sleep with mutex unlocked
46586dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        if (sleepUs > 0) {
46596dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            usleep(sleepUs);
46606dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            sleepUs = 0;
46615edadd46c76c5ff1c3edabf2ea943c2278e82e1cGlenn Kasten        }
46625edadd46c76c5ff1c3edabf2ea943c2278e82e1cGlenn Kasten
46636dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        // activeTracks accumulates a copy of a subset of mActiveTracks
46646dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        Vector< sp<RecordTrack> > activeTracks;
46656dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
466681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        { // scope for mLock
466781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            Mutex::Autolock _l(mLock);
4668000a4193dd82549192277fd4b9bb571d8a4c262fEric Laurent
46692cfbf88b89854f30b295e8ae26a031edb8d712f8Glenn Kasten            processConfigEvents_l();
467026a4029c95620a2b98187cf003cd3c58eea03747Glenn Kasten            // return value 'reconfig' is currently unused
467126a4029c95620a2b98187cf003cd3c58eea03747Glenn Kasten            bool reconfig = checkForNewParameters_l();
4672f10ffec18f930d92e1abe9200d60e746831841a7Glenn Kasten
4673000a4193dd82549192277fd4b9bb571d8a4c262fEric Laurent            // check exitPending here because checkForNewParameters_l() and
4674000a4193dd82549192277fd4b9bb571d8a4c262fEric Laurent            // checkForNewParameters_l() can temporarily release mLock
4675000a4193dd82549192277fd4b9bb571d8a4c262fEric Laurent            if (exitPending()) {
4676000a4193dd82549192277fd4b9bb571d8a4c262fEric Laurent                break;
4677000a4193dd82549192277fd4b9bb571d8a4c262fEric Laurent            }
4678000a4193dd82549192277fd4b9bb571d8a4c262fEric Laurent
46792b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten            // if no active track(s), then standby and release wakelock
46802b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten            size_t size = mActiveTracks.size();
46812b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten            if (size == 0) {
468293e471f620454f7de73d190521568b1e25879767Glenn Kasten                standbyIfNotAlreadyInStandby();
46834ef0b463a56c19bad9197aa9f90d792090461429Glenn Kasten                // exitPending() can't become true here
468481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                releaseWakeLock_l();
468581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                ALOGV("RecordThread: loop stopping");
468681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // go to sleep
468781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                mWaitWorkCV.wait(mLock);
468881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                ALOGV("RecordThread: loop starting");
4689f10ffec18f930d92e1abe9200d60e746831841a7Glenn Kasten                goto reacquire_wakelock;
4690f10ffec18f930d92e1abe9200d60e746831841a7Glenn Kasten            }
4691f10ffec18f930d92e1abe9200d60e746831841a7Glenn Kasten
46922b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten            if (mActiveTracksGen != activeTracksGen) {
46932b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten                activeTracksGen = mActiveTracksGen;
4694f10ffec18f930d92e1abe9200d60e746831841a7Glenn Kasten                SortedVector<int> tmp;
46952b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten                for (size_t i = 0; i < size; i++) {
46962b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten                    tmp.add(mActiveTracks[i]->uid());
46972b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten                }
4698f10ffec18f930d92e1abe9200d60e746831841a7Glenn Kasten                updateWakeLockUids_l(tmp);
469981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
47009e98235a9e9bb870e1c76911e3b4d00386a52c39Glenn Kasten
47016dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            bool doBroadcast = false;
47026dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            for (size_t i = 0; i < size; ) {
47039e98235a9e9bb870e1c76911e3b4d00386a52c39Glenn Kasten
47046dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                activeTrack = mActiveTracks[i];
47056dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                if (activeTrack->isTerminated()) {
47066dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    removeTrack_l(activeTrack);
47072b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten                    mActiveTracks.remove(activeTrack);
47082b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten                    mActiveTracksGen++;
47096dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    size--;
47109e98235a9e9bb870e1c76911e3b4d00386a52c39Glenn Kasten                    continue;
47119e98235a9e9bb870e1c76911e3b4d00386a52c39Glenn Kasten                }
47126dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
47136dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                TrackBase::track_state activeTrackState = activeTrack->mState;
47146dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                switch (activeTrackState) {
47156dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
47166dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                case TrackBase::PAUSING:
47176dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    mActiveTracks.remove(activeTrack);
47186dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    mActiveTracksGen++;
47196dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    doBroadcast = true;
47206dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    size--;
47216dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    continue;
47226dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
47236dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                case TrackBase::STARTING_1:
47246dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    sleepUs = 10000;
47256dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    i++;
47266dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    continue;
47276dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
47286dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                case TrackBase::STARTING_2:
47296dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    doBroadcast = true;
47306dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    mStandby = false;
47319e98235a9e9bb870e1c76911e3b4d00386a52c39Glenn Kasten                    activeTrack->mState = TrackBase::ACTIVE;
47326dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    break;
47336dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
47346dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                case TrackBase::ACTIVE:
47356dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    break;
47366dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
47376dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                case TrackBase::IDLE:
47386dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    i++;
47396dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    continue;
47406dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
47416dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                default:
47426dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    LOG_FATAL("Unexpected activeTrackState %d", activeTrackState);
47439e98235a9e9bb870e1c76911e3b4d00386a52c39Glenn Kasten                }
47442d94426cd3302cb1215c92c5f1c4b90c24ceb72bGlenn Kasten
47456dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                activeTracks.add(activeTrack);
47466dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                i++;
47472d94426cd3302cb1215c92c5f1c4b90c24ceb72bGlenn Kasten
47486dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            }
47496dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            if (doBroadcast) {
47506dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                mStartStopCond.broadcast();
47516dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            }
4752d9fc34fb0fcfcc739f868b116edf50c62af19d5eGlenn Kasten
47536dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            // sleep if there are no active tracks to process
47546dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            if (activeTracks.size() == 0) {
47556dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                if (sleepUs == 0) {
47566dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    sleepUs = kRecordThreadSleepUs;
47576dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                }
47586dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                continue;
475981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
47606dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            sleepUs = 0;
47619e98235a9e9bb870e1c76911e3b4d00386a52c39Glenn Kasten
476281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            lockEffectChains_l(effectChains);
476381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
476481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
47656dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        // thread mutex is now unlocked, mActiveTracks unknown, activeTracks.size() > 0
47667165268ffa6c7b6b405b6afad82e2a346500e8eeGlenn Kasten
47676dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        size_t size = effectChains.size();
47686dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        for (size_t i = 0; i < size; i++) {
47691ba19cd7fcdf18ab6efab2a1b831affab9a46157Glenn Kasten            // thread mutex is not locked, but effect chain is locked
47701ba19cd7fcdf18ab6efab2a1b831affab9a46157Glenn Kasten            effectChains[i]->process_l();
47711ba19cd7fcdf18ab6efab2a1b831affab9a46157Glenn Kasten        }
477281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
47736dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        // Read from HAL to keep up with fastest client if multiple active tracks, not slowest one.
47746dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        // Only the client(s) that are too slow will overrun. But if even the fastest client is too
47756dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        // slow, then this RecordThread will overrun by not calling HAL read often enough.
47766dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        // If destination is non-contiguous, first read past the nominal end of buffer, then
47776dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        // copy to the right place.  Permitted because mRsmpInBuffer was over-allocated.
47786dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
47796dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        int32_t rear = mRsmpInRear & (mRsmpInFramesP2 - 1);
47806dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        ssize_t bytesRead = mInput->stream->read(mInput->stream,
47816dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                &mRsmpInBuffer[rear * mChannelCount], mBufferSize);
47826dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        if (bytesRead <= 0) {
47836dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            ALOGE("read failed: bytesRead=%d < %u", bytesRead, mBufferSize);
47846dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            // Force input into standby so that it tries to recover at next read attempt
47856dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            inputStandBy();
47866dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            sleepUs = kRecordThreadSleepUs;
47876dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            continue;
47886dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        }
47896dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        ALOG_ASSERT((size_t) bytesRead <= mBufferSize);
47906dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        size_t framesRead = bytesRead / mFrameSize;
47916dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        ALOG_ASSERT(framesRead > 0);
47926dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        if (mTeeSink != 0) {
47936dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            (void) mTeeSink->write(&mRsmpInBuffer[rear * mChannelCount], framesRead);
47946dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        }
47956dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        // If destination is non-contiguous, we now correct for reading past end of buffer.
47966dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        size_t part1 = mRsmpInFramesP2 - rear;
47976dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        if (framesRead > part1) {
47986dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            memcpy(mRsmpInBuffer, &mRsmpInBuffer[mRsmpInFramesP2 * mChannelCount],
47996dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    (framesRead - part1) * mFrameSize);
48006dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        }
48016dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        rear = mRsmpInRear += framesRead;
48026dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
48036dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        size = activeTracks.size();
48046dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        // loop over each active track
48056dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        for (size_t i = 0; i < size; i++) {
48066dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            activeTrack = activeTracks[i];
48076dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
48086dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            enum {
48096dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                OVERRUN_UNKNOWN,
48106dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                OVERRUN_TRUE,
48116dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                OVERRUN_FALSE
48126dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            } overrun = OVERRUN_UNKNOWN;
48136dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
48146dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            // loop over getNextBuffer to handle circular sink
48156dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            for (;;) {
48166dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
48176dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                activeTrack->mSink.frameCount = ~0;
48186dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                status_t status = activeTrack->getNextBuffer(&activeTrack->mSink);
48196dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                size_t framesOut = activeTrack->mSink.frameCount;
48206dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                LOG_ALWAYS_FATAL_IF((status == OK) != (framesOut > 0));
48216dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
48226dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                int32_t front = activeTrack->mRsmpInFront;
48236dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                ssize_t filled = rear - front;
48246dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                size_t framesIn;
48256dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
48266dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                if (filled < 0) {
48276dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    // should not happen, but treat like a massive overrun and re-sync
48286dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    framesIn = 0;
48296dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    activeTrack->mRsmpInFront = rear;
48306dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    overrun = OVERRUN_TRUE;
4831607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                } else if ((size_t) filled <= mRsmpInFrames) {
48326dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    framesIn = (size_t) filled;
48336dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                } else {
48346dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    // client is not keeping up with server, but give it latest data
4835607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                    framesIn = mRsmpInFrames;
4836607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                    activeTrack->mRsmpInFront = front = rear - framesIn;
48376dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    overrun = OVERRUN_TRUE;
48386dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                }
48396dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
48404cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten                if (framesOut == 0 || framesIn == 0) {
48414cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten                    break;
48424cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten                }
48434cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten
48446dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                if (activeTrack->mResampler == NULL) {
48456dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    // no resampling
48466dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    if (framesIn > framesOut) {
48476dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        framesIn = framesOut;
48486dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    } else {
48496dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        framesOut = framesIn;
48506dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    }
48516dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    int8_t *dst = activeTrack->mSink.i8;
48526dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    while (framesIn > 0) {
48536dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        front &= mRsmpInFramesP2 - 1;
48546dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        size_t part1 = mRsmpInFramesP2 - front;
48556dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        if (part1 > framesIn) {
48566dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                            part1 = framesIn;
485781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        }
48586dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        int8_t *src = (int8_t *)mRsmpInBuffer + (front * mFrameSize);
48594cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten                        if (mChannelCount == activeTrack->mChannelCount) {
48606dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                            memcpy(dst, src, part1 * mFrameSize);
48616dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        } else if (mChannelCount == 1) {
48626dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                            upmix_to_stereo_i16_from_mono_i16((int16_t *)dst, (int16_t *)src,
48636dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                                    part1);
48641ba19cd7fcdf18ab6efab2a1b831affab9a46157Glenn Kasten                        } else {
48656dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                            downmix_to_mono_i16_from_stereo_i16((int16_t *)dst, (int16_t *)src,
48666dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                                    part1);
48671ba19cd7fcdf18ab6efab2a1b831affab9a46157Glenn Kasten                        }
48686dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        dst += part1 * activeTrack->mFrameSize;
48696dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        front += part1;
48706dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        framesIn -= part1;
48711ba19cd7fcdf18ab6efab2a1b831affab9a46157Glenn Kasten                    }
48726dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    activeTrack->mRsmpInFront += framesOut;
48736dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
48746dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                } else {
48756dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    // resampling
48766dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    // FIXME framesInNeeded should really be part of resampler API, and should
48776dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    //       depend on the SRC ratio
48786dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    //       to keep mRsmpInBuffer full so resampler always has sufficient input
48796dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    size_t framesInNeeded;
48806dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    // FIXME only re-calculate when it changes, and optimize for common ratios
48816dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    double inOverOut = (double) mSampleRate / activeTrack->mSampleRate;
48826dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    double outOverIn = (double) activeTrack->mSampleRate / mSampleRate;
48834cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten                    framesInNeeded = ceil(framesOut * inOverOut) + 1;
4884607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                    ALOGV("need %u frames in to produce %u out given in/out ratio of %.4g",
4885607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                                framesInNeeded, framesOut, inOverOut);
4886607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                    // Although we theoretically have framesIn in circular buffer, some of those are
4887607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                    // unreleased frames, and thus must be discounted for purpose of budgeting.
4888607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                    size_t unreleased = activeTrack->mRsmpInUnrel;
4889607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                    framesIn = framesIn > unreleased ? framesIn - unreleased : 0;
48906dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    if (framesIn < framesInNeeded) {
4891607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                        ALOGV("not enough to resample: have %u frames in but need %u in to "
4892607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                                "produce %u out given in/out ratio of %.4g",
48934cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten                                framesIn, framesInNeeded, framesOut, inOverOut);
48944cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten                        size_t newFramesOut = framesIn > 0 ? floor((framesIn - 1) * outOverIn) : 0;
4895607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                        LOG_ALWAYS_FATAL_IF(newFramesOut >= framesOut);
4896607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                        if (newFramesOut == 0) {
4897607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                            break;
48984cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten                        }
4899607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                        framesInNeeded = ceil(newFramesOut * inOverOut) + 1;
4900607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                        ALOGV("now need %u frames in to produce %u out given out/in ratio of %.4g",
4901607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                                framesInNeeded, newFramesOut, outOverIn);
4902607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                        LOG_ALWAYS_FATAL_IF(framesIn < framesInNeeded);
4903607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                        ALOGV("success 2: have %u frames in and need %u in to produce %u out "
4904607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                              "given in/out ratio of %.4g",
4905607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                              framesIn, framesInNeeded, newFramesOut, inOverOut);
4906607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                        framesOut = newFramesOut;
49074cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten                    } else {
4908607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                        ALOGV("success 1: have %u in and need %u in to produce %u out "
49094cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten                            "given in/out ratio of %.4g",
49104cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten                            framesIn, framesInNeeded, framesOut, inOverOut);
49118594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten                    }
49126dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
49136dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    // reallocate mRsmpOutBuffer as needed; we will grow but never shrink
49146dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    if (activeTrack->mRsmpOutFrameCount < framesOut) {
4915607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                        // FIXME why does each track need it's own mRsmpOutBuffer? can't they share?
49166dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        delete[] activeTrack->mRsmpOutBuffer;
49176dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        // resampler always outputs stereo
49186dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        activeTrack->mRsmpOutBuffer = new int32_t[framesOut * FCC_2];
49196dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        activeTrack->mRsmpOutFrameCount = framesOut;
49208594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten                    }
49216dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
49226dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    // resampler accumulates, but we only have one source track
49236dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    memset(activeTrack->mRsmpOutBuffer, 0, framesOut * FCC_2 * sizeof(int32_t));
49246dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    activeTrack->mResampler->resample(activeTrack->mRsmpOutBuffer, framesOut,
4925607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten                            // FIXME how about having activeTrack implement this interface itself?
49266dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                            activeTrack->mResamplerBufferProvider
49276dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                            /*this*/ /* AudioBufferProvider* */);
49286dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    // ditherAndClamp() works as long as all buffers returned by
49296dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    // activeTrack->getNextBuffer() are 32 bit aligned which should be always true.
49304cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten                    if (activeTrack->mChannelCount == 1) {
49316dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        // temporarily type pun mRsmpOutBuffer from Q19.12 to int16_t
49326dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        ditherAndClamp(activeTrack->mRsmpOutBuffer, activeTrack->mRsmpOutBuffer,
49336dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                                framesOut);
49346dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        // the resampler always outputs stereo samples:
49356dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        // do post stereo to mono conversion
49366dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        downmix_to_mono_i16_from_stereo_i16(activeTrack->mSink.i16,
49376dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                                (int16_t *)activeTrack->mRsmpOutBuffer, framesOut);
49386dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    } else {
49396dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        ditherAndClamp((int32_t *)activeTrack->mSink.raw,
49406dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                                activeTrack->mRsmpOutBuffer, framesOut);
49418594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten                    }
49426dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    // now done with mRsmpOutBuffer
49438594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten
49448594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten                }
49458594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten
49466dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                if (framesOut > 0 && (overrun == OVERRUN_UNKNOWN)) {
49476dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    overrun = OVERRUN_FALSE;
49481ba19cd7fcdf18ab6efab2a1b831affab9a46157Glenn Kasten                }
494981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
49506dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                if (activeTrack->mFramesToDrop == 0) {
49516dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    if (framesOut > 0) {
49526dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        activeTrack->mSink.frameCount = framesOut;
49536dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        activeTrack->releaseBuffer(&activeTrack->mSink);
495481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    }
495581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                } else {
49566dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    // FIXME could do a partial drop of framesOut
49576dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    if (activeTrack->mFramesToDrop > 0) {
49586dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        activeTrack->mFramesToDrop -= framesOut;
49596dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        if (activeTrack->mFramesToDrop <= 0) {
496025f4aa83efaa9179e65a20583a6d441de2c3ff3fGlenn Kasten                            activeTrack->clearSyncStartEvent();
49616dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        }
49626dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    } else {
49636dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        activeTrack->mFramesToDrop += framesOut;
49646dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        if (activeTrack->mFramesToDrop >= 0 || activeTrack->mSyncStartEvent == 0 ||
49656dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                                activeTrack->mSyncStartEvent->isCancelled()) {
49666dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                            ALOGW("Synced record %s, session %d, trigger session %d",
49676dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                                  (activeTrack->mFramesToDrop >= 0) ? "timed out" : "cancelled",
49686dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                                  activeTrack->sessionId(),
49696dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                                  (activeTrack->mSyncStartEvent != 0) ?
49706dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                                          activeTrack->mSyncStartEvent->triggerSession() : 0);
497125f4aa83efaa9179e65a20583a6d441de2c3ff3fGlenn Kasten                            activeTrack->clearSyncStartEvent();
49726dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        }
497381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    }
497481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
49756dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
49766dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                if (framesOut == 0) {
49776dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    break;
49786dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                }
497981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
49806dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
49816dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            switch (overrun) {
49826dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            case OVERRUN_TRUE:
49836dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                // client isn't retrieving buffers fast enough
49846dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                if (!activeTrack->setOverflow()) {
49856dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    nsecs_t now = systemTime();
49866dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    // FIXME should lastWarning per track?
49876dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    if ((now - lastWarning) > kWarningThrottleNs) {
49886dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        ALOGW("RecordThread: buffer overflow");
49896dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                        lastWarning = now;
49906dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                    }
499181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
49926dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                break;
49936dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            case OVERRUN_FALSE:
49946dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                activeTrack->clearOverflow();
49956dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                break;
49966dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            case OVERRUN_UNKNOWN:
49976dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                break;
499881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
49996dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
500081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
50011ba19cd7fcdf18ab6efab2a1b831affab9a46157Glenn Kasten
500281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // enable changes in effect chain
500381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        unlockEffectChains(effectChains);
5004c527a7c2b1bfd26e8f3086e1b653d56e521379d9Glenn Kasten        // effectChains doesn't need to be cleared, since it is cleared by destructor at scope end
500581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
500681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
500793e471f620454f7de73d190521568b1e25879767Glenn Kasten    standbyIfNotAlreadyInStandby();
500881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
500981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    {
501081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        Mutex::Autolock _l(mLock);
50119a54bc27876acd5d8be5b1fc3dc46701fe76fbb3Eric Laurent        for (size_t i = 0; i < mTracks.size(); i++) {
50129a54bc27876acd5d8be5b1fc3dc46701fe76fbb3Eric Laurent            sp<RecordTrack> track = mTracks[i];
50139a54bc27876acd5d8be5b1fc3dc46701fe76fbb3Eric Laurent            track->invalidate();
50149a54bc27876acd5d8be5b1fc3dc46701fe76fbb3Eric Laurent        }
50152b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten        mActiveTracks.clear();
50162b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten        mActiveTracksGen++;
501781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mStartStopCond.broadcast();
501881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
501981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
502081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    releaseWakeLock();
502181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
502281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOGV("RecordThread %p exiting", this);
502381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return false;
502481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
502581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
502693e471f620454f7de73d190521568b1e25879767Glenn Kastenvoid AudioFlinger::RecordThread::standbyIfNotAlreadyInStandby()
502781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
502881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (!mStandby) {
502981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        inputStandBy();
503081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mStandby = true;
503181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
503281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
503381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
503481784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::RecordThread::inputStandBy()
503581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
503681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mInput->stream->common.standby(&mInput->stream->common);
503781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
503881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
5039e198c360d5e75a9b2097844c495c10902e7e8500Glenn Kastensp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createRecordTrack_l(
504081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        const sp<AudioFlinger::Client>& client,
504181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        uint32_t sampleRate,
504281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        audio_format_t format,
504381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        audio_channel_mask_t channelMask,
504474935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten        size_t *pFrameCount,
504581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        int sessionId,
5046462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen        int uid,
5047ddb0ccf3fb6fe8da8c71a6deb30561b821f3c0a2Glenn Kasten        IAudioFlinger::track_flags_t *flags,
504881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        pid_t tid,
504981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        status_t *status)
505081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
505174935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten    size_t frameCount = *pFrameCount;
505281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    sp<RecordTrack> track;
505381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    status_t lStatus;
505481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
505581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    lStatus = initCheck();
505681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (lStatus != NO_ERROR) {
5057e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten        ALOGE("createRecordTrack_l() audio driver not initialized");
505881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        goto Exit;
505981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
50604944acb7355b3aa25748fd25945a363a69d65444Glenn Kasten
506190e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten    // client expresses a preference for FAST, but we get the final say
506290e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten    if (*flags & IAudioFlinger::TRACK_FAST) {
506390e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten      if (
506490e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten            // use case: callback handler and frame count is default or at least as large as HAL
506590e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten            (
506690e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten                (tid != -1) &&
506790e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten                ((frameCount == 0) ||
5068b5fed68bcdd6f44424c9e4d12bfe9a3ff51bd62eGlenn Kasten                (frameCount >= mFrameCount))
506990e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten            ) &&
507090e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten            // FIXME when record supports non-PCM data, also check for audio_is_linear_pcm(format)
507190e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten            // mono or stereo
507290e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten            ( (channelMask == AUDIO_CHANNEL_OUT_MONO) ||
507390e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten              (channelMask == AUDIO_CHANNEL_OUT_STEREO) ) &&
507490e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten            // hardware sample rate
507590e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten            (sampleRate == mSampleRate) &&
507690e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten            // record thread has an associated fast recorder
507790e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten            hasFastRecorder()
507890e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten            // FIXME test that RecordThread for this fast track has a capable output HAL
507990e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten            // FIXME add a permission test also?
508090e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten        ) {
508190e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten        // if frameCount not specified, then it defaults to fast recorder (HAL) frame count
508290e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten        if (frameCount == 0) {
508390e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten            frameCount = mFrameCount * kFastTrackMultiplier;
508490e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten        }
508590e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten        ALOGV("AUDIO_INPUT_FLAG_FAST accepted: frameCount=%d mFrameCount=%d",
508690e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten                frameCount, mFrameCount);
508790e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten      } else {
508890e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten        ALOGV("AUDIO_INPUT_FLAG_FAST denied: frameCount=%d "
508990e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten                "mFrameCount=%d format=%d isLinear=%d channelMask=%#x sampleRate=%u mSampleRate=%u "
509090e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten                "hasFastRecorder=%d tid=%d",
509190e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten                frameCount, mFrameCount, format,
509290e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten                audio_is_linear_pcm(format),
509390e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten                channelMask, sampleRate, mSampleRate, hasFastRecorder(), tid);
509490e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten        *flags &= ~IAudioFlinger::TRACK_FAST;
509590e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten        // For compatibility with AudioRecord calculation, buffer depth is forced
509690e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten        // to be at least 2 x the record thread frame count and cover audio hardware latency.
509790e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten        // This is probably too conservative, but legacy application code may depend on it.
509890e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten        // If you change this calculation, also review the start threshold which is related.
509990e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten        uint32_t latencyMs = 50; // FIXME mInput->stream->get_latency(mInput->stream);
510090e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten        size_t mNormalFrameCount = 2048; // FIXME
510190e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten        uint32_t minBufCount = latencyMs / ((1000 * mNormalFrameCount) / mSampleRate);
510290e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten        if (minBufCount < 2) {
510390e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten            minBufCount = 2;
510490e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten        }
510590e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten        size_t minFrameCount = mNormalFrameCount * minBufCount;
510690e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten        if (frameCount < minFrameCount) {
510790e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten            frameCount = minFrameCount;
510890e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten        }
510990e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten      }
511090e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten    }
511174935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten    *pFrameCount = frameCount;
511290e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten
511381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // FIXME use flags and tid similar to createTrack_l()
511481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
511581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    { // scope for mLock
511681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        Mutex::Autolock _l(mLock);
511781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
511881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        track = new RecordTrack(this, client, sampleRate,
5119462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen                      format, channelMask, frameCount, sessionId, uid);
512081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
5121030033342a6ea17003e6af38a56c7edc6d2ead01Glenn Kasten        lStatus = track->initCheck();
5122030033342a6ea17003e6af38a56c7edc6d2ead01Glenn Kasten        if (lStatus != NO_ERROR) {
512335295078ab59c8c5d143a54d5a55557c3ca62c51Glenn Kasten            ALOGE("createRecordTrack_l() initCheck failed %d; no control block?", lStatus);
512403e9e83c47ab4a518da0a1f36b8f702f59221c95Haynes Mathew George            // track must be cleared from the caller as the caller has the AF lock
512581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            goto Exit;
512681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
512781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mTracks.add(track);
512881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
512981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // disable AEC and NS if the device is a BT SCO headset supporting those pre processings
513081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        bool suspend = audio_is_bluetooth_sco_device(mInDevice) &&
513181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        mAudioFlinger->btNrecIsOff();
513281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        setEffectSuspended_l(FX_IID_AEC, suspend, sessionId);
513381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        setEffectSuspended_l(FX_IID_NS, suspend, sessionId);
513490e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten
513590e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten        if ((*flags & IAudioFlinger::TRACK_FAST) && (tid != -1)) {
513690e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten            pid_t callingPid = IPCThreadState::self()->getCallingPid();
513790e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten            // we don't have CAP_SYS_NICE, nor do we want to have it as it's too powerful,
513890e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten            // so ask activity manager to do this on our behalf
513990e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten            sendPrioConfigEvent_l(callingPid, tid, kPriorityAudioApp);
514090e58b1fefc8caf70b34301a92bc86179580b6fcGlenn Kasten        }
514181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
514281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    lStatus = NO_ERROR;
514381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
514481784c37c61b09289654b979567a42bf73cd2b12Eric LaurentExit:
51459156ef3e11b68cc4b6d3cea77f1f63673855a6d1Glenn Kasten    *status = lStatus;
514681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return track;
514781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
514881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
514981784c37c61b09289654b979567a42bf73cd2b12Eric Laurentstatus_t AudioFlinger::RecordThread::start(RecordThread::RecordTrack* recordTrack,
515081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                           AudioSystem::sync_event_t event,
515181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                           int triggerSession)
515281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
515381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOGV("RecordThread::start event %d, triggerSession %d", event, triggerSession);
515481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    sp<ThreadBase> strongMe = this;
515581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    status_t status = NO_ERROR;
515681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
515781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (event == AudioSystem::SYNC_EVENT_NONE) {
515825f4aa83efaa9179e65a20583a6d441de2c3ff3fGlenn Kasten        recordTrack->clearSyncStartEvent();
515981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    } else if (event != AudioSystem::SYNC_EVENT_SAME) {
51606dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        recordTrack->mSyncStartEvent = mAudioFlinger->createSyncEvent(event,
516181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                       triggerSession,
516281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                       recordTrack->sessionId(),
516381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                       syncStartEventCallback,
51646dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                                       recordTrack);
516581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // Sync event can be cancelled by the trigger session if the track is not in a
516681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // compatible state in which case we start record immediately
51676dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        if (recordTrack->mSyncStartEvent->isCancelled()) {
516825f4aa83efaa9179e65a20583a6d441de2c3ff3fGlenn Kasten            recordTrack->clearSyncStartEvent();
516981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        } else {
517081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // do not wait for the event for more than AudioSystem::kSyncRecordStartTimeOutMs
51716dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            recordTrack->mFramesToDrop = -
51724cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten                    ((AudioSystem::kSyncRecordStartTimeOutMs * recordTrack->mSampleRate) / 1000);
517381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
517481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
517581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
517681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    {
517747c2070b2ce8aedb7300c0aad91caccf3c383841Glenn Kasten        // This section is a rendezvous between binder thread executing start() and RecordThread
517881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        AutoMutex lock(mLock);
51796dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        if (mActiveTracks.indexOf(recordTrack) >= 0) {
51806dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            if (recordTrack->mState == TrackBase::PAUSING) {
51816dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                ALOGV("active record track PAUSING -> ACTIVE");
5182f10ffec18f930d92e1abe9200d60e746831841a7Glenn Kasten                recordTrack->mState = TrackBase::ACTIVE;
51836dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            } else {
51846dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                ALOGV("active record track state %d", recordTrack->mState);
518581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
518681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            return status;
518781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
518881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
51894cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten        // TODO consider other ways of handling this, such as changing the state to :STARTING and
51904cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten        //      adding the track to mActiveTracks after returning from AudioSystem::startInput(),
51914cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten        //      or using a separate command thread
51926dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        recordTrack->mState = TrackBase::STARTING_1;
51932b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten        mActiveTracks.add(recordTrack);
51942b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten        mActiveTracksGen++;
519581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mLock.unlock();
519681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        status_t status = AudioSystem::startInput(mId);
519781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mLock.lock();
51986dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        // FIXME should verify that recordTrack is still in mActiveTracks
519981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (status != NO_ERROR) {
52002b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten            mActiveTracks.remove(recordTrack);
52012b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten            mActiveTracksGen++;
520225f4aa83efaa9179e65a20583a6d441de2c3ff3fGlenn Kasten            recordTrack->clearSyncStartEvent();
520381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            return status;
520481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
52056dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        // Catch up with current buffer indices if thread is already running.
52066dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        // This is what makes a new client discard all buffered data.  If the track's mRsmpInFront
52076dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        // was initialized to some value closer to the thread's mRsmpInFront, then the track could
52086dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        // see previously buffered data before it called start(), but with greater risk of overrun.
52096dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
52106dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        recordTrack->mRsmpInFront = mRsmpInRear;
52116dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        recordTrack->mRsmpInUnrel = 0;
52126dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        // FIXME why reset?
52136dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        if (recordTrack->mResampler != NULL) {
52146dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            recordTrack->mResampler->reset();
52156dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        }
52166dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        recordTrack->mState = TrackBase::STARTING_2;
521781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // signal thread to start
521881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mWaitWorkCV.broadcast();
52192b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten        if (mActiveTracks.indexOf(recordTrack) < 0) {
522081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            ALOGV("Record failed to start");
522181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            status = BAD_VALUE;
522281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            goto startError;
522381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
522481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return status;
522581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
52267c027248e1a4ccd5b22bc4deafb03e2d87ac8f38Glenn Kasten
522781784c37c61b09289654b979567a42bf73cd2b12Eric LaurentstartError:
522881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    AudioSystem::stopInput(mId);
522925f4aa83efaa9179e65a20583a6d441de2c3ff3fGlenn Kasten    recordTrack->clearSyncStartEvent();
52306dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    // FIXME I wonder why we do not reset the state here?
523181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return status;
523281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
523381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
523481784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::RecordThread::syncStartEventCallback(const wp<SyncEvent>& event)
523581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
523681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    sp<SyncEvent> strongEvent = event.promote();
523781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
523881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (strongEvent != 0) {
52398ea16e4b0a7d398d26887c18675b3899de5d779dEric Laurent        sp<RefBase> ptr = strongEvent->cookie().promote();
52408ea16e4b0a7d398d26887c18675b3899de5d779dEric Laurent        if (ptr != 0) {
52418ea16e4b0a7d398d26887c18675b3899de5d779dEric Laurent            RecordTrack *recordTrack = (RecordTrack *)ptr.get();
52428ea16e4b0a7d398d26887c18675b3899de5d779dEric Laurent            recordTrack->handleSyncStartEvent(strongEvent);
52438ea16e4b0a7d398d26887c18675b3899de5d779dEric Laurent        }
524481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
524581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
524681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
5247a8356f663014e7d4c27869629af83d8bb3441e19Glenn Kastenbool AudioFlinger::RecordThread::stop(RecordThread::RecordTrack* recordTrack) {
524881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOGV("RecordThread::stop");
5249a8356f663014e7d4c27869629af83d8bb3441e19Glenn Kasten    AutoMutex _l(mLock);
52502b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten    if (mActiveTracks.indexOf(recordTrack) != 0 || recordTrack->mState == TrackBase::PAUSING) {
525181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return false;
525281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
525347c2070b2ce8aedb7300c0aad91caccf3c383841Glenn Kasten    // note that threadLoop may still be processing the track at this point [without lock]
525481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    recordTrack->mState = TrackBase::PAUSING;
525581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // do not wait for mStartStopCond if exiting
525681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (exitPending()) {
525781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return true;
525881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
525947c2070b2ce8aedb7300c0aad91caccf3c383841Glenn Kasten    // FIXME incorrect usage of wait: no explicit predicate or loop
526081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mStartStopCond.wait(mLock);
52612b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten    // if we have been restarted, recordTrack is in mActiveTracks here
52622b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten    if (exitPending() || mActiveTracks.indexOf(recordTrack) != 0) {
526381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        ALOGV("Record stopped OK");
526481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return true;
526581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
526681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return false;
526781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
526881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
52690f11b51a57bc9062c4fe8af73747319cedabc5d6Glenn Kastenbool AudioFlinger::RecordThread::isValidSyncEvent(const sp<SyncEvent>& event __unused) const
527081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
527181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return false;
527281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
527381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
52740f11b51a57bc9062c4fe8af73747319cedabc5d6Glenn Kastenstatus_t AudioFlinger::RecordThread::setSyncEvent(const sp<SyncEvent>& event __unused)
527581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
527681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#if 0   // This branch is currently dead code, but is preserved in case it will be needed in future
527781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (!isValidSyncEvent(event)) {
527881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return BAD_VALUE;
527981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
528081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
528181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    int eventSession = event->triggerSession();
528281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    status_t ret = NAME_NOT_FOUND;
528381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
528481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
528581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
528681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (size_t i = 0; i < mTracks.size(); i++) {
528781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sp<RecordTrack> track = mTracks[i];
528881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (eventSession == track->sessionId()) {
528981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            (void) track->setSyncEvent(event);
529081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            ret = NO_ERROR;
529181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
529281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
529381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return ret;
529481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#else
529581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return BAD_VALUE;
529681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#endif
529781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
529881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
529981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// destroyTrack_l() must be called with ThreadBase::mLock held
530081784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::RecordThread::destroyTrack_l(const sp<RecordTrack>& track)
530181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
5302bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    track->terminate();
5303bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    track->mState = TrackBase::STOPPED;
530481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // active tracks are removed by threadLoop()
53052b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten    if (mActiveTracks.indexOf(track) < 0) {
530681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        removeTrack_l(track);
530781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
530881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
530981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
531081784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::RecordThread::removeTrack_l(const sp<RecordTrack>& track)
531181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
531281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mTracks.remove(track);
531381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // need anything related to effects here?
531481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
531581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
531681784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::RecordThread::dump(int fd, const Vector<String16>& args)
531781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
531881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    dumpInternals(fd, args);
531981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    dumpTracks(fd, args);
532081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    dumpEffectChains(fd, args);
532181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
532281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
532381784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid AudioFlinger::RecordThread::dumpInternals(int fd, const Vector<String16>& args)
532481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
5325b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    fdprintf(fd, "\nInput thread %p:\n", this);
532681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
53272b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten    if (mActiveTracks.size() > 0) {
53281d6fa7af1288b550faabe4ec2cf98684236723dbNarayan Kamath        fdprintf(fd, "  Buffer size: %zu bytes\n", mBufferSize);
532981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    } else {
53306dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        fdprintf(fd, "  No active record clients\n");
533181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
533281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
533381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    dumpBase(fd, args);
533481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
533581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
53360f11b51a57bc9062c4fe8af73747319cedabc5d6Glenn Kastenvoid AudioFlinger::RecordThread::dumpTracks(int fd, const Vector<String16>& args __unused)
533781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
533881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    const size_t SIZE = 256;
533981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    char buffer[SIZE];
534081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    String8 result;
534181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
5342b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    size_t numtracks = mTracks.size();
5343b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    size_t numactive = mActiveTracks.size();
5344b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    size_t numactiveseen = 0;
5345b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    fdprintf(fd, "  %d Tracks", numtracks);
5346b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    if (numtracks) {
5347b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        fdprintf(fd, " of which %d are active\n", numactive);
5348b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        RecordTrack::appendDumpHeader(result);
5349b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        for (size_t i = 0; i < numtracks ; ++i) {
5350b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen            sp<RecordTrack> track = mTracks[i];
5351b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen            if (track != 0) {
5352b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen                bool active = mActiveTracks.indexOf(track) >= 0;
5353b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen                if (active) {
5354b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen                    numactiveseen++;
5355b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen                }
5356b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen                track->dump(buffer, SIZE, active);
5357b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen                result.append(buffer);
5358b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen            }
535981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
5360b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    } else {
5361b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        fdprintf(fd, "\n");
536281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
536381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
5364b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen    if (numactiveseen != numactive) {
5365b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        snprintf(buffer, SIZE, "  The following tracks are in the active list but"
5366b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen                " not in the track list\n");
536781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        result.append(buffer);
536881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        RecordTrack::appendDumpHeader(result);
5369b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen        for (size_t i = 0; i < numactive; ++i) {
53702b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten            sp<RecordTrack> track = mActiveTracks[i];
5371b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen            if (mTracks.indexOf(track) < 0) {
5372b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen                track->dump(buffer, SIZE, true);
5373b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen                result.append(buffer);
5374b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen            }
53752b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten        }
537681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
537781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
537881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    write(fd, result.string(), result.size());
537981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
538081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
538181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// AudioBufferProvider interface
53826dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kastenstatus_t AudioFlinger::RecordThread::ResamplerBufferProvider::getNextBuffer(
53836dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        AudioBufferProvider::Buffer* buffer, int64_t pts __unused)
538481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
53856dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    RecordTrack *activeTrack = mRecordTrack;
53866dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    sp<ThreadBase> threadBase = activeTrack->mThread.promote();
53876dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    if (threadBase == 0) {
53886dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        buffer->frameCount = 0;
5389607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten        buffer->raw = NULL;
53906dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        return NOT_ENOUGH_DATA;
53916dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    }
53926dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    RecordThread *recordThread = (RecordThread *) threadBase.get();
53936dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    int32_t rear = recordThread->mRsmpInRear;
53946dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    int32_t front = activeTrack->mRsmpInFront;
53958594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten    ssize_t filled = rear - front;
53966dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    // FIXME should not be P2 (don't want to increase latency)
53976dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    // FIXME if client not keeping up, discard
5398607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten    LOG_ALWAYS_FATAL_IF(!(0 <= filled && (size_t) filled <= recordThread->mRsmpInFrames));
53998594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten    // 'filled' may be non-contiguous, so return only the first contiguous chunk
54006dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    front &= recordThread->mRsmpInFramesP2 - 1;
54016dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    size_t part1 = recordThread->mRsmpInFramesP2 - front;
54028594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten    if (part1 > (size_t) filled) {
54038594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten        part1 = filled;
54048594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten    }
54058594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten    size_t ask = buffer->frameCount;
54068594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten    ALOG_ASSERT(ask > 0);
54078594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten    if (part1 > ask) {
54088594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten        part1 = ask;
54098594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten    }
54108594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten    if (part1 == 0) {
54118594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten        // Higher-level should keep mRsmpInBuffer full, and not call resampler if empty
5412607fa3e928de696eba49f198af72d68e4591ca1bGlenn Kasten        LOG_ALWAYS_FATAL("RecordThread::getNextBuffer() starved");
54138594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten        buffer->raw = NULL;
54148594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten        buffer->frameCount = 0;
54156dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        activeTrack->mRsmpInUnrel = 0;
54168594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten        return NOT_ENOUGH_DATA;
54178594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten    }
54188594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten
54196dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    buffer->raw = recordThread->mRsmpInBuffer + front * recordThread->mChannelCount;
54208594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten    buffer->frameCount = part1;
54216dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    activeTrack->mRsmpInUnrel = part1;
542281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return NO_ERROR;
542381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
542481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
542581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// AudioBufferProvider interface
54266dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kastenvoid AudioFlinger::RecordThread::ResamplerBufferProvider::releaseBuffer(
54276dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten        AudioBufferProvider::Buffer* buffer)
542881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
54296dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    RecordTrack *activeTrack = mRecordTrack;
54308594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten    size_t stepCount = buffer->frameCount;
54318594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten    if (stepCount == 0) {
54328594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten        return;
54338594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten    }
54346dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    ALOG_ASSERT(stepCount <= activeTrack->mRsmpInUnrel);
54356dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    activeTrack->mRsmpInUnrel -= stepCount;
54366dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    activeTrack->mRsmpInFront += stepCount;
54378594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten    buffer->raw = NULL;
543881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    buffer->frameCount = 0;
543981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
544081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
544181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentbool AudioFlinger::RecordThread::checkForNewParameters_l()
544281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
544381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    bool reconfig = false;
544481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
544581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    while (!mNewParameters.isEmpty()) {
544681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        status_t status = NO_ERROR;
544781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        String8 keyValuePair = mNewParameters[0];
544881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        AudioParameter param = AudioParameter(keyValuePair);
544981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        int value;
545081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        audio_format_t reqFormat = mFormat;
54514cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten        uint32_t samplingRate = mSampleRate;
54524cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten        audio_channel_mask_t channelMask = audio_channel_in_mask_from_count(mChannelCount);
545381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
54544cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten        // TODO Investigate when this code runs. Check with audio policy when a sample rate and
54554cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten        //      channel count change can be requested. Do we mandate the first client defines the
54564cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten        //      HAL sampling rate and channel count or do we allow changes on the fly?
545781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (param.getInt(String8(AudioParameter::keySamplingRate), value) == NO_ERROR) {
54584cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten            samplingRate = value;
545981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            reconfig = true;
546081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
546181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (param.getInt(String8(AudioParameter::keyFormat), value) == NO_ERROR) {
5462291bb6d8947c5b0c062f0895d623c529259bfa39Glenn Kasten            if ((audio_format_t) value != AUDIO_FORMAT_PCM_16_BIT) {
5463291bb6d8947c5b0c062f0895d623c529259bfa39Glenn Kasten                status = BAD_VALUE;
5464291bb6d8947c5b0c062f0895d623c529259bfa39Glenn Kasten            } else {
5465291bb6d8947c5b0c062f0895d623c529259bfa39Glenn Kasten                reqFormat = (audio_format_t) value;
5466291bb6d8947c5b0c062f0895d623c529259bfa39Glenn Kasten                reconfig = true;
5467291bb6d8947c5b0c062f0895d623c529259bfa39Glenn Kasten            }
546881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
546981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (param.getInt(String8(AudioParameter::keyChannels), value) == NO_ERROR) {
5470ec3fb50c8ee25ac263a9c2cbe9242f877bef960cGlenn Kasten            audio_channel_mask_t mask = (audio_channel_mask_t) value;
5471ec3fb50c8ee25ac263a9c2cbe9242f877bef960cGlenn Kasten            if (mask != AUDIO_CHANNEL_IN_MONO && mask != AUDIO_CHANNEL_IN_STEREO) {
5472ec3fb50c8ee25ac263a9c2cbe9242f877bef960cGlenn Kasten                status = BAD_VALUE;
5473ec3fb50c8ee25ac263a9c2cbe9242f877bef960cGlenn Kasten            } else {
54744cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten                channelMask = mask;
5475ec3fb50c8ee25ac263a9c2cbe9242f877bef960cGlenn Kasten                reconfig = true;
5476ec3fb50c8ee25ac263a9c2cbe9242f877bef960cGlenn Kasten            }
547781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
547881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (param.getInt(String8(AudioParameter::keyFrameCount), value) == NO_ERROR) {
547981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // do not accept frame count changes if tracks are open as the track buffer
548081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // size depends on frame count and correct behavior would not be guaranteed
548181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // if frame count is changed after track creation
54822b806406ac1ec680b6fe3aaa84c54bdc4e43ad8dGlenn Kasten            if (mActiveTracks.size() > 0) {
548381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                status = INVALID_OPERATION;
548481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            } else {
548581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                reconfig = true;
548681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
548781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
548881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (param.getInt(String8(AudioParameter::keyRouting), value) == NO_ERROR) {
548981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // forward device change to effects that have requested to be
549081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // aware of attached audio device.
549181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            for (size_t i = 0; i < mEffectChains.size(); i++) {
549281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                mEffectChains[i]->setDevice_l(value);
549381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
549481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
549581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // store input device and output device but do not forward output device to audio HAL.
549681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // Note that status is ignored by the caller for output device
549781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // (see AudioFlinger::setParameters()
549881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (audio_is_output_devices(value)) {
549981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                mOutDevice = value;
550081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                status = BAD_VALUE;
550181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            } else {
550281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                mInDevice = value;
550381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // disable AEC and NS if the device is a BT SCO headset supporting those
550481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                // pre processings
550581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (mTracks.size() > 0) {
550681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    bool suspend = audio_is_bluetooth_sco_device(mInDevice) &&
550781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                        mAudioFlinger->btNrecIsOff();
550881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    for (size_t i = 0; i < mTracks.size(); i++) {
550981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        sp<RecordTrack> track = mTracks[i];
551081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        setEffectSuspended_l(FX_IID_AEC, suspend, track->sessionId());
551181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        setEffectSuspended_l(FX_IID_NS, suspend, track->sessionId());
551281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    }
551381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
551481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
551581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
551681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (param.getInt(String8(AudioParameter::keyInputSource), value) == NO_ERROR &&
551781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                mAudioSource != (audio_source_t)value) {
551881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // forward device change to effects that have requested to be
551981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // aware of attached audio device.
552081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            for (size_t i = 0; i < mEffectChains.size(); i++) {
552181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                mEffectChains[i]->setAudioSource_l((audio_source_t)value);
552281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
552381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mAudioSource = (audio_source_t)value;
552481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
5525e198c360d5e75a9b2097844c495c10902e7e8500Glenn Kasten
552681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (status == NO_ERROR) {
552781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            status = mInput->stream->common.set_parameters(&mInput->stream->common,
552881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    keyValuePair.string());
552981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (status == INVALID_OPERATION) {
553081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                inputStandBy();
553181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                status = mInput->stream->common.set_parameters(&mInput->stream->common,
553281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        keyValuePair.string());
553381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
553481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            if (reconfig) {
553581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (status == BAD_VALUE &&
553681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    reqFormat == mInput->stream->common.get_format(&mInput->stream->common) &&
553781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    reqFormat == AUDIO_FORMAT_PCM_16_BIT &&
5538c4974312e5a1e2ab94eca56045f991baf1508d73Glenn Kasten                    (mInput->stream->common.get_sample_rate(&mInput->stream->common)
55394cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten                            <= (2 * samplingRate)) &&
554081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    popcount(mInput->stream->common.get_channels(&mInput->stream->common))
554181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                            <= FCC_2 &&
55424cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten                    (channelMask == AUDIO_CHANNEL_IN_MONO ||
55434cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten                            channelMask == AUDIO_CHANNEL_IN_STEREO)) {
554481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    status = NO_ERROR;
554581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
554681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                if (status == NO_ERROR) {
5547deca2ae0a7cf8bc54ff3f30b7dc39bbc78b94c0dGlenn Kasten                    readInputParameters_l();
554881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                    sendIoConfigEvent_l(AudioSystem::INPUT_CONFIG_CHANGED);
554981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                }
555081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
555181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
555281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
555381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mNewParameters.removeAt(0);
555481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
555581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mParamStatus = status;
555681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mParamCond.signal();
555781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // wait for condition with time out in case the thread calling ThreadBase::setParameters()
555881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        // already timed out waiting for the status and will never signal the condition.
555981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mWaitWorkCV.waitRelative(mLock, kSetParametersTimeoutNs);
556081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
556181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return reconfig;
556281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
556381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
556481784c37c61b09289654b979567a42bf73cd2b12Eric LaurentString8 AudioFlinger::RecordThread::getParameters(const String8& keys)
556581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
556681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
556781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (initCheck() != NO_ERROR) {
5568d8ea699dc8e7dac58bb32e9cdb31b0758da25817Glenn Kasten        return String8();
556981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
557081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
5571d8ea699dc8e7dac58bb32e9cdb31b0758da25817Glenn Kasten    char *s = mInput->stream->common.get_parameters(&mInput->stream->common, keys.string());
5572d8ea699dc8e7dac58bb32e9cdb31b0758da25817Glenn Kasten    const String8 out_s8(s);
557381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    free(s);
557481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return out_s8;
557581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
557681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
55770f11b51a57bc9062c4fe8af73747319cedabc5d6Glenn Kastenvoid AudioFlinger::RecordThread::audioConfigChanged_l(int event, int param __unused) {
557881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    AudioSystem::OutputDescriptor desc;
5579b2737d0b33c17e408d96d6f9eeaa3381479c94c7Glenn Kasten    const void *param2 = NULL;
558081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
558181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    switch (event) {
558281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    case AudioSystem::INPUT_OPENED:
558381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    case AudioSystem::INPUT_CONFIG_CHANGED:
5584fad226abd12435dbcd232f7de396f1a097b2bd5fGlenn Kasten        desc.channelMask = mChannelMask;
558581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        desc.samplingRate = mSampleRate;
558681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        desc.format = mFormat;
558781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        desc.frameCount = mFrameCount;
558881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        desc.latency = 0;
558981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        param2 = &desc;
559081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        break;
559181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
559281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    case AudioSystem::INPUT_CLOSED:
559381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    default:
559481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        break;
559581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
559681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mAudioFlinger->audioConfigChanged_l(event, mId, param2);
559781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
559881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
5599deca2ae0a7cf8bc54ff3f30b7dc39bbc78b94c0dGlenn Kastenvoid AudioFlinger::RecordThread::readInputParameters_l()
560081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
560181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mSampleRate = mInput->stream->common.get_sample_rate(&mInput->stream->common);
560281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mChannelMask = mInput->stream->common.get_channels(&mInput->stream->common);
5603f6ed423af92a56ef54bba23eba883b1f21448b54Glenn Kasten    mChannelCount = popcount(mChannelMask);
560481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mFormat = mInput->stream->common.get_format(&mInput->stream->common);
5605291bb6d8947c5b0c062f0895d623c529259bfa39Glenn Kasten    if (mFormat != AUDIO_FORMAT_PCM_16_BIT) {
5606cac3daa6332bf6d1f7d26adc4a9915f3d7992dd9Glenn Kasten        ALOGE("HAL format %#x not supported; must be AUDIO_FORMAT_PCM_16_BIT", mFormat);
5607291bb6d8947c5b0c062f0895d623c529259bfa39Glenn Kasten    }
560881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mFrameSize = audio_stream_frame_size(&mInput->stream->common);
5609548efc94813c1dec6e8cf6c085ae41ccb04827f1Glenn Kasten    mBufferSize = mInput->stream->common.get_buffer_size(&mInput->stream->common);
5610548efc94813c1dec6e8cf6c085ae41ccb04827f1Glenn Kasten    mFrameCount = mBufferSize / mFrameSize;
56116dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    // This is the formula for calculating the temporary buffer size.
5612e842614837e5401adf77e90485300c288b9a7876Glenn Kasten    // With 7 HAL buffers, we can guarantee ability to down-sample the input by ratio of 6:1 to
56138594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten    // 1 full output buffer, regardless of the alignment of the available input.
5614e842614837e5401adf77e90485300c288b9a7876Glenn Kasten    // The value is somewhat arbitrary, and could probably be even larger.
56156dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    // A larger value should allow more old data to be read after a track calls start(),
56166dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    // without increasing latency.
5617e842614837e5401adf77e90485300c288b9a7876Glenn Kasten    mRsmpInFrames = mFrameCount * 7;
56188594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten    mRsmpInFramesP2 = roundup(mRsmpInFrames);
56196dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten    delete[] mRsmpInBuffer;
56208594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten    // Over-allocate beyond mRsmpInFramesP2 to permit a HAL read past end of buffer
56218594843c15b4722ced39436fe9e64f3e57e7ace4Glenn Kasten    mRsmpInBuffer = new int16_t[(mRsmpInFramesP2 + mFrameCount - 1) * mChannelCount];
56226dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
56234cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten    // AudioRecord mSampleRate and mChannelCount are constant due to AudioRecord API constraints.
56244cc0a6a835c806d200ef83ef31fe5bef327c355cGlenn Kasten    // But if thread's mSampleRate or mChannelCount changes, how will that affect active tracks?
562581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
562681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
56275f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kastenuint32_t AudioFlinger::RecordThread::getInputFramesLost()
562881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
562981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
563081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (initCheck() != NO_ERROR) {
563181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return 0;
563281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
563381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
563481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return mInput->stream->get_input_frames_lost(mInput->stream);
563581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
563681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
563781784c37c61b09289654b979567a42bf73cd2b12Eric Laurentuint32_t AudioFlinger::RecordThread::hasAudioSession(int sessionId) const
563881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
563981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
564081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    uint32_t result = 0;
564181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (getEffectChain_l(sessionId) != 0) {
564281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        result = EFFECT_SESSION;
564381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
564481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
564581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (size_t i = 0; i < mTracks.size(); ++i) {
564681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (sessionId == mTracks[i]->sessionId()) {
564781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            result |= TRACK_SESSION;
564881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            break;
564981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
565081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
565181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
565281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return result;
565381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
565481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
565581784c37c61b09289654b979567a42bf73cd2b12Eric LaurentKeyedVector<int, bool> AudioFlinger::RecordThread::sessionIds() const
565681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
565781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    KeyedVector<int, bool> ids;
565881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
565981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (size_t j = 0; j < mTracks.size(); ++j) {
566081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        sp<RecordThread::RecordTrack> track = mTracks[j];
566181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        int sessionId = track->sessionId();
566281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (ids.indexOfKey(sessionId) < 0) {
566381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            ids.add(sessionId, true);
566481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
566581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
566681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return ids;
566781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
566881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
566981784c37c61b09289654b979567a42bf73cd2b12Eric LaurentAudioFlinger::AudioStreamIn* AudioFlinger::RecordThread::clearInput()
567081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
567181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Mutex::Autolock _l(mLock);
567281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    AudioStreamIn *input = mInput;
567381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mInput = NULL;
567481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return input;
567581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
567681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
567781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// this method must always be called either with ThreadBase mLock held or inside the thread loop
567881784c37c61b09289654b979567a42bf73cd2b12Eric Laurentaudio_stream_t* AudioFlinger::RecordThread::stream() const
567981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
568081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mInput == NULL) {
568181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return NULL;
568281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
568381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return &mInput->stream->common;
568481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
568581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
568681784c37c61b09289654b979567a42bf73cd2b12Eric Laurentstatus_t AudioFlinger::RecordThread::addEffectChain_l(const sp<EffectChain>& chain)
568781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
568881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // only one chain per input thread
568981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mEffectChains.size() != 0) {
569081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return INVALID_OPERATION;
569181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
569281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOGV("addEffectChain_l() %p on thread %p", chain.get(), this);
569381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
569481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    chain->setInBuffer(NULL);
569581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    chain->setOutBuffer(NULL);
569681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
569781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    checkSuspendOnAddEffectChain_l(chain);
569881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
569981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mEffectChains.add(chain);
570081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
570181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return NO_ERROR;
570281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
570381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
570481784c37c61b09289654b979567a42bf73cd2b12Eric Laurentsize_t AudioFlinger::RecordThread::removeEffectChain_l(const sp<EffectChain>& chain)
570581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
570681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOGV("removeEffectChain_l() %p from thread %p", chain.get(), this);
570781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ALOGW_IF(mEffectChains.size() != 1,
570881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            "removeEffectChain_l() %p invalid chain size %d on thread %p",
570981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            chain.get(), mEffectChains.size(), this);
571081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mEffectChains.size() == 1) {
571181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mEffectChains.removeAt(0);
571281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
571381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return 0;
571481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
571581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
571681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}; // namespace android
5717