blob: fdb90420e52409b4e54c6a58b18cad5c825c7465 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
#pragma once
#include <atlbase.h>
#include <atlutil.h>
#include "Interfaces.h"
class CSyncClockFilter;
class CSyncClock: public CBaseReferenceClock
{
friend class CSyncClockFilter;
public:
CSyncClock(LPUNKNOWN pUnk, HRESULT *phr);
REFERENCE_TIME GetPrivateTime();
IUnknown * pUnk() {
return static_cast<IUnknown*>(static_cast<IReferenceClock*>(this));
}
DOUBLE adjustment; // For adjusting speed temporarily
DOUBLE bias; // For changing speed permanently
private:
REFERENCE_TIME m_rtPrivateTime;
LONGLONG m_llPerfFrequency;
REFERENCE_TIME m_rtPrevTime;
CCritSec m_csClock;
IReferenceClock * m_pCurrentRefClock;
IReferenceClock * m_pPrevRefClock;
REFERENCE_TIME GetTicks100ns();
};
class __declspec(uuid("57797fe5-ee9b-4408-98a9-20b134e7e8f0"))
CSyncClockFilter: public ISyncClock, public CBaseFilter
{
public:
CSyncClockFilter(LPUNKNOWN pUnk, HRESULT *phr);
virtual ~CSyncClockFilter();
DECLARE_IUNKNOWN
STDMETHODIMP NonDelegatingQueryInterface( REFIID riid, void ** ppv);
// ISyncClock
STDMETHODIMP AdjustClock(DOUBLE adjustment);
STDMETHODIMP SetBias(DOUBLE bias);
STDMETHODIMP GetBias(DOUBLE *bias);
STDMETHODIMP GetStartTime(REFERENCE_TIME *startTime);
// CBaseFilter methods
int CSyncClockFilter::GetPinCount();
CBasePin *CSyncClockFilter::GetPin(int iPin);
private:
CSyncClock m_Clock;
CCritSec m_Lock;
};
|