Skip to content

Commit 8b17eae

Browse files
committed
fir.c: fir_parse_opts(): Allow additional options.
This feature is not currently used, but may be useful in the future.
1 parent 999346c commit 8b17eae

File tree

3 files changed

+19
-10
lines changed

3 files changed

+19
-10
lines changed

fir.c

+14-8
Original file line numberDiff line numberDiff line change
@@ -473,16 +473,18 @@ sample_t * fir_read_filter(const struct effect_info *ei, const char *dir, const
473473
return data;
474474
}
475475

476-
int fir_parse_codec_opts(const struct effect_info *ei, const struct stream_info *istream, struct codec_params *p, struct dsp_getopt_state *g, int argc, const char *const *argv)
476+
int fir_parse_opts(const struct effect_info *ei, const struct stream_info *istream, struct codec_params *p, struct dsp_getopt_state *g, int argc, const char *const *argv, const char *optstr,
477+
int (*extra_opts_fn)(const struct effect_info *, const struct stream_info *, const struct codec_params *, int, const char *))
477478
{
478-
int opt;
479+
int opt, err;
479480
char *endptr;
480481

481482
*p = (struct codec_params) CODEC_PARAMS_AUTO(NULL, CODEC_MODE_READ);
482483
p->fs = istream->fs;
483484
p->channels = istream->channels;
485+
if (optstr == NULL) optstr = FIR_INPUT_CODEC_OPTS;
484486

485-
while ((opt = dsp_getopt(g, argc, argv, "t:e:BLNr:c:")) != -1) {
487+
while ((opt = dsp_getopt(g, argc, argv, optstr)) != -1) {
486488
switch (opt) {
487489
case 't': p->type = g->arg; break;
488490
case 'e': p->enc = g->arg; break;
@@ -511,12 +513,16 @@ int fir_parse_codec_opts(const struct effect_info *ei, const struct stream_info
511513
return 1;
512514
}
513515
break;
516+
case ':':
517+
LOG_FMT(LL_ERROR, "%s: error: expected argument to option '%c'", ei->name, g->opt);
518+
return 1;
514519
default:
515-
if (opt == ':')
516-
LOG_FMT(LL_ERROR, "%s: error: expected argument to option '%c'", ei->name, g->opt);
517-
else
520+
if (opt == '?' || extra_opts_fn == NULL) {
518521
LOG_FMT(LL_ERROR, "%s: error: illegal option '%c'", ei->name, g->opt);
519-
return 1;
522+
return 1;
523+
}
524+
else if ((err = extra_opts_fn(ei, istream, p, opt, g->arg)) != 0)
525+
return err;
520526
}
521527
}
522528
return 0;
@@ -531,7 +537,7 @@ struct effect * fir_effect_init(const struct effect_info *ei, const struct strea
531537
struct codec_params c_params;
532538
struct dsp_getopt_state g = DSP_GETOPT_STATE_INITIALIZER;
533539

534-
int err = fir_parse_codec_opts(ei, istream, &c_params, &g, argc, argv);
540+
int err = fir_parse_opts(ei, istream, &c_params, &g, argc, argv, NULL, NULL);
535541
if (err || g.ind != argc-1) {
536542
LOG_FMT(LL_ERROR, "%s: usage: %s", argv[0], ei->usage);
537543
return NULL;

fir.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,12 @@
2424
#include "codec.h"
2525
#include "util.h"
2626

27+
#define FIR_INPUT_CODEC_OPTS "t:e:BLNr:c:"
28+
2729
struct effect * fir_effect_init_with_filter(const struct effect_info *, const struct stream_info *, const char *, sample_t *, int, ssize_t, int);
2830
sample_t * fir_read_filter(const struct effect_info *, const char *, const struct codec_params *, int *, ssize_t *);
29-
int fir_parse_codec_opts(const struct effect_info *, const struct stream_info *, struct codec_params *, struct dsp_getopt_state *, int, const char *const *);
31+
int fir_parse_opts(const struct effect_info *, const struct stream_info *, struct codec_params *, struct dsp_getopt_state *, int, const char *const *, const char *,
32+
int (*extra_opt_fn)(const struct effect_info *, const struct stream_info *, const struct codec_params *, int, const char *));
3033
struct effect * fir_effect_init(const struct effect_info *, const struct stream_info *, const char *, const char *, int, const char *const *);
3134

3235
#endif

fir_p.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,7 @@ struct effect * fir_p_effect_init(const struct effect_info *ei, const struct str
528528
struct dsp_getopt_state g = DSP_GETOPT_STATE_INITIALIZER;
529529
char *endptr;
530530

531-
int err = fir_parse_codec_opts(ei, istream, &c_params, &g, argc, argv);
531+
int err = fir_parse_opts(ei, istream, &c_params, &g, argc, argv, NULL, NULL);
532532
if (err || g.ind < argc-2 || g.ind > argc-1) {
533533
LOG_FMT(LL_ERROR, "%s: usage: %s", argv[0], ei->usage);
534534
return NULL;

0 commit comments

Comments
 (0)