[pulseaudio-discuss] [PATCH 5/6] stream: Add a pa_stream_set_mute() API

arun at accosted.net arun at accosted.net
Mon Dec 28 19:33:44 PST 2015


From: Arun Raghavan <git at arunraghavan.net>

---
 src/map-file         |  1 +
 src/pulse/internal.h |  1 +
 src/pulse/stream.c   | 28 ++++++++++++++++++++++++++++
 src/pulse/stream.h   |  9 +++++++++
 4 files changed, 39 insertions(+)

diff --git a/src/map-file b/src/map-file
index afce508..17e7f6b 100644
--- a/src/map-file
+++ b/src/map-file
@@ -320,6 +320,7 @@ pa_stream_set_event_callback;
 pa_stream_set_latency_update_callback;
 pa_stream_set_monitor_stream;
 pa_stream_set_moved_callback;
+pa_stream_set_mute;
 pa_stream_set_name;
 pa_stream_set_overflow_callback;
 pa_stream_set_read_callback;
diff --git a/src/pulse/internal.h b/src/pulse/internal.h
index a75ffbf..df67c60 100644
--- a/src/pulse/internal.h
+++ b/src/pulse/internal.h
@@ -153,6 +153,7 @@ struct pa_stream {
 
     pa_cvolume volume;
     bool volume_set;
+    bool mute;
 
     bool channel_valid:1;
     bool suspended:1;
diff --git a/src/pulse/stream.c b/src/pulse/stream.c
index d9ca039..934a747 100644
--- a/src/pulse/stream.c
+++ b/src/pulse/stream.c
@@ -3013,6 +3013,34 @@ int pa_stream_set_volume(pa_stream *s, pa_cvolume *v, pa_stream_success_cb_t cb,
     return 0;
 }
 
+int pa_stream_set_mute(pa_stream *s, int mute, pa_stream_success_cb_t cb, void *userdata) {
+    pa_operation *o;
+    pa_tagstruct *t;
+    uint32_t tag;
+
+    pa_assert(s);
+    pa_assert(PA_REFCNT_VALUE(s) >= 1);
+
+    PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED);
+    PA_CHECK_VALIDITY(s->context, s->state != PA_STREAM_FAILED && s->state != PA_STREAM_TERMINATED, PA_ERR_BADSTATE);
+    PA_CHECK_VALIDITY(s->context, userdata == NULL || cb != NULL, PA_ERR_INVALID);
+    PA_CHECK_VALIDITY(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_INVALID); /* TODO: do we want to support this? */
+    /* We can't currently set this before connecting, which is not symmetric with volume */
+    PA_CHECK_VALIDITY(s->context, s->state != PA_STREAM_UNCONNECTED, PA_ERR_BADSTATE);
+
+    o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata);
+
+    t = pa_tagstruct_command(s->context,
+            s->direction == PA_STREAM_PLAYBACK ? PA_COMMAND_SET_SINK_INPUT_MUTE : PA_COMMAND_SET_SOURCE_OUTPUT_MUTE,
+            &tag);
+    pa_tagstruct_putu32(t, s->stream_index);
+    pa_tagstruct_put_boolean(t, !!mute);
+    pa_pstream_send_tagstruct(s->context->pstream, t);
+    pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_stream_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
+
+    return 0;
+}
+
 int pa_stream_get_volume(pa_stream *s, pa_cvolume *v) {
     pa_assert(s);
     pa_assert(v);
diff --git a/src/pulse/stream.h b/src/pulse/stream.h
index c9fdec7..7adebe0 100644
--- a/src/pulse/stream.h
+++ b/src/pulse/stream.h
@@ -828,6 +828,15 @@ uint32_t pa_stream_get_monitor_stream(pa_stream *s);
  * \since 9.0 */
 int pa_stream_set_volume(pa_stream *s, pa_cvolume *v, pa_stream_success_cb_t cb, void *userdata);
 
+/** Set the mute status on the given stream. The operation is asynchronous and
+ * a callback may optionally be provided to be invoked when the volume has been
+ * set.
+ *
+ * Returns 0 on success, negative error value on failure.
+ *
+ * \since 9.0 */
+int pa_stream_set_mute(pa_stream *s, int mute, pa_stream_success_cb_t cb, void *userdata);
+
 /** Get the volume on the given stream.
  *
  * Returns 0 on success, negative error value on failure.
-- 
2.5.0



More information about the pulseaudio-discuss mailing list