Home | History | Annotate | Download | only in audioflinger
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ANDROID_AUDIO_FAST_THREAD_H
     18 #define ANDROID_AUDIO_FAST_THREAD_H
     19 
     20 #include "Configuration.h"
     21 #ifdef CPU_FREQUENCY_STATISTICS
     22 #include <cpustats/ThreadCpuUsage.h>
     23 #endif
     24 #include <utils/Thread.h>
     25 #include "FastThreadState.h"
     26 
     27 namespace android {
     28 
     29 // FastThread is the common abstract base class of FastMixer and FastCapture
     30 class FastThread : public Thread {
     31 
     32 public:
     33             FastThread(const char *cycleMs, const char *loadUs);
     34     virtual ~FastThread();
     35 
     36 private:
     37     // implement Thread::threadLoop()
     38     virtual bool threadLoop();
     39 
     40 protected:
     41     // callouts to subclass in same lexical order as they were in original FastMixer.cpp
     42     // FIXME need comments
     43     virtual const FastThreadState *poll() = 0;
     44     virtual void setNBLogWriter(NBLog::Writer *logWriter __unused) { }
     45     virtual void onIdle() = 0;
     46     virtual void onExit() = 0;
     47     virtual bool isSubClassCommand(FastThreadState::Command command) = 0;
     48     virtual void onStateChange() = 0;
     49     virtual void onWork() = 0;
     50 
     51     // FIXME these former local variables need comments
     52     const FastThreadState*  mPrevious;
     53     const FastThreadState*  mCurrent;
     54     struct timespec mOldTs;
     55     bool            mOldTsValid;
     56     long            mSleepNs;       // -1: busy wait, 0: sched_yield, > 0: nanosleep
     57     long            mPeriodNs;      // expected period; the time required to render one mix buffer
     58     long            mUnderrunNs;    // underrun likely when write cycle is greater than this value
     59     long            mOverrunNs;     // overrun likely when write cycle is less than this value
     60     long            mForceNs;       // if overrun detected,
     61                                     // force the write cycle to take this much time
     62     long            mWarmupNsMin;   // warmup complete when write cycle is greater than or equal to
     63                                     // this value
     64     long            mWarmupNsMax;   // and less than or equal to this value
     65     FastThreadDumpState* mDummyDumpState;
     66     FastThreadDumpState* mDumpState;
     67     bool            mIgnoreNextOverrun;     // used to ignore initial overrun and first after an
     68                                             // underrun
     69 #ifdef FAST_THREAD_STATISTICS
     70     struct timespec mOldLoad;       // previous value of clock_gettime(CLOCK_THREAD_CPUTIME_ID)
     71     bool            mOldLoadValid;  // whether oldLoad is valid
     72     uint32_t        mBounds;
     73     bool            mFull;          // whether we have collected at least mSamplingN samples
     74 #ifdef CPU_FREQUENCY_STATISTICS
     75     ThreadCpuUsage  mTcu;           // for reading the current CPU clock frequency in kHz
     76 #endif
     77 #endif
     78     unsigned        mColdGen;       // last observed mColdGen
     79     bool            mIsWarm;        // true means ready to mix,
     80                                     // false means wait for warmup before mixing
     81     struct timespec mMeasuredWarmupTs;  // how long did it take for warmup to complete
     82     uint32_t        mWarmupCycles;  // counter of number of loop cycles during warmup phase
     83     uint32_t        mWarmupConsecutiveInRangeCycles;    // number of consecutive cycles in range
     84     NBLog::Writer   mDummyNBLogWriter;
     85     NBLog::Writer*  mNBLogWriter;   // always non-nullptr: real NBLog::Writer* or &mDummyNBLogWriter
     86     status_t        mTimestampStatus;
     87 
     88     FastThreadState::Command mCommand;
     89     bool            mAttemptedWrite;
     90 
     91     char            mCycleMs[16];   // cycle_ms + suffix
     92     char            mLoadUs[16];    // load_us + suffix
     93 
     94 };  // class FastThread
     95 
     96 }   // android
     97 
     98 #endif  // ANDROID_AUDIO_FAST_THREAD_H
     99