aboutsummaryrefslogtreecommitdiff
path: root/source/client/local_user.ts
diff options
context:
space:
mode:
authorMetaMuffin <metamuffin@yandex.com>2021-08-06 19:25:57 +0200
committerMetaMuffin <metamuffin@yandex.com>2021-08-06 19:25:57 +0200
commitb31837bd5253c772de38dc0d0fadfdba5a1903bf (patch)
tree6b8ef79bfdbb4d0f525ad95f7ad52b4fd9f5ee80 /source/client/local_user.ts
parentc5f4438589be44208ce4946c3c090350840113ba (diff)
downloadkeks-meet-b31837bd5253c772de38dc0d0fadfdba5a1903bf.tar
keks-meet-b31837bd5253c772de38dc0d0fadfdba5a1903bf.tar.bz2
keks-meet-b31837bd5253c772de38dc0d0fadfdba5a1903bf.tar.zst
Added mute and mic gain
Diffstat (limited to 'source/client/local_user.ts')
-rw-r--r--source/client/local_user.ts58
1 files changed, 47 insertions, 11 deletions
diff --git a/source/client/local_user.ts b/source/client/local_user.ts
index 78652b3..7f2327e 100644
--- a/source/client/local_user.ts
+++ b/source/client/local_user.ts
@@ -1,7 +1,7 @@
-import { parameter_bool, parameter_string } from "./helper";
+import { parameter_bool, parameter_number, parameter_string } from "./helper";
import { log } from "./logger";
import { RemoteUser } from "./remote_user";
-import { rnnoise_track } from "./rnnoise";
+import { get_rnnoise_node } from "./rnnoise";
import { Room } from "./room";
import { User } from "./user";
@@ -10,8 +10,12 @@ export class LocalUser extends User {
private audio_track?: MediaStreamTrack
private video_track?: MediaStreamTrack
+ private audio_disable_cleanup?: () => void
- controls?: { audio: HTMLElement, video: HTMLElement }
+ mic_gain?: GainNode
+ default_gain: number = parameter_number("mic_gain", 1)
+
+ controls?: { audio: HTMLElement, video: HTMLElement, mute: HTMLElement }
constructor(room: Room, name: string) {
super(room, name)
@@ -25,10 +29,15 @@ export class LocalUser extends User {
create_controls() {
const audio_toggle = document.createElement("input")
const video_toggle = document.createElement("input")
- audio_toggle.type = video_toggle.type = "button"
+ const mute_toggle = document.createElement("input")
+ audio_toggle.type = video_toggle.type = mute_toggle.type = "button"
audio_toggle.value = "Audio"
video_toggle.value = "Video"
- let audio = false, video = false
+ mute_toggle.value = "Mute"
+ let audio = parameter_bool("audio_enabled", false),
+ video = parameter_bool("video_enabled", false),
+ mute = parameter_bool("video_enabled", false)
+
audio_toggle.addEventListener("click", () => {
audio = !audio
@@ -40,11 +49,17 @@ export class LocalUser extends User {
if (video) this.enable_video()
else this.disable_video()
})
+ mute_toggle.addEventListener("click", () => {
+ mute = !mute
+ this.mic_gain?.gain?.setValueAtTime(mute ? 0 : this.default_gain, 0)
+ if (mute) this.controls?.mute.classList.add("enabled")
+ else this.controls?.mute.classList.remove("enabled")
+ })
const el = document.createElement("div")
el.classList.add("local-controls")
- el.append(audio_toggle, video_toggle)
- this.controls = { video: video_toggle, audio: audio_toggle }
+ el.append(audio_toggle, video_toggle, mute_toggle)
+ this.controls = { video: video_toggle, audio: audio_toggle, mute: mute_toggle }
document.body.append(el)
}
@@ -86,17 +101,38 @@ export class LocalUser extends User {
} : true;
const user_media = await window.navigator.mediaDevices.getUserMedia({ audio: audio_contraints })
- let t = user_media.getAudioTracks()[0]
+ const context = new AudioContext()
+ const source = context.createMediaStreamSource(user_media)
+ const destination = context.createMediaStreamDestination()
+ const gain = context.createGain()
+ gain.gain.value = this.default_gain
+ this.mic_gain = gain
+ let rnnoise: RNNoiseNode;
if (use_rnnoise) {
- t = await rnnoise_track(t)
+ rnnoise = await get_rnnoise_node(context)
+ source.connect(rnnoise)
+ rnnoise.connect(gain)
+ } else {
+ source.connect(gain)
}
+ gain.connect(destination)
+ this.audio_disable_cleanup = () => {
+ source.disconnect()
+ if (rnnoise) rnnoise.disconnect()
+ gain.disconnect()
+ destination.disconnect()
+ this.mic_gain = undefined
+ }
+
+ const t = destination.stream.getAudioTracks()[0]
this.audio_track = t
this.room.remote_users.forEach(u => u.peer.addTrack(t))
this.stream.addTrack(t)
this.update_view_w()
}
+
async disable_video() {
if (!this.video_track) return
this.room.remote_users.forEach(u => {
@@ -110,6 +146,7 @@ export class LocalUser extends User {
}
async disable_audio() {
if (!this.audio_track) return
+ if (this.audio_disable_cleanup) this.audio_disable_cleanup()
this.room.remote_users.forEach(u => {
u.peer.getSenders().forEach(s => {
if (s.track == this.audio_track) u.peer.removeTrack(s)
@@ -119,5 +156,4 @@ export class LocalUser extends User {
this.update_view_w()
this.audio_track = undefined
}
-
-} \ No newline at end of file
+}