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
}
}