Files
advanced-camera-card/docs/uml/call-sequence.puml
T
Dermot Duffy 11cc543406 fix: Hold the 2-way audio backchannel open for the shortest possible time (#2697)
The card claimed a camera's ONVIF audio backchannel in two places that
had
nothing to do with a call: the capability probe at camera init
(`&microphone`),
and a pre-armed `sendonly` audio transceiver on every live WebRTC offer.
Merely
looking at a dashboard occupied the camera's speaker line. Outbound
audio now
travels on its own audio-only WebRTC connection, opened when a call is
answered
and closed when it ends.

- The backchannel is claimed only for the duration of a call. Idle
viewing
  claims nothing.
- Two-way audio now works in `mse`, `mp4` and `mjpeg` modes (note: the
outbound
  audio still traverses WebRTC).
- No renegotiation and no video blink at call start or end.
- A call that cannot carry audio now reports it and ends, instead of
showing a
  live microphone that goes nowhere.
- `live.microphone.always_connected` is now purely about the browser
microphone
  permission prompt.
- Call setup measured at 66ms (LAN) and ~260ms (cellular) for ICE and
DTLS, plus
  ~300ms for `go2rtc` to open an RTSP backchannel.

Verified against a live Frigate + `go2rtc` instance, and by unit tests
at 100%
coverage.

 - Closes #2691
 - Closes #2039
 - Closes #2178

Ref #2299 -- the probe no longer opens a backchannel, but it still runs
per
camera on every load and reconnect, and still dials the camera on the
direct-`go2rtc` path. Caching remains to be done.

Ref AlexxIT/go2rtc#1860 -- once a call has opened a backchannel,
`go2rtc` keeps
that media set up on the camera's RTSP session for the life of the
producer.

Diagnoses #2678
2026-08-21 20:13:58 -07:00

78 lines
2.9 KiB
Plaintext

@startuml
skinparam backgroundColor white
actor User
participant "Call" as Card
participant Microphone as Mic
actor Guest
opt <color:#43a047>**""live.microphone.always_connected""**</color> is enabled
Card -> Mic : Microphone connection attempted (muted)
note over Mic : Connected at card load, before (and independent of) any call
Mic --> User : Microphone access granted
end
alt Outbound call
User -> Card : Start a call
note over User, Card
Via Call menu button or <color:#43a047>**""call_start""**</color> action.
Needs a camera that supports 2-way audio
end note
else Inbound call
Guest -> Card : Rings
note over Card
Via a <color:#43a047>**""view.triggers.actions.trigger: call""**</color> trigger, e.g. a doorbell.
The card rings (<color:#43a047>**""live.controls.call.ringtone""**</color>) until answered,
rejected, or <color:#43a047>**""live.controls.call.unanswered_timeout_seconds""**</color> elapses
end note
User -> Card : Answer the call
end
opt <color:#43a047>**""live.microphone.always_connected""**</color> not enabled
Card -> Mic : Microphone connection attempted (muted)
note over Mic : Stays muted by default (<color:#43a047>**""live.microphone.auto_unmute""**</color>)
Mic --> User : Microphone access granted
end
note over User, Mic
The microphone is connected when the call is answered -- immediately
for an outbound call. An inbound call rings without it, so a doorbell
can ring even where microphone access needs a tap to be granted
end note
note over Card
The card opens an audio connection to the camera and holds it only while the
call is in progress. If the camera has no 2-way audio, or another application
is already using it, the call fails with an error
end note
Card --> User : You hear the caller
note over Card
Inbound audio unmutes if configured (<color:#43a047>**""live.auto_unmute""**</color>)
Menu, status bar & next/previous hide (<color:#43a047>**""auto_hide""**</color>)
Camera navigation is locked (<color:#43a047>**""live.controls.call.lock""**</color>)
end note
User -> Mic : Unmute to talk
note over Mic : List 'call' in <color:#43a047>**""live.microphone.auto_unmute""**</color> to unmute automatically
loop Until the call ends
User -[#red]> Guest : Talking
Guest -[#red]-> User : Responding
end
User -> Card : End the call
note over User, Card
Via Hang-up button, <color:#43a047>**""call_end""**</color> action, or -- when
<color:#43a047>**""live.controls.call.lock""**</color> is disabled -- navigating away
end note
note over Card : The audio connection to the camera closes, releasing it for other applications
Card --> User : Inbound audio mutes (<color:#43a047>**""live.auto_mute""**</color>)
Card -> Mic : Microphone mutes and disconnects
note over Mic
The browser stops reporting the microphone as in use, unless
<color:#43a047>**""live.microphone.always_connected""**</color> holds it open
end note
@enduml