diff --git a/pipewire-jack/src/pipewire-jack.c b/pipewire-jack/src/pipewire-jack.c index 1fbef3b72..c5d303ae0 100644 --- a/pipewire-jack/src/pipewire-jack.c +++ b/pipewire-jack/src/pipewire-jack.c @@ -1926,11 +1926,14 @@ static void default_latency(struct client *c, enum spa_direction direction, enum spa_direction other; struct port *p; - *latency = SPA_LATENCY_INFO(direction); other = SPA_DIRECTION_REVERSE(direction); + spa_latency_info_combine_start(latency, direction); + spa_list_for_each(p, &c->ports[other], link) spa_latency_info_combine(latency, &p->object->port.latency[direction]); + + spa_latency_info_combine_finish(latency); } /* called from thread-loop */ diff --git a/spa/include/spa/param/latency-utils.h b/spa/include/spa/param/latency-utils.h index 05638362f..6fe36c1a4 100644 --- a/spa/include/spa/param/latency-utils.h +++ b/spa/include/spa/param/latency-utils.h @@ -34,6 +34,8 @@ extern "C" { * \{ */ +#include + #include #include #include @@ -63,20 +65,39 @@ spa_latency_info_compare(const struct spa_latency_info *a, struct spa_latency_in return 1; } +static inline void +spa_latency_info_combine_start(struct spa_latency_info *info, enum spa_direction direction) +{ + *info = SPA_LATENCY_INFO(direction, + .min_quantum = FLT_MAX, + .min_rate = UINT32_MAX, + .min_ns = UINT64_MAX); +} +static inline void +spa_latency_info_combine_finish(struct spa_latency_info *info) +{ + if (info->min_quantum == FLT_MAX) + info->min_quantum = 0; + if (info->min_rate == UINT32_MAX) + info->min_rate = 0; + if (info->min_ns == UINT64_MAX) + info->min_ns = 0; +} + static inline int spa_latency_info_combine(struct spa_latency_info *info, const struct spa_latency_info *other) { if (info->direction != other->direction) return -EINVAL; - if (info->min_quantum == 0.0f || other->min_quantum < info->min_quantum) + if (other->min_quantum < info->min_quantum) info->min_quantum = other->min_quantum; if (other->max_quantum > info->max_quantum) info->max_quantum = other->max_quantum; - if (info->min_rate == 0U || other->min_rate < info->min_rate) + if (other->min_rate < info->min_rate) info->min_rate = other->min_rate; if (other->max_rate > info->max_rate) info->max_rate = other->max_rate; - if (info->min_ns == 0UL || other->min_ns < info->min_ns) + if (other->min_ns < info->min_ns) info->min_ns = other->min_ns; if (other->max_ns > info->max_ns) info->max_ns = other->max_ns; diff --git a/src/pipewire/filter.c b/src/pipewire/filter.c index 763f19ba4..15fd09f59 100644 --- a/src/pipewire/filter.c +++ b/src/pipewire/filter.c @@ -769,13 +769,13 @@ static int default_latency(struct filter *impl, struct port *port, enum spa_dire struct spa_latency_info info; struct port *p; - info = SPA_LATENCY_INFO(direction); - + spa_latency_info_combine_start(&info, direction); spa_list_for_each(p, &impl->port_list, link) { if (p->direction == direction) continue; spa_latency_info_combine(&info, &p->latency[direction]); } + spa_latency_info_combine_finish(&info); spa_process_latency_info_add(&impl->process_latency, &info); diff --git a/src/pipewire/impl-port.c b/src/pipewire/impl-port.c index f6034ccb9..b6287ceb9 100644 --- a/src/pipewire/impl-port.c +++ b/src/pipewire/impl-port.c @@ -1318,7 +1318,7 @@ int pw_impl_port_recalc_latency(struct pw_impl_port *port) if (port->destroying) return 0; - latency = SPA_LATENCY_INFO(SPA_DIRECTION_REVERSE(port->direction)); + spa_latency_info_combine_start(&latency, SPA_DIRECTION_REVERSE(port->direction)); if (port->direction == PW_DIRECTION_OUTPUT) { spa_list_for_each(l, &port->links, output_link) { @@ -1341,6 +1341,7 @@ int pw_impl_port_recalc_latency(struct pw_impl_port *port) latency.min_ns, latency.max_ns); } } + spa_latency_info_combine_finish(&latency); current = &port->latency[latency.direction];