From 1126fbd26c61bf6605e39744769b1e2e6ffdc230 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 18 Jan 2023 18:22:34 +0100 Subject: [PATCH] filter-chain: simplify a little We can reuse the array of filenames for the single filename case and remove some duplicate code. Handle some errors better. --- .../module-filter-chain/builtin_plugin.c | 64 +++++-------------- 1 file changed, 17 insertions(+), 47 deletions(-) diff --git a/src/modules/module-filter-chain/builtin_plugin.c b/src/modules/module-filter-chain/builtin_plugin.c index a3e9318d2..397eb20aa 100644 --- a/src/modules/module-filter-chain/builtin_plugin.c +++ b/src/modules/module-filter-chain/builtin_plugin.c @@ -476,35 +476,6 @@ static float *read_samples_from_sf(SNDFILE *f, SF_INFO info, float gain, int del } #endif -static float *read_samples(const char *filename, float gain, int delay, int offset, - int length, int channel, long unsigned *rate, int *n_samples) -{ -#ifdef HAVE_SNDFILE - SF_INFO info; - SNDFILE *f; - - spa_zero(info); - f = sf_open(filename, SFM_READ, &info) ; - if (f == NULL) { - pw_log_error("can't open %s", filename); - return NULL; - } - - float *samples = read_samples_from_sf(f, info, gain, delay, offset, - length, channel, rate, n_samples); - - sf_close(f); - return samples; -#else - pw_log_error("compiled without sndfile support, can't load samples: " - "using dirac impulse"); - float *samples = calloc(1, sizeof(float)); - samples[0] = gain; - *n_samples = 1; - return samples; -#endif -} - static float *read_closest(char **filenames, float gain, int delay, int offset, int length, int channel, long unsigned *rate, int *n_samples) { @@ -530,6 +501,7 @@ static float *read_closest(char **filenames, float gain, int delay, int offset, } } + pw_log_debug("loading %s", filenames[best]); float *samples = read_samples_from_sf(fs[best], infos[best], gain, delay, offset, length, channel, rate, n_samples); @@ -539,8 +511,12 @@ static float *read_closest(char **filenames, float gain, int delay, int offset, return samples; #else - return read_samples(filenames[0], gain, delay, offset, - length, channel, rate, n_samples); + pw_log_error("compiled without sndfile support, can't load samples: " + "using dirac impulse"); + float *samples = calloc(1, sizeof(float)); + samples[0] = gain; + *n_samples = 1; + return samples; #endif } @@ -672,7 +648,6 @@ static void * convolver_instantiate(const struct fc_descriptor * Descriptor, struct spa_json it[3]; const char *val; char key[256], v[256]; - char filename[PATH_MAX] = ""; char *filenames[MAX_RATES] = { 0 }; int blocksize = 0, tailsize = 0; int delay = 0; @@ -726,9 +701,11 @@ static void * convolver_instantiate(const struct fc_descriptor * Descriptor, i++; } } - else if (spa_json_parse_stringn(val, len, filename, sizeof(filename)) <= 0) { + else if (spa_json_parse_stringn(val, len, v, sizeof(v)) <= 0) { pw_log_error("convolver:filename requires a string or an array"); return NULL; + } else { + filenames[i] = strdup(v); } } else if (spa_streq(key, "offset")) { @@ -758,7 +735,7 @@ static void * convolver_instantiate(const struct fc_descriptor * Descriptor, else if (spa_json_next(&it[1], &val) < 0) break; } - if (!filename[0] && !filenames[0]) { + if (filenames[0] == NULL) { pw_log_error("convolver:filename was not given"); return NULL; } @@ -768,24 +745,17 @@ static void * convolver_instantiate(const struct fc_descriptor * Descriptor, if (offset < 0) offset = 0; - if (filenames[0]) { - rate = SampleRate; - samples = read_closest(filenames, gain, delay, offset, - length, channel, &rate, &n_samples); - if (rate != SampleRate) - samples = resample_buffer(samples, &n_samples, - rate, SampleRate, resample_quality); - } else if (spa_streq(filename, "/hilbert")) { - samples = create_hilbert(filename, gain, delay, offset, + if (spa_streq(filenames[0], "/hilbert")) { + samples = create_hilbert(filenames[0], gain, delay, offset, length, &n_samples); - } else if (spa_streq(filename, "/dirac")) { - samples = create_dirac(filename, gain, delay, offset, + } else if (spa_streq(filenames[0], "/dirac")) { + samples = create_dirac(filenames[0], gain, delay, offset, length, &n_samples); } else { rate = SampleRate; - samples = read_samples(filename, gain, delay, offset, + samples = read_closest(filenames, gain, delay, offset, length, channel, &rate, &n_samples); - if (rate != SampleRate) + if (samples != NULL && rate != SampleRate) samples = resample_buffer(samples, &n_samples, rate, SampleRate, resample_quality); }