Added support class TimeComputer to compute smoother performance times.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34682 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
7d592ec4d2
commit
cb00754227
@ -13,6 +13,7 @@ Addon hmulti_audio.media_addon :
|
|||||||
MultiAudioDevice.cpp
|
MultiAudioDevice.cpp
|
||||||
MultiAudioNode.cpp
|
MultiAudioNode.cpp
|
||||||
MultiAudioUtility.cpp
|
MultiAudioUtility.cpp
|
||||||
|
TimeComputer.cpp
|
||||||
: be media $(TARGET_LIBSUPC++)
|
: be media $(TARGET_LIBSUPC++)
|
||||||
;
|
;
|
||||||
|
|
||||||
|
94
src/add-ons/media/media-add-ons/multi_audio/TimeComputer.cpp
Normal file
94
src/add-ons/media/media-add-ons/multi_audio/TimeComputer.cpp
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "TimeComputer.h"
|
||||||
|
|
||||||
|
|
||||||
|
TimeComputer::TimeComputer()
|
||||||
|
:
|
||||||
|
fRealTime(0),
|
||||||
|
fPerformanceTime(0),
|
||||||
|
fDrift(1),
|
||||||
|
fFrameRate(1000000),
|
||||||
|
fUsecsPerFrame(1),
|
||||||
|
fPerformanceTimeBase(0),
|
||||||
|
fFrameBase(0),
|
||||||
|
fResetTimeBase(true),
|
||||||
|
fFirstEntry(0),
|
||||||
|
fLastEntry(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
TimeComputer::Init(float frameRate, bigtime_t realBaseTime)
|
||||||
|
{
|
||||||
|
fRealTime = realBaseTime;
|
||||||
|
fPerformanceTime = 0;
|
||||||
|
fDrift = 1;
|
||||||
|
SetFrameRate(frameRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
TimeComputer::SetFrameRate(float frameRate)
|
||||||
|
{
|
||||||
|
if (frameRate == fFrameRate)
|
||||||
|
return;
|
||||||
|
|
||||||
|
fFrameRate = frameRate;
|
||||||
|
fUsecsPerFrame = (double)1000000 / fFrameRate;
|
||||||
|
fResetTimeBase = true;
|
||||||
|
fFirstEntry = 0;
|
||||||
|
fLastEntry = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
TimeComputer::AddTimeStamp(bigtime_t realTime, uint64 frames)
|
||||||
|
{
|
||||||
|
bigtime_t estimatedPerformanceTime = fPerformanceTime
|
||||||
|
+ bigtime_t((realTime - fRealTime) * fDrift);
|
||||||
|
|
||||||
|
fRealTime = realTime;
|
||||||
|
|
||||||
|
if (fResetTimeBase) {
|
||||||
|
// use the extrapolated performance time at the given real time
|
||||||
|
fPerformanceTime = estimatedPerformanceTime;
|
||||||
|
fPerformanceTimeBase = estimatedPerformanceTime;
|
||||||
|
fFrameBase = frames;
|
||||||
|
fResetTimeBase = false;
|
||||||
|
_AddEntry(fRealTime, fPerformanceTime);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// add entry
|
||||||
|
bigtime_t performanceTime = fPerformanceTimeBase
|
||||||
|
+ bigtime_t((frames - fFrameBase) * fUsecsPerFrame);
|
||||||
|
_AddEntry(realTime, performanceTime);
|
||||||
|
|
||||||
|
// Update performance time and drift. We don't use the given
|
||||||
|
// performance time directly, but average it with the estimated
|
||||||
|
// performance time.
|
||||||
|
fPerformanceTime = (performanceTime + estimatedPerformanceTime) / 2;
|
||||||
|
|
||||||
|
Entry& entry = fEntries[fFirstEntry];
|
||||||
|
fDrift = double(fPerformanceTime - entry.performanceTime)
|
||||||
|
/ double(fRealTime - entry.realTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
TimeComputer::_AddEntry(bigtime_t realTime, bigtime_t performanceTime)
|
||||||
|
{
|
||||||
|
fLastEntry = (fLastEntry + 1) % kEntryCount;
|
||||||
|
Entry& entry = fEntries[fLastEntry];
|
||||||
|
entry.realTime = realTime;
|
||||||
|
entry.performanceTime = performanceTime;
|
||||||
|
|
||||||
|
if (fLastEntry == fFirstEntry)
|
||||||
|
fFirstEntry = (fFirstEntry + 1) % kEntryCount;
|
||||||
|
}
|
52
src/add-ons/media/media-add-ons/multi_audio/TimeComputer.h
Normal file
52
src/add-ons/media/media-add-ons/multi_audio/TimeComputer.h
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
#ifndef TIME_COMPUTER_H
|
||||||
|
#define TIME_COMPUTER_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <SupportDefs.h>
|
||||||
|
|
||||||
|
|
||||||
|
struct TimeComputer {
|
||||||
|
TimeComputer();
|
||||||
|
|
||||||
|
void Init(float frameRate, bigtime_t realBaseTime);
|
||||||
|
void SetFrameRate(float frameRate);
|
||||||
|
|
||||||
|
void AddTimeStamp(bigtime_t realTime, uint64 frames);
|
||||||
|
|
||||||
|
bigtime_t RealTime() const { return fRealTime; }
|
||||||
|
bigtime_t PerformanceTime() const
|
||||||
|
{ return fPerformanceTime; }
|
||||||
|
double Drift() const { return fDrift; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
static const int32 kEntryCount = 32;
|
||||||
|
|
||||||
|
struct Entry {
|
||||||
|
bigtime_t realTime;
|
||||||
|
bigtime_t performanceTime;
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
void _AddEntry(bigtime_t realTime,
|
||||||
|
bigtime_t performanceTime);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bigtime_t fRealTime;
|
||||||
|
bigtime_t fPerformanceTime;
|
||||||
|
double fDrift;
|
||||||
|
float fFrameRate;
|
||||||
|
double fUsecsPerFrame;
|
||||||
|
bigtime_t fPerformanceTimeBase;
|
||||||
|
uint64 fFrameBase;
|
||||||
|
bool fResetTimeBase;
|
||||||
|
Entry fEntries[kEntryCount];
|
||||||
|
int32 fFirstEntry;
|
||||||
|
int32 fLastEntry;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // TIME_COMPUTER_H
|
Loading…
Reference in New Issue
Block a user