Browse Source

Send no more than 10 frames of silence.

tags/1.0-rc
RogueException 8 years ago
parent
commit
d243587a97
1 changed files with 7 additions and 1 deletions
  1. +7
    -1
      src/Discord.Net.WebSocket/Audio/Streams/BufferedWriteStream.cs

+ 7
- 1
src/Discord.Net.WebSocket/Audio/Streams/BufferedWriteStream.cs View File

@@ -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


Loading…
Cancel
Save