From 4cc6f554afa3247b624c59e3d1ae33db5f2c2426 Mon Sep 17 00:00:00 2001 From: joren Date: Mon, 30 Mar 2026 00:36:40 +0200 Subject: [PATCH] fix: property inspector - read sample rate from node.latency, not node.rate - node.rate was a PipeWire internal flag (always 1), not sample rate - Now reads from node.latency (format: '256/48000') for quantum + rate - Fallback to clock.rate if latency not available - Reuses rate field for ALSA period-size - Shows 'Latency: 256 samples @ 48000 Hz' and 'Period Size: 256' --- frontend/src/components/GraphCanvas.svelte | 4 ++-- src/graph_engine.cpp | 22 ++++++++++++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/frontend/src/components/GraphCanvas.svelte b/frontend/src/components/GraphCanvas.svelte index dcb9000..11feb1f 100644 --- a/frontend/src/components/GraphCanvas.svelte +++ b/frontend/src/components/GraphCanvas.svelte @@ -693,8 +693,8 @@ {#if nd.sample_rate > 0}Sample Rate{nd.sample_rate} Hz{/if} {#if nd.channels > 0}Channels{nd.channels}{/if} {#if nd.format}Format{nd.format}{/if} - {#if nd.quantum > 0}Quantum{nd.quantum}{/if} - {#if nd.rate > 0}Rate{nd.rate}{/if} + {#if nd.quantum > 0}Latency{nd.quantum} samples @ {nd.sample_rate} Hz{/if} + {#if nd.rate > 0}Period Size{nd.rate}{/if} {#if nd.device_name}Device{nd.device_name}{/if} {#if nd.device_bus}Bus{nd.device_bus}{/if} {#if nd.api}API{nd.api}{/if} diff --git a/src/graph_engine.cpp b/src/graph_engine.cpp index d08190c..03e6b94 100644 --- a/src/graph_engine.cpp +++ b/src/graph_engine.cpp @@ -125,8 +125,26 @@ static void on_node_info(void *data, const struct pw_node_info *info) { str = spa_dict_lookup(info->props, "priority.driver"); if (str) nobj->node.priority = atoi(str); - str = spa_dict_lookup(info->props, "node.rate"); - if (str) nobj->node.rate = (uint32_t)atoi(str); + // Latency info + str = spa_dict_lookup(info->props, "node.latency"); + if (str) { + // Format: "256/48000" -> quantum=256 rate=48000 + uint32_t q = 0, r = 0; + if (sscanf(str, "%u/%u", &q, &r) == 2) { + nobj->node.quantum = q; + nobj->node.sample_rate = r; + } + } + + // Fallback: read clock rate from device props + if (nobj->node.sample_rate == 0) { + str = spa_dict_lookup(info->props, "clock.rate"); + if (str) nobj->node.sample_rate = (uint32_t)atoi(str); + } + + // ALSA latency + str = spa_dict_lookup(info->props, "api.alsa.period-size"); + if (str) nobj->node.rate = (uint32_t)atoi(str); // reuse rate field for period-size } }