mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 16:36:33 +00:00
- Free queued audio buffers and complete irps
svn path=/trunk/; revision=39901
This commit is contained in:
parent
b69eed875d
commit
0da1e6e5e9
1 changed files with 57 additions and 6 deletions
|
@ -15,7 +15,6 @@ typedef struct _IRP_MAPPING_
|
|||
{
|
||||
KSSTREAM_HEADER *Header;
|
||||
PIRP Irp;
|
||||
LIST_ENTRY Entry;
|
||||
struct _IRP_MAPPING_ * Next;
|
||||
}IRP_MAPPING, *PIRP_MAPPING;
|
||||
|
||||
|
@ -32,8 +31,16 @@ typedef struct
|
|||
LONG NumMappings;
|
||||
IN KSPIN_CONNECT *ConnectDetails;
|
||||
|
||||
KDPC Dpc;
|
||||
PIRP_MAPPING FirstMap;
|
||||
PIRP_MAPPING LastMap;
|
||||
|
||||
ULONG DpcActive;
|
||||
PIRP_MAPPING FreeMapHead;
|
||||
PIRP_MAPPING FreeMapTail;
|
||||
|
||||
LONG FreeCount;
|
||||
|
||||
}IIrpQueueImpl;
|
||||
|
||||
VOID
|
||||
|
@ -42,7 +49,35 @@ DpcRoutine(
|
|||
IN struct _KDPC *Dpc,
|
||||
IN PVOID DeferredContext,
|
||||
IN PVOID SystemArgument1,
|
||||
IN PVOID SystemArgument2);
|
||||
IN PVOID SystemArgument2)
|
||||
{
|
||||
PIRP_MAPPING CurMapping, NextMapping = NULL;
|
||||
ULONG Count;
|
||||
IIrpQueueImpl * This = (IIrpQueueImpl*)DeferredContext;
|
||||
|
||||
CurMapping = (PIRP_MAPPING)SystemArgument1;
|
||||
ASSERT(CurMapping);
|
||||
|
||||
Count = 0;
|
||||
while(CurMapping)
|
||||
{
|
||||
NextMapping = CurMapping->Next;
|
||||
|
||||
CurMapping->Irp->IoStatus.Information = CurMapping->Header->DataUsed;
|
||||
CurMapping->Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||
IoCompleteRequest(CurMapping->Irp, IO_SOUND_INCREMENT);
|
||||
|
||||
ExFreePool(CurMapping->Header->Data);
|
||||
ExFreePool(CurMapping->Header);
|
||||
ExFreePool(CurMapping);
|
||||
|
||||
CurMapping = NextMapping;
|
||||
InterlockedDecrement(&This->FreeCount);
|
||||
Count++;
|
||||
}
|
||||
This->DpcActive = FALSE;
|
||||
DPRINT1("Freed %u Buffers / IRP\n", Count);
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS
|
||||
|
@ -102,6 +137,7 @@ IIrpQueue_fnInit(
|
|||
IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
|
||||
|
||||
This->ConnectDetails = ConnectDetails;
|
||||
KeInitializeDpc(&This->Dpc, DpcRoutine, (PVOID)This);
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
@ -123,6 +159,7 @@ IIrpQueue_fnAddMapping(
|
|||
|
||||
Mapping->Header = (KSSTREAM_HEADER*)Buffer;
|
||||
Mapping->Irp = Irp;
|
||||
Mapping->Next = NULL;
|
||||
|
||||
if (!This->FirstMap)
|
||||
This->FirstMap = Mapping;
|
||||
|
@ -175,10 +212,24 @@ IIrpQueue_fnUpdateMapping(
|
|||
Mapping = This->FirstMap;
|
||||
This->FirstMap = This->FirstMap->Next;
|
||||
|
||||
//ExFreePool(Mapping->Header->Data);
|
||||
//ExFreePool(Mapping->Header);
|
||||
//IoCompleteRequest(Mapping->Irp, IO_NO_INCREMENT);
|
||||
//ExFreePool(Mapping);
|
||||
This->FreeCount++;
|
||||
|
||||
if (!This->FreeMapHead)
|
||||
This->FreeMapHead = Mapping;
|
||||
else
|
||||
This->FreeMapTail->Next = Mapping;
|
||||
|
||||
This->FreeMapTail = Mapping;
|
||||
Mapping->Next = NULL;
|
||||
|
||||
if (This->FreeCount > iface->lpVtbl->MinMappings(iface) && This->DpcActive == FALSE)
|
||||
{
|
||||
Mapping = This->FreeMapHead;
|
||||
This->FreeMapHead = NULL;
|
||||
This->FreeMapTail = NULL;
|
||||
This->DpcActive = TRUE;
|
||||
KeInsertQueueDpc(&This->Dpc, (PVOID)Mapping, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue