- If the current irp buffer is finished, set the state to pause (fixes looping of last sample)

- Use KeSetTimer if Irql is below equal DISPATCH_LEVEL

svn path=/trunk/; revision=39675
This commit is contained in:
Johannes Anderwald 2009-02-19 05:48:51 +00:00
parent f5cfdeec77
commit aa52ca9057
2 changed files with 15 additions and 5 deletions

View file

@ -105,9 +105,10 @@ IServiceSink_fnRequestService(
NTSTATUS Status; NTSTATUS Status;
IPortPinWaveCyclicImpl * This = (IPortPinWaveCyclicImpl*)CONTAINING_RECORD(iface, IPortPinWaveCyclicImpl, lpVtblServiceSink); IPortPinWaveCyclicImpl * This = (IPortPinWaveCyclicImpl*)CONTAINING_RECORD(iface, IPortPinWaveCyclicImpl, lpVtblServiceSink);
#if 0
if (This->ActiveIrp && This->ActiveIrpOffset >= This->ActiveIrpBufferSize) if (This->ActiveIrp && This->ActiveIrpOffset >= This->ActiveIrpBufferSize)
{ {
This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_PAUSE);
if (KeGetCurrentIrql() > DISPATCH_LEVEL) if (KeGetCurrentIrql() > DISPATCH_LEVEL)
{ {
if (This->DelayedRequestInProgress) if (This->DelayedRequestInProgress)
@ -140,7 +141,6 @@ IServiceSink_fnRequestService(
return; return;
} }
} }
#endif
if (!This->ActiveIrp) if (!This->ActiveIrp)
{ {
@ -186,7 +186,8 @@ IServiceSink_fnRequestService(
} }
else else
{ {
This->Stream->lpVtbl->Silence(This->Stream, (PUCHAR)This->CommonBuffer + This->CommonBufferOffset, BytesToCopy); This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_PAUSE);
return;
} }
BufferLength = Position; BufferLength = Position;
IrpLength = This->ActiveIrpBufferSize - This->ActiveIrpOffset; IrpLength = This->ActiveIrpBufferSize - This->ActiveIrpOffset;
@ -210,6 +211,12 @@ IServiceSink_fnRequestService(
BytesToCopy = min(BufferLength, IrpLength); BytesToCopy = min(BufferLength, IrpLength);
DPRINT1("Copying %u Remaining %u\n", BytesToCopy, IrpLength); DPRINT1("Copying %u Remaining %u\n", BytesToCopy, IrpLength);
if (!BytesToCopy)
{
This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_PAUSE);
return;
}
This->DmaChannel->lpVtbl->CopyTo(This->DmaChannel, This->DmaChannel->lpVtbl->CopyTo(This->DmaChannel,
(PUCHAR)This->CommonBuffer + This->CommonBufferOffset, (PUCHAR)This->CommonBuffer + This->CommonBufferOffset,
(PUCHAR)This->ActiveIrpBuffer + This->ActiveIrpOffset, (PUCHAR)This->ActiveIrpBuffer + This->ActiveIrpOffset,

View file

@ -211,8 +211,11 @@ IServiceGroup_fnRequestDelayedService(
if (This->Initialized) if (This->Initialized)
{ {
//KeSetTimer(&This->Timer, DueTime, &This->Dpc); if (KeGetCurrentIrql() <= DISPATCH_LEVEL)
KeSetTimer(&This->Timer, DueTime, &This->Dpc);
else
KeInsertQueueDpc(&This->Dpc, NULL, NULL); KeInsertQueueDpc(&This->Dpc, NULL, NULL);
KeClearEvent(&This->DpcEvent); KeClearEvent(&This->DpcEvent);
} }
} }