fix(voice): route media on evidence and switch devices without dropping the call
Outgoing voice was gated on the observer's roster copy of the remote user's voice state, which is signaling gossip. The signal server broadcasts `user_left` for any socket it declares dead, so a suspended laptop or a flaky hop wiped that copy and the observer detached its microphone from a peer that never left the channel - a silent member with no way back through the UI. `decideVoicePathRouting` now closes a path only on positive evidence: we left voice, the peer itself reported another channel or none, or the connection is gone. Missing gossip holds an established path instead. Opening still needs confirmation, so a guess never starts sending; the same rule gates playback, camera video, and the microphone a new connection puts in its first offer. Peers are also asked for their voice state when a connection or data channel comes up, so a rebuilt path re-confirms itself. Alongside it, the microphone can be switched mid-call: capture moves to a device service and rules, the live track is swapped with `replaceTrack` so the session is never renegotiated, and the speaking indicator follows the new stream.
This commit is contained in:
@@ -7,6 +7,10 @@
|
||||
"retry": "Retry",
|
||||
"failedConnect": "Failed to connect voice session."
|
||||
},
|
||||
"devices": {
|
||||
"inputFellBack": "Your microphone was disconnected. Switched to the system default.",
|
||||
"outputFellBack": "Your speaker was disconnected. Switched to the system default."
|
||||
},
|
||||
"floating": {
|
||||
"backToServer": "Back to {{server}}",
|
||||
"voiceFallback": "Voice",
|
||||
|
||||
Reference in New Issue
Block a user