Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenfilter_dmus.cpp
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS Kernel Streaming 00004 * FILE: drivers/wdm/audio/backpln/portcls/filter_dmus.cpp 00005 * PURPOSE: portcls wave pci filter 00006 * PROGRAMMER: Johannes Anderwald 00007 */ 00008 00009 #include "private.hpp" 00010 00011 class CPortFilterDMus : public IPortFilterDMus 00012 { 00013 public: 00014 STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); 00015 00016 STDMETHODIMP_(ULONG) AddRef() 00017 { 00018 InterlockedIncrement(&m_Ref); 00019 return m_Ref; 00020 } 00021 STDMETHODIMP_(ULONG) Release() 00022 { 00023 InterlockedDecrement(&m_Ref); 00024 00025 if (!m_Ref) 00026 { 00027 delete this; 00028 return 0; 00029 } 00030 return m_Ref; 00031 } 00032 IMP_IPortFilterDMus; 00033 CPortFilterDMus(IUnknown *OuterUnknown){} 00034 virtual ~CPortFilterDMus(){} 00035 00036 protected: 00037 IPortDMus* m_Port; 00038 IPortPinDMus ** m_Pins; 00039 SUBDEVICE_DESCRIPTOR * m_Descriptor; 00040 LONG m_Ref; 00041 }; 00042 00043 NTSTATUS 00044 NTAPI 00045 CPortFilterDMus::QueryInterface( 00046 IN REFIID refiid, 00047 OUT PVOID* Output) 00048 { 00049 00050 if (IsEqualGUIDAligned(refiid, IID_IIrpTarget) || 00051 IsEqualGUIDAligned(refiid, IID_IUnknown)) 00052 { 00053 *Output = PVOID(PUNKNOWN(this)); 00054 PUNKNOWN(*Output)->AddRef(); 00055 return STATUS_SUCCESS; 00056 } 00057 else if (IsEqualGUIDAligned(refiid, IID_IPort)) 00058 { 00059 *Output = PUNKNOWN(m_Port); 00060 PUNKNOWN(*Output)->AddRef(); 00061 return STATUS_SUCCESS; 00062 } 00063 00064 return STATUS_UNSUCCESSFUL; 00065 } 00066 00067 NTSTATUS 00068 NTAPI 00069 CPortFilterDMus::NewIrpTarget( 00070 OUT struct IIrpTarget **OutTarget, 00071 IN PCWSTR Name, 00072 IN PUNKNOWN Unknown, 00073 IN POOL_TYPE PoolType, 00074 IN PDEVICE_OBJECT DeviceObject, 00075 IN PIRP Irp, 00076 IN KSOBJECT_CREATE *CreateObject) 00077 { 00078 NTSTATUS Status; 00079 IPortPinDMus * Pin; 00080 PKSPIN_CONNECT ConnectDetails; 00081 00082 PC_ASSERT(m_Port); 00083 PC_ASSERT(m_Descriptor); 00084 PC_ASSERT(m_Pins); 00085 00086 DPRINT("CPortFilterDMus::NewIrpTarget entered\n"); 00087 00088 // let's verify the connection request 00089 Status = PcValidateConnectRequest(Irp, &m_Descriptor->Factory, &ConnectDetails); 00090 if (!NT_SUCCESS(Status)) 00091 { 00092 return STATUS_UNSUCCESSFUL; 00093 } 00094 00095 if (m_Pins[ConnectDetails->PinId] && m_Descriptor->Factory.Instances[ConnectDetails->PinId].CurrentPinInstanceCount) 00096 { 00097 // release existing instance 00098 PC_ASSERT(0); 00099 } 00100 00101 // now create the pin 00102 Status = NewPortPinDMus(&Pin); 00103 if (!NT_SUCCESS(Status)) 00104 { 00105 return Status; 00106 } 00107 00108 // initialize the pin 00109 Status = Pin->Init(m_Port, this, ConnectDetails, &m_Descriptor->Factory.KsPinDescriptor[ConnectDetails->PinId], DeviceObject); 00110 if (!NT_SUCCESS(Status)) 00111 { 00112 Pin->Release(); 00113 return Status; 00114 } 00115 00116 // store pin 00117 m_Pins[ConnectDetails->PinId] = Pin; 00118 00119 // store result 00120 *OutTarget = (IIrpTarget*)Pin; 00121 00122 // increment current instance count 00123 m_Descriptor->Factory.Instances[ConnectDetails->PinId].CurrentPinInstanceCount++; 00124 00125 return Status; 00126 } 00127 00128 NTSTATUS 00129 NTAPI 00130 CPortFilterDMus::DeviceIoControl( 00131 IN PDEVICE_OBJECT DeviceObject, 00132 IN PIRP Irp) 00133 { 00134 PIO_STACK_LOCATION IoStack; 00135 NTSTATUS Status; 00136 00137 IoStack = IoGetCurrentIrpStackLocation(Irp); 00138 00139 if (IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_PROPERTY) 00140 { 00141 DPRINT("Unhandled function %lx Length %x\n", IoStack->Parameters.DeviceIoControl.IoControlCode, IoStack->Parameters.DeviceIoControl.InputBufferLength); 00142 00143 Irp->IoStatus.Status = STATUS_SUCCESS; 00144 00145 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00146 return STATUS_SUCCESS; 00147 } 00148 00149 Status = PcHandlePropertyWithTable(Irp, m_Descriptor->FilterPropertySetCount, m_Descriptor->FilterPropertySet, m_Descriptor); 00150 if (Status != STATUS_PENDING) 00151 { 00152 Irp->IoStatus.Status = Status; 00153 DPRINT("Result %x Length %u\n", Status, Irp->IoStatus.Information); 00154 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00155 } 00156 return Status; 00157 } 00158 00159 NTSTATUS 00160 NTAPI 00161 CPortFilterDMus::Read( 00162 IN PDEVICE_OBJECT DeviceObject, 00163 IN PIRP Irp) 00164 { 00165 return KsDispatchInvalidDeviceRequest(DeviceObject, Irp); 00166 } 00167 00168 NTSTATUS 00169 NTAPI 00170 CPortFilterDMus::Write( 00171 IN PDEVICE_OBJECT DeviceObject, 00172 IN PIRP Irp) 00173 { 00174 return KsDispatchInvalidDeviceRequest(DeviceObject, Irp); 00175 } 00176 00177 NTSTATUS 00178 NTAPI 00179 CPortFilterDMus::Flush( 00180 IN PDEVICE_OBJECT DeviceObject, 00181 IN PIRP Irp) 00182 { 00183 return KsDispatchInvalidDeviceRequest(DeviceObject, Irp); 00184 } 00185 00186 NTSTATUS 00187 NTAPI 00188 CPortFilterDMus::Close( 00189 IN PDEVICE_OBJECT DeviceObject, 00190 IN PIRP Irp) 00191 { 00192 Irp->IoStatus.Status = STATUS_SUCCESS; 00193 Irp->IoStatus.Information = 0; 00194 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00195 00196 return STATUS_UNSUCCESSFUL; 00197 } 00198 00199 NTSTATUS 00200 NTAPI 00201 CPortFilterDMus::QuerySecurity( 00202 IN PDEVICE_OBJECT DeviceObject, 00203 IN PIRP Irp) 00204 { 00205 return KsDispatchInvalidDeviceRequest(DeviceObject, Irp); 00206 } 00207 00208 NTSTATUS 00209 NTAPI 00210 CPortFilterDMus::SetSecurity( 00211 IN PDEVICE_OBJECT DeviceObject, 00212 IN PIRP Irp) 00213 { 00214 return KsDispatchInvalidDeviceRequest(DeviceObject, Irp); 00215 } 00216 00217 BOOLEAN 00218 NTAPI 00219 CPortFilterDMus::FastDeviceIoControl( 00220 IN PFILE_OBJECT FileObject, 00221 IN BOOLEAN Wait, 00222 IN PVOID InputBuffer, 00223 IN ULONG InputBufferLength, 00224 OUT PVOID OutputBuffer, 00225 IN ULONG OutputBufferLength, 00226 IN ULONG IoControlCode, 00227 OUT PIO_STATUS_BLOCK StatusBlock, 00228 IN PDEVICE_OBJECT DeviceObject) 00229 { 00230 return FALSE; 00231 } 00232 00233 BOOLEAN 00234 NTAPI 00235 CPortFilterDMus::FastRead( 00236 IN PFILE_OBJECT FileObject, 00237 IN PLARGE_INTEGER FileOffset, 00238 IN ULONG Length, 00239 IN BOOLEAN Wait, 00240 IN ULONG LockKey, 00241 IN PVOID Buffer, 00242 OUT PIO_STATUS_BLOCK StatusBlock, 00243 IN PDEVICE_OBJECT DeviceObject) 00244 { 00245 UNIMPLEMENTED 00246 return FALSE; 00247 } 00248 00249 BOOLEAN 00250 NTAPI 00251 CPortFilterDMus::FastWrite( 00252 IN PFILE_OBJECT FileObject, 00253 IN PLARGE_INTEGER FileOffset, 00254 IN ULONG Length, 00255 IN BOOLEAN Wait, 00256 IN ULONG LockKey, 00257 IN PVOID Buffer, 00258 OUT PIO_STATUS_BLOCK StatusBlock, 00259 IN PDEVICE_OBJECT DeviceObject) 00260 { 00261 UNIMPLEMENTED 00262 return FALSE; 00263 } 00264 00265 NTSTATUS 00266 NTAPI 00267 CPortFilterDMus::Init( 00268 IN IPortDMus* Port) 00269 { 00270 ISubdevice * ISubDevice; 00271 NTSTATUS Status; 00272 00273 m_Port = Port; 00274 00275 // get our private interface 00276 Status = m_Port->QueryInterface(IID_ISubdevice, (PVOID*)&ISubDevice); 00277 if (!NT_SUCCESS(Status)) 00278 return STATUS_UNSUCCESSFUL; 00279 00280 // get the subdevice descriptor 00281 Status = ISubDevice->GetDescriptor(&m_Descriptor); 00282 00283 // release subdevice interface 00284 ISubDevice->Release(); 00285 00286 if (!NT_SUCCESS(Status)) 00287 return STATUS_UNSUCCESSFUL; 00288 00289 // allocate pin array 00290 m_Pins = (IPortPinDMus**)AllocateItem(NonPagedPool, m_Descriptor->Factory.PinDescriptorCount * sizeof(IPortPinDMus*), TAG_PORTCLASS); 00291 00292 if (!m_Pins) 00293 return STATUS_UNSUCCESSFUL; 00294 00295 // increment reference count 00296 Port->AddRef(); 00297 00298 return STATUS_SUCCESS; 00299 } 00300 00301 00302 NTSTATUS 00303 NTAPI 00304 CPortFilterDMus::FreePin( 00305 IN struct IPortPinDMus* Pin) 00306 { 00307 ULONG Index; 00308 00309 for(Index = 0; Index < m_Descriptor->Factory.PinDescriptorCount; Index++) 00310 { 00311 if (m_Pins[Index] == Pin) 00312 { 00313 m_Pins[Index]->Release(); 00314 m_Pins[Index] = NULL; 00315 return STATUS_SUCCESS; 00316 } 00317 } 00318 return STATUS_UNSUCCESSFUL; 00319 } 00320 00321 VOID 00322 NTAPI 00323 CPortFilterDMus::NotifyPins() 00324 { 00325 ULONG Index; 00326 00327 DPRINT("Notifying %u pins\n", m_Descriptor->Factory.PinDescriptorCount); 00328 00329 for(Index = 0; Index < m_Descriptor->Factory.PinDescriptorCount; Index++) 00330 { 00331 m_Pins[Index]->Notify(); 00332 } 00333 } 00334 00335 00336 NTSTATUS 00337 NewPortFilterDMus( 00338 OUT PPORTFILTERDMUS * OutFilter) 00339 { 00340 CPortFilterDMus * This; 00341 00342 This = new(NonPagedPool, TAG_PORTCLASS) CPortFilterDMus(NULL); 00343 if (!This) 00344 return STATUS_INSUFFICIENT_RESOURCES; 00345 00346 This->AddRef(); 00347 00348 // return result 00349 *OutFilter = (CPortFilterDMus*)This; 00350 00351 return STATUS_SUCCESS; 00352 } 00353 00354 Generated on Thu May 24 2012 04:29:06 for ReactOS by
1.7.6.1
|