From: Johannes Anderwald Date: Sat, 31 Oct 2009 10:38:25 +0000 (+0000) Subject: - Fix retrieving audio position X-Git-Tag: ReactOS-0.3.11~222 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=650fc71047c96a954d8bde5b5a3d0f45a3df479d - Fix retrieving audio position svn path=/trunk/; revision=43869 --- diff --git a/reactos/drivers/wdm/audio/backpln/portcls/interfaces.hpp b/reactos/drivers/wdm/audio/backpln/portcls/interfaces.hpp index 031a00fc465..bf9057b3fb2 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/interfaces.hpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/interfaces.hpp @@ -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) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp b/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp index 37595855dfa..e69996421af 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp @@ -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 diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp index 759b261540c..e4b4aaf68a8 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp @@ -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; }