| @@ -122,6 +122,9 @@ | |||||
| <Compile Include="..\Discord.Net\Helpers\JsonHttpClient.Events.cs"> | <Compile Include="..\Discord.Net\Helpers\JsonHttpClient.Events.cs"> | ||||
| <Link>Helpers\JsonHttpClient.Events.cs</Link> | <Link>Helpers\JsonHttpClient.Events.cs</Link> | ||||
| </Compile> | </Compile> | ||||
| <Compile Include="..\Discord.Net\Helpers\TaskHelper.cs"> | |||||
| <Link>Helpers\TaskHelper.cs</Link> | |||||
| </Compile> | |||||
| <Compile Include="..\Discord.Net\HttpException.cs"> | <Compile Include="..\Discord.Net\HttpException.cs"> | ||||
| <Link>HttpException.cs</Link> | <Link>HttpException.cs</Link> | ||||
| </Compile> | </Compile> | ||||
| @@ -645,15 +645,15 @@ namespace Discord | |||||
| /// <summary> Sends a PCM frame to the voice server. </summary> | /// <summary> Sends a PCM frame to the voice server. </summary> | ||||
| /// <param name="data">PCM frame to send.</param> | /// <param name="data">PCM frame to send.</param> | ||||
| /// <param name="count">Number of bytes in this frame. </param> | /// <param name="count">Number of bytes in this frame. </param> | ||||
| public void SendVoicePCM(byte[] data, int count) | |||||
| public Task SendVoicePCM(byte[] data, int count) | |||||
| { | { | ||||
| CheckReady(); | CheckReady(); | ||||
| if (!_config.EnableVoice) throw new InvalidOperationException("Voice is not enabled for this client."); | if (!_config.EnableVoice) throw new InvalidOperationException("Voice is not enabled for this client."); | ||||
| if (count == 0) return; | |||||
| if (count == 0) return TaskHelper.CompletedTask; | |||||
| if (_isDebugMode) | if (_isDebugMode) | ||||
| RaiseOnDebugMessage(DebugMessageType.VoiceOutput, $"Queued {count} bytes for voice output."); | RaiseOnDebugMessage(DebugMessageType.VoiceOutput, $"Queued {count} bytes for voice output."); | ||||
| _voiceWebSocket.SendPCMFrame(data, count); | |||||
| return _voiceWebSocket.SendPCMFrame(data, count); | |||||
| } | } | ||||
| /// <summary> Clears the PCM buffer. </summary> | /// <summary> Clears the PCM buffer. </summary> | ||||
| @@ -1,4 +1,5 @@ | |||||
| using Discord.API.Models; | using Discord.API.Models; | ||||
| using Discord.Helpers; | |||||
| using Newtonsoft.Json; | using Newtonsoft.Json; | ||||
| using Newtonsoft.Json.Linq; | using Newtonsoft.Json.Linq; | ||||
| using System; | using System; | ||||
| @@ -81,11 +82,7 @@ namespace Discord | |||||
| RaiseOnDebugMessage(DebugMessageType.WebSocketUnknownOpCode, "Unknown Opcode: " + msg.Operation); | RaiseOnDebugMessage(DebugMessageType.WebSocketUnknownOpCode, "Unknown Opcode: " + msg.Operation); | ||||
| break; | break; | ||||
| } | } | ||||
| #if DNXCORE | |||||
| return Task.CompletedTask | |||||
| #else | |||||
| return Task.Delay(0); | |||||
| #endif | |||||
| return TaskHelper.CompletedTask; | |||||
| } | } | ||||
| protected override object GetKeepAlive() | protected override object GetKeepAlive() | ||||
| @@ -369,25 +369,27 @@ namespace Discord | |||||
| } | } | ||||
| } | } | ||||
| public void SendPCMFrame(byte[] data, int count) | |||||
| public Task SendPCMFrame(byte[] data, int count) | |||||
| { | { | ||||
| if (count != _encoder.FrameSize) | if (count != _encoder.FrameSize) | ||||
| throw new InvalidOperationException($"Invalid frame size. Got {count}, expected {_encoder.FrameSize}."); | throw new InvalidOperationException($"Invalid frame size. Got {count}, expected {_encoder.FrameSize}."); | ||||
| lock (_encoder) | |||||
| byte[] payload; | |||||
| int encodedLength; | |||||
| lock (_encoder) | |||||
| { | { | ||||
| byte[] payload = new byte[4000]; | |||||
| int encodedLength = _encoder.EncodeFrame(data, payload); | |||||
| payload = new byte[4000]; | |||||
| encodedLength = _encoder.EncodeFrame(data, payload); | |||||
| if (_mode == "xsalsa20_poly1305") | if (_mode == "xsalsa20_poly1305") | ||||
| { | { | ||||
| //TODO: Encode | //TODO: Encode | ||||
| } | } | ||||
| lock (_sendQueue) | |||||
| _sendQueue.Enqueue(new Packet(payload, encodedLength)); | |||||
| } | } | ||||
| } | |||||
| _sendQueue.Enqueue(new Packet(payload, encodedLength)); | |||||
| return Task.Delay(0); | |||||
| } | |||||
| public void ClearPCMFrames() | public void ClearPCMFrames() | ||||
| { | { | ||||
| _isClearing = true; | _isClearing = true; | ||||
| @@ -0,0 +1,17 @@ | |||||
| using System.Threading.Tasks; | |||||
| namespace Discord.Helpers | |||||
| { | |||||
| internal static class TaskHelper | |||||
| { | |||||
| public static Task CompletedTask { get; } | |||||
| static TaskHelper() | |||||
| { | |||||
| #if DNXCORE50 | |||||
| CompletedTask = Task.CompletedTask; | |||||
| #else | |||||
| CompletedTask = Task.Delay(0); | |||||
| #endif | |||||
| } | |||||
| } | |||||
| } | |||||