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