Compare commits

..

No commits in common. "main" and "0.0.59" have entirely different histories.

View file

@ -29,7 +29,6 @@ const state = {
viewMode: 'chat', // 'chat' or 'video'
iceServers: [{ urls: "stun:stun.l.google.com:19302" }],
peerGainNodes: new Map(), // userId -> GainNode
peerAudioNodes: new Map(), // userId -> { sourceNode, compressorNode, gainNode }
visibleVolumeSliders: new Set(), // userIds whose sliders are visible
},
voicePresencePollId: null,
@ -1040,24 +1039,7 @@ function shouldInitiateOffer(peerId) {
return state.me.id > peerId;
}
function disconnectPeerAudioNodes(peerId) {
const nodes = state.voice.peerAudioNodes.get(peerId);
if (!nodes) return;
for (const node of [nodes.sourceNode, nodes.compressorNode, nodes.gainNode]) {
try {
node?.disconnect();
} catch { }
}
state.voice.peerAudioNodes.delete(peerId);
state.voice.peerGainNodes.delete(peerId);
}
function stopAndClearAudioPipeline() {
for (const peerId of state.voice.peerAudioNodes.keys()) {
disconnectPeerAudioNodes(peerId);
}
if (state.voice.deepFilterProcessor) {
state.voice.deepFilterProcessor.destroy();
state.voice.deepFilterProcessor = null;
@ -1283,7 +1265,7 @@ async function createLocalVoiceStream() {
sampleRate: 48000,
echoCancellation: true,
noiseSuppression: false,
autoGainControl: true,
autoGainControl: false,
},
video: false,
};
@ -1406,27 +1388,16 @@ function ensurePeerConnection(peerId) {
const ctx = state.voice.audioContext;
if (ctx.state === 'suspended') ctx.resume();
disconnectPeerAudioNodes(peerId);
const sourceNode = ctx.createMediaStreamSource(audio.srcObject);
const compressorNode = ctx.createDynamicsCompressor();
const gainNode = ctx.createGain();
compressorNode.threshold.setValueAtTime(-24, ctx.currentTime);
compressorNode.knee.setValueAtTime(18, ctx.currentTime);
compressorNode.ratio.setValueAtTime(4, ctx.currentTime);
compressorNode.attack.setValueAtTime(0.003, ctx.currentTime);
compressorNode.release.setValueAtTime(0.25, ctx.currentTime);
const currentVolume = state.userVolumes.get(peerId) ?? 1.0;
gainNode.gain.setValueAtTime(currentVolume, ctx.currentTime);
sourceNode.connect(compressorNode);
compressorNode.connect(gainNode);
sourceNode.connect(gainNode);
gainNode.connect(ctx.destination);
state.voice.peerGainNodes.set(peerId, gainNode);
state.voice.peerAudioNodes.set(peerId, { sourceNode, compressorNode, gainNode });
// Mute the original element as we play through Web Audio destination
audio.volume = 0;
@ -1611,7 +1582,6 @@ async function joinVoice() {
pc.close();
state.voice.peerConnections.delete(msg.user_id);
}
disconnectPeerAudioNodes(msg.user_id);
document.getElementById(`audio-${msg.user_id}`)?.remove();
} else if (msg.type === "signal") {
await handleSignal(msg.from_user_id, msg.kind, msg.data);