From 474c74483b78dbcb1d1008ba2f70cb8567f3c3a0 Mon Sep 17 00:00:00 2001 From: Anton Fedchin Date: Fri, 16 Mar 2018 18:41:07 +0300 Subject: AudioEngine: XAudio - rework delay calculation based on currently played samples. --- xbmc/cores/AudioEngine/Sinks/AESinkXAudio.cpp | 13 ++++++++++--- xbmc/cores/AudioEngine/Sinks/AESinkXAudio.h | 1 + 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkXAudio.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkXAudio.cpp index b51150d0ef..029e858480 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkXAudio.cpp +++ b/xbmc/cores/AudioEngine/Sinks/AESinkXAudio.cpp @@ -69,6 +69,7 @@ CAESinkXAudio::CAESinkXAudio() : m_dwChunkSize(0), m_dwFrameSize(0), m_dwBufferLen(0), + m_sinkFrames(0), m_running(false), m_initialized(false), m_isSuspended(false), @@ -166,6 +167,7 @@ void CAESinkXAudio::Deinitialize() { m_sourceVoice->Stop(); m_sourceVoice->FlushSourceBuffers(); + m_sinkFrames = 0; } catch (...) { @@ -198,10 +200,10 @@ void CAESinkXAudio::GetDelay(AEDelayStatus& status) goto failed; XAUDIO2_VOICE_STATE state; - m_sourceVoice->GetState(&state, XAUDIO2_VOICE_NOSAMPLESPLAYED); + m_sourceVoice->GetState(&state, 0); - uint64_t framesInQueue = state.BuffersQueued * m_format.m_frames; - status.SetDelay(framesInQueue / (double)m_format.m_sampleRate); + double delay = (double)(m_sinkFrames - state.SamplesPlayed) / m_format.m_sampleRate; + status.SetDelay(delay); return; failed: @@ -251,6 +253,7 @@ unsigned int CAESinkXAudio::AddPackets(uint8_t **data, unsigned int frames, unsi if (!m_running) //first time called, pre-fill buffer then start voice { + m_sourceVoice->Stop(); hr = m_sourceVoice->SubmitSourceBuffer(&xbuffer); if (FAILED(hr)) { @@ -266,6 +269,7 @@ unsigned int CAESinkXAudio::AddPackets(uint8_t **data, unsigned int frames, unsi delete[] buff; return INT_MAX; } + m_sinkFrames += frames; m_running = true; //signal that we're processing frames return frames; } @@ -311,9 +315,12 @@ unsigned int CAESinkXAudio::AddPackets(uint8_t **data, unsigned int frames, unsi #ifdef _DEBUG CLog::Log(LOGERROR, __FUNCTION__": SubmitSourceBuffer failed due to %s", WASAPIErrToStr(hr)); #endif + delete[] buff; return INT_MAX; } + m_sinkFrames += frames; + return frames; } diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkXAudio.h b/xbmc/cores/AudioEngine/Sinks/AESinkXAudio.h index 0a81a7e6de..6ddabaabc5 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkXAudio.h +++ b/xbmc/cores/AudioEngine/Sinks/AESinkXAudio.h @@ -115,6 +115,7 @@ private: unsigned int m_dwChunkSize; unsigned int m_dwFrameSize; unsigned int m_dwBufferLen; + uint64_t m_sinkFrames; double m_avgTimeWaiting; /* time between next buffer of data from SoftAE and driver call for data */ -- cgit v1.2.3