From b5942f80de481cabab07ce1cee7a2b6a537b4c93 Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 2 Oct 2014 02:50:12 +0200 Subject: audio/filter: allow removing filters by label Although the "af" command already could do this, it seems it's better to introduce a lower level mechanism for now. This avoids some messy issues, since that code would recursive call reinit_audio_chain(). To be used by the next commit. --- audio/filter/af.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) (limited to 'audio/filter/af.c') diff --git a/audio/filter/af.c b/audio/filter/af.c index 176946b6d4..6a3b4bf0d5 100644 --- a/audio/filter/af.c +++ b/audio/filter/af.c @@ -647,11 +647,14 @@ int af_init(struct af_stream *s) // Add all filters in the list (if there are any) struct m_obj_settings *list = s->opts->af_settings; for (int i = 0; list && list[i].name; i++) { - if (!af_prepend(s, s->last, list[i].name, list[i].attribs)) { + struct af_instance *af = + af_prepend(s, s->last, list[i].name, list[i].attribs); + if (!af) { af_uninit(s); s->initialized = -1; return -1; } + af->label = talloc_strdup(af, list[i].label); } } @@ -690,6 +693,32 @@ struct af_instance *af_add(struct af_stream *s, char *name, char **args) return new; } +struct af_instance *af_find_by_label(struct af_stream *s, char *label) +{ + for (struct af_instance *af = s->first; af; af = af->next) { + if (af->label && strcmp(af->label, label) == 0) + return af; + } + return NULL; +} + +/* Remove the first filter that matches this name. Return number of filters + * removed (0, 1), or a negative error code if reinit after removing failed. + */ +int af_remove_by_label(struct af_stream *s, char *label) +{ + struct af_instance *af = af_find_by_label(s, label); + if (!af) + return 0; + af_remove(s, af); + if (af_reinit(s) != AF_OK) { + af_uninit(s); + af_init(s); + return -1; + } + return 1; +} + /* Filter data chunk through the filters in the list. * On success, *data is set to the filtered data/format. * Warning: input audio data will be overwritten. -- cgit v1.2.3