Updated German translation
[dasher.git] / Src / DasherCore / FrameRate.cpp
blob4396d282e74e215b8a76260bb4d69610fbbdd1cc
1 #include "FrameRate.h"
3 using namespace Dasher;
5 CFrameRate::CFrameRate(CSettingsUser *pCreator) :
6 CSettingsUserObserver(pCreator) {
8 //Sampling parameters...
9 m_iFrames = 0;
10 m_iSamples = 1;
11 m_iTime = 0;
13 //try and carry on from where we left off at last run
14 HandleEvent(LP_X_LIMIT_SPEED);
15 //Sets m_dBitsAtLimX and m_iSteps
18 void CFrameRate::RecordFrame(unsigned long Time)
20 m_iFrames++;
22 // Update values once enough samples have been collected
23 if(m_iFrames == m_iSamples) {
24 unsigned long m_iTime2 = Time;
26 // If samples are collected in < 50ms, collect more
27 if(m_iTime2 - m_iTime < 50)
28 m_iSamples++;
29 // And if it's taking longer than > 80ms, collect fewer, down to a
30 // limit of 2
31 else if(m_iTime2 - m_iTime > 80) {
32 m_iSamples--;
33 if(m_iSamples < 2)
34 m_iSamples = 2;
37 // Calculate the framerate and reset framerate statistics for next
38 // sampling period
39 if(m_iTime2 - m_iTime > 0) {
40 double dFrNow = m_iFrames * 1000.0 / (m_iTime2 - m_iTime);
41 //LP_FRAMERATE records a decaying average, smoothed 50:50 with previous value
42 SetLongParameter(LP_FRAMERATE, long(GetLongParameter(LP_FRAMERATE) + (dFrNow*100))/2);
43 m_iTime = m_iTime2;
44 m_iFrames = 0;
46 DASHER_TRACEOUTPUT("Fr %f Steps %d Samples %d Time2 %d\n", dFrNow, m_iSteps, m_iSamples, m_iTime2);
53 void CFrameRate::HandleEvent(int iParameter) {
54 switch (iParameter) {
55 case LP_X_LIMIT_SPEED:
56 m_dBitsAtLimX = (log(static_cast<double>(CDasherModel::MAX_Y)) - log (2.*GetLongParameter(LP_X_LIMIT_SPEED)))/log(2.);
57 //fallthrough
58 case LP_MAX_BITRATE:
59 case LP_FRAMERATE:
60 //Calculate m_iSteps from the decaying-average framerate, as the number
61 // of steps that, at the X limit, will cause LP_MAX_BITRATE bits to be
62 // entered per second
63 m_iSteps = std::max(1,(int)(GetLongParameter(LP_FRAMERATE)*m_dBitsAtLimX/GetLongParameter(LP_MAX_BITRATE)));