Reactos
at master 336 lines 9.2 kB view raw
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 (johannes.anderwald@reactos.org) 8 */ 9 10#include "precomp.h" 11 12#ifndef _MSC_VER 13const GUID IID_IBDA_DigitalDemodulator = {0xef30f379, 0x985b, 0x4d10, {0xb6, 0x40, 0xa7, 0x9d, 0x5e, 0x04, 0xe1, 0xe0}}; 14const GUID KSPROPSETID_BdaDigitalDemodulator = {0xef30f379, 0x985b, 0x4d10, {0xb6, 0x40, 0xa7, 0x9d, 0x5e, 0x4, 0xe1, 0xe0}}; 15#endif 16 17class CBDADigitalDemodulator : public IBDA_DigitalDemodulator 18{ 19public: 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(IKsPropertySet * pProperty, ULONG NodeId) : m_Ref(0), m_pProperty(pProperty), m_NodeId(NodeId){}; 54 ~CBDADigitalDemodulator(){}; 55 56protected: 57 LONG m_Ref; 58 IKsPropertySet * m_pProperty; 59 ULONG m_NodeId; 60}; 61 62HRESULT 63STDMETHODCALLTYPE 64CBDADigitalDemodulator::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); 91DebugBreak(); 92#endif 93 94 return E_NOINTERFACE; 95} 96 97HRESULT 98STDMETHODCALLTYPE 99CBDADigitalDemodulator::put_ModulationType(ModulationType *pModulationType) 100{ 101 KSP_NODE Node; 102 HRESULT hr; 103 104 // setup request 105 Node.NodeId = m_NodeId; 106 Node.Reserved = 0; 107 108 // perform request 109 hr = m_pProperty->Set(KSPROPSETID_BdaDigitalDemodulator, KSPROPERTY_BDA_MODULATION_TYPE, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), pModulationType, sizeof(ModulationType)); 110 111 112#ifdef BDAPLGIN_TRACE 113 WCHAR Buffer[100]; 114 swprintf(Buffer, L"CBDADigitalDemodulator::put_ModulationType: pModulationType %lu hr %lx\n", *pModulationType, hr); 115 OutputDebugStringW(Buffer); 116#endif 117 118 return hr; 119} 120 121HRESULT 122STDMETHODCALLTYPE 123CBDADigitalDemodulator::get_ModulationType(ModulationType *pModulationType) 124{ 125 return E_NOINTERFACE; 126} 127 128HRESULT 129STDMETHODCALLTYPE 130CBDADigitalDemodulator::put_InnerFECMethod(FECMethod *pFECMethod) 131{ 132 KSP_NODE Node; 133 HRESULT hr; 134 135 // setup request 136 Node.NodeId = m_NodeId; 137 Node.Reserved = 0; 138 139 // perform request 140 hr = m_pProperty->Set(KSPROPSETID_BdaDigitalDemodulator, KSPROPERTY_BDA_INNER_FEC_TYPE, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), pFECMethod, sizeof(FECMethod)); 141 142 143#ifdef BDAPLGIN_TRACE 144 WCHAR Buffer[100]; 145 swprintf(Buffer, L"CBDADigitalDemodulator::put_InnerFECMethod: pFECMethod %lu hr %lx\n", *pFECMethod, hr); 146 OutputDebugStringW(Buffer); 147#endif 148 149 return hr; 150} 151 152HRESULT 153STDMETHODCALLTYPE 154CBDADigitalDemodulator::get_InnerFECMethod(FECMethod *pFECMethod) 155{ 156 return E_NOINTERFACE; 157} 158 159HRESULT 160STDMETHODCALLTYPE 161CBDADigitalDemodulator::put_InnerFECRate(BinaryConvolutionCodeRate *pFECRate) 162{ 163 KSP_NODE Node; 164 HRESULT hr; 165 166 // setup request 167 Node.NodeId = m_NodeId; 168 Node.Reserved = 0; 169 170 // perform request 171 hr = m_pProperty->Set(KSPROPSETID_BdaDigitalDemodulator, KSPROPERTY_BDA_INNER_FEC_RATE, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), pFECRate, sizeof(BinaryConvolutionCodeRate)); 172 173#ifdef BDAPLGIN_TRACE 174 WCHAR Buffer[100]; 175 swprintf(Buffer, L"CBDADigitalDemodulator::put_InnerFECRate: pFECRate %lu hr %lx\n", *pFECRate, hr); 176 OutputDebugStringW(Buffer); 177#endif 178 179 return hr; 180} 181 182HRESULT 183STDMETHODCALLTYPE 184CBDADigitalDemodulator::get_InnerFECRate(BinaryConvolutionCodeRate *pFECRate) 185{ 186 return E_NOINTERFACE; 187} 188 189HRESULT 190STDMETHODCALLTYPE 191CBDADigitalDemodulator::put_OuterFECMethod(FECMethod *pFECMethod) 192{ 193 KSP_NODE Node; 194 HRESULT hr; 195 196 // setup request 197 Node.NodeId = m_NodeId; 198 Node.Reserved = 0; 199 200 // perform request 201 hr = m_pProperty->Set(KSPROPSETID_BdaDigitalDemodulator, KSPROPERTY_BDA_OUTER_FEC_TYPE, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), pFECMethod, sizeof(FECMethod)); 202 203#ifdef BDAPLGIN_TRACE 204 WCHAR Buffer[100]; 205 swprintf(Buffer, L"CBDADigitalDemodulator::put_OuterFECMethod: pFECMethod %lu hr %lx\n", *pFECMethod, hr); 206 OutputDebugStringW(Buffer); 207#endif 208 209 return hr; 210} 211 212 213HRESULT 214STDMETHODCALLTYPE CBDADigitalDemodulator::get_OuterFECMethod(FECMethod *pFECMethod) 215{ 216 return E_NOINTERFACE; 217} 218 219HRESULT 220STDMETHODCALLTYPE 221CBDADigitalDemodulator::put_OuterFECRate(BinaryConvolutionCodeRate *pFECRate) 222{ 223 KSP_NODE Node; 224 HRESULT hr; 225 226 // setup request 227 Node.NodeId = m_NodeId; 228 Node.Reserved = 0; 229 230 // perform request 231 hr = m_pProperty->Set(KSPROPSETID_BdaDigitalDemodulator, KSPROPERTY_BDA_OUTER_FEC_RATE, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), pFECRate, sizeof(BinaryConvolutionCodeRate)); 232 233#ifdef BDAPLGIN_TRACE 234 WCHAR Buffer[100]; 235 swprintf(Buffer, L"CBDADigitalDemodulator::put_OuterFECRate: pFECRate %lu hr %lx\n", *pFECRate, hr); 236 OutputDebugStringW(Buffer); 237#endif 238 239 return hr; 240} 241 242HRESULT 243STDMETHODCALLTYPE 244CBDADigitalDemodulator::get_OuterFECRate(BinaryConvolutionCodeRate *pFECRate) 245{ 246 return E_NOINTERFACE; 247} 248 249HRESULT 250STDMETHODCALLTYPE 251CBDADigitalDemodulator::put_SymbolRate(ULONG *pSymbolRate) 252{ 253 KSP_NODE Node; 254 HRESULT hr; 255 256 // setup request 257 Node.NodeId = m_NodeId; 258 Node.Reserved = 0; 259 260 // perform request 261 hr = m_pProperty->Set(KSPROPSETID_BdaDigitalDemodulator, KSPROPERTY_BDA_SYMBOL_RATE, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), pSymbolRate, sizeof(ULONG)); 262 263#ifdef BDAPLGIN_TRACE 264 WCHAR Buffer[100]; 265 swprintf(Buffer, L"CBDADigitalDemodulator::put_SymbolRate: pSymbolRate %lu hr %lx\n", *pSymbolRate, hr); 266 OutputDebugStringW(Buffer); 267#endif 268 269 return hr; 270} 271 272HRESULT 273STDMETHODCALLTYPE 274CBDADigitalDemodulator::get_SymbolRate(ULONG *pSymbolRate) 275{ 276 return E_NOINTERFACE; 277} 278 279HRESULT 280STDMETHODCALLTYPE 281CBDADigitalDemodulator::put_SpectralInversion(SpectralInversion *pSpectralInversion) 282{ 283 KSP_NODE Node; 284 HRESULT hr; 285 286 // setup request 287 Node.NodeId = m_NodeId; 288 Node.Reserved = 0; 289 290 // perform request 291 hr = m_pProperty->Set(KSPROPSETID_BdaDigitalDemodulator, KSPROPERTY_BDA_SPECTRAL_INVERSION, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), pSpectralInversion, sizeof(SpectralInversion)); 292 293#ifdef BDAPLGIN_TRACE 294 WCHAR Buffer[100]; 295 swprintf(Buffer, L"CBDADigitalDemodulator::put_SpectralInversion: pSpectralInversion %lu hr %lx\n", *pSpectralInversion, hr); 296 OutputDebugStringW(Buffer); 297#endif 298 299 return hr; 300} 301 302HRESULT 303STDMETHODCALLTYPE 304CBDADigitalDemodulator::get_SpectralInversion(SpectralInversion *pSpectralInversion) 305{ 306 return E_NOINTERFACE; 307} 308 309 310HRESULT 311WINAPI 312CBDADigitalDemodulator_fnConstructor( 313 IKsPropertySet * pProperty, 314 ULONG NodeId, 315 REFIID riid, 316 LPVOID * ppv) 317{ 318 // construct device control 319 CBDADigitalDemodulator * handler = new CBDADigitalDemodulator(pProperty, NodeId); 320 321#ifdef BDAPLGIN_TRACE 322 OutputDebugStringW(L"CBDADigitalDemodulator_fnConstructor\n"); 323#endif 324 325 if (!handler) 326 return E_OUTOFMEMORY; 327 328 if (FAILED(handler->QueryInterface(riid, ppv))) 329 { 330 /* not supported */ 331 delete handler; 332 return E_NOINTERFACE; 333 } 334 335 return NOERROR; 336}