[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:
Johannes Anderwald 2010-03-05 10:11:54 +00:00
parent 95f5adb673
commit 309fb1c02a
4 changed files with 88 additions and 2 deletions

View file

@ -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);
/*****************************************************************************

View file

@ -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(

View file

@ -347,7 +347,6 @@ PinWaveCyclicAudioPosition(
DPRINT("Play %lu Write %lu\n", Position->PlayOffset, Position->WriteOffset);
}
Irp->IoStatus.Information = sizeof(KSAUDIO_POSITION);
return STATUS_SUCCESS;
}

View file

@ -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);