diff options
| -rw-r--r-- | src/plugins/Effect/soxr/soxresampler.cpp | 9 | ||||
| -rw-r--r-- | src/plugins/Effect/soxr/soxresampler.h | 1 |
2 files changed, 7 insertions, 3 deletions
diff --git a/src/plugins/Effect/soxr/soxresampler.cpp b/src/plugins/Effect/soxr/soxresampler.cpp index 5bc876160..028fafce6 100644 --- a/src/plugins/Effect/soxr/soxresampler.cpp +++ b/src/plugins/Effect/soxr/soxresampler.cpp @@ -28,6 +28,7 @@ SoXResampler::SoXResampler() : Effect() { m_soxr = 0; m_out = 0; + m_out_samples = 0; QSettings settings(Qmmp::configFile(), QSettings::IniFormat); m_overSamplingFs = settings.value("SOXR/sample_rate", 48000).toInt(); m_quality = soxr_quality_spec(settings.value("SOXR/quality", SOXR_HQ).toInt(), 0); @@ -42,9 +43,9 @@ void SoXResampler::applyEffect(Buffer *b) { if(m_soxr && b->samples > 0) { - size_t frames = b->samples / channels(); size_t done = 0; - soxr_process(m_soxr, b->data, frames, 0, m_out, frames, &done); + soxr_process(m_soxr, b->data, b->samples / channels(), 0, + m_out, m_out_samples / channels(), &done); b->samples = done * channels(); if(b->samples > b->size) @@ -66,7 +67,8 @@ void SoXResampler::configure(quint32 freq, ChannelMap map) soxr_error_t error = 0; m_soxr = soxr_create(freq, m_overSamplingFs, map.count(), &error, 0, &m_quality, 0); double ratio = (double)m_overSamplingFs/freq; - m_out = new float[int(ratio * QMMP_BLOCK_FRAMES * map.count() * 2 + 2)]; + m_out_samples = ratio * QMMP_BLOCK_FRAMES * map.count() * 2 + 2; + m_out = new float[m_out_samples]; } Effect::configure(m_overSamplingFs, map); } @@ -82,5 +84,6 @@ void SoXResampler::freeSoXR() { delete [] m_out; m_out = 0; + m_out_samples = 0; } } diff --git a/src/plugins/Effect/soxr/soxresampler.h b/src/plugins/Effect/soxr/soxresampler.h index 026d60b3c..a6741aafa 100644 --- a/src/plugins/Effect/soxr/soxresampler.h +++ b/src/plugins/Effect/soxr/soxresampler.h @@ -40,6 +40,7 @@ private: void freeSoXR(); quint32 m_overSamplingFs; float *m_out; + size_t m_out_samples; soxr_quality_spec_t m_quality; soxr_t m_soxr; |
