diff options
author | Anton Fedchin <afedchin@users.noreply.github.com> | 2018-03-16 21:50:47 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-03-16 21:50:47 +0300 |
commit | a897fc5df1b92863032615a4c489ccb08706a166 (patch) | |
tree | f305745255c4568b91c839b17021fbdeee3b784f | |
parent | 497cf7335e0608a92557e11ccc22d824e202fbc5 (diff) | |
parent | 474c74483b78dbcb1d1008ba2f70cb8567f3c3a0 (diff) |
Merge pull request #13656 from afedchin/ae-xaudio-fix
AudioEngine: XAudio - rework delay calculation based on currently pla…
-rw-r--r-- | xbmc/cores/AudioEngine/Sinks/AESinkXAudio.cpp | 13 | ||||
-rw-r--r-- | 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 */ |