1 /*
2  * COPYRIGHT:       See COPYING in the top level directory
3  * PROJECT:         ReactOS BDA Proxy
4  * FILE:            dll/directx/bdaplgin/frequencyfilter.cpp
5  * PURPOSE:         IBDA_FrequencyFilter interface
6  *
7  * PROGRAMMERS:     Johannes Anderwald (johannes.anderwald@reactos.org)
8  */
9 
10 #include "precomp.h"
11 
12 #ifndef _MSC_VER
13 const GUID IID_IBDA_FrequencyFilter = {0x71985f47, 0x1ca1, 0x11d3, {0x9c, 0xc8, 0x00, 0xc0, 0x4f, 0x79, 0x71, 0xe0}};
14 const GUID KSPROPSETID_BdaFrequencyFilter = {0x71985f47, 0x1ca1, 0x11d3, {0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}};
15 #endif
16 
17 class CBDAFrequencyFilter : public IBDA_FrequencyFilter
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 
38     HRESULT STDMETHODCALLTYPE put_Autotune(ULONG ulTransponder);
39     HRESULT STDMETHODCALLTYPE get_Autotune(ULONG *pulTransponder);
40     HRESULT STDMETHODCALLTYPE put_Frequency(ULONG ulFrequency);
41     HRESULT STDMETHODCALLTYPE get_Frequency(ULONG *pulFrequency);
42     HRESULT STDMETHODCALLTYPE put_Polarity(Polarisation Polarity);
43     HRESULT STDMETHODCALLTYPE get_Polarity(Polarisation *pPolarity);
44     HRESULT STDMETHODCALLTYPE put_Range(ULONG ulRange);
45     HRESULT STDMETHODCALLTYPE get_Range(ULONG *pulRange);
46     HRESULT STDMETHODCALLTYPE put_Bandwidth(ULONG ulBandwidth);
47     HRESULT STDMETHODCALLTYPE get_Bandwidth(ULONG *pulBandwidth);
48     HRESULT STDMETHODCALLTYPE put_FrequencyMultiplier(ULONG ulMultiplier);
49     HRESULT STDMETHODCALLTYPE get_FrequencyMultiplier(ULONG *pulMultiplier);
50 
51     CBDAFrequencyFilter(IKsPropertySet * pProperty, ULONG NodeId) : m_Ref(0), m_pProperty(pProperty), m_NodeId(NodeId){};
52     virtual ~CBDAFrequencyFilter(){};
53 
54 protected:
55     LONG m_Ref;
56     IKsPropertySet * m_pProperty;
57     ULONG m_NodeId;
58 };
59 
60 HRESULT
61 STDMETHODCALLTYPE
62 CBDAFrequencyFilter::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_FrequencyFilter))
76     {
77         *Output = (IBDA_FrequencyFilter*)(this);
78         reinterpret_cast<IBDA_FrequencyFilter*>(*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"CControlNode::QueryInterface: NoInterface for %s", lpstr);
87     OutputDebugStringW(Buffer);
88     CoTaskMemFree(lpstr);
89 DebugBreak();
90 #endif
91 
92     return E_NOINTERFACE;
93 }
94 
95 HRESULT
96 STDMETHODCALLTYPE
97 CBDAFrequencyFilter::put_Autotune(ULONG ulTransponder)
98 {
99     return E_NOINTERFACE;
100 }
101 
102 HRESULT
103 STDMETHODCALLTYPE
104 CBDAFrequencyFilter::get_Autotune(ULONG *pulTransponder)
105 {
106     return E_NOINTERFACE;
107 }
108 
109 HRESULT
110 STDMETHODCALLTYPE
111 CBDAFrequencyFilter::put_Frequency(ULONG ulFrequency)
112 {
113     KSP_NODE Node;
114     HRESULT hr;
115 
116     // setup request
117     Node.NodeId = m_NodeId;
118     Node.Reserved = 0;
119 
120     // perform request
121     hr = m_pProperty->Set(KSPROPSETID_BdaFrequencyFilter, KSPROPERTY_BDA_RF_TUNER_FREQUENCY, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &ulFrequency, sizeof(ULONG));
122 
123 #ifdef BDAPLGIN_TRACE
124     WCHAR Buffer[100];
125     swprintf(Buffer, L"CBDAFrequencyFilter::put_Frequency: m_NodeId %lu ulFrequency %lu hr %lx\n", m_NodeId, ulFrequency, hr);
126     OutputDebugStringW(Buffer);
127 #endif
128 
129     return hr;
130 }
131 
132 HRESULT
133 STDMETHODCALLTYPE
134 CBDAFrequencyFilter::get_Frequency(ULONG *pulFrequency)
135 {
136     return E_NOINTERFACE;
137 }
138 
139 HRESULT
140 STDMETHODCALLTYPE
141 CBDAFrequencyFilter::put_Polarity(Polarisation Polarity)
142 {
143     KSP_NODE Node;
144     HRESULT hr;
145 
146     // setup request
147     Node.NodeId = m_NodeId;
148     Node.Reserved = 0;
149 
150     // perform request
151     hr = m_pProperty->Set(KSPROPSETID_BdaFrequencyFilter, KSPROPERTY_BDA_RF_TUNER_POLARITY, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &Polarity, sizeof(Polarisation));
152 
153 #ifdef BDAPLGIN_TRACE
154     WCHAR Buffer[100];
155     swprintf(Buffer, L"CBDAFrequencyFilter::put_Polarity: m_NodeId %lu Polarity %lu hr %lx\n", m_NodeId, Polarity, hr);
156     OutputDebugStringW(Buffer);
157 #endif
158 
159     return hr;
160 }
161 
162 HRESULT
163 STDMETHODCALLTYPE
164 CBDAFrequencyFilter::get_Polarity(Polarisation *pPolarity)
165 {
166     return E_NOINTERFACE;
167 }
168 
169 HRESULT
170 STDMETHODCALLTYPE
171 CBDAFrequencyFilter::put_Range(ULONG ulRange)
172 {
173     KSP_NODE Node;
174     HRESULT hr;
175 
176     // setup request
177     Node.NodeId = m_NodeId;
178     Node.Reserved = 0;
179 
180     // perform request
181     hr = m_pProperty->Set(KSPROPSETID_BdaFrequencyFilter, KSPROPERTY_BDA_RF_TUNER_RANGE, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &ulRange, sizeof(ULONG));
182 
183 #ifdef BDAPLGIN_TRACE
184     WCHAR Buffer[100];
185     swprintf(Buffer, L"CBDAFrequencyFilter::put_Range: m_NodeId %lu ulRange %lu hr %lx\n", m_NodeId, ulRange, hr);
186     OutputDebugStringW(Buffer);
187 #endif
188 
189     return hr;
190 }
191 
192 HRESULT
193 STDMETHODCALLTYPE
194 CBDAFrequencyFilter::get_Range(ULONG *pulRange)
195 {
196     return E_NOINTERFACE;
197 }
198 
199 HRESULT
200 STDMETHODCALLTYPE
201 CBDAFrequencyFilter::put_Bandwidth(ULONG ulBandwidth)
202 {
203     KSP_NODE Node;
204     HRESULT hr;
205 
206     // setup request
207     Node.NodeId = m_NodeId;
208     Node.Reserved = 0;
209 
210     // perform request
211     hr = m_pProperty->Set(KSPROPSETID_BdaFrequencyFilter, KSPROPERTY_BDA_RF_TUNER_BANDWIDTH, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &ulBandwidth, sizeof(ULONG));
212 
213 #ifdef BDAPLGIN_TRACE
214     WCHAR Buffer[100];
215     swprintf(Buffer, L"CBDAFrequencyFilter::put_Bandwidth: m_NodeId %lu ulBandwidth %lu hr %lx\n", m_NodeId, ulBandwidth, hr);
216     OutputDebugStringW(Buffer);
217 #endif
218 
219     return hr;
220 }
221 
222 HRESULT
223 STDMETHODCALLTYPE
224 CBDAFrequencyFilter::get_Bandwidth(ULONG *pulBandwidth)
225 {
226     return E_NOINTERFACE;
227 }
228 HRESULT
229 STDMETHODCALLTYPE
230 CBDAFrequencyFilter::put_FrequencyMultiplier(ULONG ulMultiplier)
231 {
232     KSP_NODE Node;
233     HRESULT hr;
234 
235     // setup request
236     Node.NodeId = m_NodeId;
237     Node.Reserved = 0;
238 
239     // perform request
240     hr = m_pProperty->Set(KSPROPSETID_BdaFrequencyFilter, KSPROPERTY_BDA_RF_TUNER_FREQUENCY_MULTIPLIER, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &ulMultiplier, sizeof(ULONG));
241 
242 #ifdef BDAPLGIN_TRACE
243     WCHAR Buffer[100];
244     swprintf(Buffer, L"CBDAFrequencyFilter::put_FrequencyMultiplier: m_NodeId %lu ulMultiplier %lu hr %lx\n", m_NodeId, ulMultiplier, hr);
245     OutputDebugStringW(Buffer);
246 #endif
247 
248     return hr;
249 }
250 
251 HRESULT
252 STDMETHODCALLTYPE
253 CBDAFrequencyFilter::get_FrequencyMultiplier(ULONG *pulMultiplier)
254 {
255     return E_NOINTERFACE;
256 }
257 
258 HRESULT
259 WINAPI
260 CBDAFrequencyFilter_fnConstructor(
261     IKsPropertySet* pProperty,
262     ULONG NodeId,
263     REFIID riid,
264     LPVOID * ppv)
265 {
266     // construct device control
267     CBDAFrequencyFilter * handler = new CBDAFrequencyFilter(pProperty, NodeId);
268 
269 #ifdef BDAPLGIN_TRACE
270     OutputDebugStringW(L"CBDAFrequencyFilter_fnConstructor\n");
271 #endif
272 
273     if (!handler)
274         return E_OUTOFMEMORY;
275 
276     if (FAILED(handler->QueryInterface(riid, ppv)))
277     {
278         /* not supported */
279         delete handler;
280         return E_NOINTERFACE;
281     }
282 
283     return NOERROR;
284 }