@@ -239,7 +239,7 @@ namespace Discord.Audio | |||||
throw new InvalidOperationException($"Discord selected an unexpected mode: {data.Mode}"); | throw new InvalidOperationException($"Discord selected an unexpected mode: {data.Mode}"); | ||||
_secretKey = data.SecretKey; | _secretKey = data.SecretKey; | ||||
await ApiClient.SendSetSpeaking(true).ConfigureAwait(false); | |||||
//await ApiClient.SendSetSpeaking(true).ConfigureAwait(false); | |||||
var _ = _connection.CompleteAsync(); | var _ = _connection.CompleteAsync(); | ||||
} | } | ||||
@@ -78,6 +78,7 @@ namespace Discord.Audio.Streams | |||||
Frame frame; | Frame frame; | ||||
if (_queuedFrames.TryDequeue(out frame)) | if (_queuedFrames.TryDequeue(out frame)) | ||||
{ | { | ||||
await _next.SetSpeakingAsync(true).ConfigureAwait(false); | |||||
await _next.WriteAsync(frame.Buffer, 0, frame.Bytes).ConfigureAwait(false); | await _next.WriteAsync(frame.Buffer, 0, frame.Bytes).ConfigureAwait(false); | ||||
_bufferPool.Enqueue(frame.Buffer); | _bufferPool.Enqueue(frame.Buffer); | ||||
_queueLock.Release(); | _queueLock.Release(); | ||||
@@ -93,6 +94,8 @@ namespace Discord.Audio.Streams | |||||
{ | { | ||||
if (_silenceFrames++ < MaxSilenceFrames) | if (_silenceFrames++ < MaxSilenceFrames) | ||||
await _next.WriteAsync(_silenceFrame, 0, _silenceFrame.Length).ConfigureAwait(false); | await _next.WriteAsync(_silenceFrame, 0, _silenceFrame.Length).ConfigureAwait(false); | ||||
else | |||||
await _next.SetSpeakingAsync(false).ConfigureAwait(false); | |||||
nextTick += _ticksPerFrame; | nextTick += _ticksPerFrame; | ||||
} | } | ||||
#if DEBUG | #if DEBUG | ||||
@@ -6,6 +6,8 @@ namespace Discord.Audio.Streams | |||||
///<summary> Wraps an IAudioClient, sending voice data on write. </summary> | ///<summary> Wraps an IAudioClient, sending voice data on write. </summary> | ||||
public class OutputStream : AudioOutStream | public class OutputStream : AudioOutStream | ||||
{ | { | ||||
private bool _isSpeaking; | |||||
private readonly DiscordVoiceAPIClient _client; | private readonly DiscordVoiceAPIClient _client; | ||||
public OutputStream(IAudioClient client) | public OutputStream(IAudioClient client) | ||||
: this((client as AudioClient).ApiClient) { } | : this((client as AudioClient).ApiClient) { } | ||||
@@ -14,6 +16,14 @@ namespace Discord.Audio.Streams | |||||
_client = client; | _client = client; | ||||
} | } | ||||
public async Task SetSpeakingAsync(bool isSpeaking) | |||||
{ | |||||
if (_isSpeaking != isSpeaking) | |||||
{ | |||||
await _client.SendSetSpeaking(isSpeaking).ConfigureAwait(false); | |||||
_isSpeaking = isSpeaking; | |||||
} | |||||
} | |||||
public override async Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancelToken) | public override async Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancelToken) | ||||
{ | { | ||||
cancelToken.ThrowIfCancellationRequested(); | cancelToken.ThrowIfCancellationRequested(); | ||||