diff options
author | Alex Marsev <alex.marsev@gmail.com> | 2016-01-26 13:27:40 +0300 |
---|---|---|
committer | Alex Marsev <alex.marsev@gmail.com> | 2016-01-27 09:11:51 +0300 |
commit | b26a63867524534e2a5c9d8c62586111871b0a12 (patch) | |
tree | 4cc929b8bde32a6ca1e03e391d102b7618678139 | |
parent | 461017247a091d2029629a0e04b28012b07c439c (diff) |
Tweak rate matching of live sources
-rw-r--r-- | src/AudioRenderer.cpp | 23 |
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
{
|