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-27 12:15:26 +0300
committerAlex Marsev <alex.marsev@gmail.com>2016-01-27 12:17:01 +0300
commitefeb2ee26c4ccd1de481493f42c88ca9bd0ba6b2 (patch)
tree7cd459a4fa394a30f52015232cdb1bb67844a158
parent184c50adcbf72f3bc21926bfa06cce5e1a390d1c (diff)
Deduplicate some common code
-rw-r--r--src/AudioRenderer.cpp18
-rw-r--r--src/DspChunk.cpp40
-rw-r--r--src/DspChunk.h3
-rw-r--r--src/SampleCorrection.cpp14
4 files changed, 46 insertions, 29 deletions
diff --git a/src/AudioRenderer.cpp b/src/AudioRenderer.cpp
index 281feb0..d2fcb52 100644
--- a/src/AudioRenderer.cpp
+++ b/src/AudioRenderer.cpp
@@ -607,14 +607,7 @@ namespace SaneAudioRenderer
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);
+ chunk.PadHead(padFrames);
DebugOut("AudioRenderer pad", padFrames, "frames for rate matching");
}
@@ -643,14 +636,7 @@ namespace SaneAudioRenderer
if (padFrames > m_device->GetWaveFormat()->nSamplesPerSec / 33) // ~30ms threshold
{
- 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);
+ chunk.PadHead(padFrames);
REFERENCE_TIME paddedTime = llMulDiv(padFrames, OneSecond,
m_device->GetWaveFormat()->nSamplesPerSec, 0);
diff --git a/src/DspChunk.cpp b/src/DspChunk.cpp
index df1b702..66ff501 100644
--- a/src/DspChunk.cpp
+++ b/src/DspChunk.cpp
@@ -405,6 +405,46 @@ namespace SaneAudioRenderer
return *this;
}
+ void DspChunk::PadTail(size_t padFrames)
+ {
+ if (padFrames == 0)
+ return;
+
+ size_t newBytes = padFrames * GetFrameSize();
+
+ {
+ DspChunk tempChunk(GetFormat(), GetChannelCount(), GetFrameCount() + padFrames, GetRate());
+ memcpy(tempChunk.GetData(), GetData(), GetSize());
+ *this = std::move(tempChunk);
+ }
+
+ assert(GetSize() >= newBytes);
+ ZeroMemory(GetData() + GetSize() - newBytes, newBytes);
+ }
+
+ void DspChunk::PadHead(size_t padFrames)
+ {
+ if (padFrames == 0)
+ return;
+
+ size_t newBytes = padFrames * GetFrameSize();
+
+ if (padFrames <= m_dataOffset)
+ {
+ m_dataOffset -= padFrames;
+ m_dataSize += newBytes;
+ }
+ else
+ {
+ DspChunk tempChunk(GetFormat(), GetChannelCount(), GetFrameCount() + padFrames, GetRate());
+ memcpy(tempChunk.GetData() + newBytes, GetData(), GetSize());
+ *this = std::move(tempChunk);
+ }
+
+ assert(GetSize() >= newBytes);
+ ZeroMemory(GetData(), newBytes);
+ }
+
void DspChunk::ShrinkTail(size_t toFrames)
{
if (toFrames < GetFrameCount())
diff --git a/src/DspChunk.h b/src/DspChunk.h
index dfd81e8..0cd1117 100644
--- a/src/DspChunk.h
+++ b/src/DspChunk.h
@@ -34,6 +34,9 @@ namespace SaneAudioRenderer
char* GetData() { return (m_mediaSample ? m_mediaData : m_data.get()) + m_dataOffset; }
+ void PadTail(size_t padFrames);
+ void PadHead(size_t padFrames);
+
void ShrinkTail(size_t toFrames);
void ShrinkHead(size_t toFrames);
diff --git a/src/SampleCorrection.cpp b/src/SampleCorrection.cpp
index 8aafcbf..b6989be 100644
--- a/src/SampleCorrection.cpp
+++ b/src/SampleCorrection.cpp
@@ -86,19 +86,7 @@ namespace SaneAudioRenderer
DebugOut("SampleCorrection pad", padFrames, "frames before [",
sampleProps.tStart, sampleProps.tStop, "]");
- DspChunk tempChunk(chunk.GetFormat(), chunk.GetChannelCount(),
- chunk.GetFrameCount() + padFrames, chunk.GetRate());
-
- const size_t padBytes = padFrames * chunk.GetFrameSize();
- sampleProps.pbBuffer = nullptr;
- sampleProps.lActual += (int32_t)padBytes;
- sampleProps.tStart -= FramesToTime(padFrames);
-
- assert(tempChunk.GetSize() == chunk.GetSize() + padBytes);
- ZeroMemory(tempChunk.GetData(), padBytes);
- memcpy(tempChunk.GetData() + padBytes, chunk.GetData(), chunk.GetSize());
-
- chunk = std::move(tempChunk);
+ chunk.PadHead(padFrames);
}
}
}