From 8ddb6d711fd3e8913f09179f0406a6317537da2d Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 23 Mar 2023 10:26:21 +0100 Subject: [PATCH] context: don't reconfigure when already pending When we already have a pending rate/quantum change, don't reconfigure the driver. This avoids going into an endless loop when: 1- paplay plays with 44100Hz on device1 2- jack_simple_client starts and attaches to device1 3- jack_simple_client links to device2 4- jack_simple_client is moved from device1 to device2, rate from device1 is moved to device2 (44100Hz) 5- device2 becomes schedulable and sees the rate should be 48000Hz (the default) it does a rate switch to 48KHz 6- jack_simple_client is suspended, links are back to init 7- jack_simple_client is moved back to device1 8- jack_simple_client links are activated and cycle restarts at 4 The cycle is broken because at 6 we avoid doing the suspend. --- src/pipewire/context.c | 8 ++++---- src/pipewire/impl-node.c | 17 ++++++++++++----- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/pipewire/context.c b/src/pipewire/context.c index c615ea4e7..d000c3c30 100644 --- a/src/pipewire/context.c +++ b/src/pipewire/context.c @@ -1307,18 +1307,18 @@ again: if (target_rate != current_rate) { bool do_reconfigure = false; /* we doing a rate switch */ - pw_log_info("(%s-%u) state:%s new rate:%u->%u", + pw_log_info("(%s-%u) state:%s new rate:%u/(%u)->%u", n->name, n->info.id, pw_node_state_as_string(n->info.state), - n->current_rate.denom, + n->current_rate.denom, current_rate, target_rate); if (force_rate) { if (settings->clock_rate_update_mode == CLOCK_RATE_UPDATE_MODE_HARD) - do_reconfigure = true; + do_reconfigure = !n->current_pending; } else { if (n->info.state >= PW_NODE_STATE_SUSPENDED) - do_reconfigure = true; + do_reconfigure = !n->current_pending; } if (do_reconfigure) reconfigure_driver(context, n); diff --git a/src/pipewire/impl-node.c b/src/pipewire/impl-node.c index 182bccdbf..917c915d3 100644 --- a/src/pipewire/impl-node.c +++ b/src/pipewire/impl-node.c @@ -841,14 +841,16 @@ int pw_impl_node_set_driver(struct pw_impl_node *node, struct pw_impl_node *driv remove_segment_owner(old, node->info.id); if (old != node && old->driving && driver->info.state < PW_NODE_STATE_RUNNING) { + pw_log_info("move quantum:%"PRIu64"->%"PRIu64" rate:%d->%d (%s-%d -> %s-%d)", + driver->current_quantum, + old->current_quantum, + driver->current_rate.denom, + old->current_rate.denom, + old->name, old->info.id, + driver->name, driver->info.id); driver->current_rate = old->current_rate; driver->current_quantum = old->current_quantum; driver->current_pending = true; - pw_log_info("move quantum:%"PRIu64" rate:%d (%s-%d -> %s-%d)", - driver->current_quantum, - driver->current_rate.denom, - old->name, old->info.id, - driver->name, driver->info.id); } was_driving = node->driving; node->driving = node->driver && driver == node; @@ -1682,6 +1684,11 @@ static int node_ready(void *data, int status) } if (node->current_pending) { + pw_log_debug("apply quantum %"PRIu64"->%"PRIu64" %d->%d", + node->rt.position->clock.duration, + node->current_quantum, + node->rt.position->clock.rate.denom, + node->current_rate.denom); node->rt.position->clock.duration = node->current_quantum; node->rt.position->clock.rate = node->current_rate; node->current_pending = false;