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

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