[pulseaudio-discuss] [PATCH 4/6] stream: Add a volume changed callback on streams

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


From: Arun Raghavan <git at arunraghavan.net>

---
 src/map-file         |  1 +
 src/pulse/internal.h |  2 ++
 src/pulse/stream.c   | 22 ++++++++++++++++++++++
 src/pulse/stream.h   |  4 ++++
 src/tests/api-test.c | 14 +++++++++++---
 5 files changed, 40 insertions(+), 3 deletions(-)

diff --git a/src/map-file b/src/map-file
index 8e61f53..afce508 100644
--- a/src/map-file
+++ b/src/map-file
@@ -328,6 +328,7 @@ pa_stream_set_state_callback;
 pa_stream_set_suspended_callback;
 pa_stream_set_underflow_callback;
 pa_stream_set_volume;
+pa_stream_set_volume_changed_callback;
 pa_stream_set_write_callback;
 pa_stream_trigger;
 pa_stream_unref;
diff --git a/src/pulse/internal.h b/src/pulse/internal.h
index ac9d07e..a75ffbf 100644
--- a/src/pulse/internal.h
+++ b/src/pulse/internal.h
@@ -223,6 +223,8 @@ struct pa_stream {
     void *event_userdata;
     pa_stream_notify_cb_t buffer_attr_callback;
     void *buffer_attr_userdata;
+    pa_stream_notify_cb_t volume_changed_callback;
+    void *volume_changed_userdata;
 };
 
 typedef void (*pa_operation_cb_t)(void);
diff --git a/src/pulse/stream.c b/src/pulse/stream.c
index bc49cbb..d9ca039 100644
--- a/src/pulse/stream.c
+++ b/src/pulse/stream.c
@@ -78,6 +78,8 @@ static void reset_callbacks(pa_stream *s) {
     s->event_userdata = NULL;
     s->buffer_attr_callback = NULL;
     s->buffer_attr_userdata = NULL;
+    s->volume_changed_callback = NULL;
+    s->volume_changed_userdata = NULL;
 }
 
 static pa_stream *pa_stream_new_with_proplist_internal(
@@ -946,6 +948,9 @@ void pa_command_stream_volume_changed(pa_pdispatch *pd, uint32_t command, uint32
 
     s->volume = volume;
 
+    if (s->volume_changed_callback)
+        s->volume_changed_callback(s, s->volume_changed_userdata);
+
 finish:
     pa_context_unref(c);
 }
@@ -3023,3 +3028,20 @@ int pa_stream_get_volume(pa_stream *s, pa_cvolume *v) {
 
     return 0;
 }
+
+void pa_stream_set_volume_changed_callback(pa_stream *s, pa_stream_notify_cb_t cb, void *userdata) {
+    pa_assert(s);
+    pa_assert(PA_REFCNT_VALUE(s) >= 1);
+
+    if (s->context->version < 31)
+        return;
+
+    if (pa_detect_fork())
+        return;
+
+    if (s->state == PA_STREAM_TERMINATED || s->state == PA_STREAM_FAILED)
+        return;
+
+    s->volume_changed_callback = cb;
+    s->volume_changed_userdata = userdata;
+}
diff --git a/src/pulse/stream.h b/src/pulse/stream.h
index b4e6ff9..c9fdec7 100644
--- a/src/pulse/stream.h
+++ b/src/pulse/stream.h
@@ -835,6 +835,10 @@ int pa_stream_set_volume(pa_stream *s, pa_cvolume *v, pa_stream_success_cb_t cb,
  * \since 9.0 */
 int pa_stream_get_volume(pa_stream *s, pa_cvolume *v);
 
+/** Set the callback function that is called whenever the volume of the stream
+ * changes. \since 9.0 */
+void pa_stream_set_volume_changed_callback(pa_stream *p, pa_stream_notify_cb_t cb, void *userdata);
+
 PA_C_DECL_END
 
 #endif
diff --git a/src/tests/api-test.c b/src/tests/api-test.c
index e7ae3df..c88d00b 100644
--- a/src/tests/api-test.c
+++ b/src/tests/api-test.c
@@ -32,7 +32,14 @@
 
 #define CHANNELS 2
 
-static void stream_volume_callback(pa_stream *s, int success, void *userdata) {
+static void volume_changed_callback(pa_stream *s, void *userdata) {
+    pa_cvolume v;
+
+    fail_unless(pa_stream_get_volume(s, &v) == 0);
+    fail_unless(pa_cvolume_avg(&v) == (PA_VOLUME_NORM / 3));
+}
+
+static void set_stream_volume_callback(pa_stream *s, int success, void *userdata) {
     pa_cvolume v;
     bool disconnect = PA_PTR_TO_UINT(userdata);
 
@@ -67,7 +74,8 @@ static void stream_state_callback(pa_stream *s, void *userdata) {
             fail_unless(pa_cvolume_avg(&v) == (PA_VOLUME_NORM / 2));
 
             pa_cvolume_set(&v, CHANNELS, PA_VOLUME_NORM / 3);
-            fail_unless(pa_stream_set_volume(s, &v, stream_volume_callback, PA_UINT_TO_PTR(true)) == 0);
+            pa_stream_set_volume_changed_callback(s, volume_changed_callback, NULL);
+            fail_unless(pa_stream_set_volume(s, &v, set_stream_volume_callback, PA_UINT_TO_PTR(true)) == 0);
             break;
 
         default:
@@ -100,7 +108,7 @@ static void context_state_callback(pa_context *c, void *userdata) {
             fail_unless(s != NULL);
 
             pa_cvolume_set(&v, CHANNELS, PA_VOLUME_NORM / 2);
-            fail_unless(pa_stream_set_volume(s, &v, stream_volume_callback, PA_UINT_TO_PTR(false)) == 0);
+            fail_unless(pa_stream_set_volume(s, &v, set_stream_volume_callback, PA_UINT_TO_PTR(false)) == 0);
 
             pa_stream_set_state_callback(s, stream_state_callback, NULL);
             if (playback)
-- 
2.5.0



More information about the pulseaudio-discuss mailing list