From 7f2ba55772ae67cb75ad8f59573e0385cf14ab45 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Wed, 14 Oct 2009 10:24:19 +0000 Subject: [PATCH] - Implement KSPROPERTY_CONNECTION_ALLOCATORFRAMING for CPortPinWaveCyclic + CPortPinWavePci svn path=/trunk/; revision=43446 --- .../audio/backpln/portcls/pin_wavecyclic.cpp | 56 +++++++++++++++++-- .../wdm/audio/backpln/portcls/pin_wavepci.cpp | 30 +++++++++- .../wdm/audio/backpln/portcls/private.hpp | 7 --- 3 files changed, 77 insertions(+), 16 deletions(-) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp index 67ff1fce355..84f3277abf0 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp @@ -51,6 +51,7 @@ protected: friend NTSTATUS NTAPI PinWaveCyclicState(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); friend NTSTATUS NTAPI PinWaveCyclicDataFormat(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); friend NTSTATUS NTAPI PinWaveCyclicAudioPosition(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); + friend NTSTATUS NTAPI PinWaveCyclicAllocatorFraming(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); IPortWaveCyclic * m_Port; IPortFilterWaveCyclic * m_Filter; @@ -75,6 +76,7 @@ protected: ULONG m_TotalPackets; ULONG m_StopCount; KSAUDIO_POSITION m_Position; + KSALLOCATOR_FRAMING m_AllocatorFraming; SUBDEVICE_DESCRIPTOR m_Descriptor; ULONG m_Delay; @@ -93,9 +95,9 @@ typedef struct NTSTATUS NTAPI PinWaveCyclicState(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); NTSTATUS NTAPI PinWaveCyclicDataFormat(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); NTSTATUS NTAPI PinWaveCyclicAudioPosition(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); +NTSTATUS NTAPI PinWaveCyclicAllocatorFraming(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); - -DEFINE_KSPROPERTY_CONNECTIONSET(PinWaveCyclicConnectionSet, PinWaveCyclicState, PinWaveCyclicDataFormat); +DEFINE_KSPROPERTY_CONNECTIONSET(PinWaveCyclicConnectionSet, PinWaveCyclicState, PinWaveCyclicDataFormat, PinWaveCyclicAllocatorFraming); DEFINE_KSPROPERTY_AUDIOSET(PinWaveCyclicAudioSet, PinWaveCyclicAudioPosition); KSPROPERTY_SET PinWaveCyclicPropertySet[] = @@ -144,7 +146,40 @@ CPortPinWaveCyclic::QueryInterface( return STATUS_UNSUCCESSFUL; } +NTSTATUS +NTAPI +PinWaveCyclicAllocatorFraming( + IN PIRP Irp, + IN PKSIDENTIFIER Request, + IN OUT PVOID Data) +{ + CPortPinWaveCyclic *Pin; + PSUBDEVICE_DESCRIPTOR Descriptor; + // get sub device descriptor + Descriptor = (PSUBDEVICE_DESCRIPTOR)KSPROPERTY_ITEM_IRP_STORAGE(Irp); + + // sanity check + PC_ASSERT(Descriptor); + PC_ASSERT(Descriptor->PortPin); + PC_ASSERT_IRQL(DISPATCH_LEVEL); + + // cast to pin impl + Pin = (CPortPinWaveCyclic*)Descriptor->PortPin; + + + if (Request->Flags & KSPROPERTY_TYPE_GET) + { + // copy pin framing + RtlMoveMemory(Data, &Pin->m_AllocatorFraming, sizeof(KSALLOCATOR_FRAMING)); + + Irp->IoStatus.Information = sizeof(KSALLOCATOR_FRAMING); + return STATUS_SUCCESS; + } + + // not supported + return STATUS_NOT_SUPPORTED; +} NTSTATUS NTAPI @@ -960,6 +995,7 @@ CPortPinWaveCyclic::Init( PDEVICE_OBJECT DeviceObject; BOOLEAN Capture; PVOID SilenceBuffer; + PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor = NULL; //IDrmAudioStream * DrmAudio = NULL; m_KsPinDescriptor = KsPinDescriptor; @@ -1015,6 +1051,8 @@ CPortPinWaveCyclic::Init( } #endif + DPRINT("CPortPinWaveCyclic::Init Status %x\n", Status); + if (!NT_SUCCESS(Status)) return Status; @@ -1025,8 +1063,6 @@ CPortPinWaveCyclic::Init( if (!NT_SUCCESS(Status)) return Status; - PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor = NULL; - Status = Subdevice->GetDescriptor(&SubDeviceDescriptor); if (!NT_SUCCESS(Status)) { @@ -1044,11 +1080,10 @@ CPortPinWaveCyclic::Init( m_Descriptor.UnknownMiniport = SubDeviceDescriptor->UnknownMiniport; m_Descriptor.PortPin = (PVOID)this; - DPRINT("CPortPinWaveCyclic::Init Status %x\n", Status); - // release subdevice descriptor Subdevice->Release(); + // add ourselves to service group Status = m_ServiceGroup->AddMember(PSERVICESINK(this)); if (!NT_SUCCESS(Status)) { @@ -1072,6 +1107,15 @@ CPortPinWaveCyclic::Init( if (!SilenceBuffer) return STATUS_INSUFFICIENT_RESOURCES; + + /* set up allocator framing */ + m_AllocatorFraming.RequirementsFlags = KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY | KSALLOCATOR_REQUIREMENTF_PREFERENCES_ONLY; + m_AllocatorFraming.PoolType = NonPagedPool; + m_AllocatorFraming.Frames = 8; + m_AllocatorFraming.FileAlignment = FILE_64_BYTE_ALIGNMENT; + m_AllocatorFraming.Reserved = 0; + m_AllocatorFraming.FrameSize = m_FrameSize; + m_Stream->Silence(SilenceBuffer, m_FrameSize); Status = m_IrpQueue->Init(ConnectDetails, DataFormat, DeviceObject, m_FrameSize, 0, SilenceBuffer); diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp index fafe75a3685..336605cbc5f 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp @@ -94,7 +94,7 @@ NTSTATUS NTAPI PinWavePciDataFormat(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OU NTSTATUS NTAPI PinWavePciAudioPosition(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); NTSTATUS NTAPI PinWavePciAllocatorFraming(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); -DEFINE_KSPROPERTY_ALLOCATORFRAMING(PinWavePciConnectionSet, PinWavePciState, PinWavePciDataFormat, PinWavePciAllocatorFraming); +DEFINE_KSPROPERTY_CONNECTIONSET(PinWavePciConnectionSet, PinWavePciState, PinWavePciDataFormat, PinWavePciAllocatorFraming); DEFINE_KSPROPERTY_AUDIOSET(PinWavePciAudioSet, PinWavePciAudioPosition); KSPROPERTY_SET PinWavePciPropertySet[] = @@ -123,8 +123,32 @@ PinWavePciAllocatorFraming( IN PKSIDENTIFIER Request, IN OUT PVOID Data) { - UNIMPLEMENTED - return STATUS_NOT_IMPLEMENTED; + CPortPinWavePci *Pin; + PSUBDEVICE_DESCRIPTOR Descriptor; + + // get sub device descriptor + Descriptor = (PSUBDEVICE_DESCRIPTOR)KSPROPERTY_ITEM_IRP_STORAGE(Irp); + + // sanity check + PC_ASSERT(Descriptor); + PC_ASSERT(Descriptor->PortPin); + PC_ASSERT_IRQL(DISPATCH_LEVEL); + + // cast to pin impl + Pin = (CPortPinWavePci*)Descriptor->PortPin; + + + if (Request->Flags & KSPROPERTY_TYPE_GET) + { + // copy pin framing + RtlMoveMemory(Data, &Pin->m_AllocatorFraming, sizeof(KSALLOCATOR_FRAMING)); + + Irp->IoStatus.Information = sizeof(KSALLOCATOR_FRAMING); + return STATUS_SUCCESS; + } + + // not supported + return STATUS_NOT_SUPPORTED; } NTSTATUS diff --git a/reactos/drivers/wdm/audio/backpln/portcls/private.hpp b/reactos/drivers/wdm/audio/backpln/portcls/private.hpp index b892123753c..65fcc8abe79 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/private.hpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/private.hpp @@ -317,13 +317,6 @@ PcHandlePropertyWithTable( IN PSUBDEVICE_DESCRIPTOR Descriptor); #define DEFINE_KSPROPERTY_CONNECTIONSET(PinSet,\ - PropStateHandler, PropDataFormatHandler)\ -DEFINE_KSPROPERTY_TABLE(PinSet) {\ - DEFINE_KSPROPERTY_ITEM_CONNECTION_STATE(PropStateHandler, PropStateHandler),\ - DEFINE_KSPROPERTY_ITEM_CONNECTION_DATAFORMAT(PropDataFormatHandler, PropDataFormatHandler)\ -} - -#define DEFINE_KSPROPERTY_ALLOCATORFRAMING(PinSet,\ PropStateHandler, PropDataFormatHandler, PropAllocatorFraming)\ DEFINE_KSPROPERTY_TABLE(PinSet) {\ DEFINE_KSPROPERTY_ITEM_CONNECTION_STATE(PropStateHandler, PropStateHandler),\