This commit is contained in:
legop3
2026-02-18 21:54:16 -05:00
parent 438fff0902
commit d165f69b6f
4 changed files with 21 additions and 15 deletions
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -11,7 +11,7 @@
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Multi Roomba Rover" /> <meta name="apple-mobile-web-app-title" content="Multi Roomba Rover" />
<title>Multi Roomba Rover</title> <title>Multi Roomba Rover</title>
<script type="module" crossorigin src="/assets/index-CyMJCyW9.js"></script> <script type="module" crossorigin src="/assets/index-CVZhRUxX.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-Bz1ixYh7.css"> <link rel="stylesheet" crossorigin href="/assets/index-Bz1ixYh7.css">
</head> </head>
<body> <body>
+10 -4
View File
@@ -62,6 +62,7 @@ export default function VideoTile({
const [restartToken, setRestartToken] = useState(0); const [restartToken, setRestartToken] = useState(0);
const [audioRestartToken, setAudioRestartToken] = useState(0); const [audioRestartToken, setAudioRestartToken] = useState(0);
const [muted, setMuted] = useState(true); const [muted, setMuted] = useState(true);
const hasDedicatedAudio = Boolean(audioSessionInfo?.url);
const usingSnapshot = videoMode === 'snapshot'; const usingSnapshot = videoMode === 'snapshot';
const sensors = telemetryFrame?.sensors; const sensors = telemetryFrame?.sensors;
const { value: audioSettings } = useSettingsNamespace('audio', AUDIO_SETTINGS_DEFAULTS); const { value: audioSettings } = useSettingsNamespace('audio', AUDIO_SETTINGS_DEFAULTS);
@@ -205,7 +206,7 @@ export default function VideoTile({
const attemptUnmute = useCallback( const attemptUnmute = useCallback(
(delay = 0) => { (delay = 0) => {
if (forceMute) return; if (forceMute || hasDedicatedAudio) return;
clearTimeout(unmuteTimer.current); clearTimeout(unmuteTimer.current);
const scheduleRetry = () => { const scheduleRetry = () => {
@@ -234,7 +235,7 @@ export default function VideoTile({
unmuteTimer.current = setTimeout(tryPlay, delay); unmuteTimer.current = setTimeout(tryPlay, delay);
}, },
[ensurePlayback, forceMute], [ensurePlayback, forceMute, hasDedicatedAudio],
); );
useEffect( useEffect(
@@ -400,7 +401,11 @@ export default function VideoTile({
}); });
if (nextStatus === 'playing') { if (nextStatus === 'playing') {
resumeAudioContext(); resumeAudioContext();
audioRef.current?.play().catch(() => {}); const target = audioRef.current;
if (target) {
target.muted = false;
target.play().catch(() => {});
}
} }
if (['error', 'failed', 'disconnected', 'closed'].includes(nextStatus)) { if (['error', 'failed', 'disconnected', 'closed'].includes(nextStatus)) {
scheduleAudioRestart(); scheduleAudioRestart();
@@ -444,6 +449,7 @@ export default function VideoTile({
const attemptPlay = async () => { const attemptPlay = async () => {
const target = audioRef.current; const target = audioRef.current;
if (!target) return; if (!target) return;
target.muted = false;
if (!target.paused && !target.ended) return; if (!target.paused && !target.ended) return;
await resumeAudioContext(); await resumeAudioContext();
target target
@@ -550,7 +556,7 @@ export default function VideoTile({
) : ( ) : (
<video <video
ref={videoRef} ref={videoRef}
muted={forceMute || muted} muted={forceMute || muted || hasDedicatedAudio}
playsInline playsInline
autoPlay autoPlay
controls={false} controls={false}
+1 -1
View File
@@ -93,7 +93,7 @@ export const HORN_SETTINGS_DEFAULTS = {
export const AUDIO_SETTINGS_DEFAULTS = { export const AUDIO_SETTINGS_DEFAULTS = {
masterVolume: 1, masterVolume: 1,
alertVolume: 0.3, alertVolume: 0.5,
roverVolume: 1, roverVolume: 1,
autoLevelEnabled: true, autoLevelEnabled: true,
autoLevelMode: 'compressor', autoLevelMode: 'compressor',