2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Network Provider for MPEG2 based networks
4 * FILE: dll/directx/msdvbnp/scanningtuner.cpp
5 * PURPOSE: IScanningTunner interface
7 * PROGRAMMERS: Johannes Anderwald (johannes.anderwald@reactos.org)
11 class CScanningTunner
: public IScanningTuner
14 STDMETHODIMP
QueryInterface( REFIID InterfaceId
, PVOID
* Interface
);
16 STDMETHODIMP_(ULONG
) AddRef()
18 InterlockedIncrement(&m_Ref
);
21 STDMETHODIMP_(ULONG
) Release()
23 InterlockedDecrement(&m_Ref
);
33 HRESULT STDMETHODCALLTYPE
get_TuningSpace(ITuningSpace
**TuningSpace
);
34 HRESULT STDMETHODCALLTYPE
put_TuningSpace(ITuningSpace
*TuningSpace
);
35 HRESULT STDMETHODCALLTYPE
EnumTuningSpaces(IEnumTuningSpaces
**ppEnum
);
36 HRESULT STDMETHODCALLTYPE
get_TuneRequest(ITuneRequest
**TuneRequest
);
37 HRESULT STDMETHODCALLTYPE
put_TuneRequest(ITuneRequest
*TuneRequest
);
38 HRESULT STDMETHODCALLTYPE
Validate(ITuneRequest
*TuneRequest
);
39 HRESULT STDMETHODCALLTYPE
get_PreferredComponentTypes(IComponentTypes
**ComponentTypes
);
40 HRESULT STDMETHODCALLTYPE
put_PreferredComponentTypes(IComponentTypes
*ComponentTypes
);
41 HRESULT STDMETHODCALLTYPE
get_SignalStrength(long *Strength
);
42 HRESULT STDMETHODCALLTYPE
TriggerSignalEvents(long Interval
);
44 //IScanningTuner methods
45 HRESULT STDMETHODCALLTYPE
SeekUp();
46 HRESULT STDMETHODCALLTYPE
SeekDown();
47 HRESULT STDMETHODCALLTYPE
ScanUp(long MillisecondsPause
);
48 HRESULT STDMETHODCALLTYPE
ScanDown(long MillisecondsPause
);
49 HRESULT STDMETHODCALLTYPE
AutoProgram();
51 CScanningTunner(std::vector
<IUnknown
*> & DeviceFilters
) : m_Ref(0), m_TuningSpace(0), m_DeviceFilters(DeviceFilters
){};
52 virtual ~CScanningTunner() {};
53 HRESULT STDMETHODCALLTYPE
StartChanges();
54 HRESULT STDMETHODCALLTYPE
CommitChanges();
55 HRESULT STDMETHODCALLTYPE
CheckChanges();
56 HRESULT STDMETHODCALLTYPE
SetLnbInfo(IBDA_LNBInfo
* pLnbInfo
, ULONG ulLOFLow
, ULONG ulLOFHigh
, ULONG ulSwitchFrequency
);
57 HRESULT STDMETHODCALLTYPE
SetDigitalDemodulator(IBDA_DigitalDemodulator
* pDigitalDemo
, ModulationType ModType
, FECMethod InnerFEC
, BinaryConvolutionCodeRate InnerFECRate
, FECMethod OuterFEC
, BinaryConvolutionCodeRate OuterFECRate
, ULONG SymbolRate
);
58 HRESULT
SetFrequency(IBDA_FrequencyFilter
* pFrequency
, ULONG FrequencyMultiplier
, ULONG Frequency
, Polarisation Polarity
, ULONG Range
, ULONG Bandwidth
);
59 HRESULT STDMETHODCALLTYPE
performDVBTTune(IDVBTuneRequest
* pDVBTRequest
, IDVBTLocator
*pDVBTLocator
);
62 ITuningSpace
* m_TuningSpace
;
63 std::vector
<IUnknown
*> & m_DeviceFilters
;
68 CScanningTunner::QueryInterface(
72 if (IsEqualGUID(refiid
, IID_IUnknown
))
74 *Output
= PVOID(this);
75 reinterpret_cast<IUnknown
*>(*Output
)->AddRef();
78 if (IsEqualGUID(refiid
, IID_ITuner
))
80 *Output
= (ITuner
*)(this);
81 reinterpret_cast<ITuner
*>(*Output
)->AddRef();
85 if (IsEqualGUID(refiid
, IID_IScanningTuner
))
87 *Output
= (IScanningTuner
*)(this);
88 reinterpret_cast<IScanningTuner
*>(*Output
)->AddRef();
92 WCHAR Buffer
[MAX_PATH
];
94 StringFromCLSID(refiid
, &lpstr
);
95 swprintf(Buffer
, L
"CScanningTunner::QueryInterface: NoInterface for %s\n", lpstr
);
96 OutputDebugStringW(Buffer
);
100 return E_NOINTERFACE
;
103 //-------------------------------------------------------------------
108 CScanningTunner::get_TuningSpace(
109 ITuningSpace
**TuningSpace
)
111 OutputDebugStringW(L
"CScanningTunner::get_TuningSpace\n");
113 *TuningSpace
= m_TuningSpace
;
119 CScanningTunner::put_TuningSpace(
120 ITuningSpace
*TuningSpace
)
122 OutputDebugStringW(L
"CScanningTunner::put_TuningSpace\n");
123 m_TuningSpace
= TuningSpace
;
129 CScanningTunner::EnumTuningSpaces(
130 IEnumTuningSpaces
**ppEnum
)
132 OutputDebugStringW(L
"CScanningTunner::EnumTuningSpaces : NotImplemented\n");
138 CScanningTunner::get_TuneRequest(
139 ITuneRequest
**TuneRequest
)
141 OutputDebugStringW(L
"CScanningTunner::get_TuneRequest : NotImplemented\n");
147 CScanningTunner::put_TuneRequest(
148 ITuneRequest
*TuneRequest
)
150 IDVBTuneRequest
* pDVBTRequest
;
152 IDVBTLocator
*pDVBTLocator
;
156 OutputDebugStringW(L
"CScanningTunner::put_TuneRequest\n");
158 // query for IDVBTuneRequest interface
159 hr
= TuneRequest
->QueryInterface(IID_IDVBTuneRequest
, (void**)&pDVBTRequest
);
162 assert(hr
== NOERROR
);
164 // get the IDVBTLocator
165 hr
= pDVBTRequest
->get_Locator((ILocator
**)&pLocator
);
168 assert(hr
== NOERROR
);
171 hr
= pLocator
->QueryInterface(IID_ILocator
, (void**)&pDVBTLocator
);
174 assert(hr
== NOERROR
);
181 hr
= performDVBTTune(pDVBTRequest
, pDVBTLocator
);
184 pDVBTLocator
->Release();
185 pDVBTRequest
->Release();
196 CScanningTunner::Validate(
197 ITuneRequest
*TuneRequest
)
199 OutputDebugStringW(L
"CScanningTunner::Validate : NotImplemented\n");
205 CScanningTunner::get_PreferredComponentTypes(
206 IComponentTypes
**ComponentTypes
)
208 OutputDebugStringW(L
"CScanningTunner::get_PreferredComponentTypes : NotImplemented\n");
214 CScanningTunner::put_PreferredComponentTypes(
215 IComponentTypes
*ComponentTypes
)
217 OutputDebugStringW(L
"CScanningTunner::put_PreferredComponentTypes : NotImplemented\n");
223 CScanningTunner::get_SignalStrength(
226 OutputDebugStringW(L
"CScanningTunner::get_SignalStrength : NotImplemented\n");
232 CScanningTunner::TriggerSignalEvents(
235 OutputDebugStringW(L
"CScanningTunner::TriggerSignalEvents : NotImplemented\n");
239 //-------------------------------------------------------------------
243 CScanningTunner::SeekUp()
245 OutputDebugStringW(L
"CScanningTunner::SeekUp : NotImplemented\n");
251 CScanningTunner::SeekDown()
253 OutputDebugStringW(L
"CScanningTunner::SeekDown : NotImplemented\n");
259 CScanningTunner::ScanUp(
260 long MillisecondsPause
)
262 OutputDebugStringW(L
"CScanningTunner::ScanUp : NotImplemented\n");
268 CScanningTunner::ScanDown(
269 long MillisecondsPause
)
271 OutputDebugStringW(L
"CScanningTunner::ScanDown : NotImplemented\n");
277 CScanningTunner::AutoProgram()
279 OutputDebugStringW(L
"CScanningTunner::AutoProgram : NotImplemented\n");
283 //-------------------------------------------------------------------
286 CScanningTunner::performDVBTTune(
287 IDVBTuneRequest
* pDVBTRequest
,
288 IDVBTLocator
*pDVBTLocator
)
292 IBDA_Topology
*pTopo
;
294 IBDA_FrequencyFilter
* pFrequency
;
295 IBDA_LNBInfo
* pLnbInfo
;
296 IBDA_DigitalDemodulator
*pDigitalDemo
;
300 FECMethod InnerFEC
, OuterFEC
;
301 BinaryConvolutionCodeRate InnerFECRate
, OuterFECRate
;
302 ModulationType Modulation
;
304 pDVBTLocator
->get_Bandwidth(&BandWidth
);
305 pDVBTLocator
->get_CarrierFrequency(&Frequency
);
306 pDVBTLocator
->get_InnerFEC(&InnerFEC
);
307 pDVBTLocator
->get_InnerFECRate(&InnerFECRate
);
308 pDVBTLocator
->get_Modulation(&Modulation
);
309 pDVBTLocator
->get_OuterFEC(&OuterFEC
);
310 pDVBTLocator
->get_OuterFECRate(&OuterFECRate
);
311 pDVBTLocator
->get_SymbolRate(&SymbolRate
);
315 swprintf(Buffer
, L
"BandWidth %lu Frequency %lu Rate %lu InnerFEC %ld OuterFEC %ld InnerFECRate %ld OuterFECRate %ld Modulation %lu\n",
316 BandWidth
, Frequency
, SymbolRate
, InnerFEC
, OuterFEC
, InnerFECRate
, OuterFECRate
, Modulation
);
318 OutputDebugStringW(Buffer
);
322 for(Index
= 0; Index
< m_DeviceFilters
.size(); Index
++)
325 IUnknown
* pFilter
= m_DeviceFilters
[Index
];
330 hr
= pFilter
->QueryInterface(IID_IBDA_Topology
, (void**)&pTopo
);
332 assert(hr
== NOERROR
);
335 hr
= pTopo
->GetControlNode(0, 1, 0, &pNode
); //HACK
338 swprintf(Buffer
, L
"CScanningTunner::performDVBTTune GetControlNode %lx\n", hr
);
339 OutputDebugStringW(Buffer
);
345 assert(hr
== NOERROR
);
348 hr
= pNode
->QueryInterface(IID_IBDA_FrequencyFilter
, (void**)&pFrequency
);
350 swprintf(Buffer
, L
"CScanningTunner::performDVBTTune IID_IBDA_FrequencyFilter hr %lx\n", hr
);
351 OutputDebugStringW(Buffer
);
354 assert(hr
== NOERROR
);
356 hr
= SetFrequency(pFrequency
, 1000 /* FIXME */, Frequency
, BDA_POLARISATION_NOT_DEFINED
/* FIXME */, BDA_RANGE_NOT_SET
/* FIXME */, BandWidth
);
358 swprintf(Buffer
, L
"CScanningTunner::performDVBTTune SetFrequency hr %lx\n", hr
);
359 OutputDebugStringW(Buffer
);
362 assert(hr
== NOERROR
);
365 pFrequency
->Release();
368 hr
= pNode
->QueryInterface(IID_IBDA_LNBInfo
, (void**)&pLnbInfo
);
370 swprintf(Buffer
, L
"CScanningTunner::performDVBTTune IID_IBDA_LNBInfo hr %lx\n", hr
);
371 OutputDebugStringW(Buffer
);
374 assert(hr
== NOERROR
);
376 hr
= SetLnbInfo(pLnbInfo
, ULONG_MAX
/* FIXME */, ULONG_MAX
/* FIXME*/, ULONG_MAX
/*FIXME*/);
379 swprintf(Buffer
, L
"CScanningTunner::performDVBTTune SetLnbInfo hr %lx\n", hr
);
380 OutputDebugStringW(Buffer
);
383 assert(hr
== NOERROR
);
388 hr
= pNode
->QueryInterface(IID_IBDA_DigitalDemodulator
, (void**)&pDigitalDemo
);
390 swprintf(Buffer
, L
"CScanningTunner::performDVBTTune IID_IBDA_DigitalDemodulator hr %lx\n", hr
);
391 OutputDebugStringW(Buffer
);
394 assert(hr
== NOERROR
);
396 hr
= SetDigitalDemodulator(pDigitalDemo
, Modulation
, InnerFEC
, InnerFECRate
, OuterFEC
, OuterFECRate
, SymbolRate
);
398 swprintf(Buffer
, L
"CScanningTunner::performDVBTTune SetDigitalDemodulator hr %lx\n", hr
);
399 OutputDebugStringW(Buffer
);
402 assert(hr
== NOERROR
);
405 pDigitalDemo
->Release();
407 // release control node
410 // release IBDA_Topology;
421 CScanningTunner::CheckChanges()
424 HRESULT hResult
= NOERROR
;
425 IBDA_DeviceControl
* pDeviceControl
;
427 for(Index
= 0; Index
< m_DeviceFilters
.size(); Index
++)
430 IUnknown
* pFilter
= m_DeviceFilters
[Index
];
435 // query for IBDA_DeviceControl interface
436 hResult
= pFilter
->QueryInterface(IID_IBDA_DeviceControl
, (void**)&pDeviceControl
);
439 assert(hResult
== NOERROR
);
442 hResult
= pDeviceControl
->CheckChanges();
444 // fix for unimplemented
445 if (hResult
== E_NOTIMPL
)
449 pDeviceControl
->Release();
463 CScanningTunner::CommitChanges()
466 HRESULT hResult
= NOERROR
;
467 IBDA_DeviceControl
* pDeviceControl
;
469 for(Index
= 0; Index
< m_DeviceFilters
.size(); Index
++)
472 IUnknown
* pFilter
= m_DeviceFilters
[Index
];
477 // query for IBDA_DeviceControl interface
478 HRESULT hr
= pFilter
->QueryInterface(IID_IBDA_DeviceControl
, (void**)&pDeviceControl
);
481 assert(hr
== NOERROR
);
484 hr
= pDeviceControl
->CommitChanges();
486 // fix for unimplemented
492 pDeviceControl
->StartChanges();
493 pDeviceControl
->CommitChanges();
494 hResult
= E_UNEXPECTED
;
498 pDeviceControl
->Release();
508 CScanningTunner::StartChanges()
511 IBDA_DeviceControl
* pDeviceControl
;
513 for(Index
= 0; Index
< m_DeviceFilters
.size(); Index
++)
516 IUnknown
* pFilter
= m_DeviceFilters
[Index
];
521 // query for IBDA_DeviceControl interface
522 HRESULT hr
= pFilter
->QueryInterface(IID_IBDA_DeviceControl
, (void**)&pDeviceControl
);
525 assert(hr
== NOERROR
);
528 hr
= pDeviceControl
->StartChanges();
531 pDeviceControl
->Release();
533 // fix for unimplemented
542 // now commit the changes
543 for(Index
= 0; Index
< m_DeviceFilters
.size(); Index
++)
546 IUnknown
* pFilter
= m_DeviceFilters
[Index
];
551 // query for IBDA_DeviceControl interface
552 HRESULT hr
= pFilter
->QueryInterface(IID_IBDA_DeviceControl
, (void**)&pDeviceControl
);
555 assert(hr
== NOERROR
);
557 hr
= pDeviceControl
->CommitChanges();
560 pDeviceControl
->Release();
569 CScanningTunner::SetLnbInfo(
570 IBDA_LNBInfo
* pLnbInfo
,
573 ULONG ulSwitchFrequency
)
577 hr
= pLnbInfo
->put_LocalOscillatorFrequencyLowBand(ulLOFLow
);
578 if (hr
== MAKE_HRESULT(SEVERITY_ERROR
, FACILITY_WIN32
, ERROR_NOT_FOUND
) || hr
== MAKE_HRESULT(SEVERITY_ERROR
, FACILITY_WIN32
, ERROR_SET_NOT_FOUND
))
584 hr
= pLnbInfo
->put_LocalOscillatorFrequencyHighBand(ulLOFHigh
);
585 if (hr
== MAKE_HRESULT(SEVERITY_ERROR
, FACILITY_WIN32
, ERROR_NOT_FOUND
) || hr
== MAKE_HRESULT(SEVERITY_ERROR
, FACILITY_WIN32
, ERROR_SET_NOT_FOUND
))
591 hr
= pLnbInfo
->put_HighLowSwitchFrequency(ulSwitchFrequency
);
592 if (hr
== MAKE_HRESULT(SEVERITY_ERROR
, FACILITY_WIN32
, ERROR_NOT_FOUND
) || hr
== MAKE_HRESULT(SEVERITY_ERROR
, FACILITY_WIN32
, ERROR_SET_NOT_FOUND
))
599 CScanningTunner::SetFrequency(
600 IBDA_FrequencyFilter
* pFrequency
,
601 ULONG FrequencyMultiplier
,
603 Polarisation Polarity
,
609 hr
= pFrequency
->put_FrequencyMultiplier(FrequencyMultiplier
);
613 hr
= pFrequency
->put_Frequency(Frequency
);
617 hr
= pFrequency
->put_Polarity(Polarity
);
618 if (hr
== MAKE_HRESULT(SEVERITY_ERROR
, FACILITY_WIN32
, ERROR_NOT_FOUND
))
624 hr
= pFrequency
->put_Range(Range
);
625 if (hr
== MAKE_HRESULT(SEVERITY_ERROR
, FACILITY_WIN32
, ERROR_NOT_FOUND
))
631 hr
= pFrequency
->put_Bandwidth(Bandwidth
);
637 CScanningTunner::SetDigitalDemodulator(
638 IBDA_DigitalDemodulator
* pDigitalDemo
,
639 ModulationType ModType
,
641 BinaryConvolutionCodeRate InnerFECRate
,
643 BinaryConvolutionCodeRate OuterFECRate
,
648 hr
= pDigitalDemo
->put_ModulationType(&ModType
);
649 if (hr
== MAKE_HRESULT(SEVERITY_ERROR
, FACILITY_WIN32
, ERROR_NOT_FOUND
) || hr
== MAKE_HRESULT(SEVERITY_ERROR
, FACILITY_WIN32
, ERROR_SET_NOT_FOUND
))
655 hr
= pDigitalDemo
->put_InnerFECMethod(&InnerFEC
);
656 if (hr
== MAKE_HRESULT(SEVERITY_ERROR
, FACILITY_WIN32
, ERROR_NOT_FOUND
) || hr
== MAKE_HRESULT(SEVERITY_ERROR
, FACILITY_WIN32
, ERROR_SET_NOT_FOUND
))
661 hr
= pDigitalDemo
->put_InnerFECRate(&InnerFECRate
);
662 if (hr
== MAKE_HRESULT(SEVERITY_ERROR
, FACILITY_WIN32
, ERROR_NOT_FOUND
) || hr
== MAKE_HRESULT(SEVERITY_ERROR
, FACILITY_WIN32
, ERROR_SET_NOT_FOUND
))
667 hr
= pDigitalDemo
->put_OuterFECMethod(&OuterFEC
);
668 if (hr
== MAKE_HRESULT(SEVERITY_ERROR
, FACILITY_WIN32
, ERROR_NOT_FOUND
) || hr
== MAKE_HRESULT(SEVERITY_ERROR
, FACILITY_WIN32
, ERROR_SET_NOT_FOUND
))
673 hr
= pDigitalDemo
->put_OuterFECRate(&OuterFECRate
);
674 if (hr
== MAKE_HRESULT(SEVERITY_ERROR
, FACILITY_WIN32
, ERROR_NOT_FOUND
) || hr
== MAKE_HRESULT(SEVERITY_ERROR
, FACILITY_WIN32
, ERROR_SET_NOT_FOUND
))
679 hr
= pDigitalDemo
->put_SymbolRate(&SymbolRate
);
680 if (hr
== MAKE_HRESULT(SEVERITY_ERROR
, FACILITY_WIN32
, ERROR_NOT_FOUND
) || hr
== MAKE_HRESULT(SEVERITY_ERROR
, FACILITY_WIN32
, ERROR_SET_NOT_FOUND
))
685 SpectralInversion Inversion
= BDA_SPECTRAL_INVERSION_NOT_DEFINED
;
686 hr
= pDigitalDemo
->put_SpectralInversion(&Inversion
);
687 if (hr
== MAKE_HRESULT(SEVERITY_ERROR
, FACILITY_WIN32
, ERROR_NOT_FOUND
) || hr
== MAKE_HRESULT(SEVERITY_ERROR
, FACILITY_WIN32
, ERROR_SET_NOT_FOUND
))
696 CScanningTunner_fnConstructor(
697 std::vector
<IUnknown
*> & DeviceFilter
,
701 CScanningTunner
* handler
= new CScanningTunner(DeviceFilter
);
704 WCHAR Buffer
[MAX_PATH
];
706 StringFromCLSID(riid
, &lpstr
);
707 swprintf(Buffer
, L
"CScanningTunner_fnConstructor riid %s\n", lpstr
);
708 OutputDebugStringW(Buffer
);
712 return E_OUTOFMEMORY
;
714 if (FAILED(handler
->QueryInterface(riid
, ppv
)))
718 return E_NOINTERFACE
;