This makes it easier for users of this API to add/updated a volume factor by doing a _remove_volume_factor() followed by an add_volume_factor(), rather than having to either remember whether this is the first set operation or have an API to query whether a factor has already been set. --- src/pulsecore/sink-input.c | 12 ++++++++++-- src/pulsecore/sink-input.h | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c index c6d540e..47f169e 100644 --- a/src/pulsecore/sink-input.c +++ b/src/pulsecore/sink-input.c @@ -1330,7 +1330,9 @@ void pa_sink_input_add_volume_factor(pa_sink_input *i, const char *key, const pa pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_SOFT_VOLUME, NULL, 0, NULL) == 0); } -void pa_sink_input_remove_volume_factor(pa_sink_input *i, const char *key) { +/* Returns true if an entry was removed and false if no entry for the given + * key was found. */ +int pa_sink_input_remove_volume_factor(pa_sink_input *i, const char *key) { struct volume_factor_entry *v; pa_sink_input_assert_ref(i); @@ -1338,7 +1340,11 @@ void pa_sink_input_remove_volume_factor(pa_sink_input *i, const char *key) { pa_assert_ctl_context(); pa_assert(PA_SINK_INPUT_IS_LINKED(i->state)); - pa_assert_se(v = pa_hashmap_remove(i->volume_factor_items, key)); + v = pa_hashmap_remove(i->volume_factor_items, key); + + if (!v) + return -1; + volume_factor_entry_free(v); switch (pa_hashmap_size(i->volume_factor_items)) { @@ -1357,6 +1363,8 @@ void pa_sink_input_remove_volume_factor(pa_sink_input *i, const char *key) { /* Copy the new soft_volume to the thread_info struct */ pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_SOFT_VOLUME, NULL, 0, NULL) == 0); + + return 0; } /* Called from main context */ diff --git a/src/pulsecore/sink-input.h b/src/pulsecore/sink-input.h index 4cf8614..da33717 100644 --- a/src/pulsecore/sink-input.h +++ b/src/pulsecore/sink-input.h @@ -371,7 +371,7 @@ bool pa_sink_input_is_passthrough(pa_sink_input *i); bool pa_sink_input_is_volume_readable(pa_sink_input *i); void pa_sink_input_set_volume(pa_sink_input *i, const pa_cvolume *volume, bool save, bool absolute); void pa_sink_input_add_volume_factor(pa_sink_input *i, const char *key, const pa_cvolume *volume_factor); -void pa_sink_input_remove_volume_factor(pa_sink_input *i, const char *key); +int pa_sink_input_remove_volume_factor(pa_sink_input *i, const char *key); pa_cvolume *pa_sink_input_get_volume(pa_sink_input *i, pa_cvolume *volume, bool absolute); void pa_sink_input_set_mute(pa_sink_input *i, bool mute, bool save); -- 1.8.2.1