mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 00:45:24 +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;
|
KSSTREAM_HEADER *Header;
|
||||||
PIRP Irp;
|
PIRP Irp;
|
||||||
LIST_ENTRY Entry;
|
|
||||||
struct _IRP_MAPPING_ * Next;
|
struct _IRP_MAPPING_ * Next;
|
||||||
}IRP_MAPPING, *PIRP_MAPPING;
|
}IRP_MAPPING, *PIRP_MAPPING;
|
||||||
|
|
||||||
|
@ -32,8 +31,16 @@ typedef struct
|
||||||
LONG NumMappings;
|
LONG NumMappings;
|
||||||
IN KSPIN_CONNECT *ConnectDetails;
|
IN KSPIN_CONNECT *ConnectDetails;
|
||||||
|
|
||||||
|
KDPC Dpc;
|
||||||
PIRP_MAPPING FirstMap;
|
PIRP_MAPPING FirstMap;
|
||||||
PIRP_MAPPING LastMap;
|
PIRP_MAPPING LastMap;
|
||||||
|
|
||||||
|
ULONG DpcActive;
|
||||||
|
PIRP_MAPPING FreeMapHead;
|
||||||
|
PIRP_MAPPING FreeMapTail;
|
||||||
|
|
||||||
|
LONG FreeCount;
|
||||||
|
|
||||||
}IIrpQueueImpl;
|
}IIrpQueueImpl;
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
@ -42,7 +49,35 @@ DpcRoutine(
|
||||||
IN struct _KDPC *Dpc,
|
IN struct _KDPC *Dpc,
|
||||||
IN PVOID DeferredContext,
|
IN PVOID DeferredContext,
|
||||||
IN PVOID SystemArgument1,
|
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
|
NTSTATUS
|
||||||
|
@ -102,6 +137,7 @@ IIrpQueue_fnInit(
|
||||||
IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
|
IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
|
||||||
|
|
||||||
This->ConnectDetails = ConnectDetails;
|
This->ConnectDetails = ConnectDetails;
|
||||||
|
KeInitializeDpc(&This->Dpc, DpcRoutine, (PVOID)This);
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -123,6 +159,7 @@ IIrpQueue_fnAddMapping(
|
||||||
|
|
||||||
Mapping->Header = (KSSTREAM_HEADER*)Buffer;
|
Mapping->Header = (KSSTREAM_HEADER*)Buffer;
|
||||||
Mapping->Irp = Irp;
|
Mapping->Irp = Irp;
|
||||||
|
Mapping->Next = NULL;
|
||||||
|
|
||||||
if (!This->FirstMap)
|
if (!This->FirstMap)
|
||||||
This->FirstMap = Mapping;
|
This->FirstMap = Mapping;
|
||||||
|
@ -175,10 +212,24 @@ IIrpQueue_fnUpdateMapping(
|
||||||
Mapping = This->FirstMap;
|
Mapping = This->FirstMap;
|
||||||
This->FirstMap = This->FirstMap->Next;
|
This->FirstMap = This->FirstMap->Next;
|
||||||
|
|
||||||
//ExFreePool(Mapping->Header->Data);
|
This->FreeCount++;
|
||||||
//ExFreePool(Mapping->Header);
|
|
||||||
//IoCompleteRequest(Mapping->Irp, IO_NO_INCREMENT);
|
if (!This->FreeMapHead)
|
||||||
//ExFreePool(Mapping);
|
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