- Disable message flood when playing audio files as it is very time critical and makes audio stutter

- Free remaining irps and make sure that the dpc finished before stopping the audio stream. This fixing stuttering when there are too few audio buffers available.
- Complete the IRPs when they are actually have played. This should make audio playback position become more accurate and prevents application to feed in too much audio buffers
- VLC 0.9.8a can now playback audio files (no window is shown -> different issue)

svn path=/trunk/; revision=39917
This commit is contained in:
Johannes Anderwald 2009-03-09 18:05:56 +00:00
parent b27721cbe6
commit 0ea44d711f
8 changed files with 59 additions and 29 deletions

View file

@ -216,7 +216,7 @@ Dispatch_fnFastWrite(
PDEVICE_OBJECT DeviceObject)
{
IIrpTarget * IrpTarget;
DPRINT1("Dispatch_fnFastWrite called DeviceObject %p Irp %p\n", DeviceObject);
//DPRINT1("Dispatch_fnFastWrite called DeviceObject %p Irp %p\n", DeviceObject);
IrpTarget = (IIrpTarget *)FileObject->FsContext2;

View file

@ -214,6 +214,8 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown)
STDMETHOD_(BOOL, MinimumDataAvailable)(THIS);
STDMETHOD_(BOOL, CancelBuffers)(THIS);
};

View file

