- Fix retrieving audio position

svn path=/trunk/; revision=43869
This commit is contained in:
Johannes Anderwald 2009-10-31 10:38:25 +00:00
parent 46c8396918
commit 650fc71047
3 changed files with 10 additions and 11 deletions

View file

@ -354,7 +354,7 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown)
IN PVOID Tag) PURE;
STDMETHOD_(BOOL, HasLastMappingFailed)(THIS) PURE;
STDMETHOD_(VOID, PrintQueueStatus)(THIS) PURE;
STDMETHOD_(ULONG, GetCurrentIrpOffset)(THIS) PURE;
STDMETHOD_(VOID, SetMinimumDataThreshold)(THIS_
IN ULONG MinimumDataThreshold) PURE;
STDMETHOD_(ULONG, GetMinimumDataThreshold)(THIS) PURE;
@ -403,7 +403,7 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown)
IN PVOID Tag); \
\
STDMETHODIMP_(BOOL) HasLastMappingFailed(THIS); \
STDMETHODIMP_(VOID) PrintQueueStatus(THIS); \
STDMETHODIMP_(ULONG) GetCurrentIrpOffset(THIS); \
STDMETHODIMP_(VOID) SetMinimumDataThreshold( \
IN ULONG MinimumDataThreshold); \
STDMETHODIMP_(ULONG) GetMinimumDataThreshold(VOID)

View file

@ -35,7 +35,7 @@ public:
virtual ~CIrpQueue(){}
protected:
ULONG m_CurrentOffset;
volatile ULONG m_CurrentOffset;
LONG m_NumMappings;
ULONG m_NumDataAvailable;
BOOL m_StartStream;
@ -312,7 +312,7 @@ CIrpQueue::UpdateMapping(
// ASSERT(StreamHeader);
// add to current offset
m_CurrentOffset += BytesWritten;
InterlockedExchangeAdd((volatile PLONG)&m_CurrentOffset, (LONG)BytesWritten);
// decrement available data counter
m_NumDataAvailable -= BytesWritten;
@ -559,11 +559,12 @@ CIrpQueue::HasLastMappingFailed()
return m_OutOfMapping;
}
VOID
ULONG
NTAPI
CIrpQueue::PrintQueueStatus()
CIrpQueue::GetCurrentIrpOffset()
{
return m_CurrentOffset;
}
VOID

View file

@ -218,7 +218,8 @@ PinWaveCyclicAudioPosition(
else if (Pin->m_ConnectDetails->Interface.Id == KSINTERFACE_STANDARD_LOOPED_STREAMING)
{
Position->PlayOffset = Pin->m_Position.PlayOffset % Pin->m_Position.WriteOffset;
Position->WriteOffset = Pin->m_IrpQueue->NumData();
Position->WriteOffset = (ULONGLONG)Pin->m_IrpQueue->GetCurrentIrpOffset();
DPRINT("Play %lu Write %lu\n", Position->PlayOffset, Position->WriteOffset);
}
@ -606,10 +607,7 @@ CPortPinWaveCyclic::HandleKsStream(
if (NT_SUCCESS(Status))
{
if (m_Capture)
m_Position.WriteOffset += Data;
else
m_Position.WriteOffset += Data;
m_Position.WriteOffset += Data;
return STATUS_PENDING;
}