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

Generated on Thu May 24 2012 04:29:06 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.