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 16:47:10 +0300
committerAlex Marsev <alex.marsev@gmail.com>2016-02-07 19:57:12 +0300
commit83b535b70c957ffb158ff637cc0596a2e245c2b0 (patch)
tree577a80224711128025ee063dc8315c0086b6cc37
parent1340247cb2eea246d06c6be64425e6f7d01123c6 (diff)
Add additional jitter reduction logic
Will do some fine-tuning later. USB cards are likely in need to be distinguished.
-rw-r--r--src/AudioRenderer.cpp76
-rw-r--r--src/AudioRenderer.h2
2 files changed, 56 insertions, 22 deletions
diff --git a/src/AudioRenderer.cpp b/src/AudioRenderer.cpp
index ee1b032..9cc4fce 100644
--- a/src/AudioRenderer.cpp
+++ b/src/AudioRenderer.cpp
@@ -223,7 +223,7 @@ namespace SaneAudioRenderer
m_sampleCorrection.NewDeviceBuffer();
InitializeProcessors();
m_startClockOffset = m_sampleCorrection.GetLastFrameEnd();
- MinimizeReslavingJitter();
+ PushReslavingJitter();
StartDevice();
}
else
@@ -456,28 +456,46 @@ namespace SaneAudioRenderer
if (m_device)
{
- // Try to minimize clock slaving initial jitter.
+ try
{
- REFERENCE_TIME clockTime;
- m_myClock.GetImmediateTime(&clockTime);
+ // Try to minimize clock slaving initial jitter.
+ {
+ REFERENCE_TIME silence = m_startClockOffset - (m_myClock.GetPrivateTime() - m_startTime) +
+ m_device->GetPosition();
+
+ if (m_device->IsExclusive())
+ {
+ silence -= 3 * OneMillisecond; // Taking USB cards into account, could have been lower otherwise.
+ }
+ else
+ {
+ silence -= m_device->GetStreamLatency() - OneMillisecond; // Experimental guesswork.
+ }
- if (!m_device->IsExclusive())
- clockTime += m_device->GetStreamLatency();
+ int64_t sleepTime = llMulDiv(silence, 1000, OneSecond, 0);
- int64_t sleepTime = llMulDiv(m_startTime + m_startClockOffset - clockTime, 1000, OneSecond, 0);
+ if (sleepTime < 0)
+ sleepTime = 0;
- if (sleepTime > 0 && sleepTime < 200)
- {
- TimePeriodHelper timePeriodHelper(1);
- DebugOut(ClassName(this), "sleep for", sleepTime, "ms to minimize slaving jitter");
- Sleep((DWORD)sleepTime);
+ if (sleepTime > 0 && sleepTime < 200)
+ {
+ TimePeriodHelper timePeriodHelper(1);
+ DebugOut(ClassName(this), "sleep for", sleepTime, "ms to minimize slaving jitter");
+ Sleep((DWORD)sleepTime);
+ }
+
+ DebugOut(ClassName(this), "predicting approx", silence / 10000. - sleepTime, "ms slaving jitter");
}
- }
- m_guidedReclockOffset = 0;
- m_myClock.SlaveClockToAudio(m_device->GetClock(), m_startTime + m_startClockOffset);
- m_clockCorrection = 0;
- m_device->Start();
+ m_guidedReclockOffset = 0;
+ m_myClock.SlaveClockToAudio(m_device->GetClock(), m_startTime + m_startClockOffset);
+ m_clockCorrection = 0;
+ m_device->Start();
+ }
+ catch (HRESULT)
+ {
+ ClearDevice();
+ }
}
}
@@ -502,7 +520,15 @@ namespace SaneAudioRenderer
if (m_state == State_Running)
{
- MinimizeReslavingJitter();
+ try
+ {
+ PushReslavingJitter();
+ }
+ catch (HRESULT)
+ {
+ ClearDevice();
+ }
+
StartDevice();
}
}
@@ -523,8 +549,10 @@ namespace SaneAudioRenderer
}
}
- void AudioRenderer::MinimizeReslavingJitter()
+ void AudioRenderer::PushReslavingJitter()
{
+ CAutoLock objectLock(this);
+
assert(m_device);
assert(m_state == State_Running);
assert(m_device->GetEnd() == 0);
@@ -536,8 +564,14 @@ namespace SaneAudioRenderer
REFERENCE_TIME silence = m_startClockOffset - (m_myClock.GetPrivateTime() - m_startTime);
- if (!m_device->IsExclusive())
- silence -= m_device->GetStreamLatency();
+ if (m_device->IsExclusive())
+ {
+ silence -= 3 * OneMillisecond; // Taking USB cards into account, could have been lower otherwise.
+ }
+ else
+ {
+ silence -= m_device->GetStreamLatency() - OneMillisecond; // Experimental guesswork.
+ }
if (silence > 0)
{
diff --git a/src/AudioRenderer.h b/src/AudioRenderer.h
index de49436..2761606 100644
--- a/src/AudioRenderer.h
+++ b/src/AudioRenderer.h
@@ -68,7 +68,7 @@ namespace SaneAudioRenderer
void CreateDevice();
void ClearDevice();
- void MinimizeReslavingJitter();
+ void PushReslavingJitter();
void ApplyClockCorrection();