Author: janderwald
Date: Fri Jul 17 21:15:52 2009
New Revision: 42016

URL: http://svn.reactos.org/svn/reactos?rev=42016&view=rev
Log:
[WDMAUD.DRV]
- Implement retrieving the preferred frame size
- Set Maximum buffer limit to one second
[PORTCLS]
- Implement a dynamic buffer enlarging. In case a audio stream stops 
prematurely, increase the audio buffer limit by 1/3
- Implement KSPROPERTY_CONNECTION_ALLOCATORFRAMING for IPortPinWaveCyclic + 
IPortPinWavePci
- Move IPortWavePciStream object to IPortPinWavePci, as IPrefetchOffset needs a 
tight integration (TBD)
- Define pin property handler for IPortDMus (some audio devices may now show 
more than one waveout device)
- Implement IPortEvents_fnAddEventToEventList for IPortWavePci
[WDMAUD_KERNEL]
- Implement IOCTL_GETFRAMESIZE
[SYSAUDIO]
- Fix a bug in the Pin_fnWrite, though code isnt used yet
-?
- Adobe Flash Player & Vlc may now have a better playback because the audio 
stream is now updated more often (because audio packet now use the preferred 
frame size which is in most cases 10ms).


Removed:
    trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepcistream.c
Modified:
    trunk/reactos/dll/win32/wdmaud.drv/wdmaud.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h
    trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/port_dmus.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild
    trunk/reactos/drivers/wdm/audio/backpln/portcls/private.h
    trunk/reactos/drivers/wdm/audio/legacy/wdmaud/control.c
    trunk/reactos/drivers/wdm/audio/legacy/wdmaud/interface.h
    trunk/reactos/drivers/wdm/audio/sysaudio/pin.c

Modified: trunk/reactos/dll/win32/wdmaud.drv/wdmaud.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/wdmaud.drv/wdmaud.c?rev=42016&r1=42015&r2=42016&view=diff
==============================================================================
--- trunk/reactos/dll/win32/wdmaud.drv/wdmaud.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/wdmaud.drv/wdmaud.c [iso-8859-1] Fri Jul 17 
21:15:52 2009
@@ -299,6 +299,26 @@
 
     Instance->Handle = (PVOID)DeviceInfo.hDevice;
 
+    /* Now determine framing requirements */
+    Result = SyncOverlappedDeviceIoControl(KernelHandle,
+                                           IOCTL_GETFRAMESIZE,
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           NULL);
+
+    if ( MMSUCCESS(Result) )
+    {
+        if (DeviceInfo.u.FrameSize)
+        {
+            Instance->FrameSize = DeviceInfo.u.FrameSize;
+            Instance->BufferCount = WaveFormat->nAvgBytesPerSec / 
Instance->FrameSize;
+            SND_TRACE(L"FrameSize %u BufferCount %u\n", Instance->FrameSize, 
Instance->BufferCount);
+        }
+    }
+
+
     return MMSYSERR_NOERROR;
 }
 

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h?rev=42016&r1=42015&r2=42016&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h [iso-8859-1] 
Fri Jul 17 21:15:52 2009
@@ -234,6 +234,9 @@
 
     STDMETHOD_(BOOL, HasLastMappingFailed)(THIS);
     STDMETHOD_(VOID, PrintQueueStatus)(THIS);
+    STDMETHOD_(VOID, SetMinimumDataThreshold)(THIS_
+        IN ULONG MinimumDataThreshold);
+    STDMETHOD_(ULONG, GetMinimumDataThreshold)(THIS);
 };
 
 

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c?rev=42016&r1=42015&r2=42016&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c [iso-8859-1] 
Fri Jul 17 21:15:52 2009
@@ -40,6 +40,7 @@
     ULONG OutOfMapping;
     ULONG MaxFrameSize;
     ULONG Alignment;
+    ULONG MinimumDataThreshold;
 
 }IIrpQueueImpl;
 
@@ -128,6 +129,7 @@
     This->DataFormat = (PKSDATAFORMAT_WAVEFORMATEX)DataFormat;
     This->MaxFrameSize = FrameSize;
     This->Alignment = Alignment;
+    This->MinimumDataThreshold = 
((PKSDATAFORMAT_WAVEFORMATEX)DataFormat)->WaveFormatEx.nAvgBytesPerSec / 3;
 
     InitializeListHead(&This->ListHead);
     InitializeListHead(&This->FreeHead);
@@ -315,7 +317,7 @@
     if (This->StartStream)
         return TRUE;
 
-    if (This->DataFormat->WaveFormatEx.nAvgBytesPerSec/3 < 
This->NumDataAvailable)
+    if (This->MinimumDataThreshold < This->NumDataAvailable)
     {
         This->StartStream = TRUE;
         Result = TRUE;
@@ -346,9 +348,9 @@
 {
     IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
     This->DataFormat = (PKSDATAFORMAT_WAVEFORMATEX)DataFormat;
+    This->MinimumDataThreshold = 
This->DataFormat->WaveFormatEx.nAvgBytesPerSec / 3;
     This->StartStream = FALSE;
     This->NumDataAvailable = 0;
-
 }
 
 NTSTATUS
@@ -473,6 +475,27 @@
 
     KeReleaseSpinLockFromDpcLevel(&This->Lock);
     DPRINT("IIrpQueue_fnPrintQueueStatus ===============\n");
+}
+
+VOID
+NTAPI
+IIrpQueue_fnSetMinimumDataThreshold(
+    IN IIrpQueue *iface,
+    ULONG MinimumDataThreshold)
+{
+    IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
+
+    This->MinimumDataThreshold = MinimumDataThreshold;
+}
+
+ULONG
+NTAPI
+IIrpQueue_fnGetMinimumDataThreshold(
+    IN IIrpQueue *iface)
+{
+    IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
+
+    return This->MinimumDataThreshold;
 }
 
 
@@ -493,10 +516,10 @@
     IIrpQueue_fnGetMappingWithTag,
     IIrpQueue_fnReleaseMappingWithTag,
     IIrpQueue_fnHasLastMappingFailed,
-    IIrpQueue_fnPrintQueueStatus
-
+    IIrpQueue_fnPrintQueueStatus,
+    IIrpQueue_fnSetMinimumDataThreshold,
+    IIrpQueue_fnGetMinimumDataThreshold
 };
-
 
 NTSTATUS
 NTAPI
@@ -515,44 +538,3 @@
 
 }
 
