102 lines
1.9 KiB
C++
102 lines
1.9 KiB
C++
#include "Main.h"
|
|
#include "ClockLayer.h"
|
|
#include "config.h"
|
|
|
|
ClockLayer::ClockLayer(IWMReader *reader)
|
|
: clock(0), startTime(0),
|
|
clockTick(2500000), curTime(0),
|
|
startTimeMilliseconds(0),
|
|
realTime(false),
|
|
lastOutputTime(0)
|
|
{
|
|
if (FAILED(reader->QueryInterface(&clock)))
|
|
clock=0;
|
|
}
|
|
|
|
void ClockLayer::Opened()
|
|
{
|
|
realTime=!config_clock;
|
|
WMHandler::Opened();
|
|
|
|
if (!realTime)
|
|
{
|
|
HRESULT hr = clock->SetUserProvidedClock(TRUE);
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
realTime=false;
|
|
}
|
|
}
|
|
else
|
|
clock->SetUserProvidedClock(FALSE);
|
|
curTime = startTime;
|
|
}
|
|
|
|
void ClockLayer::Started()
|
|
{
|
|
if (!realTime && config_clock)
|
|
clock->DeliverTime((QWORD) - 1);
|
|
|
|
if (startTimeMilliseconds != 0)
|
|
out->Flush(startTimeMilliseconds);
|
|
|
|
SetLastOutputTime(startTimeMilliseconds);
|
|
WMHandler::Started();
|
|
}
|
|
|
|
void ClockLayer::Clock()
|
|
{
|
|
if (!realTime && config_clock)
|
|
clock->DeliverTime((QWORD) - 1);
|
|
}
|
|
|
|
void ClockLayer::SetStartTimeMilliseconds(long time)
|
|
{
|
|
startTimeMilliseconds=time;
|
|
startTime = time;
|
|
startTime *= 10000;
|
|
}
|
|
|
|
void ClockLayer::TimeReached(QWORD &timeReached)
|
|
{
|
|
curTime = timeReached;
|
|
}
|
|
|
|
QWORD ClockLayer::GetStartTime()
|
|
{
|
|
return startTime;
|
|
}
|
|
|
|
void ClockLayer::GoRealTime()
|
|
{
|
|
realTime = true;
|
|
}
|
|
|
|
int ClockLayer::GetOutputTime()
|
|
{
|
|
if (realTime)
|
|
return (int) (curTime / 10000LL);
|
|
else
|
|
return lastOutputTime + (out->GetOutputTime() - out->GetWrittenTime());
|
|
}
|
|
|
|
void ClockLayer::TimeToSync(QWORD timeStamp, __int64 &diff)
|
|
{
|
|
if (realTime)
|
|
diff = 0;
|
|
else
|
|
{
|
|
QWORD outputTime = this->GetOutputTime();
|
|
outputTime *= 10000LL;
|
|
diff = timeStamp - outputTime;
|
|
}
|
|
}
|
|
|
|
void ClockLayer::SampleReceived(QWORD &timeStamp, QWORD &duration, unsigned long &outputNum, unsigned long &flags, INSSBuffer *&sample)
|
|
{
|
|
if (realTime)
|
|
curTime = timeStamp;
|
|
|
|
WMHandler::SampleReceived(timeStamp, duration, outputNum, flags, sample);
|
|
}
|