Visualization: Protect against out of bounds read

The analyzer was reading out of bounds, so guard against that.

Signed-off-by: Christopher Snowhill <kode54@gmail.com>
CQTexperiment
Christopher Snowhill 2022-03-06 03:51:25 -08:00
parent 26966c46a2
commit 014f136b7e
1 changed files with 4 additions and 4 deletions

View File

@ -56,7 +56,7 @@ static float _bin_for_freq_round(ddb_analyzer_t *analyzer, float freq);
static float _freq_for_bin(ddb_analyzer_t *analyzer, int bin);
static float
_interpolate_bin_with_ratio(float *fft_data, int bin, float ratio);
_interpolate_bin_with_ratio(float *fft_data, int bin, float ratio, int fft_size);
#pragma mark - Public
@ -137,7 +137,7 @@ void ddb_analyzer_tick(ddb_analyzer_t *analyzer) {
float *fft_data = analyzer->fft_data + ch * analyzer->fft_size;
ddb_analyzer_bar_t *bar = analyzer->bars;
for(int i = 0; i < analyzer->bar_count; i++, bar++) {
float norm_h = _interpolate_bin_with_ratio(fft_data, bar->bin, bar->ratio);
float norm_h = _interpolate_bin_with_ratio(fft_data, bar->bin, bar->ratio, analyzer->fft_size);
// if the bar spans more than one bin, find the max value
for(int b = bar->bin + 1; b <= bar->last_bin; b++) {
@ -424,6 +424,6 @@ _tempered_scale_bands_precalc(ddb_analyzer_t *analyzer) {
}
static float
_interpolate_bin_with_ratio(float *fft_data, int bin, float ratio) {
return fft_data[bin] + (fft_data[bin + 1] - fft_data[bin]) * ratio;
_interpolate_bin_with_ratio(float *fft_data, int bin, float ratio, int fft_size) {
return bin < fft_size ? (bin + 1 < fft_size ? (fft_data[bin] + (fft_data[bin + 1] - fft_data[bin]) * ratio) : fft_data[bin]) : 0.0;
}