@ -85,7 +85,6 @@ DpcRoutine(
DPRINT1("Freed %u Buffers / IRP Available Mappings %u\n", Count, This->NumMappings);
}
NTSTATUS
NTAPI
IIrpQueue_fnQueryInterface(
@ -170,7 +169,7 @@ IIrpQueue_fnAddMapping(
Mapping->Irp = Irp;
Mapping->Next = NULL;
DPRINT1("FirstMap %p LastMap %p NumMappings %u\n", This->FirstMap, This->LastMap, This->NumMappings);
//DPRINT1("FirstMap %p LastMap %p NumMappings %u\n", This->FirstMap, This->LastMap, This->NumMappings);
if (!This->FirstMap)
This->FirstMap = Mapping;
@ -190,7 +189,7 @@ IIrpQueue_fnAddMapping(
This->NumDataAvailable += Mapping->Header->DataUsed;
DPRINT1("IIrpQueue_fnAddMapping NumMappings %u SizeOfMapping %lu NumDataAvailable %lu\n", This->NumMappings, Mapping->Header->DataUsed, This->NumDataAvailable);
DPRINT1("IIrpQueue_fnAddMapping NumMappings %u SizeOfMapping %lu NumDataAvailable %lu Irp %p\n", This->NumMappings, Mapping->Header->DataUsed, This->NumDataAvailable, Irp);
return STATUS_SUCCESS;
}
@ -231,6 +230,9 @@ IIrpQueue_fnUpdateMapping(
Mapping = This->FirstMap;
This->FirstMap = This->FirstMap->Next;
if (!This->FirstMap)
This->LastMap = NULL;
This->FreeCount++;
if (!This->FreeMapHead)
@ -245,8 +247,7 @@ IIrpQueue_fnUpdateMapping(
This->NumDataAvailable -= Mapping->Header->DataUsed;
if ((This->FreeDataSize > This->DataFormat->WaveFormatEx.nAvgBytesPerSec || This->FreeCount > 25) &&
This->DpcActive == FALSE)
if (This->FreeCount > 5 && This->DpcActive == FALSE)
{
Mapping = This->FreeMapHead;
This->FreeMapHead = NULL;
@ -292,7 +293,34 @@ IIrpQueue_fnMinimumDataAvailable(
return Result;
}
BOOL
NTAPI
IIrpQueue_fnCancelBuffers(
IN IIrpQueue *iface)
{
PIRP_MAPPING Mapping;
IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
if (This->DpcActive)
return FALSE;
ASSERT(This->FirstMap == NULL);
ASSERT(This->LastMap == NULL);
if (This->FreeMapHead == NULL)
{
ASSERT(This->FreeMapTail == NULL);
This->FreeMapTail = NULL;
return TRUE;
}
Mapping = This->FreeMapHead;
This->FreeMapHead = NULL;
This->FreeMapTail = NULL;
This->DpcActive = TRUE;
KeInsertQueueDpc(&This->Dpc, (PVOID)Mapping, NULL);
return FALSE;
}
static IIrpQueueVtbl vt_IIrpQueue =
{
@ -305,7 +333,8 @@ static IIrpQueueVtbl vt_IIrpQueue =
IIrpQueue_fnUpdateMapping,
IIrpQueue_fnNumMappings,
IIrpQueue_fnMinMappings,
IIrpQueue_fnMinimumDataAvailable
IIrpQueue_fnMinimumDataAvailable,
IIrpQueue_fnCancelBuffers
};

View file

@ -26,7 +26,6 @@ typedef struct
ULONG ActiveIrpBufferSize;
ULONG ActiveIrpOffset;
ULONG DelayedRequestInProgress;
ULONG RetryCount;
ULONG FrameSize;
}IPortPinWaveCyclicImpl;
@ -176,20 +175,19 @@ IServiceSink_fnRequestService(
Status = This->IrpQueue->lpVtbl->GetMapping(This->IrpQueue, &Buffer, &BufferSize);
if (!NT_SUCCESS(Status))
{
This->RetryCount++;
if (This->RetryCount > 30)
if (!This->IrpQueue->lpVtbl->CancelBuffers(This->IrpQueue))
{
/* there is an active dpc pending
* wait untill this dpc is done, in order to complete the remaining irps
*/
return;
}
DPRINT1("Stopping %u\n", This->IrpQueue->lpVtbl->NumMappings(This->IrpQueue));
This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_STOP);
This->RetryCount = 0;
This->State = KSSTATE_STOP;
This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_PAUSE);
This->State = KSSTATE_PAUSE;
return;
}
DPRINT("IServiceSink_fnRequestService> Waiting for mapping\n");
This->ServiceGroup->lpVtbl->RequestDelayedService(This->ServiceGroup, -10000000L);
return;
}
This->RetryCount = 0;
if (KeGetCurrentIrql() == DISPATCH_LEVEL)
return;
@ -381,6 +379,7 @@ IPortPinWaveCyclic_HandleKsProperty(
if (This->Stream)
{
This->IrpQueue->lpVtbl->CancelBuffers(This->IrpQueue);
This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_STOP);
This->State = KSSTATE_STOP;
@ -653,13 +652,13 @@ IPortPinWaveCyclic_fnFastWrite(
PIRP Irp;
IPortPinWaveCyclicImpl * This = (IPortPinWaveCyclicImpl*)iface;
DPRINT1("IPortPinWaveCyclic_fnFastWrite entered\n");
//DPRINT1("IPortPinWaveCyclic_fnFastWrite entered\n");
Packet = (PCONTEXT_WRITE)Buffer;
//if (This->IrpQueue->lpVtbl->MinimumDataAvailable(This->IrpQueue))
// Irp = Packet->Irp;
//else
if (This->IrpQueue->lpVtbl->MinimumDataAvailable(This->IrpQueue))
Irp = Packet->Irp;
else
Irp = NULL;
Status = This->IrpQueue->lpVtbl->AddMapping(This->IrpQueue, Buffer, Length, Irp);
@ -678,7 +677,7 @@ IPortPinWaveCyclic_fnFastWrite(
if (!Irp)
{
DPRINT1("Completing Irp %p\n", Packet->Irp);
//DPRINT1("Completing Irp %p\n", Packet->Irp);
Packet->Irp->IoStatus.Status = STATUS_SUCCESS;
Packet->Irp->IoStatus.Information = Packet->Header.DataUsed;

View file

@ -650,7 +650,7 @@ WdmAudWrite(
IoStack = IoGetCurrentIrpStackLocation(Irp);
DPRINT1("WdmAudWrite entered\n");
//DPRINT("WdmAudWrite entered\n");
if (IoStack->Parameters.Write.Length < sizeof(WDMAUD_DEVICE_INFO))
{
@ -670,7 +670,7 @@ WdmAudWrite(
}
DPRINT1("DeviceInfo %p %p %p\n", DeviceInfo, Irp->MdlAddress->StartVa, Irp->MdlAddress->MappedSystemVa);
//DPRINT("DeviceInfo %p %p %p\n", DeviceInfo, Irp->MdlAddress->StartVa, Irp->MdlAddress->MappedSystemVa);
if (DeviceInfo->DeviceType < MIN_SOUND_DEVICE_TYPE || DeviceInfo->DeviceType > MAX_SOUND_DEVICE_TYPE)
{
/* invalid parameter */
@ -735,7 +735,5 @@ WdmAudWrite(
return IoStatusBlock.Status;
//return SetIrpIoStatus(Irp, STATUS_SUCCESS, 0);
}

View file

@ -218,7 +218,8 @@ Pin_fnFastWrite(
{
PDISPATCH_CONTEXT Context;
NTSTATUS Status;
DPRINT1("Pin_fnFastWrite called DeviceObject %p Irp %p\n", DeviceObject);
//DPRINT1("Pin_fnFastWrite called DeviceObject %p Irp %p\n", DeviceObject);
Context = (PDISPATCH_CONTEXT)FileObject->FsContext2;
Status = KsStreamIo(Context->FileObject, NULL, NULL, NULL, NULL, 0, IoStatus, Buffer, Length, KSSTREAM_WRITE, KernelMode);

View file

@ -56,7 +56,7 @@
{ \
if ( ! ( condition ) ) \
{ \
SND_ERR(L"ASSERT FAILED: %hS\n", #condition); \
SND_ERR(L"ASSERT FAILED: %hS File %hS Line %u\n", #condition, __FILE__, __LINE__); \
POPUP(L"ASSERT FAILED: %hS\n", #condition); \
ExitProcess(1); \
} \
@ -80,6 +80,7 @@
#define SND_WARN(...) do {} while ( 0 )
#define SND_TRACE(...) do {} while ( 0 )
#define SND_ASSERT(condition) do {} while ( 0 )
#define DUMP_WAVEHDR_QUEUE(condition) do {} while ( 0 )
#endif
/*

View file

@ -2,7 +2,7 @@
<!DOCTYPE module SYSTEM "../../../../tools/rbuild/project.dtd">
<module name="mmebuddy" type="staticlibrary" allowwarnings="false" unicode="yes">
<include base="ReactOS">include/reactos/libs/sound</include>
<define name="DEBUG_NT4">1</define>
<define name="NDEBUG">1</define>
<file>capabilities.c</file>
<file>devicelist.c</file>
<file>deviceinstance.c</file>