• 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