diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c index 42a8eb3da..627769858 100644 --- a/src/pulsecore/sink.c +++ b/src/pulsecore/sink.c @@ -180,6 +180,7 @@ static void reset_callbacks(pa_sink *s) { s->update_requested_latency = NULL; s->set_port = NULL; s->get_formats = NULL; + s->set_formats = NULL; } /* Called from main context */ @@ -3428,6 +3429,21 @@ pa_idxset* pa_sink_get_formats(pa_sink *s) { return ret; } +/* Called from the main thread */ +/* Allows an external source to set what formats a sink supports if the sink + * permits this. The function makes a copy of the formats on success. */ +pa_bool_t pa_sink_set_formats(pa_sink *s, pa_idxset *formats) { + pa_assert(s); + pa_assert(formats); + + if (s->set_formats) + /* Sink supports setting formats -- let's give it a shot */ + return s->set_formats(s, formats); + else + /* Sink doesn't support setting this -- bail out */ + return FALSE; +} + /* Called from the main thread */ /* Checks if the sink can accept this format */ pa_bool_t pa_sink_check_format(pa_sink *s, pa_format_info *f) diff --git a/src/pulsecore/sink.h b/src/pulsecore/sink.h index 8aa04b867..0bd5e81eb 100644 --- a/src/pulsecore/sink.h +++ b/src/pulsecore/sink.h @@ -223,6 +223,12 @@ struct pa_sink { * in descending order of preference. */ pa_idxset* (*get_formats)(pa_sink *s); /* ditto */ + /* Called to set the list of formats supported by the sink. Can be + * NULL if the sink does not support this. Returns TRUE on success, + * FALSE otherwise (for example when an unsupportable format is + * set). Makes a copy of the formats passed in. */ + pa_bool_t (*set_formats)(pa_sink *s, pa_idxset *formats); /* ditto */ + /* Contains copies of the above data so that the real-time worker * thread can work without access locking */ struct { @@ -434,6 +440,7 @@ void pa_sink_move_all_finish(pa_sink *s, pa_queue *q, pa_bool_t save); void pa_sink_move_all_fail(pa_queue *q); pa_idxset* pa_sink_get_formats(pa_sink *s); +pa_bool_t pa_sink_set_formats(pa_sink *s, pa_idxset *formats); pa_bool_t pa_sink_check_format(pa_sink *s, pa_format_info *f); pa_idxset* pa_sink_check_formats(pa_sink *s, pa_idxset *in_formats);