[pulseaudio-discuss] [PATCH 2/3] sink: Add a maximum volume which is inherited from the port

poljar (Damir Jelić) poljarinho at gmail.com
Fri Aug 10 05:42:15 PDT 2012


From: "poljar (Damir Jelić)" <poljarinho at gmail.com>

A maximum volume variable was added to the sink struct.

Also a function was added to update the maximum volume and enforce it if
it's needed.

The maximum volume is automatically populated with the volume from the
currently active port.
---
 src/pulsecore/device-port.c | 13 +++++++++++++
 src/pulsecore/sink.c        | 24 ++++++++++++++++++++++--
 src/pulsecore/sink.h        |  4 +++-
 3 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/src/pulsecore/device-port.c b/src/pulsecore/device-port.c
index c467a09..efe1d56 100644
--- a/src/pulsecore/device-port.c
+++ b/src/pulsecore/device-port.c
@@ -150,10 +150,23 @@ void pa_device_port_set_latency_offset(pa_device_port *p, int64_t offset) {
 }
 
 void pa_device_port_set_max_volume(pa_device_port *p, pa_volume_t max) {
+    uint32_t state;
+    pa_core *core;
+
     pa_assert(p);
 
     if (max == PA_VOLUME_MUTED)
         p->max_volume = PA_VOLUME_INVALID;
     else
         p->max_volume = max;
+
+    if (p->is_output) {
+        pa_sink *sink;
+
+        PA_IDXSET_FOREACH(sink, p->core->sinks, state)
+            if (sink->active_port == p) {
+                pa_sink_set_max_volume(sink, p->max_volume);
+                break;
+            }
+    }
 }
diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
index 3d72f55..e474821 100644
--- a/src/pulsecore/sink.c
+++ b/src/pulsecore/sink.c
@@ -309,10 +309,14 @@ pa_sink* pa_sink_new(
                 s->active_port = p;
     }
 
-    if (s->active_port)
+    if (s->active_port) {
         s->latency_offset = s->active_port->latency_offset;
-    else
+        s->max_volume = s->active_port->max_volume;
+
+    } else {
         s->latency_offset = 0;
+        s->max_volume = PA_VOLUME_INVALID;
+    }
 
     s->save_volume = data->save_volume;
     s->save_muted = data->save_muted;
@@ -1967,6 +1971,13 @@ void pa_sink_set_volume(
             pa_cvolume_scale(&new_reference_volume, pa_cvolume_max(volume));
         }
 
+        /* If we have a max_volume set enforce it if needed */
+
+        if (PA_VOLUME_IS_VALID(s->max_volume))
+            for (unsigned i = 0; i < new_reference_volume.channels; i++)
+                if (new_reference_volume.values[i] > s->max_volume)
+                    new_reference_volume.values[i] = s->max_volume;
+
         pa_cvolume_remap(&new_reference_volume, &s->channel_map, &root_sink->channel_map);
 
         if (update_reference_volume(root_sink, &new_reference_volume, &root_sink->channel_map, save)) {
@@ -3261,6 +3272,15 @@ void pa_sink_set_latency_offset(pa_sink *s, int64_t offset) {
 }
 
 /* Called from main context */
+void pa_sink_set_max_volume(pa_sink *s, pa_volume_t max) {
+    pa_sink_assert_ref(s);
+
+    s->max_volume = max;
+
+    pa_sink_set_volume(s, &s->reference_volume, TRUE, s->save_volume);
+}
+
+/* Called from main context */
 size_t pa_sink_get_max_rewind(pa_sink *s) {
     size_t r;
     pa_assert_ctl_context();
diff --git a/src/pulsecore/sink.h b/src/pulsecore/sink.h
index 2c52348..6efeb46 100644
--- a/src/pulsecore/sink.h
+++ b/src/pulsecore/sink.h
@@ -113,8 +113,9 @@ struct pa_sink {
     pa_device_port *active_port;
     pa_atomic_t mixer_dirty;
 
-    /* The latency offset is inherited from the currently active port */
+    /* The latency offset and the maximum volume are inherited from the currently active port */
     int64_t latency_offset;
+    pa_volume_t max_volume;
 
     unsigned priority;
 
@@ -411,6 +412,7 @@ unsigned pa_device_init_priority(pa_proplist *p);
 
 pa_bool_t pa_sink_update_rate(pa_sink *s, uint32_t rate, pa_bool_t passthrough);
 void pa_sink_set_latency_offset(pa_sink *s, int64_t offset);
+void pa_sink_set_max_volume(pa_sink *s, pa_volume_t max);
 
 /* The returned value is supposed to be in the time domain of the sound card! */
 pa_usec_t pa_sink_get_latency(pa_sink *s);
-- 
1.7.11.4



More information about the pulseaudio-discuss mailing list