-NTSTATUS
-NewIrpStreamPhysical(
-    OUT IIrpStreamPhysical ** OutIIrpStreamPhysical,
-    IN IUnknown *OuterUnknown)
-{
-    return STATUS_UNSUCCESSFUL;
-}
-
-
-/*
- * @implemented
- */
-
-NTSTATUS
-NTAPI
-PcNewIrpStreamPhysical(
-    OUT IIrpStreamPhysical ** OutIrpStreamPhysical,
-    IN IUnknown * OuterUnknown,
-    IN BOOLEAN Wait,
-    IN KSPIN_CONNECT *ConnectDetails,
-    IN PDEVICE_OBJECT DeviceObject,
-    IN PDMA_ADAPTER DmaAdapter)
-{
-    NTSTATUS Status;
-    IIrpStreamPhysical * Irp;
-
-    Status = NewIrpStreamPhysical(&Irp, OuterUnknown);
-    if (!NT_SUCCESS(Status))
-        return Status;
-
-
-    Status = Irp->lpVtbl->Init(Irp, Wait, ConnectDetails, DeviceObject, 
DmaAdapter);
-    if (!NT_SUCCESS(Status))
-    {
-        Irp->lpVtbl->Release(Irp);
-        return Status;
-    }
-
-    *OutIrpStreamPhysical = Irp;
-    return Status;
-}

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c?rev=42016&r1=42015&r2=42016&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c 
[iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c 
[iso-8859-1] Fri Jul 17 21:15:52 2009
@@ -37,6 +37,7 @@
     ULONG TotalPackets;
     ULONG PreCompleted;
     ULONG PostCompleted;
+    ULONG StopCount;
 
     ULONG Delay;
 }IPortPinWaveCyclicImpl;
@@ -224,6 +225,8 @@
     IPortPinWaveCyclicImpl * This;
     PSETSTREAM_CONTEXT Ctx = (PSETSTREAM_CONTEXT)Context;
     KSSTATE State;
+    ULONG MinimumDataThreshold;
+    ULONG MaximumDataThreshold;
 
     This = Ctx->Pin;
     State = Ctx->State;
@@ -233,6 +236,10 @@
 
     /* Has the audio stream resumed? */
     if (This->IrpQueue->lpVtbl->NumMappings(This->IrpQueue) && State == 
KSSTATE_STOP)
+        return;
+
+    /* Has the audio state already been set? */
+    if (This->State == State)
         return;
 
     /* Set the state */
@@ -245,12 +252,26 @@
         {
             /* reset start stream */
             This->IrpQueue->lpVtbl->CancelBuffers(This->IrpQueue); //FIX 
function name
-            DPRINT1("Stopping PreCompleted %u PostCompleted %u\n", 
This->PreCompleted, This->PostCompleted);
+
+            /* increase stop counter */
+            This->StopCount++;
+            /* get current data threshold */
+            MinimumDataThreshold = 
This->IrpQueue->lpVtbl->GetMinimumDataThreshold(This->IrpQueue);
+            /* get maximum data threshold */
+            MaximumDataThreshold = 
((PKSDATAFORMAT_WAVEFORMATEX)This->Format)->WaveFormatEx.nAvgBytesPerSec;
+            /* increase minimum data threshold by a third sec */
+            MinimumDataThreshold += 
((PKSDATAFORMAT_WAVEFORMATEX)This->Format)->WaveFormatEx.nAvgBytesPerSec / 3;
+
+            /* assure it has not exceeded */
+            MinimumDataThreshold = min(MinimumDataThreshold, 
MaximumDataThreshold);
+            /* store minimum data threshold */
+            This->IrpQueue->lpVtbl->SetMinimumDataThreshold(This->IrpQueue, 
MinimumDataThreshold);
+
+            DPRINT1("Stopping PreCompleted %u PostCompleted %u StopCount %u 
MinimumDataThreshold %u\n", This->PreCompleted, This->PostCompleted, 
This->StopCount, MinimumDataThreshold);
         }
         if (This->State == KSSTATE_RUN)
         {
             DPRINT1("State RUN %x MinAvailable %u\n", State, 
This->IrpQueue->lpVtbl->MinimumDataAvailable(This->IrpQueue));
-
         }
     }
 }
@@ -570,11 +591,34 @@
                 return STATUS_SUCCESS;
             }
         }
-
-    }
+        else if (Property->Id == KSPROPERTY_CONNECTION_ALLOCATORFRAMING)
+        {
+            PKSALLOCATOR_FRAMING Framing = 
(PKSALLOCATOR_FRAMING)Irp->UserBuffer;
+
+            ASSERT_IRQL(DISPATCH_LEVEL);
+            /* Validate input buffer */
+            if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < 
sizeof(KSALLOCATOR_FRAMING))
+            {
+                Irp->IoStatus.Information = sizeof(KSALLOCATOR_FRAMING);
+                Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
+                IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                return STATUS_BUFFER_TOO_SMALL;
+            }
+            /* Clear frame structure */
+            RtlZeroMemory(Framing, sizeof(KSALLOCATOR_FRAMING));
+            /* store requested frame size */
+            Framing->FrameSize = This->FrameSize;
+            /* FIXME fill in struct */
+
+            Irp->IoStatus.Information = sizeof(KSALLOCATOR_FRAMING);
+            Irp->IoStatus.Status = STATUS_SUCCESS;
+            IoCompleteRequest(Irp, IO_NO_INCREMENT);
+            return STATUS_SUCCESS;
+        }
+    }
+
     RtlStringFromGUID(&Property->Set, &GuidString);
     DPRINT1("Unhandeled property Set |%S| Id %u Flags %x\n", 
GuidString.Buffer, Property->Id, Property->Flags);
-    DbgBreakPoint();
     RtlFreeUnicodeString(&GuidString);
 
     Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
@@ -640,7 +684,6 @@
     }
 
     UNIMPLEMENTED
-    DbgBreakPoint();
 
     Irp->IoStatus.Information = 0;
     Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
@@ -696,21 +739,24 @@
 {
     PMINIPORTWAVECYCLICSTREAM Stream;
     IPortPinWaveCyclicImpl * This;
+    NTSTATUS Status;
     PCLOSESTREAM_CONTEXT Ctx = (PCLOSESTREAM_CONTEXT)Context;
 
     This = (IPortPinWaveCyclicImpl*)Ctx->Pin;
 
-    if (This->Stream)
-    {
-        if (This->State != KSSTATE_STOP)
-        {
-            This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_STOP);
-            KeStallExecutionProcessor(10);
-        }
+    if (This->State != KSSTATE_STOP)
+    {
+        /* stop stream in case it hasn't been */
+        Status = This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_STOP);
+        if (!NT_SUCCESS(Status))
+            DPRINT1("Warning: failed to stop stream with %x\n", Status);
+
+        This->State = KSSTATE_STOP;
     }
 
     if (This->Format)
     {
+        /* free format */
         ExFreePool(This->Format);
         This->Format = NULL;
     }
@@ -848,7 +894,7 @@
     OUT PIO_STATUS_BLOCK StatusBlock,
     IN PDEVICE_OBJECT DeviceObject)
 {
-    UNIMPLEMENTED
+    //UNIMPLEMENTED
     return FALSE;
 }
 
