[KSPROXY]
[reactos.git] / reactos / dll / directx / ksproxy / qualityforward.cpp
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy
4 * FILE: dll/directx/ksproxy/clockforward.cpp
5 * PURPOSE: IKsClockForwarder interface
6 *
7 * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
8 */
9 #include "precomp.h"
10
11 const GUID KSCATEGORY_QUALITY = {0x97EBAACB, 0x95BD, 0x11D0, {0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
12
13 class CKsQualityForwarder : public IKsQualityForwarder
14 {
15 public:
16 STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
17
18 STDMETHODIMP_(ULONG) AddRef()
19 {
20 InterlockedIncrement(&m_Ref);
21 return m_Ref;
22 }
23 STDMETHODIMP_(ULONG) Release()
24 {
25 InterlockedDecrement(&m_Ref);
26
27 if (!m_Ref)
28 {
29 delete this;
30 return 0;
31 }
32 return m_Ref;
33 }
34
35 // IKsObject interface
36 HANDLE STDMETHODCALLTYPE KsGetObjectHandle();
37
38 // IKsQualityForwarder
39 VOID STDMETHODCALLTYPE KsFlushClient(IN IKsPin *Pin);
40
41 CKsQualityForwarder(HANDLE handle) : m_Ref(0), m_Handle(handle){}
42 virtual ~CKsQualityForwarder(){ if (m_Handle) CloseHandle(m_Handle);}
43
44 protected:
45 LONG m_Ref;
46 HANDLE m_Handle;
47
48
49 };
50
51 HRESULT
52 STDMETHODCALLTYPE
53 CKsQualityForwarder::QueryInterface(
54 IN REFIID refiid,
55 OUT PVOID* Output)
56 {
57 if (IsEqualGUID(refiid, IID_IUnknown) ||
58 IsEqualGUID(refiid, IID_IKsQualityForwarder))
59 {
60 *Output = PVOID(this);
61 reinterpret_cast<IUnknown*>(*Output)->AddRef();
62 return NOERROR;
63 }
64
65 return E_NOINTERFACE;
66 }
67
68 //-------------------------------------------------------------------
69 // IKsObject interface
70 //
71
72 HANDLE
73 STDMETHODCALLTYPE
74 CKsQualityForwarder::KsGetObjectHandle()
75 {
76 return m_Handle;
77 }
78
79 //-------------------------------------------------------------------
80 // IKsQualityForwarder interface
81 //
82 VOID
83 STDMETHODCALLTYPE
84 CKsQualityForwarder::KsFlushClient(
85 IN IKsPin *Pin)
86 {
87 OutputDebugString("UNIMPLEMENTED\n");
88 }
89
90 HRESULT
91 WINAPI
92 CKsQualityForwarder_Constructor(
93 IUnknown * pUnkOuter,
94 REFIID riid,
95 LPVOID * ppv)
96 {
97 HRESULT hr;
98 HANDLE handle;
99
100 OutputDebugStringW(L"CKsQualityForwarder_Constructor\n");
101
102 // open default clock
103 hr = KsOpenDefaultDevice(KSCATEGORY_QUALITY, GENERIC_READ | GENERIC_WRITE, &handle);
104
105 if (hr != NOERROR)
106 {
107 OutputDebugString("CKsClockForwarder_Constructor failed to open device\n");
108 return hr;
109 }
110
111 CKsQualityForwarder * quality = new CKsQualityForwarder(handle);
112
113 if (!quality)
114 {
115 // free clock handle
116 CloseHandle(handle);
117 return E_OUTOFMEMORY;
118 }
119
120 if (FAILED(quality->QueryInterface(riid, ppv)))
121 {
122 /* not supported */
123 delete quality;
124 return E_NOINTERFACE;
125 }
126
127 return NOERROR;
128 }