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-01-26 13:27:40 +0300
committerAlex Marsev <alex.marsev@gmail.com>2016-01-27 09:11:51 +0300
commitb26a63867524534e2a5c9d8c62586111871b0a12 (patch)
tree4cc929b8bde32a6ca1e03e391d102b7618678139
parent461017247a091d2029629a0e04b28012b07c439c (diff)
Tweak rate matching of live sources
-rw-r--r--src/AudioRenderer.cpp23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/AudioRenderer.cpp b/src/AudioRenderer.cpp
index 04ba0c9..2c24fdd 100644
--- a/src/AudioRenderer.cpp
+++ b/src/AudioRenderer.cpp
@@ -586,8 +586,7 @@ namespace SaneAudioRenderer
if (chunk.IsEmpty())
return;
- const REFERENCE_TIME latency = llMulDiv(chunk.GetFrameCount(), OneSecond, chunk.GetRate(), 0) +
- m_device->GetStreamLatency() + OneMillisecond * 10;
+ const REFERENCE_TIME latency = m_device->GetStreamLatency() * 2; // x2.0
const REFERENCE_TIME remaining = m_device->GetEnd() - m_device->GetPosition();
@@ -596,10 +595,10 @@ namespace SaneAudioRenderer
if (m_live)
{
// Rate matching.
- if (remaining > latency)
+ if (remaining > latency) // x2.0
{
size_t dropFrames = (size_t)llMulDiv(m_device->GetWaveFormat()->nSamplesPerSec,
- remaining - latency, OneSecond, 0);
+ remaining - latency * 3 / 4, OneSecond, 0); // x1.5
dropFrames = std::min(dropFrames, chunk.GetFrameCount());
@@ -607,6 +606,22 @@ namespace SaneAudioRenderer
DebugOut("AudioRenderer drop", dropFrames, "frames for rate matching");
}
+ else if (remaining < latency / 2) // x1.0
+ {
+ size_t padFrames = (size_t)llMulDiv(m_device->GetWaveFormat()->nSamplesPerSec,
+ latency * 3 / 4 - remaining, OneSecond, 0); // x1.5
+
+ DspChunk tempChunk(chunk.GetFormat(), chunk.GetChannelCount(),
+ chunk.GetFrameCount() + padFrames, chunk.GetRate());
+
+ size_t padBytes = tempChunk.GetFrameSize() * padFrames;
+ ZeroMemory(tempChunk.GetData(), padBytes);
+ memcpy(tempChunk.GetData() + padBytes, chunk.GetData(), chunk.GetSize());
+
+ chunk = std::move(tempChunk);
+
+ DebugOut("AudioRenderer pad", padFrames, "frames for rate matching");
+ }
}
else
{