| @@ -9,6 +9,8 @@ namespace Discord.Audio.Streams | |||||
| ///<summary> Wraps another stream with a timed buffer. </summary> | ///<summary> Wraps another stream with a timed buffer. </summary> | ||||
| public class BufferedWriteStream : AudioOutStream | public class BufferedWriteStream : AudioOutStream | ||||
| { | { | ||||
| private const int MaxSilenceFrames = 10; | |||||
| private struct Frame | private struct Frame | ||||
| { | { | ||||
| public Frame(byte[] buffer, int bytes) | public Frame(byte[] buffer, int bytes) | ||||
| @@ -33,6 +35,7 @@ namespace Discord.Audio.Streams | |||||
| private readonly Logger _logger; | private readonly Logger _logger; | ||||
| private readonly int _ticksPerFrame, _queueLength; | private readonly int _ticksPerFrame, _queueLength; | ||||
| private bool _isPreloaded; | private bool _isPreloaded; | ||||
| private int _silenceFrames; | |||||
| public BufferedWriteStream(AudioOutStream next, int samplesPerFrame, int bufferMillis, CancellationToken cancelToken, int maxFrameSize = 1500) | public BufferedWriteStream(AudioOutStream next, int samplesPerFrame, int bufferMillis, CancellationToken cancelToken, int maxFrameSize = 1500) | ||||
| : this(next, samplesPerFrame, bufferMillis, cancelToken, null, maxFrameSize) { } | : this(next, samplesPerFrame, bufferMillis, cancelToken, null, maxFrameSize) { } | ||||
| @@ -51,6 +54,7 @@ namespace Discord.Audio.Streams | |||||
| for (int i = 0; i < _queueLength; i++) | for (int i = 0; i < _queueLength; i++) | ||||
| _bufferPool.Enqueue(new byte[maxFrameSize]); | _bufferPool.Enqueue(new byte[maxFrameSize]); | ||||
| _queueLock = new SemaphoreSlim(_queueLength, _queueLength); | _queueLock = new SemaphoreSlim(_queueLength, _queueLength); | ||||
| _silenceFrames = MaxSilenceFrames; | |||||
| _task = Run(); | _task = Run(); | ||||
| } | } | ||||
| @@ -78,6 +82,7 @@ namespace Discord.Audio.Streams | |||||
| _bufferPool.Enqueue(frame.Buffer); | _bufferPool.Enqueue(frame.Buffer); | ||||
| _queueLock.Release(); | _queueLock.Release(); | ||||
| nextTick += _ticksPerFrame; | nextTick += _ticksPerFrame; | ||||
| _silenceFrames = 0; | |||||
| #if DEBUG | #if DEBUG | ||||
| var _ = _logger.DebugAsync($"Sent {frame.Bytes} bytes ({_queuedFrames.Count} frames buffered)"); | var _ = _logger.DebugAsync($"Sent {frame.Bytes} bytes ({_queuedFrames.Count} frames buffered)"); | ||||
| #endif | #endif | ||||
| @@ -86,7 +91,8 @@ namespace Discord.Audio.Streams | |||||
| { | { | ||||
| while ((nextTick - tick) <= 0) | 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; | nextTick += _ticksPerFrame; | ||||
| } | } | ||||
| #if DEBUG | #if DEBUG | ||||