From c829ebc356bd767851985cc023e674340ed16745 Mon Sep 17 00:00:00 2001 From: MathMan05 Date: Tue, 13 May 2025 13:32:19 -0500 Subject: [PATCH] fixed voice stuff --- src/webpage/voice.ts | 63 +++++++++++++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 16 deletions(-) diff --git a/src/webpage/voice.ts b/src/webpage/voice.ts index 55eb8d1..ee743d6 100644 --- a/src/webpage/voice.ts +++ b/src/webpage/voice.ts @@ -121,7 +121,7 @@ class Voice { const ssrc = this.speakingMap.get(userid); if (ssrc) { - this.users.delete(ssrc); + this.users.set(ssrc, ""); for (const thing of this.ssrcMap) { if (thing[1] === ssrc) { this.ssrcMap.delete(thing[0]); @@ -134,7 +134,7 @@ class Voice { //there's more for sure, but this is "good enough" for now this.onMemberChange(userid, false); } - packet(message: MessageEvent) { + async packet(message: MessageEvent) { const data = message.data; if (typeof data === "string") { const json: webRTCSocket = JSON.parse(data); @@ -158,16 +158,36 @@ class Voice { setTimeout(this.sendAlive.bind(this), 1000); break; case 12: - this.figureRecivers(); + await this.figureRecivers(); if (!this.users.has(json.d.audio_ssrc)) { console.log("redo 12!"); this.makeOp12(); } + if (this.pc) { + this.pc.addTransceiver(json.d.audio_ssrc ? "audio" : "video", { + direction: "recvonly", + sendEncodings: [{active: true}], + }); + this.getAudioTrans(this.users.size + 1).direction = "recvonly"; + } this.users.set(json.d.audio_ssrc, json.d.user_id); break; } } } + getAudioTrans(id: number) { + if (!this.pc) throw new Error("no pc"); + let i = 0; + for (const thing of this.pc.getTransceivers()) { + if (thing.receiver.track.kind === "audio") { + if (id === i) { + return thing; + } + i++; + } + } + throw new Error("none by that id"); + } hoffer?: string; get offer() { return this.hoffer; @@ -175,6 +195,7 @@ class Voice { set offer(e: string | undefined) { this.hoffer = e; } + fingerprint?: string; cleanServerSDP(sdp: string): string { const pc = this.pc; if (!pc) throw new Error("pc isn't defined"); @@ -195,18 +216,25 @@ class Voice { const rtcport = (parsed1.atr.get("rtcp") as Set).values().next().value as string; const ICE_UFRAG = (parsed1.atr.get("ice-ufrag") as Set).values().next().value as string; const ICE_PWD = (parsed1.atr.get("ice-pwd") as Set).values().next().value as string; - const FINGERPRINT = (parsed1.atr.get("fingerprint") as Set).values().next() - .value as string; + const FINGERPRINT = + this.fingerprint || + ((parsed1.atr.get("fingerprint") as Set).values().next().value as string); + this.fingerprint = FINGERPRINT; const candidate = (parsed1.atr.get("candidate") as Set).values().next().value as string; + + const audioUsers = [...this.users]; + console.warn(audioUsers); + let build = `v=0\r o=- 1420070400000 0 IN IP4 ${this.urlobj.url}\r s=-\r t=0 0\r a=msid-semantic: WMS *\r a=group:BUNDLE ${bundles.join(" ")}\r`; + let ai = -1; let i = 0; for (const grouping of parsed.medias) { - let mode = "recvonly"; + let mode = "inactive"; for (const _ of this.senders) { if (i < 2) { mode = "sendrecv"; @@ -223,17 +251,18 @@ a=rtcp-fb:111 transport-cc\r a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01 a=setup:passive\r -a=mid:${bundles[i]}\r +a=mid:${bundles[i]}${audioUsers[ai] && audioUsers[ai][1] ? `\r\na=msid:${audioUsers[ai][1]}-${audioUsers[ai][0]} a${audioUsers[ai][1]}-${audioUsers[ai][0]}\r` : "\r"} a=maxptime:60\r -a=${mode}\r +a=${audioUsers[ai] && audioUsers[ai][1] ? "sendonly" : mode}\r a=ice-ufrag:${ICE_UFRAG}\r a=ice-pwd:${ICE_PWD}\r a=fingerprint:${FINGERPRINT}\r -a=candidate:${candidate}\r +a=candidate:${candidate}${audioUsers[ai] && audioUsers[ai][1] ? `\r\na=ssrc:${audioUsers[ai][0]} cname:${audioUsers[ai][1]}-${audioUsers[ai][0]}\r` : "\r"} a=rtcp-mux\r`; + ai++; } else { build += ` -m=video ${rtcport} UDP/TLS/RTP/SAVPF 103 104\r +m=video ${parsed1.port} UDP/TLS/RTP/SAVPF 103 104\r ${cline}\r a=rtpmap:103 H264/90000\r a=rtpmap:104 rtx/90000\r @@ -271,7 +300,6 @@ a=rtcp-mux\r`; const sendOffer = async () => { console.trace("neg need"); await pc.setLocalDescription(); - console.warn(pc.localDescription?.sdp, this.offer); const senders = this.senders.difference(this.ssrcMap); for (const sender of senders) { @@ -402,7 +430,7 @@ a=rtcp-mux\r`; JSON.stringify({ op: 5, d: { - speaking: +this.speaking, + speaking: this.speaking, delay: 5, //not sure ssrc: pair[1], }, @@ -449,6 +477,7 @@ a=rtcp-mux\r`; pc.ontrack = async (e) => { this.status = "Done"; if (e.track.kind === "video") { + console.log("gotVideo?"); return; } @@ -459,12 +488,14 @@ a=rtcp-mux\r`; } const context = new AudioContext(); + console.log(context); await context.resume(); const ss = context.createMediaStreamSource(media); - console.log(media); - ss.connect(context.destination); + console.log(media, ss); new Audio().srcObject = media; //weird I know, but it's for chromium/webkit bug + ss.connect(context.destination); this.recivers.add(e.receiver); + console.log(this.recivers); }; const audioStream = await navigator.mediaDevices.getUserMedia({video: false, audio: true}); for (const track of audioStream.getAudioTracks()) { @@ -477,14 +508,14 @@ a=rtcp-mux\r`; } for (let i = 0; i < 10; i++) { pc.addTransceiver("audio", { - direction: "recvonly", + direction: "inactive", streams: [], sendEncodings: [{active: true, maxBitrate: this.settings.bitrate}], }); } for (let i = 0; i < 10; i++) { pc.addTransceiver("video", { - direction: "recvonly", + direction: "inactive", streams: [], sendEncodings: [{active: true, maxBitrate: this.settings.bitrate}], });