Re: [pulseaudio-discuss] [PATCH] sink-input, source-output: Assign to reference_ratio from a single place

2014-08-16 Thread Tanu Kaskinen
On Mon, 2014-08-04 at 21:12 +0300, Tanu Kaskinen wrote:
 This makes it easy to log a message every time the reference ratio
 changes. I also need to add a hook for reference ratio changes, but
 that need will go away if the stream relative volume controls will be
 created by the core in the future.
 ---
  src/pulsecore/sink-input.c| 28 ++--
  src/pulsecore/sink-input.h|  6 ++
  src/pulsecore/sink.c  | 11 +++
  src/pulsecore/source-output.c | 26 +-
  src/pulsecore/source-output.h |  6 ++
  src/pulsecore/source.c| 11 +++
  6 files changed, 77 insertions(+), 11 deletions(-)

No feedback received, I pushed this now.

-- 
Tanu

___
pulseaudio-discuss mailing list
pulseaudio-discuss@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss


[pulseaudio-discuss] [PATCH] sink-input, source-output: Assign to reference_ratio from a single place

2014-08-04 Thread Tanu Kaskinen
This makes it easy to log a message every time the reference ratio
changes. I also need to add a hook for reference ratio changes, but
that need will go away if the stream relative volume controls will be
created by the core in the future.
---
 src/pulsecore/sink-input.c| 28 ++--
 src/pulsecore/sink-input.h|  6 ++
 src/pulsecore/sink.c  | 11 +++
 src/pulsecore/source-output.c | 26 +-
 src/pulsecore/source-output.h |  6 ++
 src/pulsecore/source.c| 11 +++
 6 files changed, 77 insertions(+), 11 deletions(-)

diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c
index 6169d47..b9698b9 100644
--- a/src/pulsecore/sink-input.c
+++ b/src/pulsecore/sink-input.c
@@ -1273,7 +1273,7 @@ void pa_sink_input_set_volume(pa_sink_input *i, const 
pa_cvolume *volume, bool s
 /* OK, we are in normal volume mode. The volume only affects
  * ourselves */
 set_real_ratio(i, volume);
-i-reference_ratio = i-volume;
+pa_sink_input_set_reference_ratio(i, i-volume);
 
 /* Copy the new soft_volume to the thread_info struct */
 pa_assert_se(pa_asyncmsgq_send(i-sink-asyncmsgq, PA_MSGOBJECT(i), 
PA_SINK_INPUT_MESSAGE_SET_SOFT_VOLUME, NULL, 0, NULL) == 0);
@@ -1673,7 +1673,7 @@ static void update_volume_due_to_moving(pa_sink_input *i, 
pa_sink *dest) {
 
 pa_cvolume_reset(new_volume, i-volume.channels);
 pa_sink_input_set_volume_direct(i, new_volume);
-pa_cvolume_reset(i-reference_ratio, i-reference_ratio.channels);
+pa_sink_input_set_reference_ratio(i, new_volume);
 pa_assert(pa_cvolume_is_norm(i-real_ratio));
 pa_assert(pa_cvolume_equal(i-soft_volume, i-volume_factor));
 }
@@ -2238,3 +2238,27 @@ void pa_sink_input_set_volume_direct(pa_sink_input *i, 
const pa_cvolume *volume)
 pa_subscription_post(i-core, 
PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i-index);
 pa_hook_fire(i-core-hooks[PA_CORE_HOOK_SINK_INPUT_VOLUME_CHANGED], i);
 }
+
+/* Called from the main thread. */
+void pa_sink_input_set_reference_ratio(pa_sink_input *i, const pa_cvolume 
*ratio) {
+pa_cvolume old_ratio;
+char old_ratio_str[PA_CVOLUME_SNPRINT_VERBOSE_MAX];
+char new_ratio_str[PA_CVOLUME_SNPRINT_VERBOSE_MAX];
+
+pa_assert(i);
+pa_assert(ratio);
+
+old_ratio = i-reference_ratio;
+
+if (pa_cvolume_equal(ratio, old_ratio))
+return;
+
+i-reference_ratio = *ratio;
+
+if (!PA_SINK_INPUT_IS_LINKED(i-state))
+return;
+
+pa_log_debug(Sink input %u reference ratio changed from %s to %s., 
i-index,
+ pa_cvolume_snprint_verbose(old_ratio_str, 
sizeof(old_ratio_str), old_ratio, i-channel_map, true),
+ pa_cvolume_snprint_verbose(new_ratio_str, 
sizeof(new_ratio_str), ratio, i-channel_map, true));
+}
diff --git a/src/pulsecore/sink-input.h b/src/pulsecore/sink-input.h
index a48476c..15f9315 100644
--- a/src/pulsecore/sink-input.h
+++ b/src/pulsecore/sink-input.h
@@ -423,6 +423,12 @@ pa_memchunk* pa_sink_input_get_silence(pa_sink_input *i, 
pa_memchunk *ret);
  * and fires change notifications. */
 void pa_sink_input_set_volume_direct(pa_sink_input *i, const pa_cvolume 
*volume);
 
+/* Called from the main thread, from sink.c only. This shouldn't be a public
+ * function, but the flat volume logic in sink.c currently needs a way to
+ * directly set the sink input reference ratio. This function simply sets
+ * i-reference_ratio and logs a message if the value changes. */
+void pa_sink_input_set_reference_ratio(pa_sink_input *i, const pa_cvolume 
*ratio);
+
 #define pa_sink_input_assert_io_context(s) \
 pa_assert(pa_thread_mq_get() || !PA_SINK_INPUT_IS_LINKED((s)-state))
 
diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
index ccf6ea1..274fe83 100644
--- a/src/pulsecore/sink.c
+++ b/src/pulsecore/sink.c
@@ -1610,6 +1610,7 @@ void pa_sink_leave_passthrough(pa_sink *s) {
 static void compute_reference_ratio(pa_sink_input *i) {
 unsigned c = 0;
 pa_cvolume remapped;
+pa_cvolume ratio;
 
 pa_assert(i);
 pa_assert(pa_sink_flat_volume_enabled(i-sink));
@@ -1624,7 +1625,7 @@ static void compute_reference_ratio(pa_sink_input *i) {
 remapped = i-sink-reference_volume;
 pa_cvolume_remap(remapped, i-sink-channel_map, i-channel_map);
 
-i-reference_ratio.channels = i-sample_spec.channels;
+ratio = i-reference_ratio;
 
 for (c = 0; c  i-sample_spec.channels; c++) {
 
@@ -1634,14 +1635,16 @@ static void compute_reference_ratio(pa_sink_input *i) {
 
 /* Don't update the reference ratio unless necessary */
 if (pa_sw_volume_multiply(
-i-reference_ratio.values[c],
+ratio.values[c],
 remapped.values[c]) == i-volume.values[c])
 continue;
 
-i-reference_ratio.values[c] = pa_sw_volume_divide(
+