@@ -915,14 +961,18 @@
     NTSTATUS Status;
     PCONTEXT_WRITE Packet;
     PIRP Irp;
+    ULONG PrePostRatio;
+    ULONG MinData;
     IPortPinWaveCyclicImpl * This = (IPortPinWaveCyclicImpl*)iface;
 
     InterlockedIncrement((PLONG)&This->TotalPackets);
 
-    DPRINT("IPortPinWaveCyclic_fnFastWrite entered Total %u Pre %u Post %u 
State %x MinData %u\n", This->TotalPackets, This->PreCompleted, 
This->PostCompleted, This->State, 
This->IrpQueue->lpVtbl->NumData(This->IrpQueue));
+    PrePostRatio = (This->PreCompleted * 100) / This->TotalPackets;
+    MinData = This->IrpQueue->lpVtbl->NumData(This->IrpQueue);
+
+    DPRINT1("IPortPinWaveCyclic_fnFastWrite entered Total %u Pre %u Post %u 
State %x MinData %u Ratio %u\n", This->TotalPackets, This->PreCompleted, 
This->PostCompleted, This->State, 
This->IrpQueue->lpVtbl->NumData(This->IrpQueue), PrePostRatio);
 
     Packet = (PCONTEXT_WRITE)Buffer;
-
 
     if (This->IrpQueue->lpVtbl->MinimumDataAvailable(This->IrpQueue))
     {
@@ -945,7 +995,7 @@
     if (!NT_SUCCESS(Status))
         return FALSE;
 
-    if (This->IrpQueue->lpVtbl->MinimumDataAvailable(This->IrpQueue) == TRUE 
&& This->State != KSSTATE_RUN)
+    if (This->State != KSSTATE_RUN && 
This->IrpQueue->lpVtbl->MinimumDataAvailable(This->IrpQueue) == TRUE)
     {
         SetStreamState(This, KSSTATE_RUN);
         /* some should initiate a state request but didnt do it */
@@ -999,13 +1049,6 @@
     Status = NewIrpQueue(&This->IrpQueue);
     if (!NT_SUCCESS(Status))
         return Status;
-
-    Status = This->IrpQueue->lpVtbl->Init(This->IrpQueue, ConnectDetails, 
DataFormat, DeviceObject, 0, 0);
-    if (!NT_SUCCESS(Status))
-    {
-       This->IrpQueue->lpVtbl->Release(This->IrpQueue);
-       return Status;
-    }
 
     if (KsPinDescriptor->Communication == KSPIN_COMMUNICATION_SINK && 
KsPinDescriptor->DataFlow == KSPIN_DATAFLOW_IN)
     {
@@ -1070,6 +1113,14 @@
     This->Delay = Int32x32To64(10, -10000);
 
     Status = This->Stream->lpVtbl->SetNotificationFreq(This->Stream, 10, 
&This->FrameSize);
+
+   Status = This->IrpQueue->lpVtbl->Init(This->IrpQueue, ConnectDetails, 
DataFormat, DeviceObject, This->FrameSize, 0);
+    if (!NT_SUCCESS(Status))
+    {
+       This->IrpQueue->lpVtbl->Release(This->IrpQueue);
+       return Status;
+    }
+
 
     //This->Stream->lpVtbl->SetFormat(This->Stream, 
(PKSDATAFORMAT)This->Format);
     DPRINT1("Setting state to acquire %x\n", 
This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_ACQUIRE));

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c?rev=42016&r1=42015&r2=42016&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c [iso-8859-1] 
Fri Jul 17 21:15:52 2009
@@ -12,6 +12,7 @@
 {
     IPortPinWavePciVtbl *lpVtbl;
     IServiceSinkVtbl *lpVtblServiceSink;
+    IPortWavePciStreamVtbl *lpVtblPortWavePciStream;
 
     LONG ref;
     IPortWavePci * Port;
@@ -27,17 +28,21 @@
 
     BOOL Capture;
     PDEVICE_OBJECT DeviceObject;
-    PPORTWAVEPCISTREAM WaveStream;
     IIrpQueue * IrpQueue;
 
     ULONG TotalPackets;
     ULONG PreCompleted;
     ULONG PostCompleted;
+    ULONG StopCount;
 
     ULONG Delay;
 
+    BOOL bUsePrefetch;
+    ULONG PrefetchOffset;
+
+    KSALLOCATOR_FRAMING AllocatorFraming;
+
 }IPortPinWavePciImpl;
-
 
 typedef struct
 {
@@ -46,12 +51,110 @@
     KSSTATE State;
 }SETSTREAM_CONTEXT, *PSETSTREAM_CONTEXT;
 
-NTSTATUS
-NTAPI
-IPortWavePci_fnProcessNewIrp(
-    IPortPinWavePciImpl * This);
-
 
//==================================================================================================================================
+static
+NTSTATUS
+NTAPI
+IPortWavePciStream_fnQueryInterface(
+    IPortWavePciStream* iface,
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    IPortPinWavePciImpl * This = 
(IPortPinWavePciImpl*)CONTAINING_RECORD(iface, IPortPinWavePciImpl, 
lpVtblPortWavePciStream);
+
+    DPRINT("IPortWavePciStream_fnQueryInterface entered\n");
+
+    if (IsEqualGUIDAligned(refiid, &IID_IPortWavePciStream) ||
+        IsEqualGUIDAligned(refiid, &IID_IUnknown))
+    {
+        *Output = &This->lpVtbl;
+        InterlockedIncrement(&This->ref);
+        return STATUS_SUCCESS;
+    }
+
+    return STATUS_UNSUCCESSFUL;
+}
+
+static
+ULONG
+NTAPI
+IPortWavePciStream_fnAddRef(
+    IPortWavePciStream* iface)
+{
+    IPortPinWavePciImpl * This = 
(IPortPinWavePciImpl*)CONTAINING_RECORD(iface, IPortPinWavePciImpl, 
lpVtblPortWavePciStream);
+    DPRINT("IPortWavePciStream_fnAddRef entered\n");
+
+    return InterlockedIncrement(&This->ref);
+}
+
+static
+ULONG
+NTAPI
+IPortWavePciStream_fnRelease(
+    IPortWavePciStream* iface)
+{
+    IPortPinWavePciImpl * This = 
(IPortPinWavePciImpl*)CONTAINING_RECORD(iface, IPortPinWavePciImpl, 
lpVtblPortWavePciStream);
+
+    InterlockedDecrement(&This->ref);
+
+    DPRINT("IPortWavePciStream_fnRelease entered %u\n", This->ref);
+
+    /* Return new reference count */
+    return This->ref;
+}
+
+static
+NTSTATUS
+NTAPI
+IPortWavePciStream_fnGetMapping(
+    IN IPortWavePciStream *iface,
+    IN PVOID Tag,
+    OUT PPHYSICAL_ADDRESS  PhysicalAddress,
+    OUT PVOID  *VirtualAddress,
+    OUT PULONG  ByteCount,
+    OUT PULONG  Flags)
+{
+    IPortPinWavePciImpl * This = 
(IPortPinWavePciImpl*)CONTAINING_RECORD(iface, IPortPinWavePciImpl, 
lpVtblPortWavePciStream);
+
+    ASSERT_IRQL(DISPATCH_LEVEL);
+    return This->IrpQueue->lpVtbl->GetMappingWithTag(This->IrpQueue, Tag, 
PhysicalAddress, VirtualAddress, ByteCount, Flags);
+}
+
+static
+NTSTATUS
+NTAPI
+IPortWavePciStream_fnReleaseMapping(
+    IN IPortWavePciStream *iface,
+    IN PVOID  Tag)
+{
+    IPortPinWavePciImpl * This = 
(IPortPinWavePciImpl*)CONTAINING_RECORD(iface, IPortPinWavePciImpl, 
lpVtblPortWavePciStream);
+
+    ASSERT_IRQL(DISPATCH_LEVEL);
+    return This->IrpQueue->lpVtbl->ReleaseMappingWithTag(This->IrpQueue, Tag);
+}
+
+static
+NTSTATUS
+NTAPI
+IPortWavePciStream_fnTerminatePacket(
+    IN IPortWavePciStream *iface)
+{
+    UNIMPLEMENTED
+    ASSERT_IRQL(DISPATCH_LEVEL);
+    return STATUS_SUCCESS;
+}
+
+
+static IPortWavePciStreamVtbl vt_PortWavePciStream =
+{
+    IPortWavePciStream_fnQueryInterface,
+    IPortWavePciStream_fnAddRef,
+    IPortWavePciStream_fnRelease,
+    IPortWavePciStream_fnGetMapping,
+    IPortWavePciStream_fnReleaseMapping,
+    IPortWavePciStream_fnTerminatePacket
+};
+
 
 static
 NTSTATUS
@@ -117,6 +220,8 @@
     IPortPinWavePciImpl * This;
     PSETSTREAM_CONTEXT Ctx = (PSETSTREAM_CONTEXT)Context;
     KSSTATE State;
+    ULONG MinimumDataThreshold;
+    ULONG MaximumDataThreshold;
 
     This = Ctx->Pin;
     State = Ctx->State;
@@ -138,13 +243,27 @@
         {
             /* reset start stream */
             This->IrpQueue->lpVtbl->CancelBuffers(This->IrpQueue); //FIX 
function name
-            
This->ServiceGroup->lpVtbl->CancelDelayedService(This->ServiceGroup);
-            DPRINT1("Stopping PreCompleted %u PostCompleted %u\n", 
This->PreCompleted, This->PostCompleted);
+            
//This->ServiceGroup->lpVtbl->CancelDelayedService(This->ServiceGroup);
+            /* increase stop counter */
+            This->StopCount++;
+            /* get current data threshold */
+            MinimumDataThreshold = 
This->IrpQueue->lpVtbl->GetMinimumDataThreshold(This->IrpQueue);
+            /* get maximum data threshold */
+            MaximumDataThreshold = 
((PKSDATAFORMAT_WAVEFORMATEX)This->Format)->WaveFormatEx.nAvgBytesPerSec * 3;
+            /* increase minimum data threshold by a third sec */
+            MinimumDataThreshold += 
((PKSDATAFORMAT_WAVEFORMATEX)This->Format)->WaveFormatEx.nAvgBytesPerSec / 3;
+
+            /* assure it has not exceeded */
+            MinimumDataThreshold = min(MinimumDataThreshold, 
MaximumDataThreshold);
+            /* store minimum data threshold */
+            This->IrpQueue->lpVtbl->SetMinimumDataThreshold(This->IrpQueue, 
MinimumDataThreshold);
+
+            DPRINT1("Stopping PreCompleted %u PostCompleted %u StopCount %u 
MinimumDataThreshold %u\n", This->PreCompleted, This->PostCompleted, 
This->StopCount, MinimumDataThreshold);
         }
         if (This->State == KSSTATE_RUN)
         {
             /* start the notification timer */
-            
This->ServiceGroup->lpVtbl->RequestDelayedService(This->ServiceGroup, 
This->Delay);
+            
//This->ServiceGroup->lpVtbl->RequestDelayedService(This->ServiceGroup, 
This->Delay);
         }
     }
 }
