mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -05:00
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.
This commit is contained in:
parent
30057967dd
commit
1126fbd26c
1 changed files with 17 additions and 47 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue