diff --git a/Discord.Net.targets b/Discord.Net.targets index 15591afc2..a4558b069 100644 --- a/Discord.Net.targets +++ b/Discord.Net.targets @@ -1,7 +1,7 @@ 1.0.0 - rc + rc2 RogueException discord;discordapp https://github.com/RogueException/Discord.Net diff --git a/src/Discord.Net.Core/Audio/AudioInStream.cs b/src/Discord.Net.Core/Audio/AudioInStream.cs index 6503474e5..86f1d8935 100644 --- a/src/Discord.Net.Core/Audio/AudioInStream.cs +++ b/src/Discord.Net.Core/Audio/AudioInStream.cs @@ -10,8 +10,10 @@ namespace Discord.Audio public override bool CanRead => true; public override bool CanSeek => false; public override bool CanWrite => true; + public abstract int AvailableFrames { get; } public abstract Task ReadFrameAsync(CancellationToken cancelToken); + public abstract bool TryReadFrame(CancellationToken cancelToken, out RTPFrame frame); public RTPFrame ReadFrame() { diff --git a/src/Discord.Net.WebSocket/Audio/Streams/InputStream.cs b/src/Discord.Net.WebSocket/Audio/Streams/InputStream.cs index 14bb18851..e29302fa0 100644 --- a/src/Discord.Net.WebSocket/Audio/Streams/InputStream.cs +++ b/src/Discord.Net.WebSocket/Audio/Streams/InputStream.cs @@ -8,7 +8,7 @@ namespace Discord.Audio.Streams /// Reads the payload from an RTP frame public class InputStream : AudioInStream { - private const int MaxFrames = 100; + private const int MaxFrames = 100; //1-2 Seconds private ConcurrentQueue _frames; private SemaphoreSlim _signal; @@ -20,6 +20,7 @@ namespace Discord.Audio.Streams public override bool CanRead => !_isDisposed; public override bool CanSeek => false; public override bool CanWrite => false; + public override int AvailableFrames => _signal.CurrentCount; public InputStream() { @@ -27,14 +28,17 @@ namespace Discord.Audio.Streams _signal = new SemaphoreSlim(0, MaxFrames); } - public override async Task ReadFrameAsync(CancellationToken cancelToken) + public override bool TryReadFrame(CancellationToken cancelToken, out RTPFrame frame) { cancelToken.ThrowIfCancellationRequested(); - RTPFrame frame; - await _signal.WaitAsync(cancelToken).ConfigureAwait(false); - _frames.TryDequeue(out frame); - return frame; + if (_signal.Wait(0)) + { + _frames.TryDequeue(out frame); + return true; + } + frame = default(RTPFrame); + return false; } public override async Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancelToken) { @@ -46,6 +50,15 @@ namespace Discord.Audio.Streams Buffer.BlockCopy(frame.Payload, 0, buffer, offset, frame.Payload.Length); return frame.Payload.Length; } + public override async Task ReadFrameAsync(CancellationToken cancelToken) + { + cancelToken.ThrowIfCancellationRequested(); + + RTPFrame frame; + await _signal.WaitAsync(cancelToken).ConfigureAwait(false); + _frames.TryDequeue(out frame); + return frame; + } public void WriteHeader(ushort seq, uint timestamp) { @@ -59,7 +72,7 @@ namespace Discord.Audio.Streams { cancelToken.ThrowIfCancellationRequested(); - if (_frames.Count > MaxFrames) //1-2 seconds + if (_signal.CurrentCount >= MaxFrames) //1-2 seconds { _hasHeader = false; return Task.Delay(0); //Buffer overloaded diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index e83cec52c..3516bd208 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net - 1.0.0-rc$suffix$ + 1.0.0-rc2$suffix$ Discord.Net RogueException RogueException