Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / drivers / wdm / audio / backpln / portcls / filter_topology.cpp
diff --git a/drivers/wdm/audio/backpln/portcls/filter_topology.cpp b/drivers/wdm/audio/backpln/portcls/filter_topology.cpp
new file mode 100644 (file)
index 0000000..6855faf
--- /dev/null
@@ -0,0 +1,292 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS Kernel Streaming
+ * FILE:            drivers/wdm/audio/backpln/portcls/filter_topology.c
+ * PURPOSE:         portcls topology filter
+ * PROGRAMMER:      Johannes Anderwald
+ */
+
+#include "private.hpp"
+
+#ifndef YDEBUG
+#define NDEBUG
+#endif
+
+#include <debug.h>
+
+class CPortFilterTopology : public IPortFilterTopology
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+    IMP_IPortFilterTopology;
+    CPortFilterTopology(IUnknown *OuterUnknown){}
+    virtual ~CPortFilterTopology(){}
+
+protected:
+    IPortTopology * m_Port;
+    SUBDEVICE_DESCRIPTOR * m_Descriptor;
+    ISubdevice * m_SubDevice;
+    LONG m_Ref;
+};
+
+
+NTSTATUS
+NTAPI
+CPortFilterTopology::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+
+    if (IsEqualGUIDAligned(refiid, IID_IIrpTarget) ||
+        IsEqualGUIDAligned(refiid, IID_IUnknown))
+    {
+        *Output = PVOID(PUNKNOWN(this));
+        PUNKNOWN(*Output)->AddRef();
+        return STATUS_SUCCESS;
+    }
+    else if (IsEqualGUIDAligned(refiid, IID_IPort))
+    {
+        *Output = PVOID(PUNKNOWN(m_Port));
+        PUNKNOWN(*Output)->AddRef();
+        return STATUS_SUCCESS;
+    }
+
+    return STATUS_UNSUCCESSFUL;
+}
+
+NTSTATUS
+NTAPI
+CPortFilterTopology::NewIrpTarget(
+    OUT struct IIrpTarget **OutTarget,
+    IN PCWSTR Name,
+    IN PUNKNOWN Unknown,
+    IN POOL_TYPE PoolType,
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp,
+    IN KSOBJECT_CREATE *CreateObject)
+{
+    DPRINT("CPortFilterTopology::NewIrpTarget entered\n");
+
+    return STATUS_NOT_SUPPORTED;
+}
+
+
+NTSTATUS
+NTAPI
+CPortFilterTopology::DeviceIoControl(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    PIO_STACK_LOCATION IoStack;
+    NTSTATUS Status;
+
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+    if (IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_PROPERTY)
+    {
+        DPRINT("Unhandled function %lx Length %x\n", IoStack->Parameters.DeviceIoControl.IoControlCode, IoStack->Parameters.DeviceIoControl.InputBufferLength);
+        
+        Irp->IoStatus.Status = STATUS_SUCCESS;
+
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+        return STATUS_SUCCESS;
+    }
+
+    Status = PcHandlePropertyWithTable(Irp, m_Descriptor->FilterPropertySetCount, m_Descriptor->FilterPropertySet, m_Descriptor);
+    if (Status != STATUS_PENDING)
+    {
+        Irp->IoStatus.Status = Status;
+        DPRINT("Result %x Length %u\n", Status, Irp->IoStatus.Information);
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    }
+    return Status;
+
+}
+
+NTSTATUS
+NTAPI
+CPortFilterTopology::Read(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
+}
+
+NTSTATUS
+NTAPI
+CPortFilterTopology::Write(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
+}
+
+NTSTATUS
+NTAPI
+CPortFilterTopology::Flush(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
+}
+
+NTSTATUS
+NTAPI
+CPortFilterTopology::Close(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    NTSTATUS Status = STATUS_SUCCESS;
+
+    // FIXME handle DirectSound
+
+#if 0
+//FIXME
+    if (m_ref == 1)
+    {
+        // release reference to port
+        This->SubDevice->lpVtbl->Release(This->SubDevice);
+
+        // time to shutdown the audio system
+        Status = This->SubDevice->lpVtbl->ReleaseChildren(This->SubDevice);
+    }
+#endif
+
+    Irp->IoStatus.Status = Status;
+    Irp->IoStatus.Information = 0;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+CPortFilterTopology::QuerySecurity(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
+}
+
+NTSTATUS
+NTAPI
+CPortFilterTopology::SetSecurity(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
+}
+
+BOOLEAN
+NTAPI
+CPortFilterTopology::FastDeviceIoControl(
+    IN PFILE_OBJECT FileObject,
+    IN BOOLEAN Wait,
+    IN PVOID InputBuffer,
+    IN ULONG InputBufferLength,
+    OUT PVOID OutputBuffer,
+    IN ULONG OutputBufferLength,
+    IN ULONG IoControlCode,
+    OUT PIO_STATUS_BLOCK StatusBlock,
+    IN PDEVICE_OBJECT DeviceObject)
+{
+    return FALSE;
+}
+
+BOOLEAN
+NTAPI
+CPortFilterTopology::FastRead(
+    IN PFILE_OBJECT FileObject,
+    IN PLARGE_INTEGER FileOffset,
+    IN ULONG Length,
+    IN BOOLEAN Wait,
+    IN ULONG LockKey,
+    IN PVOID Buffer,
+    OUT PIO_STATUS_BLOCK StatusBlock,
+    IN PDEVICE_OBJECT DeviceObject)
+{
+    return FALSE;
+}
+
+BOOLEAN
+NTAPI
+CPortFilterTopology::FastWrite(
+    IN PFILE_OBJECT FileObject,
+    IN PLARGE_INTEGER FileOffset,
+    IN ULONG Length,
+    IN BOOLEAN Wait,
+    IN ULONG LockKey,
+    IN PVOID Buffer,
+    OUT PIO_STATUS_BLOCK StatusBlock,
+    IN PDEVICE_OBJECT DeviceObject)
+{
+    return FALSE;
+}
+
+NTSTATUS
+NTAPI
+CPortFilterTopology::Init(
+    IN IPortTopology* Port)
+{
+    ISubdevice * ISubDevice;
+    SUBDEVICE_DESCRIPTOR * Descriptor;
+    NTSTATUS Status;
+
+
+    // get our private interface
+    Status = Port->QueryInterface(IID_ISubdevice, (PVOID*)&ISubDevice);
+    if (!NT_SUCCESS(Status))
+        return STATUS_UNSUCCESSFUL;
+
+    // get the subdevice descriptor
+    Status = ISubDevice->GetDescriptor(&Descriptor);
+
+    // store subdevice interface
+    m_SubDevice = ISubDevice;
+
+    if (!NT_SUCCESS(Status))
+        return STATUS_UNSUCCESSFUL;
+
+    // save descriptor
+    m_Descriptor = Descriptor;
+
+    // store port object
+    m_Port = Port;
+
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS 
+NewPortFilterTopology(
+    OUT IPortFilterTopology ** OutFilter)
+{
+    CPortFilterTopology * This;
+
+    This = new(NonPagedPool, TAG_PORTCLASS)CPortFilterTopology(NULL);
+    if (!This)
+        return STATUS_INSUFFICIENT_RESOURCES;
+
+    This->AddRef();
+
+    // return result
+    *OutFilter = (CPortFilterTopology*)This;
+
+    return STATUS_SUCCESS;
+}