• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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;
setLog(NBLog::Writer * logWriter __unused)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