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