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

  1. Check network connectivity and let the client attempt automatic reconnection
  2. Verify the LiveKit token is still valid and re-authenticate if expired
  3. 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)