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