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 (`µphone`), 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
1 line
28 KiB
XML
1 line
28 KiB
XML
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" data-diagram-type="SEQUENCE" height="1283px" preserveAspectRatio="none" style="width:899px;height:1283px;background:#FFFFFF;" version="1.1" viewBox="0 0 899 1283" width="899px" zoomAndPan="magnify"><?plantuml 1.2026.3?><defs/><g><rect fill="none" height="110.5313" style="stroke:#000000;stroke-width:1.5;" width="838.5503" x="32" y="98.2969"/><rect fill="none" height="235" style="stroke:#000000;stroke-width:1.5;" width="734.6846" x="32" y="222.8281"/><rect fill="none" height="110.5313" style="stroke:#000000;stroke-width:1.5;" width="828.7109" x="32" y="471.8281"/><rect fill="none" height="75.3984" style="stroke:#000000;stroke-width:1.5;" width="734.6846" x="32" y="885.9531"/><g class="participant-lifeline" data-entity-uid="part1" data-qualified-name="User" data-source-line="3" id="part1-lifeline"><g><title>User</title><rect fill="#000000" fill-opacity="0.00000" height="1120.1172" width="8" x="56.9551" y="81.2969"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5,5;" x1="60" x2="60" y1="81.2969" y2="1201.4141"/></g></g><g class="participant-lifeline" data-entity-uid="part2" data-qualified-name="Card" data-source-line="4" id="part2-lifeline"><g><title>Call</title><rect fill="#000000" fill-opacity="0.00000" height="1120.1172" width="8" x="342.8721" y="81.2969"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5,5;" x1="346.8052" x2="346.8052" y1="81.2969" y2="1201.4141"/></g></g><g class="participant-lifeline" data-entity-uid="part3" data-qualified-name="Mic" data-source-line="5" id="part3-lifeline"><g><title>Microphone</title><rect fill="#000000" fill-opacity="0.00000" height="1120.1172" width="8" x="647.667" y="81.2969"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5,5;" x1="650.7676" x2="650.7676" y1="81.2969" y2="1201.4141"/></g></g><g class="participant-lifeline" data-entity-uid="part4" data-qualified-name="Guest" data-source-line="6" id="part4-lifeline"><g><title>Guest</title><rect fill="#000000" fill-opacity="0.00000" height="1120.1172" width="8" x="729.1255" y="81.2969"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5,5;" x1="732.5664" x2="732.5664" y1="81.2969" y2="1201.4141"/></g></g><g class="participant participant-head" data-entity-uid="part1" data-qualified-name="User" data-source-line="3" id="part1-head"><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="31.9102" x="42" y="77.9951">User</text><ellipse cx="60.9551" cy="13.5" fill="#E2E2F0" rx="8" ry="8" style="stroke:#181818;stroke-width:0.5;"/><path d="M60.9551,21.5 L60.9551,48.5 M47.9551,29.5 L73.9551,29.5 M60.9551,48.5 L47.9551,63.5 M60.9551,48.5 L73.9551,63.5" fill="none" style="stroke:#181818;stroke-width:0.5;"/></g><g class="participant participant-tail" data-entity-uid="part1" data-qualified-name="User" data-source-line="3" id="part1-tail"><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="31.9102" x="42" y="1213.4092">User</text><ellipse cx="60.9551" cy="1225.2109" fill="#E2E2F0" rx="8" ry="8" style="stroke:#181818;stroke-width:0.5;"/><path d="M60.9551,1233.2109 L60.9551,1260.2109 M47.9551,1241.2109 L73.9551,1241.2109 M60.9551,1260.2109 L47.9551,1275.2109 M60.9551,1260.2109 L73.9551,1275.2109" fill="none" style="stroke:#181818;stroke-width:0.5;"/></g><g class="participant participant-head" data-entity-uid="part2" data-qualified-name="Card" data-source-line="4" id="part2-head"><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="40.1338" x="326.8052" y="50"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="26.1338" x="333.8052" y="69.9951">Call</text></g><g class="participant participant-tail" data-entity-uid="part2" data-qualified-name="Card" data-source-line="4" id="part2-tail"><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="40.1338" x="326.8052" y="1200.4141"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="26.1338" x="333.8052" y="1220.4092">Call</text></g><g class="participant participant-head" data-entity-uid="part3" data-qualified-name="Mic" data-source-line="5" id="part3-head"><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="95.7988" x="603.7676" y="50"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="81.7988" x="610.7676" y="69.9951">Microphone</text></g><g class="participant participant-tail" data-entity-uid="part3" data-qualified-name="Mic" data-source-line="5" id="part3-tail"><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="95.7988" x="603.7676" y="1200.4141"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="81.7988" x="610.7676" y="1220.4092">Microphone</text></g><g class="participant participant-head" data-entity-uid="part4" data-qualified-name="Guest" data-source-line="6" id="part4-head"><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="41.1182" x="709.5664" y="77.9951">Guest</text><ellipse cx="733.1255" cy="13.5" fill="#E2E2F0" rx="8" ry="8" style="stroke:#181818;stroke-width:0.5;"/><path d="M733.1255,21.5 L733.1255,48.5 M720.1255,29.5 L746.1255,29.5 M733.1255,48.5 L720.1255,63.5 M733.1255,48.5 L746.1255,63.5" fill="none" style="stroke:#181818;stroke-width:0.5;"/></g><g class="participant participant-tail" data-entity-uid="part4" data-qualified-name="Guest" data-source-line="6" id="part4-tail"><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="41.1182" x="709.5664" y="1213.4092">Guest</text><ellipse cx="733.1255" cy="1225.2109" fill="#E2E2F0" rx="8" ry="8" style="stroke:#181818;stroke-width:0.5;"/><path d="M733.1255,1233.2109 L733.1255,1260.2109 M720.1255,1241.2109 L746.1255,1241.2109 M733.1255,1260.2109 L720.1255,1275.2109 M733.1255,1260.2109 L746.1255,1275.2109" fill="none" style="stroke:#181818;stroke-width:0.5;"/></g><path d="M32,98.2969 L101.4512,98.2969 L101.4512,105.4297 L91.4512,115.4297 L32,115.4297 L32,98.2969" fill="#EEEEEE" style="stroke:#000000;stroke-width:1.5;"/><rect fill="none" height="110.5313" style="stroke:#000000;stroke-width:1.5;" width="838.5503" x="32" y="98.2969"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="700" lengthAdjust="spacing" textLength="24.4512" x="47" y="111.3638">opt</text><text fill="#000000" font-family="sans-serif" font-size="11" font-weight="700" lengthAdjust="spacing" textLength="5.0273" x="116.4512" y="110.5073">[</text><text fill="#43A047" font-family="monospace" font-size="11" font-weight="700" lengthAdjust="spacing" textLength="211.9219" x="121.4785" y="110.5073">live.microphone.always_connected</text><text fill="#000000" font-family="sans-serif" font-size="11" font-weight="700" lengthAdjust="spacing" textLength="68.8682" x="337.23" y="110.5073">is enabled]</text><g class="message" data-entity-1="part2" data-entity-2="part3" data-source-line="9" id="msg1"><polygon fill="#181818" points="639.667,132.5625,649.667,136.5625,639.667,140.5625,643.667,136.5625" style="stroke:#181818;stroke-width:1;"/><line style="stroke:#181818;stroke-width:1;" x1="346.8721" x2="645.667" y1="136.5625" y2="136.5625"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="280.7949" x="353.8721" y="131.4966">Microphone connection attempted (muted)</text></g><path d="M441,149.5625 L441,174.5625 L860,174.5625 L860,159.5625 L850,149.5625 L441,149.5625" fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/><path d="M850,149.5625 L850,159.5625 L860,159.5625 L850,149.5625" fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="398.5503" x="447" y="166.6294">Connected at card load, before (and independent of) any call</text><g class="message" data-entity-1="part3" data-entity-2="part1" data-source-line="11" id="msg2"><polygon fill="#181818" points="71.9551,196.8281,61.9551,200.8281,71.9551,204.8281,67.9551,200.8281" style="stroke:#181818;stroke-width:1;"/><line style="stroke:#181818;stroke-width:1;stroke-dasharray:2,2;" x1="65.9551" x2="650.667" y1="200.8281" y2="200.8281"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="179.1753" x="77.9551" y="195.7622">Microphone access granted</text></g><path d="M32,222.8281 L96.4429,222.8281 L96.4429,229.9609 L86.4429,239.9609 L32,239.9609 L32,222.8281" fill="#EEEEEE" style="stroke:#000000;stroke-width:1.5;"/><rect fill="none" height="235" style="stroke:#000000;stroke-width:1.5;" width="734.6846" x="32" y="222.8281"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="700" lengthAdjust="spacing" textLength="19.4429" x="47" y="235.895">alt</text><text fill="#000000" font-family="sans-serif" font-size="11" font-weight="700" lengthAdjust="spacing" textLength="96.7764" x="111.4429" y="235.0386">[Outbound call]</text><g class="message" data-entity-1="part1" data-entity-2="part2" data-source-line="15" id="msg3"><polygon fill="#181818" points="334.8721,257.0938,344.8721,261.0938,334.8721,265.0938,338.8721,261.0938" style="stroke:#181818;stroke-width:1;"/><line style="stroke:#181818;stroke-width:1;" x1="60.9551" x2="340.8721" y1="261.0938" y2="261.0938"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="70.3257" x="67.9551" y="256.0278">Start a call</text></g><path d="M43,274.0938 L43,314.0938 L362,314.0938 L362,284.0938 L352,274.0938 L43,274.0938" fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/><path d="M352,274.0938 L352,284.0938 L362,284.0938 L352,274.0938" fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="154.5845" x="55.8376" y="291.1606">Via Call menu button or</text><text fill="#43A047" font-family="monospace" font-size="13" font-weight="700" lengthAdjust="spacing" textLength="78.2666" x="214.5544" y="291.1606">call_start</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="44.1479" x="296.9534" y="291.1606">action.</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="280.9536" x="55.8376" y="306.2935">Needs a camera that supports 2-way audio</text><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="32" x2="766.6846" y1="320.3594" y2="320.3594"/><text fill="#000000" font-family="sans-serif" font-size="11" font-weight="700" lengthAdjust="spacing" textLength="86.2598" x="37" y="330.5698">[Inbound call]</text><g class="message" data-entity-1="part4" data-entity-2="part2" data-source-line="21" id="msg4"><polygon fill="#181818" points="357.8721,351.2969,347.8721,355.2969,357.8721,359.2969,353.8721,355.2969" style="stroke:#181818;stroke-width:1;"/><line style="stroke:#181818;stroke-width:1;" x1="351.8721" x2="732.1255" y1="355.2969" y2="355.2969"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="35.9087" x="363.8721" y="350.231">Rings</text></g><path d="M93,368.2969 L93,423.2969 L598,423.2969 L598,378.2969 L588,368.2969 L93,368.2969" fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/><path d="M588,368.2969 L588,378.2969 L598,378.2969 L588,368.2969" fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="32.5698" x="99" y="385.3638">Via a</text><text fill="#43A047" font-family="monospace" font-size="13" font-weight="700" lengthAdjust="spacing" textLength="273.9331" x="135.7021" y="385.3638">view.triggers.actions.trigger: call</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="150.0205" x="413.7676" y="385.3638">trigger, e.g. a doorbell.</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="102.5781" x="99" y="400.4966">The card rings (</text><text fill="#43A047" font-family="monospace" font-size="13" font-weight="700" lengthAdjust="spacing" textLength="211.3198" x="201.5781" y="400.4966">live.controls.call.ringtone</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="109.4717" x="412.8979" y="400.4966">) until answered,</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="75.0103" x="99" y="415.6294">rejected, or</text><text fill="#43A047" font-family="monospace" font-size="13" font-weight="700" lengthAdjust="spacing" textLength="352.1997" x="178.1426" y="415.6294">live.controls.call.unanswered_timeout_seconds</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="49.3721" x="534.4746" y="415.6294">elapses</text><g class="message" data-entity-1="part1" data-entity-2="part2" data-source-line="27" id="msg5"><polygon fill="#181818" points="334.8721,445.8281,344.8721,449.8281,334.8721,453.8281,338.8721,449.8281" style="stroke:#181818;stroke-width:1;"/><line style="stroke:#181818;stroke-width:1;" x1="60.9551" x2="340.8721" y1="449.8281" y2="449.8281"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="99.8169" x="67.9551" y="444.7622">Answer the call</text></g><path d="M32,471.8281 L101.4512,471.8281 L101.4512,478.9609 L91.4512,488.9609 L32,488.9609 L32,471.8281" fill="#EEEEEE" style="stroke:#000000;stroke-width:1.5;"/><rect fill="none" height="110.5313" style="stroke:#000000;stroke-width:1.5;" width="828.7109" x="32" y="471.8281"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="700" lengthAdjust="spacing" textLength="24.4512" x="47" y="484.895">opt</text><text fill="#000000" font-family="sans-serif" font-size="11" font-weight="700" lengthAdjust="spacing" textLength="5.0273" x="116.4512" y="484.0386">[</text><text fill="#43A047" font-family="monospace" font-size="11" font-weight="700" lengthAdjust="spacing" textLength="211.9219" x="121.4785" y="484.0386">live.microphone.always_connected</text><text fill="#000000" font-family="sans-serif" font-size="11" font-weight="700" lengthAdjust="spacing" textLength="79.1968" x="337.23" y="484.0386">not enabled]</text><g class="message" data-entity-1="part2" data-entity-2="part3" data-source-line="31" id="msg6"><polygon fill="#181818" points="639.667,506.0938,649.667,510.0938,639.667,514.0938,643.667,510.0938" style="stroke:#181818;stroke-width:1;"/><line style="stroke:#181818;stroke-width:1;" x1="346.8721" x2="645.667" y1="510.0938" y2="510.0938"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="280.7949" x="353.8721" y="505.0278">Microphone connection attempted (muted)</text></g><path d="M452,523.0938 L452,548.0938 L850,548.0938 L850,533.0938 L840,523.0938 L452,523.0938" fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/><path d="M840,523.0938 L840,533.0938 L850,533.0938 L840,523.0938" fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="161.3193" x="458" y="540.1606">Stays muted by default (</text><text fill="#43A047" font-family="monospace" font-size="13" font-weight="700" lengthAdjust="spacing" textLength="211.3198" x="619.3193" y="540.1606">live.microphone.auto_unmute</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="5.0718" x="830.6392" y="540.1606">)</text><g class="message" data-entity-1="part3" data-entity-2="part1" data-source-line="33" id="msg7"><polygon fill="#181818" points="71.9551,570.3594,61.9551,574.3594,71.9551,578.3594,67.9551,574.3594" style="stroke:#181818;stroke-width:1;"/><line style="stroke:#181818;stroke-width:1;stroke-dasharray:2,2;" x1="65.9551" x2="650.667" y1="574.3594" y2="574.3594"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="179.1753" x="77.9551" y="569.2935">Microphone access granted</text></g><path d="M30,594.3594 L30,649.3594 L682,649.3594 L682,604.3594 L672,594.3594 L30,594.3594" fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/><path d="M672,594.3594 L672,604.3594 L682,604.3594 L672,594.3594" fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="464.2803" x="119.6431" y="611.4263">The microphone is connected when the call is answered -- immediately</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="434.2241" x="119.6431" y="626.5591">for an outbound call. An inbound call rings without it, so a doorbell</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="436.5981" x="119.6431" y="641.6919">can ring even where microphone access needs a tap to be granted</text><path d="M82,659.7578 L82,714.7578 L611,714.7578 L611,669.7578 L601,659.7578 L82,659.7578" fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/><path d="M601,659.7578 L601,669.7578 L611,669.7578 L601,659.7578" fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="508.2061" x="88" y="676.8247">The card opens an audio connection to the camera and holds it only while the</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="492.375" x="88" y="691.9575">call is in progress. If the camera has no 2-way audio, or another application</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="290.3481" x="88" y="707.0903">is already using it, the call fails with an error</text><g class="message" data-entity-1="part2" data-entity-2="part1" data-source-line="48" id="msg8"><polygon fill="#181818" points="71.9551,737.2891,61.9551,741.2891,71.9551,745.2891,67.9551,741.2891" style="stroke:#181818;stroke-width:1;"/><line style="stroke:#181818;stroke-width:1;stroke-dasharray:2,2;" x1="65.9551" x2="345.8721" y1="741.2891" y2="741.2891"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="123.0938" x="77.9551" y="736.2231">You hear the caller</text></g><path d="M146,754.2891 L146,809.2891 L547,809.2891 L547,764.2891 L537,754.2891 L146,754.2891" fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/><path d="M537,754.2891 L537,764.2891 L547,764.2891 L537,754.2891" fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="249.8184" x="152" y="771.356">Inbound audio unmutes if configured (</text><text fill="#43A047" font-family="monospace" font-size="13" font-weight="700" lengthAdjust="spacing" textLength="125.2266" x="401.8184" y="771.356">live.auto_unmute</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="5.0718" x="527.0449" y="771.356">)</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="258.7114" x="152" y="786.4888">Menu, status bar & next/previous hide (</text><text fill="#43A047" font-family="monospace" font-size="13" font-weight="700" lengthAdjust="spacing" textLength="70.4399" x="410.7114" y="786.4888">auto_hide</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="5.0718" x="481.1514" y="786.4888">)</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="194.124" x="152" y="801.6216">Camera navigation is locked (</text><text fill="#43A047" font-family="monospace" font-size="13" font-weight="700" lengthAdjust="spacing" textLength="180.0132" x="346.124" y="801.6216">live.controls.call.lock</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="5.0718" x="526.1372" y="801.6216">)</text><g class="message" data-entity-1="part1" data-entity-2="part3" data-source-line="55" id="msg9"><polygon fill="#181818" points="639.667,831.8203,649.667,835.8203,639.667,839.8203,643.667,835.8203" style="stroke:#181818;stroke-width:1;"/><line style="stroke:#181818;stroke-width:1;" x1="60.9551" x2="645.667" y1="835.8203" y2="835.8203"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="97.2715" x="67.9551" y="830.7544">Unmute to talk</text></g><path d="M415,848.8203 L415,873.8203 L888,873.8203 L888,858.8203 L878,848.8203 L415,848.8203" fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/><path d="M878,848.8203 L878,858.8203 L888,858.8203 L878,848.8203" fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="72.3252" x="421" y="865.8872">List 'call' in</text><text fill="#43A047" font-family="monospace" font-size="13" font-weight="700" lengthAdjust="spacing" textLength="211.3198" x="497.4575" y="865.8872">live.microphone.auto_unmute</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="160.418" x="712.9097" y="865.8872">to unmute automatically</text><path d="M32,885.9531 L108.624,885.9531 L108.624,893.0859 L98.624,903.0859 L32,903.0859 L32,885.9531" fill="#EEEEEE" style="stroke:#000000;stroke-width:1.5;"/><rect fill="none" height="75.3984" style="stroke:#000000;stroke-width:1.5;" width="734.6846" x="32" y="885.9531"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="700" lengthAdjust="spacing" textLength="31.624" x="47" y="899.02">loop</text><text fill="#000000" font-family="sans-serif" font-size="11" font-weight="700" lengthAdjust="spacing" textLength="122.853" x="123.624" y="898.1636">[Until the call ends]</text><g class="message" data-entity-1="part1" data-entity-2="part4" data-source-line="59" id="msg10"><polygon fill="#FF0000" points="721.1255,920.2188,731.1255,924.2188,721.1255,928.2188,725.1255,924.2188" style="stroke:#FF0000;stroke-width:1;"/><line style="stroke:#FF0000;stroke-width:1;" x1="60.9551" x2="727.1255" y1="924.2188" y2="924.2188"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="47.1504" x="67.9551" y="919.1528">Talking</text></g><g class="message" data-entity-1="part4" data-entity-2="part1" data-source-line="60" id="msg11"><polygon fill="#FF0000" points="71.9551,949.3516,61.9551,953.3516,71.9551,957.3516,67.9551,953.3516" style="stroke:#FF0000;stroke-width:1;"/><line style="stroke:#FF0000;stroke-width:1;stroke-dasharray:2,2;" x1="65.9551" x2="732.1255" y1="953.3516" y2="953.3516"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="76.6035" x="77.9551" y="948.2856">Responding</text></g><g class="message" data-entity-1="part1" data-entity-2="part2" data-source-line="63" id="msg12"><polygon fill="#181818" points="334.8721,985.4844,344.8721,989.4844,334.8721,993.4844,338.8721,989.4844" style="stroke:#181818;stroke-width:1;"/><line style="stroke:#181818;stroke-width:1;" x1="60.9551" x2="340.8721" y1="989.4844" y2="989.4844"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="76.6416" x="67.9551" y="984.4185">End the call</text></g><path d="M5,1002.4844 L5,1042.4844 L404,1042.4844 L404,1012.4844 L394,1002.4844 L5,1002.4844" fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/><path d="M394,1002.4844 L394,1012.4844 L404,1012.4844 L394,1002.4844" fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="131.1616" x="11" y="1019.5513">Via Hang-up button,</text><text fill="#43A047" font-family="monospace" font-size="13" font-weight="700" lengthAdjust="spacing" textLength="62.6133" x="146.2939" y="1019.5513">call_end</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="114.334" x="213.0396" y="1019.5513">action, or -- when</text><text fill="#43A047" font-family="monospace" font-size="13" font-weight="700" lengthAdjust="spacing" textLength="180.0132" x="11" y="1034.6841">live.controls.call.lock</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="194.2002" x="195.1455" y="1034.6841">is disabled -- navigating away</text><path d="M84,1052.75 L84,1077.75 L609,1077.75 L609,1062.75 L599,1052.75 L84,1052.75" fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/><path d="M599,1052.75 L599,1062.75 L609,1062.75 L599,1052.75" fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="504.6387" x="90" y="1069.8169">The audio connection to the camera closes, releasing it for other applications</text><g class="message" data-entity-1="part2" data-entity-2="part1" data-source-line="70" id="msg13"><polygon fill="#181818" points="71.9551,1100.0156,61.9551,1104.0156,71.9551,1108.0156,67.9551,1104.0156" style="stroke:#181818;stroke-width:1;"/><line style="stroke:#181818;stroke-width:1;stroke-dasharray:2,2;" x1="65.9551" x2="345.8721" y1="1104.0156" y2="1104.0156"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="147.272" x="77.9551" y="1098.9497">Inbound audio mutes (</text><text fill="#43A047" font-family="monospace" font-size="13" font-weight="700" lengthAdjust="spacing" textLength="109.5732" x="225.2271" y="1098.9497">live.auto_mute</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="5.0718" x="334.8003" y="1098.9497">)</text></g><g class="message" data-entity-1="part2" data-entity-2="part3" data-source-line="71" id="msg14"><polygon fill="#181818" points="639.667,1129.1484,649.667,1133.1484,639.667,1137.1484,643.667,1133.1484" style="stroke:#181818;stroke-width:1;"/><line style="stroke:#181818;stroke-width:1;" x1="346.8721" x2="645.667" y1="1133.1484" y2="1133.1484"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="230.8135" x="353.8721" y="1128.0825">Microphone mutes and disconnects</text></g><path d="M439,1146.1484 L439,1186.1484 L862,1186.1484 L862,1156.1484 L852,1146.1484 L439,1146.1484" fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/><path d="M852,1146.1484 L852,1156.1484 L862,1156.1484 L852,1146.1484" fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="402.7144" x="445" y="1163.2153">The browser stops reporting the microphone as in use, unless</text><text fill="#43A047" font-family="monospace" font-size="13" font-weight="700" lengthAdjust="spacing" textLength="250.4531" x="445" y="1178.3481">live.microphone.always_connected</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="84.2461" x="699.5854" y="1178.3481">holds it open</text><?plantuml-src jLRlYzj64Fskls9meBaxV4ff0mKJ3eefRQ0_84qAfHIpbiRIzbQxOdTbr_zztgnaMphRrpIqz-4EUtVVpBoPz-R2exQjyggXjIeUA-ywMowTSPvsjOwSPQg8-F0XiCzmB-f2jyf6cYsLCJDIWPRAbvEZdtJXNLixotACJmF6zns7c6MkZVIca12B5w-_Lb--_kRXxcusCthBUNDycYkpK_kmAforN4GkPxExkpUlqhi7qe7OghNXCgEK0Dq_I2HQZACFRxMpf6BafWKCtJGT_jpYdNMHoMtP3o-NXr2uJOM06gVAEQrvuppJZR8bQLjoo_Y5EjtcbfJTuwenW1EGUwGXL4tpK4N18L3bmGuondFGQYBzqiMry7r0I2-1a0fQqAyHf98wd9xIbNlpddV2pszQaNI36hOThRiOKJ3ula2oGAs2u4xeL8caFA7zp5o65BLXhoZM82DqRUjy3FJLFPf2gYkrmsKKahBAs0IcjtPIJEhsg9ftsbPXKiQa07KftQtcNHwzhYhs8U-p38Sl5YdIf8xXP4wSLpaWI-VycetfAtjVSzzMBwdGpRKXnDX4xqp81J-Noo2Knu5kgRDH6tG_xDXpEK_udlzAupE_Glu5yCuU85PHD-owk0gCAsMOrCL6jO73cFApQVas0Q5Vt7SWJTb_eJM4-n_4Xk7U1qh7jDvJoHlLGH8tdv9j5zsgi_9sqfH_hS6dYXAhwiVa54siviWBF97jaM8vEhGFKKat3PTQHJPxmC0pS4fkhF4SNOA5dBuOHd6dOusBfEESWXiDBd0AWCWjuYrY8m4_IM-eomwgZQgbw61PuqhxYSdEb7SKX8EbIIsziiUj15PVRZ83SS3Q6KJIi3zhzh8a3CkLb6dFYRRKUbTvv9NJsyqOeCP2i6vi8qai2gcXC59jQtIX93BmX5xZMPLxwe8m8FGSoTyeRNhc977stlbHhVsOdYRXTzTHpUga3wopCpuE3jQpq4yOoja88HjTTTBdgmFwt5J2bz7Og68Ni6OzVO5-_HrVjPwtsk6xMfTy4Jc1okbJo6NFfrLRNIM-X2tZYiVdKfnwZzoUmfxeEtXBhzKFgQeq2yeyPa-b_AE6qRyKp9VI-yzNi4JeloMvqQ0mGTrdcN6kHHhYkSS1GBRXQ8D_l41p_dmOjiw2tYDHZCnf3_KNJWFnZaCBdvKxoGkUkEbteE9efLSshwoj7vIjxhjssBhpgpiNCIvit3JyS0wn5G1-Nj-aywKEoQ05x30J48o2pAuQWB1Kypz9lZ0EcsUEvMPO3IfCtdQcs70ckgcUUZKzhvzpzLpTDpsSE1AA7z8FqzaSB6xjtKuI2j6r0ON8lp9II9mQlKhErGMUOmWDpEkPZdpgxZoP9Hpss8cF?></g></svg> |