@@ -201,26 +320,23 @@
 IServiceSink_fnRequestService(
     IServiceSink* iface)
 {
-    ULONGLONG Position;
-    NTSTATUS Status;
     IPortPinWavePciImpl * This = 
(IPortPinWavePciImpl*)CONTAINING_RECORD(iface, IPortPinWavePciImpl, 
lpVtblServiceSink);
 
     ASSERT_IRQL(DISPATCH_LEVEL);
 
     if (This->IrpQueue->lpVtbl->HasLastMappingFailed(This->IrpQueue))
     {
-        This->IrpQueue->lpVtbl->PrintQueueStatus(This->IrpQueue);
         if (This->IrpQueue->lpVtbl->NumMappings(This->IrpQueue) == 0)
         {
             DPRINT("Stopping stream...\n");
             SetStreamState(This, KSSTATE_STOP);
+            return;
         }
     }
 
-    Status = This->Stream->lpVtbl->GetPosition(This->Stream, &Position);
-    DPRINT("Position %lu Status %x\n", Position, Status);
-
     This->Stream->lpVtbl->Service(This->Stream);
+    //TODO
+    //generate events
 }
 
 static IServiceSinkVtbl vt_IServiceSink = 
@@ -312,6 +428,191 @@
     return STATUS_UNSUCCESSFUL;
 }
 
