Sync with trunk r43123
[reactos.git] / reactos / drivers / wdm / audio / backpln / portcls / filter_topology.cpp
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/wdm/audio/backpln/portcls/filter_topology.c
5 * PURPOSE: portcls topology filter
6 * PROGRAMMER: Johannes Anderwald
7 */
8
9 #include "private.hpp"
10
11 class CPortFilterTopology : public IPortFilterTopology
12 {
13 public:
14 STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
15
16 STDMETHODIMP_(ULONG) AddRef()
17 {
18 InterlockedIncrement(&m_Ref);
19 return m_Ref;
20 }
21 STDMETHODIMP_(ULONG) Release()
22 {
23 InterlockedDecrement(&m_Ref);
24
25 if (!m_Ref)
26 {
27 delete this;
28 return 0;
29 }
30 return m_Ref;
31 }
32 IMP_IPortFilterTopology;
33 CPortFilterTopology(IUnknown *OuterUnknown){}
34 virtual ~CPortFilterTopology(){}
35
36 protected:
37 IPortTopology * m_Port;
38 SUBDEVICE_DESCRIPTOR * m_Descriptor;
39 ISubdevice * m_SubDevice;
40 LONG m_Ref;
41 };
42
43
44 NTSTATUS
45 NTAPI
46 CPortFilterTopology::QueryInterface(
47 IN REFIID refiid,
48 OUT PVOID* Output)
49 {
50
51 if (IsEqualGUIDAligned(refiid, IID_IIrpTarget) ||
52 IsEqualGUIDAligned(refiid, IID_IUnknown))
53 {
54 *Output = PVOID(PUNKNOWN(this));
55 PUNKNOWN(*Output)->AddRef();
56 return STATUS_SUCCESS;
57 }
58 else if (IsEqualGUIDAligned(refiid, IID_IPort))
59 {
60 *Output = PVOID(PUNKNOWN(m_Port));
61 PUNKNOWN(*Output)->AddRef();
62 return STATUS_SUCCESS;
63 }
64
65 return STATUS_UNSUCCESSFUL;
66 }
67
68 NTSTATUS
69 NTAPI
70 CPortFilterTopology::NewIrpTarget(
71 OUT struct IIrpTarget **OutTarget,
72 IN WCHAR * Name,
73 IN PUNKNOWN Unknown,
74 IN POOL_TYPE PoolType,
75 IN PDEVICE_OBJECT DeviceObject,
76 IN PIRP Irp,
77 IN KSOBJECT_CREATE *CreateObject)
78 {
79 DPRINT("CPortFilterTopology::NewIrpTarget entered\n");
80
81 return STATUS_NOT_SUPPORTED;
82 }
83
84
85 NTSTATUS
86 NTAPI
87 CPortFilterTopology::DeviceIoControl(
88 IN PDEVICE_OBJECT DeviceObject,
89 IN PIRP Irp)
90 {
91 PIO_STACK_LOCATION IoStack;
92
93 IoStack = IoGetCurrentIrpStackLocation(Irp);
94 PC_ASSERT(IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY);
95
96 return PcPropertyHandler(Irp, m_Descriptor);
97 }
98
99 NTSTATUS
100 NTAPI
101 CPortFilterTopology::Read(
102 IN PDEVICE_OBJECT DeviceObject,
103 IN PIRP Irp)
104 {
105 return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
106 }
107
108 NTSTATUS
109 NTAPI
110 CPortFilterTopology::Write(
111 IN PDEVICE_OBJECT DeviceObject,
112 IN PIRP Irp)
113 {
114 return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
115 }
116
117 NTSTATUS
118 NTAPI
119 CPortFilterTopology::Flush(
120 IN PDEVICE_OBJECT DeviceObject,
121 IN PIRP Irp)
122 {
123 return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
124 }
125
126 NTSTATUS
127 NTAPI
128 CPortFilterTopology::Close(
129 IN PDEVICE_OBJECT DeviceObject,
130 IN PIRP Irp)
131 {
132 NTSTATUS Status = STATUS_SUCCESS;
133
134 // FIXME handle DirectSound
135
136 #if 0
137 //FIXME
138 if (m_ref == 1)
139 {
140 // release reference to port
141 This->SubDevice->lpVtbl->Release(This->SubDevice);
142
143 // time to shutdown the audio system
144 Status = This->SubDevice->lpVtbl->ReleaseChildren(This->SubDevice);
145 }
146 #endif
147
148 Irp->IoStatus.Status = Status;
149 Irp->IoStatus.Information = 0;
150 IoCompleteRequest(Irp, IO_NO_INCREMENT);
151
152 return STATUS_SUCCESS;
153 }
154
155 NTSTATUS
156 NTAPI
157 CPortFilterTopology::QuerySecurity(
158 IN PDEVICE_OBJECT DeviceObject,
159 IN PIRP Irp)
160 {
161 return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
162 }
163
164 NTSTATUS
165 NTAPI
166 CPortFilterTopology::SetSecurity(
167 IN PDEVICE_OBJECT DeviceObject,
168 IN PIRP Irp)
169 {
170 return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
171 }
172
173 BOOLEAN
174 NTAPI
175 CPortFilterTopology::FastDeviceIoControl(
176 IN PFILE_OBJECT FileObject,
177 IN BOOLEAN Wait,
178 IN PVOID InputBuffer,
179 IN ULONG InputBufferLength,
180 OUT PVOID OutputBuffer,
181 IN ULONG OutputBufferLength,
182 IN ULONG IoControlCode,
183 OUT PIO_STATUS_BLOCK StatusBlock,
184 IN PDEVICE_OBJECT DeviceObject)
185 {
186 return FALSE;
187 }
188
189 BOOLEAN
190 NTAPI
191 CPortFilterTopology::FastRead(
192 IN PFILE_OBJECT FileObject,
193 IN PLARGE_INTEGER FileOffset,
194 IN ULONG Length,
195 IN BOOLEAN Wait,
196 IN ULONG LockKey,
197 IN PVOID Buffer,
198 OUT PIO_STATUS_BLOCK StatusBlock,
199 IN PDEVICE_OBJECT DeviceObject)
200 {
201 return FALSE;
202 }
203
204 BOOLEAN
205 NTAPI
206 CPortFilterTopology::FastWrite(
207 IN PFILE_OBJECT FileObject,
208 IN PLARGE_INTEGER FileOffset,
209 IN ULONG Length,
210 IN BOOLEAN Wait,
211 IN ULONG LockKey,
212 IN PVOID Buffer,
213 OUT PIO_STATUS_BLOCK StatusBlock,
214 IN PDEVICE_OBJECT DeviceObject)
215 {
216 return FALSE;
217 }
218
219 NTSTATUS
220 NTAPI
221 CPortFilterTopology::Init(
222 IN IPortTopology* Port)
223 {
224 ISubdevice * ISubDevice;
225 SUBDEVICE_DESCRIPTOR * Descriptor;
226 NTSTATUS Status;
227
228
229 // get our private interface
230 Status = Port->QueryInterface(IID_ISubdevice, (PVOID*)&ISubDevice);
231 if (!NT_SUCCESS(Status))
232 return STATUS_UNSUCCESSFUL;
233
234 // get the subdevice descriptor
235 Status = ISubDevice->GetDescriptor(&Descriptor);
236
237 // store subdevice interface
238 m_SubDevice = ISubDevice;
239
240 if (!NT_SUCCESS(Status))
241 return STATUS_UNSUCCESSFUL;
242
243 // save descriptor
244 m_Descriptor = Descriptor;
245
246 // store port object
247 m_Port = Port;
248
249 return STATUS_SUCCESS;
250 }
251
252 NTSTATUS
253 NewPortFilterTopology(
254 OUT IPortFilterTopology ** OutFilter)
255 {
256 CPortFilterTopology * This;
257
258 This = new(NonPagedPool, TAG_PORTCLASS)CPortFilterTopology(NULL);
259 if (!This)
260 return STATUS_INSUFFICIENT_RESOURCES;
261
262 This->AddRef();
263
264 // return result
265 *OutFilter = (CPortFilterTopology*)This;
266
267 return STATUS_SUCCESS;
268 }