From d243587a97179104095408d463547e2b0f86fe1c Mon Sep 17 00:00:00 2001 From: RogueException Date: Sat, 1 Apr 2017 13:16:18 -0300 Subject: [PATCH] Send no more than 10 frames of silence. --- .../Audio/Streams/BufferedWriteStream.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.WebSocket/Audio/Streams/BufferedWriteStream.cs b/src/Discord.Net.WebSocket/Audio/Streams/BufferedWriteStream.cs index 3040da855..5c402785e 100644 --- a/src/Discord.Net.WebSocket/Audio/Streams/BufferedWriteStream.cs +++ b/src/Discord.Net.WebSocket/Audio/Streams/BufferedWriteStream.cs @@ -9,6 +9,8 @@ namespace Discord.Audio.Streams /// Wraps another stream with a timed buffer. public class BufferedWriteStream : AudioOutStream { + private const int MaxSilenceFrames = 10; + private struct Frame { public Frame(byte[] buffer, int bytes) @@ -33,6 +35,7 @@ namespace Discord.Audio.Streams private readonly Logger _logger; private readonly int _ticksPerFrame, _queueLength; private bool _isPreloaded; + private int _silenceFrames; public BufferedWriteStream(AudioOutStream next, int samplesPerFrame, int bufferMillis, CancellationToken cancelToken, int maxFrameSize = 1500) : this(next, samplesPerFrame, bufferMillis, cancelToken, null, maxFrameSize) { } @@ -51,6 +54,7 @@ namespace Discord.Audio.Streams for (int i = 0; i < _queueLength; i++) _bufferPool.Enqueue(new byte[maxFrameSize]); _queueLock = new SemaphoreSlim(_queueLength, _queueLength); + _silenceFrames = MaxSilenceFrames; _task = Run(); } @@ -78,6 +82,7 @@ namespace Discord.Audio.Streams _bufferPool.Enqueue(frame.Buffer); _queueLock.Release(); nextTick += _ticksPerFrame; + _silenceFrames = 0; #if DEBUG var _ = _logger.DebugAsync($"Sent {frame.Bytes} bytes ({_queuedFrames.Count} frames buffered)"); #endif @@ -86,7 +91,8 @@ namespace Discord.Audio.Streams { while ((nextTick - tick) <= 0) { - await _next.WriteAsync(_silenceFrame, 0, _silenceFrame.Length).ConfigureAwait(false); + if (_silenceFrames++ < MaxSilenceFrames) + await _next.WriteAsync(_silenceFrame, 0, _silenceFrame.Length).ConfigureAwait(false); nextTick += _ticksPerFrame; } #if DEBUG