mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 00:45:24 +00:00
- 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:
parent
b27721cbe6
commit
0ea44d711f
8 changed files with 59 additions and 29 deletions
|
@ -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;
|
||||
|
||||
|
|
|
@ -214,6 +214,8 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown)
|
|||
|
||||
STDMETHOD_(BOOL, MinimumDataAvailable)(THIS);
|
||||
|
||||
STDMETHOD_(BOOL, CancelBuffers)(THIS);
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
||||
/*
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in a new issue