Skip to content

Commit 5328648

Browse files
amishshahiCrawl
authored andcommitted
fix(Voice*): filter out silent audio from video users (#5035)
1 parent f8b0c01 commit 5328648

File tree

4 files changed

+43
-11
lines changed

4 files changed

+43
-11
lines changed

src/client/voice/VoiceConnection.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,11 @@ class VoiceConnection extends EventEmitter {
473473
}
474474

475475
onStartSpeaking({ user_id, ssrc, speaking }) {
476-
this.ssrcMap.set(+ssrc, { userID: user_id, speaking: speaking });
476+
this.ssrcMap.set(+ssrc, {
477+
...(this.ssrcMap.get(+ssrc) || {}),
478+
userID: user_id,
479+
speaking: speaking,
480+
});
477481
}
478482

479483
/**

src/client/voice/networking/VoiceWebSocket.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,11 @@ class VoiceWebSocket extends EventEmitter {
189189
this.emit('sessionDescription', packet.d);
190190
break;
191191
case VoiceOPCodes.CLIENT_CONNECT:
192-
this.connection.ssrcMap.set(+packet.d.audio_ssrc, { userID: packet.d.user_id, speaking: 0 });
192+
this.connection.ssrcMap.set(+packet.d.audio_ssrc, {
193+
userID: packet.d.user_id,
194+
speaking: 0,
195+
hasVideo: Boolean(packet.d.video_ssrc),
196+
});
193197
break;
194198
case VoiceOPCodes.CLIENT_DISCONNECT:
195199
const streamInfo = this.connection.receiver && this.connection.receiver.packets.streams.get(packet.d.user_id);

src/client/voice/receiver/PacketHandler.js

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
'use strict';
22

33
const EventEmitter = require('events');
4+
const Speaking = require('../../../util/Speaking');
45
const secretbox = require('../util/Secretbox');
6+
const { SILENCE_FRAME } = require('../util/Silence');
57

68
// The delay between packets when a user is considered to have stopped speaking
79
// https://github.com/discordjs/discord.js/issues/3524#issuecomment-540373200
@@ -84,12 +86,30 @@ class PacketHandler extends EventEmitter {
8486
const userStat = this.connection.ssrcMap.get(ssrc);
8587
if (!userStat) return;
8688

89+
let opusPacket;
90+
const streamInfo = this.streams.get(userStat.userID);
91+
// If the user is in video, we need to check if the packet is just silence
92+
if (userStat.hasVideo) {
93+
opusPacket = this.parseBuffer(buffer);
94+
if (opusPacket instanceof Error) {
95+
// Only emit an error if we were actively receiving packets from this user
96+
if (streamInfo) {
97+
this.emit('error', opusPacket);
98+
return;
99+
}
100+
}
101+
if (SILENCE_FRAME.equals(opusPacket)) {
102+
// If this is a silence frame, pretend we never received it
103+
return;
104+
}
105+
}
106+
87107
let speakingTimeout = this.speakingTimeouts.get(ssrc);
88108
if (typeof speakingTimeout === 'undefined') {
89109
// Ensure at least the speaking bit is set.
90110
// As the object is by reference, it's only needed once per client re-connect.
91111
if (userStat.speaking === 0) {
92-
userStat.speaking = 1;
112+
userStat.speaking = Speaking.FLAGS.SPEAKING;
93113
}
94114
this.connection.onSpeaking({ user_id: userStat.userID, ssrc: ssrc, speaking: userStat.speaking });
95115
speakingTimeout = this.receiver.connection.client.setTimeout(() => {
@@ -106,15 +126,17 @@ class PacketHandler extends EventEmitter {
106126
speakingTimeout.refresh();
107127
}
108128

109-
let stream = this.streams.get(userStat.userID);
110-
if (!stream) return;
111-
stream = stream.stream;
112-
const opusPacket = this.parseBuffer(buffer);
113-
if (opusPacket instanceof Error) {
114-
this.emit('error', opusPacket);
115-
return;
129+
if (streamInfo) {
130+
const { stream } = streamInfo;
131+
if (!opusPacket) {
132+
opusPacket = this.parseBuffer(buffer);
133+
if (opusPacket instanceof Error) {
134+
this.emit('error', opusPacket);
135+
return;
136+
}
137+
}
138+
stream.push(opusPacket);
116139
}
117-
stream.push(opusPacket);
118140
}
119141
}
120142

src/client/voice/util/Silence.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,6 @@ class Silence extends Readable {
1010
}
1111
}
1212

13+
Silence.SILENCE_FRAME = SILENCE_FRAME;
14+
1315
module.exports = Silence;

0 commit comments

Comments
 (0)