[BDAPLGIN]
[reactos.git] / reactos / dll / directx / bdaplgin / digitaldemo.cpp
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS BDA Proxy
4 * FILE: dll/directx/bdaplgin/digitaldemo.cpp
5 * PURPOSE: IBDA_DigitalDemodulator interface
6 *
7 * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
8 */
9
10 #include "precomp.h"
11
12 #ifndef _MSC_VER
13 const GUID IID_IBDA_DigitalDemodulator = {0xef30f379, 0x985b, 0x4d10, {0xb6, 0x40, 0xa7, 0x9d, 0x5e, 0x04, 0xe1, 0xe0}};
14 const GUID KSPROPSETID_BdaDigitalDemodulator = {0xef30f379, 0x985b, 0x4d10, {0xb6, 0x40, 0xa7, 0x9d, 0x5e, 0x4, 0xe1, 0xe0}};
15 #endif
16
17 class CBDADigitalDemodulator : public IBDA_DigitalDemodulator
18 {
19 public:
20 STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
21
22 STDMETHODIMP_(ULONG) AddRef()
23 {
24 InterlockedIncrement(&m_Ref);
25 return m_Ref;
26 }
27 STDMETHODIMP_(ULONG) Release()
28 {
29 InterlockedDecrement(&m_Ref);
30 if (!m_Ref)
31 {
32 delete this;
33 return 0;
34 }
35 return m_Ref;
36 }
37 //IBDA_DigitalDemodulator methods
38 HRESULT STDMETHODCALLTYPE put_ModulationType(ModulationType *pModulationType);
39 HRESULT STDMETHODCALLTYPE get_ModulationType(ModulationType *pModulationType);
40 HRESULT STDMETHODCALLTYPE put_InnerFECMethod(FECMethod *pFECMethod);
41 HRESULT STDMETHODCALLTYPE get_InnerFECMethod(FECMethod *pFECMethod);
42 HRESULT STDMETHODCALLTYPE put_InnerFECRate(BinaryConvolutionCodeRate *pFECRate);
43 HRESULT STDMETHODCALLTYPE get_InnerFECRate(BinaryConvolutionCodeRate *pFECRate);
44 HRESULT STDMETHODCALLTYPE put_OuterFECMethod(FECMethod *pFECMethod);
45 HRESULT STDMETHODCALLTYPE get_OuterFECMethod(FECMethod *pFECMethod);
46 HRESULT STDMETHODCALLTYPE put_OuterFECRate(BinaryConvolutionCodeRate *pFECRate);
47 HRESULT STDMETHODCALLTYPE get_OuterFECRate(BinaryConvolutionCodeRate *pFECRate);
48 HRESULT STDMETHODCALLTYPE put_SymbolRate(ULONG *pSymbolRate);
49 HRESULT STDMETHODCALLTYPE get_SymbolRate(ULONG *pSymbolRate);
50 HRESULT STDMETHODCALLTYPE put_SpectralInversion(SpectralInversion *pSpectralInversion);
51 HRESULT STDMETHODCALLTYPE get_SpectralInversion(SpectralInversion *pSpectralInversion);
52
53 CBDADigitalDemodulator(HANDLE hFile, ULONG NodeId) : m_Ref(0), m_hFile(hFile), m_NodeId(NodeId){};
54 ~CBDADigitalDemodulator(){};
55
56 protected:
57 LONG m_Ref;
58 HANDLE m_hFile;
59 ULONG m_NodeId;
60 };
61
62 HRESULT
63 STDMETHODCALLTYPE
64 CBDADigitalDemodulator::QueryInterface(
65 IN REFIID refiid,
66 OUT PVOID* Output)
67 {
68 *Output = NULL;
69
70 if (IsEqualGUID(refiid, IID_IUnknown))
71 {
72 *Output = PVOID(this);
73 reinterpret_cast<IUnknown*>(*Output)->AddRef();
74 return NOERROR;
75 }
76
77 if (IsEqualGUID(refiid, IID_IBDA_DigitalDemodulator))
78 {
79 *Output = (IBDA_DigitalDemodulator*)(this);
80 reinterpret_cast<IBDA_DigitalDemodulator*>(*Output)->AddRef();
81 return NOERROR;
82 }
83
84 #ifdef BDAPLGIN_TRACE
85 WCHAR Buffer[MAX_PATH];
86 LPOLESTR lpstr;
87 StringFromCLSID(refiid, &lpstr);
88 swprintf(Buffer, L"CBDADigitalDemodulator::QueryInterface: NoInterface for %s", lpstr);
89 OutputDebugStringW(Buffer);
90 CoTaskMemFree(lpstr);
91 #endif
92
93 return E_NOINTERFACE;
94 }
95
96 HRESULT
97 STDMETHODCALLTYPE
98 CBDADigitalDemodulator::put_ModulationType(ModulationType *pModulationType)
99 {
100 KSP_NODE Node;
101 HRESULT hr;
102
103 ULONG BytesReturned;
104
105 // setup request
106 Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator;
107 Node.Property.Id = KSPROPERTY_BDA_MODULATION_TYPE;
108 Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET;
109 Node.NodeId = m_NodeId;
110
111 // perform request
112 hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pModulationType, sizeof(ModulationType), &BytesReturned);
113
114 #ifdef BDAPLGIN_TRACE
115 WCHAR Buffer[100];
116 swprintf(Buffer, L"CBDADigitalDemodulator::put_ModulationType: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
117 OutputDebugStringW(Buffer);
118 #endif
119
120 return hr;
121 }
122
123 HRESULT
124 STDMETHODCALLTYPE
125 CBDADigitalDemodulator::get_ModulationType(ModulationType *pModulationType)
126 {
127 return E_NOINTERFACE;
128 }
129
130 HRESULT
131 STDMETHODCALLTYPE
132 CBDADigitalDemodulator::put_InnerFECMethod(FECMethod *pFECMethod)
133 {
134 KSP_NODE Node;
135 HRESULT hr;
136 ULONG BytesReturned;
137
138 // setup request
139 Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator;
140 Node.Property.Id = KSPROPERTY_BDA_INNER_FEC_TYPE;
141 Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET;
142 Node.NodeId = m_NodeId;
143
144 // perform request
145 hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pFECMethod, sizeof(FECMethod), &BytesReturned);
146
147 #ifdef BDAPLGIN_TRACE
148 WCHAR Buffer[100];
149 swprintf(Buffer, L"CBDADigitalDemodulator::put_InnerFECMethod: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
150 OutputDebugStringW(Buffer);
151 #endif
152
153 return hr;
154 }
155
156 HRESULT
157 STDMETHODCALLTYPE
158 CBDADigitalDemodulator::get_InnerFECMethod(FECMethod *pFECMethod)
159 {
160 return E_NOINTERFACE;
161 }
162
163 HRESULT
164 STDMETHODCALLTYPE
165 CBDADigitalDemodulator::put_InnerFECRate(BinaryConvolutionCodeRate *pFECRate)
166 {
167 KSP_NODE Node;
168 HRESULT hr;
169
170 ULONG BytesReturned;
171
172 // setup request
173 Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator;
174 Node.Property.Id = KSPROPERTY_BDA_INNER_FEC_RATE;
175 Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET;
176 Node.NodeId = m_NodeId;
177
178 // perform request
179 hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pFECRate, sizeof(BinaryConvolutionCodeRate), &BytesReturned);
180
181 #ifdef BDAPLGIN_TRACE
182 WCHAR Buffer[100];
183 swprintf(Buffer, L"CBDADigitalDemodulator::put_InnerFECRate: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
184 OutputDebugStringW(Buffer);
185 #endif
186
187 return hr;
188 }
189
190 HRESULT
191 STDMETHODCALLTYPE
192 CBDADigitalDemodulator::get_InnerFECRate(BinaryConvolutionCodeRate *pFECRate)
193 {
194 return E_NOINTERFACE;
195 }
196
197 HRESULT
198 STDMETHODCALLTYPE
199 CBDADigitalDemodulator::put_OuterFECMethod(FECMethod *pFECMethod)
200 {
201 KSP_NODE Node;
202 HRESULT hr;
203 ULONG BytesReturned;
204
205 // setup request
206 Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator;
207 Node.Property.Id = KSPROPERTY_BDA_OUTER_FEC_TYPE;
208 Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET;
209 Node.NodeId = m_NodeId;
210
211 // perform request
212 hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pFECMethod, sizeof(FECMethod), &BytesReturned);
213
214 #ifdef BDAPLGIN_TRACE
215 WCHAR Buffer[100];
216 swprintf(Buffer, L"CBDADigitalDemodulator::put_OuterFECMethod: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
217 OutputDebugStringW(Buffer);
218 #endif
219
220 return hr;
221 }
222
223
224 HRESULT
225 STDMETHODCALLTYPE CBDADigitalDemodulator::get_OuterFECMethod(FECMethod *pFECMethod)
226 {
227 return E_NOINTERFACE;
228 }
229
230 HRESULT
231 STDMETHODCALLTYPE
232 CBDADigitalDemodulator::put_OuterFECRate(BinaryConvolutionCodeRate *pFECRate)
233 {
234 KSP_NODE Node;
235 HRESULT hr;
236
237 ULONG BytesReturned;
238
239 // setup request
240 Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator;
241 Node.Property.Id = KSPROPERTY_BDA_OUTER_FEC_RATE;
242 Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET;
243 Node.NodeId = m_NodeId;
244
245 // perform request
246 hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pFECRate, sizeof(BinaryConvolutionCodeRate), &BytesReturned);
247
248 #ifdef BDAPLGIN_TRACE
249 WCHAR Buffer[100];
250 swprintf(Buffer, L"CBDADigitalDemodulator::put_OuterFECRate: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
251 OutputDebugStringW(Buffer);
252 #endif
253
254 return hr;
255 }
256
257 HRESULT
258 STDMETHODCALLTYPE
259 CBDADigitalDemodulator::get_OuterFECRate(BinaryConvolutionCodeRate *pFECRate)
260 {
261 return E_NOINTERFACE;
262 }
263
264 HRESULT
265 STDMETHODCALLTYPE
266 CBDADigitalDemodulator::put_SymbolRate(ULONG *pSymbolRate)
267 {
268 KSP_NODE Node;
269 HRESULT hr;
270 ULONG BytesReturned;
271
272 // setup request
273 Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator;
274 Node.Property.Id = KSPROPERTY_BDA_SYMBOL_RATE;
275 Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET;
276 Node.NodeId = m_NodeId;
277
278 // perform request
279 hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pSymbolRate, sizeof(ULONG), &BytesReturned);
280
281 #ifdef BDAPLGIN_TRACE
282 WCHAR Buffer[100];
283 swprintf(Buffer, L"CBDADigitalDemodulator::put_SymbolRate: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
284 OutputDebugStringW(Buffer);
285 #endif
286
287 return hr;
288 }
289
290 HRESULT
291 STDMETHODCALLTYPE
292 CBDADigitalDemodulator::get_SymbolRate(ULONG *pSymbolRate)
293 {
294 return E_NOINTERFACE;
295 }
296
297 HRESULT
298 STDMETHODCALLTYPE
299 CBDADigitalDemodulator::put_SpectralInversion(SpectralInversion *pSpectralInversion)
300 {
301 KSP_NODE Node;
302 HRESULT hr;
303 ULONG BytesReturned;
304
305 // setup request
306 Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator;
307 Node.Property.Id = KSPROPERTY_BDA_SPECTRAL_INVERSION;
308 Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET;
309 Node.NodeId = m_NodeId;
310
311 // perform request
312 hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pSpectralInversion, sizeof(SpectralInversion), &BytesReturned);
313
314 #ifdef BDAPLGIN_TRACE
315 WCHAR Buffer[100];
316 swprintf(Buffer, L"CBDADigitalDemodulator::put_SpectralInversion: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
317 OutputDebugStringW(Buffer);
318 #endif
319
320 return hr;
321 }
322
323 HRESULT
324 STDMETHODCALLTYPE
325 CBDADigitalDemodulator::get_SpectralInversion(SpectralInversion *pSpectralInversion)
326 {
327 return E_NOINTERFACE;
328 }
329
330
331 HRESULT
332 WINAPI
333 CBDADigitalDemodulator_fnConstructor(
334 HANDLE hFile,
335 ULONG NodeId,
336 REFIID riid,
337 LPVOID * ppv)
338 {
339 // construct device control
340 CBDADigitalDemodulator * handler = new CBDADigitalDemodulator(hFile, NodeId);
341
342 #ifdef BDAPLGIN_TRACE
343 OutputDebugStringW(L"CBDADigitalDemodulator_fnConstructor\n");
344 #endif
345
346 if (!handler)
347 return E_OUTOFMEMORY;
348
349 if (FAILED(handler->QueryInterface(riid, ppv)))
350 {
351 /* not supported */
352 delete handler;
353 return E_NOINTERFACE;
354 }
355
356 return NOERROR;
357 }