From 5d3ed8687e05b287a40184f28fd12afb84d80d65 Mon Sep 17 00:00:00 2001 From: David Reid Date: Mon, 27 Jan 2020 18:12:25 +1000 Subject: [PATCH] Bug fixes to the linear resampler. This changes the the lpfCutoffFrequency config variable from a uint32 to a double. This is required because we simplify the sample rate fraction which cant result in cases where the cutoff frequency is too aggressively rounded down due to dividing tiny integers. --- research/ma_lpf.h | 6 +++--- research/ma_resampler.h | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/research/ma_lpf.h b/research/ma_lpf.h index 8526f068..5010eb63 100644 --- a/research/ma_lpf.h +++ b/research/ma_lpf.h @@ -41,10 +41,10 @@ typedef struct ma_format format; ma_uint32 channels; ma_uint32 sampleRate; - ma_uint32 cutoffFrequency; + double cutoffFrequency; } ma_lpf_config; -ma_lpf_config ma_lpf_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, ma_uint32 cutoffFrequency); +ma_lpf_config ma_lpf_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency); typedef struct { @@ -220,7 +220,7 @@ ma_uint32 ma_biquad_get_latency(ma_biquad* pBQ) } -ma_lpf_config ma_lpf_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, ma_uint32 cutoffFrequency) +ma_lpf_config ma_lpf_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency) { ma_lpf_config config; diff --git a/research/ma_resampler.h b/research/ma_resampler.h index 59031893..c21bf1bf 100644 --- a/research/ma_resampler.h +++ b/research/ma_resampler.h @@ -332,7 +332,7 @@ static ma_result ma_linear_resampler_set_rate_internal(ma_linear_resampler* pRes ma_result result; ma_uint32 iFilter; ma_uint32 lpfSampleRate; - ma_uint32 lpfCutoffFrequency; + double lpfCutoffFrequency; ma_lpf_config lpfConfig; if (pResampler->config.lpfCount > MA_MAX_RESAMPLER_LPF_FILTERS) { @@ -340,7 +340,7 @@ static ma_result ma_linear_resampler_set_rate_internal(ma_linear_resampler* pRes } lpfSampleRate = (ma_uint32)(ma_max(pResampler->config.sampleRateIn, pResampler->config.sampleRateOut)); - lpfCutoffFrequency = (ma_uint32)(ma_min(pResampler->config.sampleRateIn, pResampler->config.sampleRateOut) * 0.5 * pResampler->config.lpfNyquistFactor); + lpfCutoffFrequency = ( double)(ma_min(pResampler->config.sampleRateIn, pResampler->config.sampleRateOut) * 0.5 * pResampler->config.lpfNyquistFactor); lpfConfig = ma_lpf_config_init(pResampler->config.format, pResampler->config.channels, lpfSampleRate, lpfCutoffFrequency); @@ -522,7 +522,7 @@ static ma_result ma_linear_resampler_process_pcm_frames_s16_downsample(ma_linear MA_ASSERT(pResampler->inTimeInt == 0); ma_linear_resampler_interpolate_frame_s16(pResampler, pFramesOutS16); - pFramesOutS16 += 1; + pFramesOutS16 += pResampler->config.channels; } framesProcessedOut += 1; @@ -605,7 +605,7 @@ static ma_result ma_linear_resampler_process_pcm_frames_s16_upsample(ma_linear_r ma_lpf_process_pcm_frame_s16(&pResampler->lpf[iFilter], pFramesOutS16, pFramesOutS16); } - pFramesOutS16 += 1; + pFramesOutS16 += pResampler->config.channels; } framesProcessedOut += 1; @@ -699,7 +699,7 @@ static ma_result ma_linear_resampler_process_pcm_frames_f32_downsample(ma_linear MA_ASSERT(pResampler->inTimeInt == 0); ma_linear_resampler_interpolate_frame_f32(pResampler, pFramesOutF32); - pFramesOutF32 += 1; + pFramesOutF32 += pResampler->config.channels; } framesProcessedOut += 1; @@ -782,7 +782,7 @@ static ma_result ma_linear_resampler_process_pcm_frames_f32_upsample(ma_linear_r ma_lpf_process_pcm_frame_f32(&pResampler->lpf[iFilter], pFramesOutF32, pFramesOutF32); } - pFramesOutF32 += 1; + pFramesOutF32 += pResampler->config.channels; } framesProcessedOut += 1;