From 8d9e11c08afa794a9ee7ff0d0b870e76ef1cf56a Mon Sep 17 00:00:00 2001 From: RogueException Date: Mon, 10 Apr 2017 18:00:42 -0300 Subject: [PATCH] Exposed IAudioClient.SetSpeakingAsync --- src/Discord.Net.Core/Audio/IAudioClient.cs | 1 + src/Discord.Net.WebSocket/Audio/AudioClient.cs | 11 +++++++++++ .../Audio/Streams/BufferedWriteStream.cs | 15 ++++----------- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/Discord.Net.Core/Audio/IAudioClient.cs b/src/Discord.Net.Core/Audio/IAudioClient.cs index c1c31af73..7373a8e4d 100644 --- a/src/Discord.Net.Core/Audio/IAudioClient.cs +++ b/src/Discord.Net.Core/Audio/IAudioClient.cs @@ -21,6 +21,7 @@ namespace Discord.Audio int UdpLatency { get; } Task StopAsync(); + Task SetSpeakingAsync(bool value); /// Creates a new outgoing stream accepting Opus-encoded data. AudioOutStream CreateOpusStream(int bufferMillis = 1000); diff --git a/src/Discord.Net.WebSocket/Audio/AudioClient.cs b/src/Discord.Net.WebSocket/Audio/AudioClient.cs index ceaea01cc..405ff394e 100644 --- a/src/Discord.Net.WebSocket/Audio/AudioClient.cs +++ b/src/Discord.Net.WebSocket/Audio/AudioClient.cs @@ -44,6 +44,7 @@ namespace Discord.Audio private string _url, _sessionId, _token; private ulong _userId; private uint _ssrc; + private bool _isSpeaking; public SocketGuild Guild { get; } public DiscordVoiceAPIClient ApiClient { get; private set; } @@ -242,6 +243,7 @@ namespace Discord.Audio throw new InvalidOperationException($"Discord selected an unexpected mode: {data.Mode}"); SecretKey = data.SecretKey; + _isSpeaking = false; await ApiClient.SendSetSpeaking(false).ConfigureAwait(false); _keepaliveTask = RunKeepaliveAsync(5000, _connection.CancelToken); @@ -453,6 +455,15 @@ namespace Discord.Audio } } + public async Task SetSpeakingAsync(bool value) + { + if (_isSpeaking != value) + { + _isSpeaking = value; + await ApiClient.SendSetSpeaking(value).ConfigureAwait(false); + } + } + internal void Dispose(bool disposing) { if (disposing) diff --git a/src/Discord.Net.WebSocket/Audio/Streams/BufferedWriteStream.cs b/src/Discord.Net.WebSocket/Audio/Streams/BufferedWriteStream.cs index e5065345f..e73eb2cc2 100644 --- a/src/Discord.Net.WebSocket/Audio/Streams/BufferedWriteStream.cs +++ b/src/Discord.Net.WebSocket/Audio/Streams/BufferedWriteStream.cs @@ -35,7 +35,7 @@ namespace Discord.Audio.Streams private readonly SemaphoreSlim _queueLock; private readonly Logger _logger; private readonly int _ticksPerFrame, _queueLength; - private bool _isPreloaded, _isSpeaking; + private bool _isPreloaded; private int _silenceFrames; public BufferedWriteStream(AudioStream next, IAudioClient client, int bufferMillis, CancellationToken cancelToken, int maxFrameSize = 1500) @@ -88,11 +88,7 @@ namespace Discord.Audio.Streams Frame frame; if (_queuedFrames.TryDequeue(out frame)) { - if (!_isSpeaking) - { - await _client.ApiClient.SendSetSpeaking(true).ConfigureAwait(false); - _isSpeaking = true; - } + await _client.SetSpeakingAsync(true).ConfigureAwait(false); _next.WriteHeader(seq++, timestamp, false); await _next.WriteAsync(frame.Buffer, 0, frame.Bytes).ConfigureAwait(false); _bufferPool.Enqueue(frame.Buffer); @@ -113,11 +109,8 @@ namespace Discord.Audio.Streams _next.WriteHeader(seq++, timestamp, false); await _next.WriteAsync(_silenceFrame, 0, _silenceFrame.Length).ConfigureAwait(false); } - else if (_isSpeaking) - { - await _client.ApiClient.SendSetSpeaking(false).ConfigureAwait(false); - _isSpeaking = false; - } + else + await _client.SetSpeakingAsync(false).ConfigureAwait(false); nextTick += _ticksPerFrame; timestamp += OpusEncoder.FrameSamplesPerChannel; }