fix(room): в Chrome пропадал звук после возврата из мини-окна

RoomAudioRenderer жил внутри RoomStage и рендерился дважды — в ветке
variant="pip" и в основной. При открытии Document PiP сцена
размонтируется в основном окне и монтируется в PiP-окне, поэтому
скрытые <audio> с чужими аудиотреками физически переезжали в ДРУГОЙ
документ, а при возврате — обратно. После такого переезда Chrome
теряет аудиовыход у remote-трека: пакеты продолжают приходить
(packetsReceived растёт), но totalSamplesDuration и totalAudioEnergy
замирают, и трек молчит даже в свежесозданном <audio> со свежим
MediaStream. Тот же цикл detach/attach в пределах одного документа
безвреден — дело именно в переезде между документами. В Safari бага не
было: там Document PiP не используется (video-фолбэк), сцена остаётся
в основном окне.

Рендерер вынесен в RoomPage — один экземпляр, всегда в основном
документе. В PiP-окне аудиоэлементов теперь нет вовсе, цикл «открыл
мини-окно → вернул» их не касается.
This commit is contained in:
2026-08-03 18:19:19 +03:00
parent 8b63c24332
commit a9e24f6692
2 changed files with 16 additions and 4 deletions

View File

@@ -4,7 +4,6 @@ import { Track, type Participant } from 'livekit-client'
import {
CarouselLayout,
FocusLayoutContainer,
RoomAudioRenderer,
isTrackReference,
useRoomContext,
useSpeakingParticipants,
@@ -400,7 +399,6 @@ export function RoomStage({
<section className="stage room-single-tile">
{focusTrack && <RoomParticipantTile trackRef={focusTrack} onStopSharing={handleStopSharing} />}
<PipMicToggle />
<RoomAudioRenderer />
</section>
)
}
@@ -496,7 +494,6 @@ export function RoomStage({
<span>Показать остальных ({sideTracks.length})</span>
</button>
)}
<RoomAudioRenderer />
</section>
)
}