Commit 5d3ed868 authored by David Reid's avatar David Reid

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.
parent 4f5eb2f8
...@@ -41,10 +41,10 @@ typedef struct ...@@ -41,10 +41,10 @@ typedef struct
ma_format format; ma_format format;
ma_uint32 channels; ma_uint32 channels;
ma_uint32 sampleRate; ma_uint32 sampleRate;
ma_uint32 cutoffFrequency; double cutoffFrequency;
} ma_lpf_config; } 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 typedef struct
{ {
...@@ -220,7 +220,7 @@ ma_uint32 ma_biquad_get_latency(ma_biquad* pBQ) ...@@ -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; ma_lpf_config config;
......
...@@ -332,7 +332,7 @@ static ma_result ma_linear_resampler_set_rate_internal(ma_linear_resampler* pRes ...@@ -332,7 +332,7 @@ static ma_result ma_linear_resampler_set_rate_internal(ma_linear_resampler* pRes
ma_result result; ma_result result;
ma_uint32 iFilter; ma_uint32 iFilter;
ma_uint32 lpfSampleRate; ma_uint32 lpfSampleRate;
ma_uint32 lpfCutoffFrequency; double lpfCutoffFrequency;
ma_lpf_config lpfConfig; ma_lpf_config lpfConfig;
if (pResampler->config.lpfCount > MA_MAX_RESAMPLER_LPF_FILTERS) { 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 ...@@ -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)); 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); 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 ...@@ -522,7 +522,7 @@ static ma_result ma_linear_resampler_process_pcm_frames_s16_downsample(ma_linear
MA_ASSERT(pResampler->inTimeInt == 0); MA_ASSERT(pResampler->inTimeInt == 0);
ma_linear_resampler_interpolate_frame_s16(pResampler, pFramesOutS16); ma_linear_resampler_interpolate_frame_s16(pResampler, pFramesOutS16);
pFramesOutS16 += 1; pFramesOutS16 += pResampler->config.channels;
} }
framesProcessedOut += 1; framesProcessedOut += 1;
...@@ -605,7 +605,7 @@ static ma_result ma_linear_resampler_process_pcm_frames_s16_upsample(ma_linear_r ...@@ -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); ma_lpf_process_pcm_frame_s16(&pResampler->lpf[iFilter], pFramesOutS16, pFramesOutS16);
} }
pFramesOutS16 += 1; pFramesOutS16 += pResampler->config.channels;
} }
framesProcessedOut += 1; framesProcessedOut += 1;
...@@ -699,7 +699,7 @@ static ma_result ma_linear_resampler_process_pcm_frames_f32_downsample(ma_linear ...@@ -699,7 +699,7 @@ static ma_result ma_linear_resampler_process_pcm_frames_f32_downsample(ma_linear
MA_ASSERT(pResampler->inTimeInt == 0); MA_ASSERT(pResampler->inTimeInt == 0);
ma_linear_resampler_interpolate_frame_f32(pResampler, pFramesOutF32); ma_linear_resampler_interpolate_frame_f32(pResampler, pFramesOutF32);
pFramesOutF32 += 1; pFramesOutF32 += pResampler->config.channels;
} }
framesProcessedOut += 1; framesProcessedOut += 1;
...@@ -782,7 +782,7 @@ static ma_result ma_linear_resampler_process_pcm_frames_f32_upsample(ma_linear_r ...@@ -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); ma_lpf_process_pcm_frame_f32(&pResampler->lpf[iFilter], pFramesOutF32, pFramesOutF32);
} }
pFramesOutF32 += 1; pFramesOutF32 += pResampler->config.channels;
} }
framesProcessedOut += 1; framesProcessedOut += 1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment