]> code.delx.au - pulseaudio/commitdiff
sink: Add a set_formats() API
authorArun Raghavan <arun.raghavan@collabora.co.uk>
Fri, 12 Aug 2011 11:04:28 +0000 (16:34 +0530)
committerArun Raghavan <arun.raghavan@collabora.co.uk>
Mon, 15 Aug 2011 06:21:34 +0000 (11:51 +0530)
This adds API to let external sources specify what formats a sink
supports. Sinks must opt-in to allow this, and can perform some
validation if required.

src/pulsecore/sink.c
src/pulsecore/sink.h

index 42a8eb3daea92f01855606048d9f69abf585c84b..62776985812d52f78235072f6fba51e6669cacfe 100644 (file)
@@ -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)
index 8aa04b867b80a71130d88edb3c98b1baa700b1e4..0bd5e81eba59213d077057ad2c547738e9f6eefd 100644 (file)
@@ -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);