mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 00:45:24 +00:00
[PORTCLS]
- Implement a function to retrieve the current acquired mapping tag range of the miniport driver - Call RevokeMappings when audio pin is stopped svn path=/trunk/; revision=45862
This commit is contained in:
parent
95f5adb673
commit
309fb1c02a
4 changed files with 88 additions and 2 deletions
|
@ -351,6 +351,11 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown)
|
|||
|
||||
STDMETHOD_(BOOLEAN, HasLastMappingFailed)(THIS) PURE;
|
||||
STDMETHOD_(ULONG, GetCurrentIrpOffset)(THIS) PURE;
|
||||
|
||||
STDMETHOD_(BOOLEAN, GetAcquiredTagRange)(THIS_
|
||||
IN PVOID * FirstTag,
|
||||
IN PVOID * LastTag);
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
@ -387,7 +392,11 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown)
|
|||
IN PVOID Tag); \
|
||||
\
|
||||
STDMETHODIMP_(BOOLEAN) HasLastMappingFailed(THIS); \
|
||||
STDMETHODIMP_(ULONG) GetCurrentIrpOffset(THIS);
|
||||
STDMETHODIMP_(ULONG) GetCurrentIrpOffset(THIS); \
|
||||
STDMETHODIMP_(BOOLEAN) GetAcquiredTagRange(THIS_ \
|
||||
IN PVOID * FirstTag, \
|
||||
IN PVOID * LastTag);
|
||||
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
|
|
|
@ -539,6 +539,53 @@ CIrpQueue::GetCurrentIrpOffset()
|
|||
return m_CurrentOffset;
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CIrpQueue::GetAcquiredTagRange(
|
||||
IN PVOID * FirstTag,
|
||||
IN PVOID * LastTag)
|
||||
{
|
||||
KIRQL OldLevel;
|
||||
BOOLEAN Ret = FALSE;
|
||||
PIRP Irp;
|
||||
PLIST_ENTRY CurEntry;
|
||||
|
||||
KeAcquireSpinLock(&m_IrpListLock, &OldLevel);
|
||||
|
||||
if (!IsListEmpty(&m_FreeIrpList))
|
||||
{
|
||||
// get first entry
|
||||
CurEntry = RemoveHeadList(&m_FreeIrpList);
|
||||
// get irp from list entry
|
||||
Irp = (PIRP)CONTAINING_RECORD(CurEntry, IRP, Tail.Overlay.ListEntry);
|
||||
|
||||
// get tag of first acquired buffer
|
||||
*FirstTag = Irp->Tail.Overlay.DriverContext[3];
|
||||
|
||||
// put back irp
|
||||
InsertHeadList(&m_FreeIrpList, &Irp->Tail.Overlay.ListEntry);
|
||||
|
||||
// get last entry
|
||||
CurEntry = RemoveTailList(&m_FreeIrpList);
|
||||
// get irp from list entry
|
||||
Irp = (PIRP)CONTAINING_RECORD(CurEntry, IRP, Tail.Overlay.ListEntry);
|
||||
|
||||
// get tag of first acquired buffer
|
||||
*LastTag = Irp->Tail.Overlay.DriverContext[3];
|
||||
|
||||
// put back irp
|
||||
InsertTailList(&m_FreeIrpList, &Irp->Tail.Overlay.ListEntry);
|
||||
|
||||
// indicate success
|
||||
Ret = TRUE;
|
||||
}
|
||||
|
||||
// release lock
|
||||
KeReleaseSpinLock(&m_IrpListLock, OldLevel);
|
||||
// done
|
||||
return Ret;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
NewIrpQueue(
|
||||
|
|
|
@ -347,7 +347,6 @@ PinWaveCyclicAudioPosition(
|
|||
DPRINT("Play %lu Write %lu\n", Position->PlayOffset, Position->WriteOffset);
|
||||
}
|
||||
|
||||
|
||||
Irp->IoStatus.Information = sizeof(KSAUDIO_POSITION);
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -195,6 +195,8 @@ PinWavePciState(
|
|||
NTSTATUS Status = STATUS_UNSUCCESSFUL;
|
||||
CPortPinWavePci *Pin;
|
||||
PSUBDEVICE_DESCRIPTOR Descriptor;
|
||||
PVOID FirstTag, LastTag;
|
||||
ULONG MappingsRevoked;
|
||||
PKSSTATE State = (PKSSTATE)Data;
|
||||
|
||||
// get sub device descriptor
|
||||
|
@ -221,6 +223,35 @@ PinWavePciState(
|
|||
{
|
||||
// store new state
|
||||
Pin->m_State = *State;
|
||||
if (Pin->m_ConnectDetails->Interface.Id == KSINTERFACE_STANDARD_LOOPED_STREAMING && Pin->m_State == KSSTATE_STOP)
|
||||
{
|
||||
// FIXME
|
||||
// complete with successful state
|
||||
Pin->m_IrpQueue->CancelBuffers();
|
||||
while(Pin->m_IrpQueue->GetAcquiredTagRange(&FirstTag, &LastTag))
|
||||
{
|
||||
Status = Pin->m_Stream->RevokeMappings(FirstTag, LastTag, &MappingsRevoked);
|
||||
DPRINT("RevokeMappings Status %lx MappingsRevoked: %lu\n", Status, MappingsRevoked);
|
||||
KeStallExecutionProcessor(10);
|
||||
}
|
||||
Pin->m_Position.PlayOffset = 0;
|
||||
Pin->m_Position.WriteOffset = 0;
|
||||
}
|
||||
else if (Pin->m_State == KSSTATE_STOP)
|
||||
{
|
||||
Pin->m_IrpQueue->CancelBuffers();
|
||||
while(Pin->m_IrpQueue->GetAcquiredTagRange(&FirstTag, &LastTag))
|
||||
{
|
||||
Status = Pin->m_Stream->RevokeMappings(FirstTag, LastTag, &MappingsRevoked);
|
||||
DPRINT("RevokeMappings Status %lx MappingsRevoked: %lu\n", Status, MappingsRevoked);
|
||||
KeStallExecutionProcessor(10);
|
||||
}
|
||||
Pin->m_Position.PlayOffset = 0;
|
||||
Pin->m_Position.WriteOffset = 0;
|
||||
}
|
||||
// store result
|
||||
Irp->IoStatus.Information = sizeof(KSSTATE);
|
||||
|
||||
}
|
||||
// store result
|
||||
Irp->IoStatus.Information = sizeof(KSSTATE);
|
||||
|
|
Loading…
Reference in a new issue