diff --git a/client/src/MediaControl.tsx b/client/src/MediaControl.tsx index 967e9d0..7a0561c 100644 --- a/client/src/MediaControl.tsx +++ b/client/src/MediaControl.tsx @@ -757,6 +757,18 @@ const MediaAgent = (props: MediaAgentProps) => { ); if (media && localUserHasMedia) { media.getTracks().forEach((t) => { + // Check if we should enable/disable the track based on local mute state + const localPeer = peers[session.id]; + if (localPeer) { + if (t.kind === "audio") { + t.enabled = !localPeer.muted; + console.log(`media-agent - addPeer:${peer.peer_name} Audio track ${t.id} enabled: ${t.enabled} (local muted: ${localPeer.muted})`); + } else if (t.kind === "video") { + t.enabled = localPeer.video_on; + console.log(`media-agent - addPeer:${peer.peer_name} Video track ${t.id} enabled: ${t.enabled} (local video_on: ${localPeer.video_on})`); + } + } + console.log(`media-agent - addPeer:${peer.peer_name} Adding track:`, { kind: t.kind, enabled: t.enabled, @@ -815,7 +827,7 @@ const MediaAgent = (props: MediaAgentProps) => { } } }, - [peers, setPeers, media, sendJsonMessage, updatePeerConnectionState, session?.has_media] + [peers, setPeers, media, sendJsonMessage, updatePeerConnectionState, session?.has_media, session?.id] ); // Process queued peers when media becomes available @@ -1130,6 +1142,18 @@ const MediaAgent = (props: MediaAgentProps) => { // Add or update current local peer if (!updated[session.id]) { + // Disable tracks based on initial muted state before assigning to peer + if (media) { + media.getAudioTracks().forEach(track => { + track.enabled = false; // Start muted + console.log(`media-agent - Local audio track ${track.id} disabled (initial state)`); + }); + media.getVideoTracks().forEach(track => { + track.enabled = false; // Start with video off + console.log(`media-agent - Local video track ${track.id} disabled (initial state)`); + }); + } + updated[session.id] = { peer_name: session.name || "Unknown", session_id: session.id, @@ -1142,7 +1166,7 @@ const MediaAgent = (props: MediaAgentProps) => { }, dead: false, }; - console.log(`media-agent - Added local peer to peers list`); + console.log(`media-agent - Added local peer to peers list with tracks disabled`); } return updated; @@ -1315,7 +1339,9 @@ const MediaControl: React.FC = ({ isSelf, peer, className }) const [isDragging, setIsDragging] = useState(false); useEffect(() => { + console.log(`media-agent - MediaControl mounted for peer ${peer?.peer_name}, local=${peer?.local}, hasSrcObject=${!!peer?.attributes?.srcObject}`); if (!peer) return; + console.log(`media-agent - MediaControl peer changed for ${peer.peer_name}, updating state`); setMuted(peer.muted); setVideoOn(peer.video_on); }, [peer]); @@ -1408,26 +1434,33 @@ const MediaControl: React.FC = ({ isSelf, peer, className }) }, [peer, peer.attributes?.srcObject, peer.connection]); useEffect(() => { - if (!peer || peer.dead || !peer.attributes?.srcObject) return; + if (!peer || peer.dead || !peer.attributes?.srcObject) { + console.log(`media-agent - Audio track control: skipping for ${peer?.peer_name} (dead=${peer?.dead}, hasSrcObject=${!!peer?.attributes?.srcObject})`); + return; + } + console.log(`media-agent - Audio track control useEffect running for ${peer.peer_name}, muted=${muted}`); const stream = peer.attributes.srcObject as MediaStream; stream.getAudioTracks().forEach((t) => { - t.enabled = !muted; - console.log(`media-agent - Audio track ${t.id} enabled: ${t.enabled}`); + const shouldEnable = !muted; + console.log(`media-agent - Setting audio track ${t.id} enabled: ${shouldEnable} (was ${t.enabled})`); + t.enabled = shouldEnable; }); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [muted, peer?.attributes?.srcObject, peer?.dead]); + }, [muted, peer?.attributes?.srcObject, peer?.dead, peer]); useEffect(() => { if (!peer || peer.dead || !peer.attributes?.srcObject) return; + console.log(`media-agent - Video track control useEffect running for ${peer.peer_name}, videoOn=${videoOn}`); const stream = peer.attributes.srcObject as MediaStream; stream.getVideoTracks().forEach((t) => { - t.enabled = videoOn; - console.log(`media-agent - Video track ${t.id} enabled: ${t.enabled}`); + const shouldEnable = videoOn; + console.log(`media-agent - Setting video track ${t.id} enabled: ${shouldEnable} (was ${t.enabled})`); + t.enabled = shouldEnable; }); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [videoOn, peer?.attributes?.srcObject, peer?.dead]); + }, [videoOn, peer?.attributes?.srcObject, peer?.dead, peer]); // Debug target element useEffect(() => {