aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Fedchin <afedchin@users.noreply.github.com>2018-03-16 21:50:47 +0300
committerGitHub <noreply@github.com>2018-03-16 21:50:47 +0300
commita897fc5df1b92863032615a4c489ccb08706a166 (patch)
treef305745255c4568b91c839b17021fbdeee3b784f
parent497cf7335e0608a92557e11ccc22d824e202fbc5 (diff)
parent474c74483b78dbcb1d1008ba2f70cb8567f3c3a0 (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.cpp13
-rw-r--r--xbmc/cores/AudioEngine/Sinks/AESinkXAudio.h1
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 */