Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/sanear.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Marsev <alex.marsev@gmail.com>2016-02-04 14:36:56 +0300
committerAlex Marsev <alex.marsev@gmail.com>2016-02-07 18:51:31 +0300
commitb70fc1e4acabc02bae950028e2ff84b80bda919d (patch)
treefaf1dc4c240cf99a0e8abe2fbabf5c78ba793a8b
parent87dfea797e101f66776eb2156e9ed8a8d187f254 (diff)
Delay slaving to audio clock until it progresses
-rw-r--r--src/MyClock.cpp41
-rw-r--r--src/MyClock.h1
2 files changed, 31 insertions, 11 deletions
diff --git a/src/MyClock.cpp b/src/MyClock.cpp
index e5ed900..b147c8e 100644
--- a/src/MyClock.cpp
+++ b/src/MyClock.cpp
@@ -24,9 +24,15 @@ namespace SaneAudioRenderer
{
CAutoLock lock(this);
+ #ifndef NDEBUG
+ const int64_t oldCounterOffset = m_counterOffset;
+ #endif
+
if (m_guidedReclockSlaving && !CanDoGuidedReclock())
UnslaveClock();
+ REFERENCE_TIME audioClockTime, counterTime, clockTime;
+
if (m_guidedReclockSlaving)
{
auto getGuidedReclockTime = [this](int64_t counterTime)
@@ -35,7 +41,6 @@ namespace SaneAudioRenderer
return m_guidedReclockStartClock + progress;
};
- REFERENCE_TIME audioClockTime, counterTime, clockTime;
if (SUCCEEDED(GetAudioClockTime(&audioClockTime, &counterTime)))
{
clockTime = getGuidedReclockTime(counterTime);
@@ -50,34 +55,47 @@ namespace SaneAudioRenderer
}
m_counterOffset = clockTime - counterTime;
-
- return clockTime;
}
-
- REFERENCE_TIME audioClockTime, counterTime;
- if (SUCCEEDED(GetAudioClockTime(&audioClockTime, &counterTime)))
+ else if (SUCCEEDED(GetAudioClockTime(&audioClockTime, &counterTime)))
{
+ clockTime = audioClockTime;
m_counterOffset = audioClockTime - counterTime;
- return audioClockTime;
}
+ else
+ {
+ clockTime = m_counterOffset + GetCounterTime();
+ }
+
+ #ifndef NDEBUG
+ int64_t counterOffsetDiff = m_counterOffset - oldCounterOffset;
+ if (std::abs(counterOffsetDiff) > OneMillisecond)
+ DebugOut(ClassName(this), "observed clock warp of", counterOffsetDiff / 10000., "ms");
+ #endif
- return m_counterOffset + GetCounterTime();
+ return clockTime;
}
void MyClock::SlaveClockToAudio(IAudioClock* pAudioClock, int64_t audioStart)
{
+ assert(pAudioClock);
+
CAutoLock lock(this);
+ DebugOut(ClassName(this), "slave clock to audio device (delayed until it progresses)");
+
m_audioClock = pAudioClock;
m_audioStart = audioStart;
+ m_audioInitialPosition = 0;
+ m_audioClock->GetPosition(&m_audioInitialPosition, nullptr);
m_audioOffset = 0;
- m_counterOffset = audioStart - GetCounterTime();
}
void MyClock::UnslaveClockFromAudio()
{
CAutoLock lock(this);
+ DebugOut(ClassName(this), "unslave clock from audio device");
+
m_audioClock = nullptr;
}
@@ -98,11 +116,12 @@ namespace SaneAudioRenderer
{
uint64_t audioFrequency, audioPosition, audioTime;
if (SUCCEEDED(m_audioClock->GetFrequency(&audioFrequency)) &&
- SUCCEEDED(m_audioClock->GetPosition(&audioPosition, &audioTime)))
+ SUCCEEDED(m_audioClock->GetPosition(&audioPosition, &audioTime)) &&
+ audioPosition > m_audioInitialPosition)
{
int64_t counterTime = GetCounterTime();
int64_t clockTime = llMulDiv(audioPosition, OneSecond, audioFrequency, 0) +
- m_audioStart + m_audioOffset + (audioPosition > 0 ? counterTime - audioTime : 0);
+ m_audioStart + m_audioOffset + counterTime - audioTime;
*pAudioTime = clockTime;
diff --git a/src/MyClock.h b/src/MyClock.h
index 31ad742..575a435 100644
--- a/src/MyClock.h
+++ b/src/MyClock.h
@@ -45,6 +45,7 @@ namespace SaneAudioRenderer
IAudioClockPtr m_audioClock;
int64_t m_audioStart = 0;
+ uint64_t m_audioInitialPosition = 0;
int64_t m_audioOffset = 0;
int64_t m_counterOffset = 0;