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();
     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 setLog(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 and to be renamed to have an "m" prefix
     52     const FastThreadState *previous;
     53     const FastThreadState *current;
     54     struct timespec oldTs;
     55     bool oldTsValid;
     56     long sleepNs;   // -1: busy wait, 0: sched_yield, > 0: nanosleep
     57     long periodNs;      // expected period; the time required to render one mix buffer
     58     long underrunNs;    // underrun likely when write cycle is greater than this value
     59     long overrunNs;     // overrun likely when write cycle is less than this value
     60     long forceNs;       // if overrun detected, force the write cycle to take this much time
     61     long warmupNs;      // warmup complete when write cycle is greater than to this value
     62     FastThreadDumpState *mDummyDumpState;
     63     FastThreadDumpState *dumpState;
     64     bool ignoreNextOverrun;  // used to ignore initial overrun and first after an underrun
     65 #ifdef FAST_MIXER_STATISTICS
     66     struct timespec oldLoad;    // previous value of clock_gettime(CLOCK_THREAD_CPUTIME_ID)
     67     bool oldLoadValid;  // whether oldLoad is valid
     68     uint32_t bounds;
     69     bool full;          // whether we have collected at least mSamplingN samples
     70 #ifdef CPU_FREQUENCY_STATISTICS
     71     ThreadCpuUsage tcu;     // for reading the current CPU clock frequency in kHz
     72 #endif
     73 #endif
     74     unsigned coldGen;   // last observed mColdGen
     75     bool isWarm;        // true means ready to mix, false means wait for warmup before mixing
     76     struct timespec measuredWarmupTs;  // how long did it take for warmup to complete
     77     uint32_t warmupCycles;  // counter of number of loop cycles required to warmup
     78     NBLog::Writer dummyLogWriter;
     79     NBLog::Writer *logWriter;
     80     status_t timestampStatus;
     81 
     82     FastThreadState::Command command;
     83 #if 0
     84     size_t frameCount;
     85 #endif
     86     bool attemptedWrite;
     87 
     88 };  // class FastThread
     89 
     90 }   // android
     91 
     92 #endif  // ANDROID_AUDIO_FAST_THREAD_H
     93