ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

filter_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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.