From 7d9dde0a1d3192608bcde8013352e823d847c92f Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 2 Aug 2021 11:46:53 +0200 Subject: [PATCH] loopback: pass all latency to the other stream Latency configured on one streams needs to be passed directly to the other stream. --- src/modules/module-loopback.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/modules/module-loopback.c b/src/modules/module-loopback.c index 6cadce3ac..434007b53 100644 --- a/src/modules/module-loopback.c +++ b/src/modules/module-loopback.c @@ -165,7 +165,8 @@ static void capture_process(void *d) pw_stream_queue_buffer(impl->playback, out); } -static void param_latency_changed(struct impl *impl, const struct spa_pod *param) +static void param_latency_changed(struct impl *impl, const struct spa_pod *param, + struct pw_stream *other) { struct spa_latency_info latency; uint8_t buffer[1024]; @@ -177,20 +178,16 @@ static void param_latency_changed(struct impl *impl, const struct spa_pod *param spa_pod_builder_init(&b, buffer, sizeof(buffer)); params[0] = spa_latency_build(&b, SPA_PARAM_Latency, &latency); - - if (latency.direction == SPA_DIRECTION_INPUT) - pw_stream_update_params(impl->capture, params, 1); - else - pw_stream_update_params(impl->playback, params, 1); + pw_stream_update_params(other, params, 1); } -static void param_changed(void *data, uint32_t id, const struct spa_pod *param) +static void capture_param_changed(void *data, uint32_t id, const struct spa_pod *param) { struct impl *impl = data; switch (id) { case SPA_PARAM_Latency: - param_latency_changed(impl, param); + param_latency_changed(impl, param, impl->playback); break; } } @@ -199,7 +196,7 @@ static const struct pw_stream_events in_stream_events = { PW_VERSION_STREAM_EVENTS, .destroy = capture_destroy, .process = capture_process, - .param_changed = param_changed, + .param_changed = capture_param_changed, }; static void playback_destroy(void *d) @@ -209,10 +206,20 @@ static void playback_destroy(void *d) impl->playback = NULL; } +static void playback_param_changed(void *data, uint32_t id, const struct spa_pod *param) +{ + struct impl *impl = data; + + switch (id) { + case SPA_PARAM_Latency: + param_latency_changed(impl, param, impl->capture); + break; + } +} static const struct pw_stream_events out_stream_events = { PW_VERSION_STREAM_EVENTS, .destroy = playback_destroy, - .param_changed = param_changed, + .param_changed = playback_param_changed, }; static int setup_streams(struct impl *impl)