sync with trunk (r46275)
[reactos.git] / dll / directx / bdaplgin / signalstatistics.cpp
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 (janderwald@reactos.org)
8 */
9
10 #include "precomp.h"
11
12 const GUID IID_IBDA_SignalStatistics = {0x1347d106, 0xcf3a, 0x428a, {0xa5, 0xcb, 0xac, 0x0d, 0x9a, 0x2a, 0x43, 0x38}};
13 const GUID KSPROPSETID_BdaSignalStats = {0x1347d106, 0xcf3a, 0x428a, {0xa5, 0xcb, 0xac, 0xd, 0x9a, 0x2a, 0x43, 0x38}};
14
15 class CBDASignalStatistics : public IBDA_SignalStatistics
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
36 // IBDA_SignalStatistics methods
37 HRESULT STDMETHODCALLTYPE put_SignalStrength(LONG lDbStrength);
38 HRESULT STDMETHODCALLTYPE get_SignalStrength(LONG *plDbStrength);
39 HRESULT STDMETHODCALLTYPE put_SignalQuality(LONG lPercentQuality);
40 HRESULT STDMETHODCALLTYPE get_SignalQuality(LONG *plPercentQuality);
41 HRESULT STDMETHODCALLTYPE put_SignalPresent(BOOLEAN fPresent);
42 HRESULT STDMETHODCALLTYPE get_SignalPresent(BOOLEAN *pfPresent);
43 HRESULT STDMETHODCALLTYPE put_SignalLocked(BOOLEAN fLocked);
44 HRESULT STDMETHODCALLTYPE get_SignalLocked(BOOLEAN *pfLocked);
45 HRESULT STDMETHODCALLTYPE put_SampleTime(LONG lmsSampleTime);
46 HRESULT STDMETHODCALLTYPE get_SampleTime(LONG *plmsSampleTime);
47
48 CBDASignalStatistics(HANDLE hFile, ULONG NodeId) : m_Ref(0), m_hFile(hFile), m_NodeId(NodeId){};
49 ~CBDASignalStatistics(){};
50
51 protected:
52 LONG m_Ref;
53 HANDLE m_hFile;
54 ULONG m_NodeId;
55 };
56
57 HRESULT
58 STDMETHODCALLTYPE
59 CBDASignalStatistics::QueryInterface(
60 IN REFIID refiid,
61 OUT PVOID* Output)
62 {
63 *Output = NULL;
64
65 if (IsEqualGUID(refiid, IID_IUnknown))
66 {
67 *Output = PVOID(this);
68 reinterpret_cast<IUnknown*>(*Output)->AddRef();
69 return NOERROR;
70 }
71
72 if (IsEqualGUID(refiid, IID_IBDA_SignalStatistics))
73 {
74 *Output = (IBDA_SignalStatistics*)(this);
75 reinterpret_cast<IBDA_SignalStatistics*>(*Output)->AddRef();
76 return NOERROR;
77 }
78
79 return E_NOINTERFACE;
80 }
81
82 HRESULT
83 STDMETHODCALLTYPE
84 CBDASignalStatistics::put_SignalStrength(LONG lDbStrength)
85 {
86 return E_NOINTERFACE;
87 }
88
89 HRESULT
90 STDMETHODCALLTYPE
91 CBDASignalStatistics::get_SignalStrength(LONG *plDbStrength)
92 {
93 KSP_NODE Node;
94 HRESULT hr;
95 ULONG BytesReturned;
96
97 // setup request
98 Node.Property.Set = KSPROPSETID_BdaSignalStats;
99 Node.Property.Id = KSPROPERTY_BDA_SIGNAL_STRENGTH;
100 Node.Property.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY;
101 Node.NodeId = (ULONG)-1;
102
103 // perform request
104 hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), plDbStrength, sizeof(LONG), &BytesReturned);
105
106 #ifdef BDAPLGIN_TRACE
107 WCHAR Buffer[100];
108 swprintf(Buffer, L"CBDASignalStatistics::get_SignalStrength: m_NodeId %lu hr %lx, BytesReturned %lu plDbStrength %ld\n", m_NodeId, hr, BytesReturned, *plDbStrength);
109 OutputDebugStringW(Buffer);
110 #endif
111
112 return hr;
113 }
114
115 HRESULT
116 STDMETHODCALLTYPE
117 CBDASignalStatistics::put_SignalQuality(LONG lPercentQuality)
118 {
119 return E_NOINTERFACE;
120 }
121
122 HRESULT
123 STDMETHODCALLTYPE
124 CBDASignalStatistics::get_SignalQuality(LONG *plPercentQuality)
125 {
126 KSP_NODE Node;
127 HRESULT hr;
128 ULONG BytesReturned;
129
130 // setup request
131 Node.Property.Set = KSPROPSETID_BdaSignalStats;
132 Node.Property.Id = KSPROPERTY_BDA_SIGNAL_QUALITY;
133 Node.Property.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY;
134 Node.NodeId = (ULONG)-1;
135
136 // perform request
137 hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), plPercentQuality, sizeof(LONG), &BytesReturned);
138
139 #ifdef BDAPLGIN_TRACE
140 WCHAR Buffer[100];
141 swprintf(Buffer, L"CBDASignalStatistics::get_SignalQuality: m_NodeId %lu hr %lx, BytesReturned %lu plPercentQuality %lu\n", m_NodeId, hr, BytesReturned, *plPercentQuality);
142 OutputDebugStringW(Buffer);
143 #endif
144
145 return hr;
146 }
147
148 HRESULT
149 STDMETHODCALLTYPE
150 CBDASignalStatistics::put_SignalPresent(BOOLEAN fPresent)
151 {
152 return E_NOINTERFACE;
153 }
154
155 HRESULT
156 STDMETHODCALLTYPE
157 CBDASignalStatistics::get_SignalPresent(BOOLEAN *pfPresent)
158 {
159 KSP_NODE Node;
160 HRESULT hr;
161 ULONG Present;
162 ULONG BytesReturned;
163
164 // setup request
165 Node.Property.Set = KSPROPSETID_BdaSignalStats;
166 Node.Property.Id = KSPROPERTY_BDA_SIGNAL_PRESENT;
167 Node.Property.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY;
168 Node.NodeId = (ULONG)-1;
169
170 // perform request
171 hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &Present, sizeof(ULONG), &BytesReturned);
172 // store result
173 *pfPresent = Present;
174
175 #ifdef BDAPLGIN_TRACE
176 WCHAR Buffer[100];
177 swprintf(Buffer, L"CBDASignalStatistics::get_SignalPresent: m_NodeId %lu hr %lx, BytesReturned %lu Present %lu\n", m_NodeId, hr, BytesReturned, Present);
178 OutputDebugStringW(Buffer);
179 #endif
180
181 return hr;
182 }
183
184 HRESULT
185 STDMETHODCALLTYPE
186 CBDASignalStatistics::put_SignalLocked(BOOLEAN fLocked)
187 {
188 return E_NOINTERFACE;
189 }
190
191 HRESULT
192 STDMETHODCALLTYPE
193 CBDASignalStatistics::get_SignalLocked(BOOLEAN *pfLocked)
194 {
195 KSP_NODE Node;
196 HRESULT hr;
197 ULONG Locked;
198 ULONG BytesReturned;
199
200 // setup request
201 Node.Property.Set = KSPROPSETID_BdaSignalStats;
202 Node.Property.Id = KSPROPERTY_BDA_SIGNAL_LOCKED;
203 Node.Property.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY;
204 Node.NodeId = (ULONG)-1;
205
206 // perform request
207 hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &Locked, sizeof(ULONG), &BytesReturned);
208 *pfLocked = Locked;
209
210 #ifdef BDAPLGIN_TRACE
211 WCHAR Buffer[100];
212 swprintf(Buffer, L"CBDASignalStatistics::get_SignalLocked: m_NodeId %lu hr %lx, BytesReturned %lu Locked %lu\n", m_NodeId, hr, BytesReturned, Locked);
213 OutputDebugStringW(Buffer);
214 #endif
215
216 return hr;
217 }
218
219 HRESULT
220 STDMETHODCALLTYPE
221 CBDASignalStatistics::put_SampleTime(LONG lmsSampleTime)
222 {
223 KSP_NODE Node;
224 HRESULT hr;
225 ULONG BytesReturned;
226
227 // setup request
228 Node.Property.Set = KSPROPSETID_BdaSignalStats;
229 Node.Property.Id = KSPROPERTY_BDA_SAMPLE_TIME;
230 Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
231 Node.NodeId = (ULONG)-1;
232
233 // perform request
234 hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &lmsSampleTime, sizeof(LONG), &BytesReturned);
235
236 #ifdef BDAPLGIN_TRACE
237 WCHAR Buffer[100];
238 swprintf(Buffer, L"CBDASignalStatistics::put_SampleTime: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned);
239 OutputDebugStringW(Buffer);
240 #endif
241
242 return hr;
243 }
244
245 HRESULT
246 STDMETHODCALLTYPE
247 CBDASignalStatistics::get_SampleTime(LONG *plmsSampleTime)
248 {
249 KSP_NODE Node;
250 HRESULT hr;
251 ULONG BytesReturned;
252
253 // setup request
254 Node.Property.Set = KSPROPSETID_BdaSignalStats;
255 Node.Property.Id = KSPROPERTY_BDA_SAMPLE_TIME;
256 Node.Property.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY;
257 Node.NodeId = (ULONG)-1;
258
259 // perform request
260 hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), plmsSampleTime, sizeof(LONG), &BytesReturned);
261
262 #ifdef BDAPLGIN_TRACE
263 WCHAR Buffer[100];
264 swprintf(Buffer, L"CBDASignalStatistics::get_SampleTime: m_NodeId %lu hr %lx, BytesReturned %lu \n", m_NodeId, hr, BytesReturned);
265 OutputDebugStringW(Buffer);
266 #endif
267
268 return hr;
269 }
270
271 HRESULT
272 WINAPI
273 CBDASignalStatistics_fnConstructor(
274 HANDLE hFile,
275 ULONG NodeId,
276 REFIID riid,
277 LPVOID * ppv)
278 {
279 // construct device control
280 CBDASignalStatistics * handler = new CBDASignalStatistics(hFile, NodeId);
281
282 #ifdef BDAPLGIN_TRACE
283 OutputDebugStringW(L"CBDASignalStatistics_fnConstructor\n");
284 #endif
285
286 if (!handler)
287 return E_OUTOFMEMORY;
288
289 if (FAILED(handler->QueryInterface(riid, ppv)))
290 {
291 /* not supported */
292 delete handler;
293 return E_NOINTERFACE;
294 }
295
296 return NOERROR;
297 }