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:
Diffstat (limited to 'src/AudioRenderer.cpp')
-rw-r--r--src/AudioRenderer.cpp21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/AudioRenderer.cpp b/src/AudioRenderer.cpp
index ff79204..dc0d7d9 100644
--- a/src/AudioRenderer.cpp
+++ b/src/AudioRenderer.cpp
@@ -426,6 +426,19 @@ namespace SaneAudioRenderer
}
}
+ bool clearForTimestretch = false;
+ {
+ UINT32 timestretchMethod;
+ m_settings->GetTimestretchSettings(&timestretchMethod);
+ const bool usePhaseVocoder = (timestretchMethod == ISettings::TIMESTRETCH_METHOD_PHASE_VOCODER);
+
+ if ((usePhaseVocoder && m_dspTempo1.Active()) ||
+ (!usePhaseVocoder && m_dspTempo2.Active()))
+ {
+ clearForTimestretch = true;
+ }
+ }
+
m_deviceSettingsSerial = newSettingsSerial;
std::unique_ptr<WCHAR, CoTaskMemFreeDeleter> systemDeviceId;;
@@ -442,6 +455,7 @@ namespace SaneAudioRenderer
if ((clearForSystemChannelMixer) ||
(clearForCrossfeed) ||
+ (clearForTimestretch) ||
(m_device->IsExclusive() != !!settingsDeviceExclusive) ||
(m_device->GetBufferDuration() != settingsDeviceBuffer) ||
(!settingsDeviceDefault && *m_device->GetId() != settingsDeviceId.get()) ||
@@ -750,9 +764,14 @@ namespace SaneAudioRenderer
const auto outChannels = m_device->GetWaveFormat()->nChannels;
const auto outMask = DspMatrix::GetChannelMask(*m_device->GetWaveFormat());
+ UINT32 timestretchMethod;
+ m_settings->GetTimestretchSettings(&timestretchMethod);
+ const bool usePhaseVocoder = (timestretchMethod == ISettings::TIMESTRETCH_METHOD_PHASE_VOCODER);
+
m_dspMatrix.Initialize(inChannels, inMask, outChannels, outMask);
m_dspRate.Initialize(m_live || m_externalClock, inRate, outRate, outChannels);
- m_dspTempo.Initialize(m_rate, outRate, outChannels);
+ m_dspTempo1.Initialize(usePhaseVocoder ? 1.0 : m_rate, outRate, outChannels);
+ m_dspTempo2.Initialize(usePhaseVocoder ? m_rate : 1.0, outRate, outChannels);
m_dspCrossfeed.Initialize(m_settings, outRate, outChannels, outMask);
m_dspLimiter.Initialize(outRate, outChannels, m_device->IsExclusive());
m_dspDither.Initialize(m_device->GetDspFormat());