tonhowtf/omniget · error
ERR_VOICE_DISCONNECTED
ERR_VOICE_DISCONNECTED
Error message
ERR_VOICE_DISCONNECTED
What it means
Voice-engine notification emitted through EngineNotification::Error when the LiveKit room disconnects (RoomEvent::Disconnected) — the transport layer maps it to ERR_VOICE_DISCONNECTED, distinguishing recoverable reconnects (Reconnecting sets recoverable=true) from terminal drops.
Solutions
- Check network connectivity and let the client attempt automatic reconnection
- Verify the LiveKit token is still valid and re-authenticate if expired
- Rejoin the voice channel manually if reconnection window is exceeded
Defensive patterns
Strategy: fallback
When it happens
Trigger: Thrown at src-tauri/omnidisc-media/src/livekit_backend.rs:762 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of tonhowtf/omniget@8600b91f42 (2026-09-12).
Data as JSON: /api/errors/792f47f87ceefc28.
Report an issue: GitHub.
Appendix: source
Thrown at src-tauri/omnidisc-media/src/livekit_backend.rs:762
}
RoomEvent::ConnectionQualityChanged {
quality,
participant,
} => {
shared.emit(EngineNotification::Quality {
user_id: participant.identity().0,
quality: quality_of(quality),
});
}
RoomEvent::Reconnecting => {
shared.transport(VoiceEvent::Disconnected { recoverable: true })
}
RoomEvent::Reconnected => shared.transport(VoiceEvent::Reconnected),
RoomEvent::Disconnected { reason } => {
if reason != DisconnectReason::ClientInitiated {
tracing::warn!("[omnidisc-media] room disconnected: {:?}", reason);
shared.emit(EngineNotification::Error {
code: "ERR_VOICE_DISCONNECTED".into(),
message: format!("{reason:?}"),
});
shared.transport(VoiceEvent::Disconnected { recoverable: false });
}
break;
}
_ => {}
}
}
for (_, h) in feeders.drain() {
h.abort();
}
}
async fn teardown(shared: &Arc<Shared>) {
let session = shared.session.lock().await.take();
shared.feeder.send(FeederMsg::Source(None));
if let Ok(mut id) = shared.local_identity.lock() {View on GitHub (pinned to 8600b91f42)