00001
00002
00003
00004
00005
00006 #ifndef __BASEREFCLOCK__
00007 #define __BASEREFCLOCK__
00008
00009 #include <Schedule.h>
00010
00011 const UINT RESOLUTION = 1;
00012 const INT ADVISE_CACHE = 4;
00013 const LONGLONG MAX_TIME = 0x7FFFFFFFFFFFFFFF;
00014
00015 inline LONGLONG WINAPI ConvertToMilliseconds(const REFERENCE_TIME& RT)
00016 {
00017
00018 return (RT / (UNITS / MILLISECONDS));
00019 }
00020
00021 class CBaseReferenceClock
00022 : public CUnknown, public IReferenceClock, public CCritSec
00023 {
00024 protected:
00025 virtual ~CBaseReferenceClock();
00026 public:
00027 CBaseReferenceClock(TCHAR *pName, LPUNKNOWN pUnk, HRESULT *phr, CAMSchedule * pSched = 0 );
00028
00029 STDMETHODIMP NonDelegatingQueryInterface(REFIID riid,void ** ppv);
00030
00031 DECLARE_IUNKNOWN
00032
00033
00034
00035
00036
00037
00038
00039
00040 STDMETHODIMP GetTime(REFERENCE_TIME *pTime);
00041
00042
00043
00044
00045
00046 STDMETHODIMP AdviseTime(
00047 REFERENCE_TIME baseTime,
00048 REFERENCE_TIME streamTime,
00049 HEVENT hEvent,
00050 DWORD_PTR *pdwAdviseCookie
00051 );
00052
00053
00054 STDMETHODIMP AdvisePeriodic(
00055 REFERENCE_TIME StartTime,
00056 REFERENCE_TIME PeriodTime,
00057 HSEMAPHORE hSemaphore,
00058 DWORD_PTR *pdwAdviseCookie
00059 );
00060
00061
00062
00063 STDMETHODIMP Unadvise(DWORD_PTR dwAdviseCookie);
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 virtual REFERENCE_TIME GetPrivateTime();
00074
00075
00076 STDMETHODIMP SetTimeDelta( const REFERENCE_TIME& TimeDelta );
00077
00078 CAMSchedule * GetSchedule() const { return m_pSchedule; }
00079
00080 private:
00081 REFERENCE_TIME m_rtPrivateTime;
00082 DWORD m_dwPrevSystemTime;
00083 REFERENCE_TIME m_rtLastGotTime;
00084 REFERENCE_TIME m_rtNextAdvise;
00085 UINT m_TimerResolution;
00086
00087 #ifdef PERF
00088 int m_idGetSystemTime;
00089 #endif
00090
00091 public:
00092 void TriggerThread()
00093 {
00094 EXECUTE_ASSERT(SetEvent(m_pSchedule->GetEvent()));
00095 }
00096
00097 private:
00098 BOOL m_bAbort;
00099 HANDLE m_hThread;
00100
00101 HRESULT AdviseThread();
00102 static DWORD __stdcall AdviseThreadFunction(LPVOID);
00103
00104 protected:
00105 CAMSchedule * const m_pSchedule;
00106 };
00107
00108 #endif
00109