feat(qconnect): handle ACTIVE_DISCONNECTED renderer status

The wire 'status' field on RENDERER_STATE_UPDATED was decoded into the
adapter payload (decoder.rs:801) then dropped — a graceful peer
disconnect was invisible and the controller kept showing stale 'playing'.
Add a RendererStatus enum (UNKNOWN/UNRECOGNIZED -> INACTIVE collapse) and,
on ACTIVE_DISCONNECTED for the active remote renderer (id != -1), freeze
the projection to UNKNOWN and emit qconnect:renderer_disconnected. Svelte
surfaces it as an error toast (rendererDisconnected, all 5 locales). Pure
consumer-side: no protocol change.

cc
This commit is contained in:
vicrodh committed 2026-06-01 02:54:31 -06:00
1 parent c32bbc5db3
commit d625e0afef
9 files changed
+110 -1

No files matched your search

+13
View File
@@ -5592,6 +5592,7 @@
let unlistenQconnectError: UnlistenFn | null = null;
let unlistenQconnectStatusChanged: UnlistenFn | null = null;
let unlistenQconnectAdmissionBlocked: UnlistenFn | null = null;
let unlistenQconnectRendererDisconnected: UnlistenFn | null = null;
let unlistenQconnectDiagnostic: UnlistenFn | null = null;
let unlistenQconnectRendererReportDebug: UnlistenFn | null = null;
let unlistenAudioDeviceMissing: UnlistenFn | null = null;
@@ -5831,6 +5832,17 @@
if (disposed) { unlisten8(); return; }
unlistenQconnectAdmissionBlocked = unlisten8;
const unlistenRendererDisconnected = await listen<{ renderer_id: number }>(
'qconnect:renderer_disconnected',
(event) => {
pushQobuzConnectDiagnostic('qconnect:renderer_disconnected', 'warn', event.payload);
void refreshQobuzConnectRuntimeState();
showToast($t('qconnect.rendererDisconnected'), 'error');
}
);
if (disposed) { unlistenRendererDisconnected(); return; }
unlistenQconnectRendererDisconnected = unlistenRendererDisconnected;
const unlisten9 = await listen<QconnectDiagnosticsPayload>('qconnect:diagnostic', (event) => {
pushQobuzConnectDiagnostic(
event.payload.channel,
@@ -5896,6 +5908,7 @@
unlistenQconnectError?.();
unlistenQconnectStatusChanged?.();
unlistenQconnectAdmissionBlocked?.();
unlistenQconnectRendererDisconnected?.();
unlistenQconnectDiagnostic?.();
unlistenQconnectRendererReportDebug?.();
unlistenAudioDeviceMissing?.();