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