- Increase importance of the audio dpc which finishes irps

- Once one second of audio data has been buffered, always queue audio irps and dont complete them imediately. Greatly improves the playback of SMPlayer and probably many other audio players which act strictly on the timing of completed irps
- Add debug traces when KsCreatePin fails

svn path=/trunk/; revision=40649
This commit is contained in:
Johannes Anderwald 2009-04-22 15:01:18 +00:00
parent 3ec26577f7
commit 0050614d7f
3 changed files with 24 additions and 7 deletions

View file

@ -30,6 +30,7 @@ typedef struct
ULONG CurrentOffset; ULONG CurrentOffset;
LONG NumMappings; LONG NumMappings;
ULONG NumDataAvailable; ULONG NumDataAvailable;
BOOL StartStream;
KSPIN_CONNECT *ConnectDetails; KSPIN_CONNECT *ConnectDetails;
PKSDATAFORMAT_WAVEFORMATEX DataFormat; PKSDATAFORMAT_WAVEFORMATEX DataFormat;
@ -159,6 +160,7 @@ IIrpQueue_fnAddMapping(
Mapping->Header = (KSSTREAM_HEADER*)Buffer; Mapping->Header = (KSSTREAM_HEADER*)Buffer;
Mapping->Irp = Irp; Mapping->Irp = Irp;
KeInitializeDpc(&Mapping->Dpc, DpcRoutine, (PVOID)Mapping); KeInitializeDpc(&Mapping->Dpc, DpcRoutine, (PVOID)Mapping);
KeSetImportanceDpc(&Mapping->Dpc, HighImportance);
if (This->MaxFrameSize) if (This->MaxFrameSize)
{ {
@ -258,8 +260,14 @@ IIrpQueue_fnMinimumDataAvailable(
BOOL Result; BOOL Result;
IIrpQueueImpl * This = (IIrpQueueImpl*)iface; IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
if (This->StartStream)
return TRUE;
if (This->DataFormat->WaveFormatEx.nAvgBytesPerSec < This->NumDataAvailable) if (This->DataFormat->WaveFormatEx.nAvgBytesPerSec < This->NumDataAvailable)
{
This->StartStream = TRUE;
Result = TRUE; Result = TRUE;
}
else else
Result = FALSE; Result = FALSE;
@ -282,6 +290,7 @@ IIrpQueue_fnUpdateFormat(
{ {
IIrpQueueImpl * This = (IIrpQueueImpl*)iface; IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
This->DataFormat = (PKSDATAFORMAT_WAVEFORMATEX)DataFormat; This->DataFormat = (PKSDATAFORMAT_WAVEFORMATEX)DataFormat;
This->StartStream = FALSE;
} }

View file

@ -203,14 +203,17 @@ StopStreamWorkerRoutine(
This = (IPortPinWaveCyclicImpl*)Ctx->Pin; This = (IPortPinWaveCyclicImpl*)Ctx->Pin;
IoFreeWorkItem(Ctx->WorkItem);
FreeItem(Ctx, TAG_PORTCLASS);
if (This->IrpQueue->lpVtbl->NumMappings(This->IrpQueue))
return;
/* Set the state to stop */ /* Set the state to stop */
This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_STOP); This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_STOP);
/* Set internal state to stop */ /* Set internal state to stop */
This->State = KSSTATE_STOP; This->State = KSSTATE_STOP;
IoFreeWorkItem(Ctx->WorkItem);
FreeItem(Ctx, TAG_PORTCLASS);
DPRINT1("Stopping %p %u Irql %u\n", This, This->IrpQueue->lpVtbl->NumMappings(This->IrpQueue), KeGetCurrentIrql()); DPRINT1("Stopping %p %u Irql %u\n", This, This->IrpQueue->lpVtbl->NumMappings(This->IrpQueue), KeGetCurrentIrql());
} }

View file

@ -263,13 +263,18 @@ CreatePinWorkerRoutine(
Status = KsCreatePin(WorkerContext->Entry->Handle, MixerPinConnect, GENERIC_READ | GENERIC_WRITE, &RealPinHandle); Status = KsCreatePin(WorkerContext->Entry->Handle, MixerPinConnect, GENERIC_READ | GENERIC_WRITE, &RealPinHandle);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
/* This should not fail */
DPRINT1("KsCreatePin failed with %x\n", Status); DPRINT1("KsCreatePin failed with %x\n", Status);
/* This should not fail */ DPRINT1(" InputFormat: SampleRate %u Bits %u Channels %u\n", InputFormat->WaveFormatEx.nSamplesPerSec, InputFormat->WaveFormatEx.wBitsPerSample, InputFormat->WaveFormatEx.nChannels);
KeBugCheck(0); DPRINT1("OutputFormat: SampleRate %u Bits %u Channels %u\n", OutputFormat->WaveFormatEx.nSamplesPerSec, OutputFormat->WaveFormatEx.wBitsPerSample, OutputFormat->WaveFormatEx.nChannels);
SetIrpIoStatus(WorkerContext->Irp, STATUS_UNSUCCESSFUL, 0);
ExFreePool(WorkerContext->DispatchContext);
ExFreePool(MixerPinConnect);
IoFreeWorkItem(WorkerContext->WorkItem);
ExFreePool(WorkerContext);
return; return;
} }
DPRINT(" InputFormat: SampleRate %u Bits %u Channels %u\n", InputFormat->WaveFormatEx.nSamplesPerSec, InputFormat->WaveFormatEx.wBitsPerSample, InputFormat->WaveFormatEx.nChannels);
DPRINT("OutputFormat: SampleRate %u Bits %u Channels %u\n", OutputFormat->WaveFormatEx.nSamplesPerSec, OutputFormat->WaveFormatEx.wBitsPerSample, OutputFormat->WaveFormatEx.nChannels);
} }
/* get pin file object */ /* get pin file object */