+NTSTATUS
+NTAPI
+IPortPinWavePci_HandleKsProperty(
+    IN IPortPinWavePci * iface,
+    IN PIRP Irp)
+{
+    PKSPROPERTY Property;
+    NTSTATUS Status;
+    UNICODE_STRING GuidString;
+    PIO_STACK_LOCATION IoStack;
+
+    IPortPinWavePciImpl * This = (IPortPinWavePciImpl*)iface;
+
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+    DPRINT("IPortPinWavePci_HandleKsProperty entered\n");
+
+    if (IoStack->Parameters.DeviceIoControl.InputBufferLength < 
sizeof(KSPROPERTY))
+    {
+        Irp->IoStatus.Information = 0;
+        Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    Property = 
(PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
+
+    if (IsEqualGUIDAligned(&Property->Set, &KSPROPSETID_Connection))
+    {
+        if (Property->Id == KSPROPERTY_CONNECTION_STATE)
+        {
+            PKSSTATE State = (PKSSTATE)Irp->UserBuffer;
+
+            ASSERT_IRQL(DISPATCH_LEVEL);
+            if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < 
sizeof(KSSTATE))
+            {
+                Irp->IoStatus.Information = sizeof(KSSTATE);
+                Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
+                IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                return STATUS_BUFFER_TOO_SMALL;
+            }
+
+            if (Property->Flags & KSPROPERTY_TYPE_SET)
+            {
+                Status = STATUS_UNSUCCESSFUL;
+                Irp->IoStatus.Information = 0;
+
+                if (This->Stream)
+                {
+                    Status = This->Stream->lpVtbl->SetState(This->Stream, 
*State);
+
+                    DPRINT1("Setting state %u %x\n", *State, Status);
+                    if (NT_SUCCESS(Status))
+                    {
+                        This->State = *State;
+                    }
+                }
+                Irp->IoStatus.Status = Status;
+                IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                return Status;
+            }
+            else if (Property->Flags & KSPROPERTY_TYPE_GET)
+            {
+                *State = This->State;
+                Irp->IoStatus.Information = sizeof(KSSTATE);
+                Irp->IoStatus.Status = STATUS_SUCCESS;
+                IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                return STATUS_SUCCESS;
+            }
+        }
+        else if (Property->Id == KSPROPERTY_CONNECTION_DATAFORMAT)
+        {
+            PKSDATAFORMAT DataFormat = (PKSDATAFORMAT)Irp->UserBuffer;
+            if (Property->Flags & KSPROPERTY_TYPE_SET)
+            {
+                PKSDATAFORMAT NewDataFormat;
+                if (!RtlCompareMemory(DataFormat, This->Format, 
DataFormat->FormatSize))
+                {
+                    Irp->IoStatus.Information = DataFormat->FormatSize;
+                    Irp->IoStatus.Status = STATUS_SUCCESS;
+                    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                    return STATUS_SUCCESS;
+                }
+
+                NewDataFormat = AllocateItem(NonPagedPool, 
DataFormat->FormatSize, TAG_PORTCLASS);
+                if (!NewDataFormat)
+                {
+                    Irp->IoStatus.Information = 0;
+                    Irp->IoStatus.Status = STATUS_NO_MEMORY;
+                    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                    return STATUS_NO_MEMORY;
+                }
+                RtlMoveMemory(NewDataFormat, DataFormat, 
DataFormat->FormatSize);
+
+                if (This->Stream)
+                {
+                    ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
+                    ASSERT(NewDataFormat->FormatSize == 
sizeof(KSDATAFORMAT_WAVEFORMATEX));
+                    
ASSERT(IsEqualGUIDAligned(&((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->DataFormat.MajorFormat,
 &KSDATAFORMAT_TYPE_AUDIO));
+                    
ASSERT(IsEqualGUIDAligned(&((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->DataFormat.SubFormat,
 &KSDATAFORMAT_SUBTYPE_PCM));
+                    
ASSERT(IsEqualGUIDAligned(&((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->DataFormat.Specifier,
 &KSDATAFORMAT_SPECIFIER_WAVEFORMATEX));
+
+                    ASSERT(This->State == KSSTATE_STOP);
+                    DPRINT1("NewDataFormat: Channels %u Bits %u Samples %u\n", 
((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->WaveFormatEx.nChannels,
+                                                                               
  ((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->WaveFormatEx.wBitsPerSample,
+                                                                               
  ((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->WaveFormatEx.nSamplesPerSec);
+
+                    Status = This->Stream->lpVtbl->SetFormat(This->Stream, 
NewDataFormat);
+                    if (NT_SUCCESS(Status))
+                    {
+                        if (This->Format)
+                            ExFreePoolWithTag(This->Format, TAG_PORTCLASS);
+
+                        This->IrpQueue->lpVtbl->UpdateFormat(This->IrpQueue, 
(PKSDATAFORMAT)NewDataFormat);
+                        This->Format = NewDataFormat;
+                        Irp->IoStatus.Information = DataFormat->FormatSize;
+                        Irp->IoStatus.Status = STATUS_SUCCESS;
+                        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                        return STATUS_SUCCESS;
+                    }
+                }
+                DPRINT1("Failed to set format\n");
+                Irp->IoStatus.Information = 0;
+                Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
+                IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                return STATUS_UNSUCCESSFUL;
+            }
+            else if (Property->Flags & KSPROPERTY_TYPE_GET)
+            {
+                if (!This->Format)
+                {
+                    DPRINT1("No format\n");
+                    Irp->IoStatus.Information = 0;
+                    Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
+                    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                    return STATUS_UNSUCCESSFUL;
+                }
+                if (This->Format->FormatSize > 
IoStack->Parameters.DeviceIoControl.OutputBufferLength)
+                {
+                    Irp->IoStatus.Information = This->Format->FormatSize;
+                    Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
+                    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                    return STATUS_BUFFER_TOO_SMALL;
+                }
+
+                RtlMoveMemory(DataFormat, This->Format, 
This->Format->FormatSize);
+                Irp->IoStatus.Information = DataFormat->FormatSize;
+                Irp->IoStatus.Status = STATUS_SUCCESS;
+                IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                return STATUS_SUCCESS;
+            }
+        }
+        else if (Property->Id == KSPROPERTY_CONNECTION_ALLOCATORFRAMING)
+        {
+            PKSALLOCATOR_FRAMING Framing = 
(PKSALLOCATOR_FRAMING)Irp->UserBuffer;
+
+            ASSERT_IRQL(DISPATCH_LEVEL);
+            /* Validate input buffer */
+            if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < 
sizeof(KSALLOCATOR_FRAMING))
+            {
+                Irp->IoStatus.Information = sizeof(KSALLOCATOR_FRAMING);
+                Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
+                IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                return STATUS_BUFFER_TOO_SMALL;
+            }
+            /* copy frame allocator struct */
+            RtlMoveMemory(Framing, &This->AllocatorFraming, 
sizeof(KSALLOCATOR_FRAMING));
+
+            Irp->IoStatus.Information = sizeof(KSALLOCATOR_FRAMING);
+            Irp->IoStatus.Status = STATUS_SUCCESS;
+            IoCompleteRequest(Irp, IO_NO_INCREMENT);
+            return STATUS_SUCCESS;
+        }
+    }
+
+    RtlStringFromGUID(&Property->Set, &GuidString);
+    DPRINT1("Unhandeled property Set |%S| Id %u Flags %x\n", 
GuidString.Buffer, Property->Id, Property->Flags);
+    RtlFreeUnicodeString(&GuidString);
+
+    Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
+    Irp->IoStatus.Information = 0;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    return STATUS_NOT_IMPLEMENTED;
+}
+
 /*
  * @unimplemented
  */
@@ -322,6 +623,16 @@
     IN PDEVICE_OBJECT DeviceObject,
     IN PIRP Irp)
 {
+    PIO_STACK_LOCATION IoStack;
+
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+    if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY)
+    {
+       return IPortPinWavePci_HandleKsProperty(iface, Irp);
+    }
+
+
     UNIMPLEMENTED
 
     Irp->IoStatus.Information = 0;
@@ -614,7 +925,6 @@
 
     Packet = (PCONTEXT_WRITE)Buffer;
 
-
     if (This->IrpQueue->lpVtbl->MinimumDataAvailable(This->IrpQueue))
     {
         Irp = Packet->Irp;
@@ -669,7 +979,6 @@
     NTSTATUS Status;
     PKSDATAFORMAT DataFormat;
     BOOL Capture;
-    KSALLOCATOR_FRAMING AllocatorFraming;
 
     IPortPinWavePciImpl * This = (IPortPinWavePciImpl*)iface;
 
@@ -693,14 +1002,6 @@
 
     RtlMoveMemory(This->Format, DataFormat, DataFormat->FormatSize);
 
-    Status = NewIPortWavePciStream(&This->WaveStream);
-    if (!NT_SUCCESS(Status))
-    {
-        ExFreePool(This->Format);
-        This->Format = NULL;
-        return Status;
-    }
-
     if (KsPinDescriptor->Communication == KSPIN_COMMUNICATION_SINK && 
KsPinDescriptor->DataFlow == KSPIN_DATAFLOW_IN)
     {
         Capture = FALSE;
@@ -719,7 +1020,7 @@
                                                &This->Stream,
                                                NULL,
                                                NonPagedPool,
-                                               This->WaveStream,
+                                               
(PPORTWAVEPCISTREAM)&This->lpVtblPortWavePciStream,
                                                ConnectDetails->PinId,
                                                Capture,
                                                This->Format,
@@ -746,9 +1047,7 @@
     /* delay of 10 milisec */
     This->Delay = Int32x32To64(10, -10000);
 
-    This->IrpQueue = IPortWavePciStream_GetIrpQueue(This->WaveStream);
-
-    Status = This->Stream->lpVtbl->GetAllocatorFraming(This->Stream, 
&AllocatorFraming);
+    Status = This->Stream->lpVtbl->GetAllocatorFraming(This->Stream, 
&This->AllocatorFraming);
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("GetAllocatorFraming failed with %x\n", Status);
@@ -756,9 +1055,13 @@
     }
 
     DPRINT("OptionFlags %x RequirementsFlag %x PoolType %x Frames %lu 
FrameSize %lu FileAlignment %lu\n",
-           AllocatorFraming.OptionsFlags, AllocatorFraming.RequirementsFlags, 
AllocatorFraming.PoolType, AllocatorFraming.Frames, AllocatorFraming.FrameSize, 
AllocatorFraming.FileAlignment);
-
-    Status = This->IrpQueue->lpVtbl->Init(This->IrpQueue, ConnectDetails, 
This->Format, DeviceObject, AllocatorFraming.FrameSize, 
AllocatorFraming.FileAlignment);
+           This->AllocatorFraming.OptionsFlags, 
This->AllocatorFraming.RequirementsFlags, This->AllocatorFraming.PoolType, 
This->AllocatorFraming.Frames, This->AllocatorFraming.FrameSize, 
This->AllocatorFraming.FileAlignment);
+
+    Status = NewIrpQueue(&This->IrpQueue);
+    if (!NT_SUCCESS(Status))
+        return Status;
+
+    Status = This->IrpQueue->lpVtbl->Init(This->IrpQueue, ConnectDetails, 
This->Format, DeviceObject, This->AllocatorFraming.FrameSize, 
This->AllocatorFraming.FileAlignment);
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("IrpQueue_Init failed with %x\n", Status);
@@ -835,6 +1138,7 @@
     This->ref = 1;
     This->lpVtbl = &vt_IPortPinWavePci;
     This->lpVtblServiceSink = &vt_IServiceSink;
+    This->lpVtblPortWavePciStream = &vt_PortWavePciStream;
 
 
     /* store result */

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/port_dmus.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/port_dmus.c?rev=42016&r1=42015&r2=42016&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/port_dmus.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/port_dmus.c [iso-8859-1] 
Fri Jul 17 21:15:52 2009
@@ -45,6 +45,28 @@
     }
 };
 
+DEFINE_KSPROPERTY_TOPOLOGYSET(PortFilterDMusTopologySet, 
TopologyPropertyHandler);
+DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(PortFilterDMusPinSet, 
PinPropertyHandler, PinPropertyHandler, PinPropertyHandler);
+
+KSPROPERTY_SET PortDMusPropertySet[] =
+{
+    {
+        &KSPROPSETID_Topology,
+        sizeof(PortFilterDMusTopologySet) / sizeof(KSPROPERTY_ITEM),
+        (const KSPROPERTY_ITEM*)&PortFilterDMusTopologySet,
+        0,
+        NULL
+    },
+    {
+        &KSPROPSETID_Pin,
+        sizeof(PortFilterDMusPinSet) / sizeof(KSPROPERTY_ITEM),
+        (const KSPROPERTY_ITEM*)&PortFilterDMusPinSet,
+        0,
+        NULL
+    }
+};
+
+
 //---------------------------------------------------------------
 // IUnknown interface functions
 //
@@ -249,8 +271,8 @@
                                          InterfaceGuids, 
                                          0, 
                                          NULL,
-                                         0, 
-                                         NULL,
+                                         2, 
+                                         PortDMusPropertySet,
                                          0,
                                          0,
                                          0,

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c?rev=42016&r1=42015&r2=42016&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c [iso-8859-1] 
Fri Jul 17 21:15:52 2009
@@ -30,6 +30,10 @@
     PPCFILTER_DESCRIPTOR pDescriptor;
     PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor;
     IPortFilterWavePci * Filter;
+
+    LIST_ENTRY EventList;
+    KSPIN_LOCK EventListLock;
+
 }IPortWavePciImpl;
 
 static GUID InterfaceGuids[3] = 
@@ -133,8 +137,14 @@
     IPortEvents* iface,
     IN PKSEVENT_ENTRY EventEntry)
 {
-    UNIMPLEMENTED
+    KIRQL OldIrql;
+    IPortWavePciImpl * This = (IPortWavePciImpl*)CONTAINING_RECORD(iface, 
IPortWavePciImpl, lpVtblPortEvents);
+
     ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
+    KeAcquireSpinLock(&This->EventListLock, &OldIrql);
+    InsertTailList(&This->EventList, &EventEntry->ListEntry);
+    KeReleaseSpinLock(&This->EventListLock, OldIrql);
 }
 
 
@@ -377,6 +387,8 @@
     This->pDeviceObject = DeviceObject;
     This->bInitialized = TRUE;
     This->pResourceList = ResourceList;
+    InitializeListHead(&This->EventList);
+    KeInitializeSpinLock(&This->EventListLock);
 
     /* increment reference on miniport adapter */
     Miniport->lpVtbl->AddRef(Miniport);

Removed: trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepcistream.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepcistream.c?rev=42015&view=auto
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepcistream.c 
[iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepcistream.c 
(removed)
@@ -1,165 +1,0 @@
-/*
- * COPYRIGHT:       See COPYING in the top level directory
- * PROJECT:         ReactOS Kernel Streaming
- * FILE:            drivers/wdm/audio/backpln/portcls/port_wavepcistream.c
- * PURPOSE:         Wave PCI Stream object
- * PROGRAMMER:      Johannes Anderwald
- */
-
-#include "private.h"
-
-typedef struct
-{
-    IPortWavePciStreamVtbl * lpVtbl;
-    IIrpQueue *Queue;
-    LONG ref;
-
-
-}IPortWavePciStreamImpl;
-
-static
-NTSTATUS
-NTAPI
-IPortWavePciStream_fnQueryInterface(
-    IPortWavePciStream* iface,
-    IN  REFIID refiid,
-    OUT PVOID* Output)
-{
-    IPortWavePciStreamImpl * This = (IPortWavePciStreamImpl*)iface;
-
-    DPRINT("IPortWavePciStream_fnQueryInterface entered\n");
-
-    if (IsEqualGUIDAligned(refiid, &IID_IPortWavePciStream) ||
-        IsEqualGUIDAligned(refiid, &IID_IUnknown))
-    {
-        *Output = &This->lpVtbl;
-        InterlockedIncrement(&This->ref);
-        return STATUS_SUCCESS;
-    }
-
-    return STATUS_UNSUCCESSFUL;
-}
-
-static
-ULONG
-NTAPI
-IPortWavePciStream_fnAddRef(
-    IPortWavePciStream* iface)
-{
-    IPortWavePciStreamImpl * This = (IPortWavePciStreamImpl*)iface;
-    DPRINT("IPortWavePciStream_fnAddRef entered\n");
-
-    return InterlockedIncrement(&This->ref);
-}
-
-static
-ULONG
-NTAPI
-IPortWavePciStream_fnRelease(
-    IPortWavePciStream* iface)
-{
-    IPortWavePciStreamImpl * This = (IPortWavePciStreamImpl*)iface;
-
-    InterlockedDecrement(&This->ref);
-
-    DPRINT("IPortWavePciStream_fnRelease entered %u\n", This->ref);
-
-    if (This->ref == 0)
-    {
-        This->Queue->lpVtbl->Release(This->Queue);
-        FreeItem(This, TAG_PORTCLASS);
-        return 0;
-    }
-    /* Return new reference count */
-    return This->ref;
-}
-
-static
-NTSTATUS
-NTAPI
-IPortWavePciStream_fnGetMapping(
-    IN IPortWavePciStream *iface,
-    IN PVOID Tag,
-    OUT PPHYSICAL_ADDRESS  PhysicalAddress,
-    OUT PVOID  *VirtualAddress,
-    OUT PULONG  ByteCount,
-    OUT PULONG  Flags)
-{
-    IPortWavePciStreamImpl * This = (IPortWavePciStreamImpl*)iface;
-
-    ASSERT_IRQL(DISPATCH_LEVEL);
-    return This->Queue->lpVtbl->GetMappingWithTag(This->Queue, Tag, 
PhysicalAddress, VirtualAddress, ByteCount, Flags);
-}
-
-static
-NTSTATUS
-NTAPI
-IPortWavePciStream_fnReleaseMapping(
-    IN IPortWavePciStream *iface,
-    IN PVOID  Tag)
-{
-    IPortWavePciStreamImpl * This = (IPortWavePciStreamImpl*)iface;
-
-    ASSERT_IRQL(DISPATCH_LEVEL);
-    return This->Queue->lpVtbl->ReleaseMappingWithTag(This->Queue, Tag);
-}
-
-static
-NTSTATUS
-NTAPI
-IPortWavePciStream_fnTerminatePacket(
-    IN IPortWavePciStream *iface)
-{
-    UNIMPLEMENTED
-    ASSERT_IRQL(DISPATCH_LEVEL);
-    return STATUS_SUCCESS;
-}
-
-
-static IPortWavePciStreamVtbl vt_PortWavePciStream =
-{
-    IPortWavePciStream_fnQueryInterface,
-    IPortWavePciStream_fnAddRef,
-    IPortWavePciStream_fnRelease,
-    IPortWavePciStream_fnGetMapping,
-    IPortWavePciStream_fnReleaseMapping,
-    IPortWavePciStream_fnTerminatePacket
-};
-
-NTSTATUS
-NTAPI
-NewIPortWavePciStream(
-    OUT PPORTWAVEPCISTREAM *Stream)
-{
-    IIrpQueue * Queue;
-    IPortWavePciStreamImpl * This;
-    NTSTATUS Status;
-
-    Status = NewIrpQueue(&Queue);
-    if (!NT_SUCCESS(Status))
-        return Status;
-
-    This = AllocateItem(NonPagedPool, sizeof(IPortWavePciStreamImpl), 
TAG_PORTCLASS);
-    if (!This)
-    {
-        Queue->lpVtbl->Release(Queue);
-        return STATUS_INSUFFICIENT_RESOURCES;
-    }
-
-    This->lpVtbl = &vt_PortWavePciStream;
-    This->ref = 1;
-    This->Queue = Queue;
-
-    *Stream = (PPORTWAVEPCISTREAM)&This->lpVtbl;
-    return STATUS_SUCCESS;
-}
-
-IIrpQueue*
-NTAPI
-IPortWavePciStream_GetIrpQueue(
-    IN IPortWavePciStream *iface)
-{
-    IPortWavePciStreamImpl * This = (IPortWavePciStreamImpl*)iface;
-    return This->Queue;
-}
-

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild?rev=42016&r1=42015&r2=42016&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild [iso-8859-1] 
Fri Jul 17 21:15:52 2009
@@ -10,6 +10,7 @@
        <library>drmk</library>
        <library>hal</library>
        <library>libcntpr</library>
+       <library>pseh</library>
        <file>adapter.c</file>
        <file>api.c</file>
        <file>connection.c</file>
@@ -40,7 +41,6 @@
        <file>port_topology.c</file>
        <file>port_wavecyclic.c</file>
        <file>port_wavepci.c</file>
-       <file>port_wavepcistream.c</file>
        <file>port_wavert.c</file>
        <file>port_wavertstream.c</file>
        <file>power.c</file>

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/private.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/private.h?rev=42016&r1=42015&r2=42016&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/private.h [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/private.h [iso-8859-1] Fri 
Jul 17 21:15:52 2009
@@ -278,16 +278,6 @@
 PDEVICE_OBJECT
 GetDeviceObject(
     IPortWaveCyclic* iface);
-
-IIrpQueue*
-NTAPI
-IPortWavePciStream_GetIrpQueue(
-    IN IPortWavePciStream *iface);
-
-NTSTATUS
-NTAPI
-NewIPortWavePciStream(
-    OUT PPORTWAVEPCISTREAM *Stream);
 
 VOID
 NTAPI

Modified: trunk/reactos/drivers/wdm/audio/legacy/wdmaud/control.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/legacy/wdmaud/control.c?rev=42016&r1=42015&r2=42016&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/legacy/wdmaud/control.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/legacy/wdmaud/control.c [iso-8859-1] Fri 
Jul 17 21:15:52 2009
@@ -597,6 +597,49 @@
 
 NTSTATUS
 NTAPI
+WdmAudFrameSize(
+    IN  PDEVICE_OBJECT DeviceObject,
+    IN  PIRP Irp,
+    IN  PWDMAUD_DEVICE_INFO DeviceInfo,
+    IN  PWDMAUD_CLIENT ClientInfo)
+{
+    PFILE_OBJECT FileObject;
+    KSPROPERTY Property;
+    ULONG BytesReturned;
+    KSALLOCATOR_FRAMING Framing;
+    NTSTATUS Status;
+
+    /* Get sysaudio pin file object */
+    Status = ObReferenceObjectByHandle(DeviceInfo->hDevice, GENERIC_WRITE, 
IoFileObjectType, KernelMode, (PVOID*)&FileObject, NULL);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("Invalid buffer handle %x\n", DeviceInfo->hDevice);
+        return SetIrpIoStatus(Irp, Status, 0);
+    }
+
+    /* Setup get framing request */
+    Property.Id = KSPROPERTY_CONNECTION_ALLOCATORFRAMING;
+    Property.Flags = KSPROPERTY_TYPE_GET;
+    Property.Set = KSPROPSETID_Connection;
+
+    Status = KsSynchronousIoControlDevice(FileObject, KernelMode, 
IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&Framing, 
sizeof(KSALLOCATOR_FRAMING), &BytesReturned);
+    /* Did we succeed */
+    if (NT_SUCCESS(Status))
+    {
+        /* Store framesize */
+        DeviceInfo->u.FrameSize = Framing.FrameSize;
+    }
+
+    /* Release file object */
+    ObDereferenceObject(FileObject);
+
+    return SetIrpIoStatus(Irp, Status, sizeof(WDMAUD_DEVICE_INFO));
+
+}
+
+
+NTSTATUS
+NTAPI
 WdmAudDeviceControl(
     IN  PDEVICE_OBJECT DeviceObject,
     IN  PIRP Irp)
@@ -647,8 +690,9 @@
             return WdmAudCapabilities(DeviceObject, Irp, DeviceInfo, 
ClientInfo);
         case IOCTL_CLOSE_WDMAUD:
             return WdmAudIoctlClose(DeviceObject, Irp, DeviceInfo, ClientInfo);
+        case IOCTL_GETFRAMESIZE:
+            return WdmAudFrameSize(DeviceObject, Irp, DeviceInfo, ClientInfo);
         case IOCTL_GETPOS:
-            DPRINT1("IOCTL_GETPOS\n");
         case IOCTL_GETDEVID:
         case IOCTL_GETVOLUME:
         case IOCTL_SETVOLUME:
@@ -793,4 +837,3 @@
     ObDereferenceObject(FileObject);
     return IoStatusBlock.Status;
 }
-

Modified: trunk/reactos/drivers/wdm/audio/legacy/wdmaud/interface.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/legacy/wdmaud/interface.h?rev=42016&r1=42015&r2=42016&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/legacy/wdmaud/interface.h [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/legacy/wdmaud/interface.h [iso-8859-1] Fri 
Jul 17 21:15:52 2009
@@ -43,6 +43,7 @@
         ULONGLONG    Position;
         KSSTATE State;
         ULONG Volume;
+        ULONG FrameSize;
     }u;
 
 }WDMAUD_DEVICE_INFO, *PWDMAUD_DEVICE_INFO;
@@ -212,7 +213,7 @@
 /// Arguments:  InputBuffer is a pointer to a WDMAUD_DEVICE_INFO structure,
 ///             InputBufferSize is size of WDMAUD_DEVICE_INFO structure
 /// Note:       The DeviceType and hDevice must be set
-/// Result:     The result is returned in Volume
+/// Result:     The result is returned in Position
 /// ReturnCode:  STATUS_SUCCESS indicates success
 /// Prequsites: opened device
 
@@ -222,5 +223,22 @@
              METHOD_BUFFERED, \
              FILE_CREATE_TREE_CONNECTION | FILE_ANY_ACCESS)
 
+/// IOCTL_GETFRAMESIZE
+///
+/// Description: This IOCTL retrieves the frame size requirements for an audio 
pin
+///
+/// Arguments:  InputBuffer is a pointer to a WDMAUD_DEVICE_INFO structure,
+///             InputBufferSize is size of WDMAUD_DEVICE_INFO structure
+/// Note:       The DeviceType and hDevice must be set
+/// Result:     The result is returned in FrameSize
+/// ReturnCode:  STATUS_SUCCESS indicates success
+/// Prequsites: opened device
+
+#define IOCTL_GETFRAMESIZE \
+    CTL_CODE(FILE_DEVICE_SOUND, \
+             10, \
+             METHOD_BUFFERED, \
+             FILE_CREATE_TREE_CONNECTION | FILE_ANY_ACCESS)
+
 
 #endif

Modified: trunk/reactos/drivers/wdm/audio/sysaudio/pin.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/sysaudio/pin.c?rev=42016&r1=42015&r2=42016&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/sysaudio/pin.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/sysaudio/pin.c [iso-8859-1] Fri Jul 17 
21:15:52 2009
@@ -128,9 +128,9 @@
 {
     PDISPATCH_CONTEXT Context;
     PIO_STACK_LOCATION IoStack;
-    ULONG BytesReturned;
     PFILE_OBJECT FileObject;
     NTSTATUS Status;
+    ULONG BytesReturned;
 
     /* Get current stack location */
     IoStack = IoGetCurrentIrpStackLocation(Irp);
@@ -159,20 +159,21 @@
         return Status;
     }
 
-    /* Re-dispatch the request to the real target pin */
+    /* call the portcls audio pin */
     Status = KsSynchronousIoControlDevice(FileObject, KernelMode, 
IOCTL_KS_WRITE_STREAM,
                                           
MmGetMdlVirtualAddress(Irp->MdlAddress),
-                                          IoStack->Parameters.Read.Length,
+                                          IoStack->Parameters.Write.Length,
                                           NULL,
                                           0,
                                           &BytesReturned);
 
-    /* release file object */
+
+    /* Release file object */
     ObDereferenceObject(FileObject);
 
     /* Save status and information */
     Irp->IoStatus.Status = Status;
-    Irp->IoStatus.Information = 0;
+    Irp->IoStatus.Information = BytesReturned;
     /* Complete the irp */
     IoCompleteRequest(Irp, IO_NO_INCREMENT);
     /* Done */

Reply via email to