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

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