From 44e0251afd142a07832503cf8cd64c50f4418f5e Mon Sep 17 00:00:00 2001 From: Jonas Holmberg Date: Tue, 16 Mar 2021 15:19:48 +0100 Subject: [PATCH] impl-node: Make rounding of quantum configurable Add new context config clock.power-of-two-quantum to make it possible to not round quantum to closest lower power of two. This makes it possible to match the quantum of a source node with the quantum of a client node. --- src/daemon/pipewire.conf.in | 1 + src/pipewire/context.c | 29 ++++++++++++++++------------- src/pipewire/impl-node.c | 8 ++++++-- src/pipewire/private.h | 1 + 4 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/daemon/pipewire.conf.in b/src/daemon/pipewire.conf.in index 756802e7a..281671c7c 100644 --- a/src/daemon/pipewire.conf.in +++ b/src/daemon/pipewire.conf.in @@ -9,6 +9,7 @@ context.properties = { #mem.warn-mlock = false #mem.allow-mlock = true #mem.mlock-all = false + #clock.power-of-two-quantum = true #log.level = 2 core.daemon = true # listening for socket connections diff --git a/src/pipewire/context.c b/src/pipewire/context.c index f5922410c..24effb43e 100644 --- a/src/pipewire/context.c +++ b/src/pipewire/context.c @@ -46,20 +46,21 @@ #define NAME "context" -#define CLOCK_MIN_QUANTUM 4u -#define CLOCK_MAX_QUANTUM 8192u +#define CLOCK_MIN_QUANTUM 4u +#define CLOCK_MAX_QUANTUM 8192u -#define DEFAULT_CLOCK_RATE 48000u -#define DEFAULT_CLOCK_QUANTUM 1024u -#define DEFAULT_CLOCK_MIN_QUANTUM 32u -#define DEFAULT_CLOCK_MAX_QUANTUM 8192u -#define DEFAULT_VIDEO_WIDTH 640 -#define DEFAULT_VIDEO_HEIGHT 480 -#define DEFAULT_VIDEO_RATE_NUM 25u -#define DEFAULT_VIDEO_RATE_DENOM 1u -#define DEFAULT_LINK_MAX_BUFFERS 64u -#define DEFAULT_MEM_WARN_MLOCK false -#define DEFAULT_MEM_ALLOW_MLOCK true +#define DEFAULT_CLOCK_RATE 48000u +#define DEFAULT_CLOCK_QUANTUM 1024u +#define DEFAULT_CLOCK_MIN_QUANTUM 32u +#define DEFAULT_CLOCK_MAX_QUANTUM 8192u +#define DEFAULT_CLOCK_POWER_OF_TWO_QUANTUM true +#define DEFAULT_VIDEO_WIDTH 640 +#define DEFAULT_VIDEO_HEIGHT 480 +#define DEFAULT_VIDEO_RATE_NUM 25u +#define DEFAULT_VIDEO_RATE_DENOM 1u +#define DEFAULT_LINK_MAX_BUFFERS 64u +#define DEFAULT_MEM_WARN_MLOCK false +#define DEFAULT_MEM_ALLOW_MLOCK true /** \cond */ struct impl { @@ -138,6 +139,8 @@ static bool get_default_bool(struct pw_properties *properties, const char *name, static void fill_defaults(struct pw_context *this) { struct pw_properties *p = this->properties; + this->defaults.clock_power_of_two_quantum = get_default_bool(p, "clock.power-of-two-quantum", + DEFAULT_CLOCK_POWER_OF_TWO_QUANTUM); this->defaults.clock_rate = get_default_int(p, "default.clock.rate", DEFAULT_CLOCK_RATE); this->defaults.clock_quantum = get_default_int(p, "default.clock.quantum", DEFAULT_CLOCK_QUANTUM); this->defaults.clock_min_quantum = get_default_int(p, "default.clock.min-quantum", DEFAULT_CLOCK_MIN_QUANTUM); diff --git a/src/pipewire/impl-node.c b/src/pipewire/impl-node.c index e4d070985..0afcab53e 100644 --- a/src/pipewire/impl-node.c +++ b/src/pipewire/impl-node.c @@ -876,7 +876,9 @@ static void check_properties(struct pw_impl_node *node) uint32_t quantum_size; node->latency = SPA_FRACTION(num, denom); - quantum_size = flp2((num * context->defaults.clock_rate / denom)); + quantum_size = (num * context->defaults.clock_rate / denom); + if (context->defaults.clock_power_of_two_quantum) + quantum_size = flp2(quantum_size); if (quantum_size != node->quantum_size) { pw_log_debug(NAME" %p: latency '%s' quantum %u/%u", @@ -895,7 +897,9 @@ static void check_properties(struct pw_impl_node *node) uint32_t max_quantum_size; node->max_latency = SPA_FRACTION(num, denom); - max_quantum_size = flp2((num * context->defaults.clock_rate / denom)); + max_quantum_size = (num * context->defaults.clock_rate / denom); + if (context->defaults.clock_power_of_two_quantum) + max_quantum_size = flp2(max_quantum_size); if (max_quantum_size != node->max_quantum_size) { pw_log_debug(NAME" %p: max latency '%s' quantum %u/%u", diff --git a/src/pipewire/private.h b/src/pipewire/private.h index 7ec3bf578..186de6fd1 100644 --- a/src/pipewire/private.h +++ b/src/pipewire/private.h @@ -58,6 +58,7 @@ struct defaults { uint32_t link_max_buffers; unsigned int mem_warn_mlock:1; unsigned int mem_allow_mlock:1; + unsigned int clock_power_of_two_quantum:1; }; struct ratelimit {