@@ -50,34 +50,21 @@ namespace Discord.Audio | |||
private ConnectionState _gatewayState; | |||
internal Logger Logger { get; } | |||
/// <summary> Gets the unique identifier for this client. </summary> | |||
public int Id { get; } | |||
/// <summary> Gets the service managing this client. </summary> | |||
public AudioService Service { get; } | |||
/// <summary> Gets the configuration object used to make this client. </summary> | |||
public AudioServiceConfig Config { get; } | |||
/// <summary> Gets the internal RestClient for the Client API endpoint. </summary> | |||
public RestClient ClientAPI { get; } | |||
/// <summary> Gets the internal WebSocket for the Gateway event stream. </summary> | |||
public GatewaySocket GatewaySocket { get; } | |||
/// <summary> Gets the internal WebSocket for the Voice control stream. </summary> | |||
public VoiceSocket VoiceSocket { get; } | |||
/// <summary> Gets the JSON serializer used by this client. </summary> | |||
public JsonSerializer Serializer { get; } | |||
/// <summary> </summary> | |||
public Stream OutputStream { get; } | |||
/// <summary> Gets a cancellation token that triggers when the client is manually disconnected. </summary> | |||
public CancellationToken CancelToken { get; private set; } | |||
/// <summary> Gets the session id for the current connection. </summary> | |||
public string SessionId { get; private set; } | |||
/// <summary> Gets the current state of this client. </summary> | |||
public ConnectionState State => VoiceSocket.State; | |||
/// <summary> Gets the server this client is bound to. </summary> | |||
public Server Server => VoiceSocket.Server; | |||
/// <summary> Gets the channel </summary> | |||
public Channel Channel => VoiceSocket.Channel; | |||
public AudioClient(DiscordClient client, Server server, int id) | |||
@@ -116,7 +103,6 @@ namespace Discord.Audio | |||
OutputStream = new OutStream(this); | |||
} | |||
/// <summary> Connects to the Discord server with the provided token. </summary> | |||
public async Task Connect() | |||
{ | |||
if (Config.EnableMultiserver) | |||
@@ -172,7 +158,6 @@ namespace Discord.Audio | |||
_gatewayState = ConnectionState.Connected; | |||
} | |||
/// <summary> Disconnects from the Discord server, canceling any pending requests. </summary> | |||
public async Task Disconnect() | |||
{ | |||
await _taskManager.Stop(true).ConfigureAwait(false); | |||
@@ -277,9 +262,6 @@ namespace Discord.Audio | |||
} | |||
} | |||
/// <summary> Sends a PCM frame to the voice server. Will block until space frees up in the outgoing buffer. </summary> | |||
/// <param name="data">PCM frame to send. This must be a single or collection of uncompressed 48Kz monochannel 20ms PCM frames. </param> | |||
/// <param name="count">Number of bytes in this frame. </param> | |||
public void Send(byte[] data, int offset, int count) | |||
{ | |||
if (data == null) throw new ArgumentException(nameof(data)); | |||
@@ -291,14 +273,11 @@ namespace Discord.Audio | |||
VoiceSocket.SendPCMFrames(data, offset, count); | |||
} | |||
/// <summary> Clears the PCM buffer. </summary> | |||
public void Clear() | |||
{ | |||
if (VoiceSocket.Server == null) return; //Has been closed | |||
VoiceSocket.ClearPCMFrames(); | |||
} | |||
/// <summary> Returns a task that completes once the voice output buffer is empty. </summary> | |||
public void Wait() | |||
{ | |||
if (VoiceSocket.Server == null) return; //Has been closed | |||
@@ -1,16 +1,38 @@ | |||
using System.IO; | |||
using Discord.Net.Rest; | |||
using Discord.Net.WebSockets; | |||
using System.IO; | |||
using System.Threading; | |||
using System.Threading.Tasks; | |||
namespace Discord.Audio | |||
{ | |||
public interface IAudioClient | |||
{ | |||
/// <summary> Gets the unique identifier for this client. </summary> | |||
int Id { get; } | |||
/// <summary> Gets the session id for the current connection. </summary> | |||
string SessionId { get; } | |||
/// <summary> Gets the current state of this client. </summary> | |||
ConnectionState State { get; } | |||
/// <summary> Gets the channel this client is currently a member of. </summary> | |||
Channel Channel { get; } | |||
/// <summary> Gets the server this client is bound to. </summary> | |||
Server Server { get; } | |||
/// <summary> Gets a stream object that wraps the Send() function. </summary> | |||
Stream OutputStream { get; } | |||
/// <summary> Gets a cancellation token that triggers when the client is manually disconnected. </summary> | |||
CancellationToken CancelToken { get; } | |||
/// <summary> Gets the internal RestClient for the Client API endpoint. </summary> | |||
RestClient ClientAPI { get; } | |||
/// <summary> Gets the internal WebSocket for the Gateway event stream. </summary> | |||
GatewaySocket GatewaySocket { get; } | |||
/// <summary> Gets the internal WebSocket for the Voice control stream. </summary> | |||
VoiceSocket VoiceSocket { get; } | |||
/// <summary> Moves the client to another channel on the same server. </summary> | |||
Task Join(Channel channel); | |||
/// <summary> Disconnects from the Discord server, canceling any pending requests. </summary> | |||
Task Disconnect(); | |||
/// <summary> Sends a PCM frame to the voice server. Will block until space frees up in the outgoing buffer. </summary> | |||
@@ -4,13 +4,13 @@ using System.Security; | |||
namespace Discord.Audio.Opus | |||
{ | |||
public enum OpusApplication : int | |||
internal enum OpusApplication : int | |||
{ | |||
Voice = 2048, | |||
MusicOrMixed = 2049, | |||
LowLatency = 2051 | |||
} | |||
public enum OpusError : int | |||
internal enum OpusError : int | |||
{ | |||
OK = 0, | |||
BadArg = -1, | |||
@@ -22,7 +22,7 @@ namespace Discord.Audio.Opus | |||
AllocFail = -7 | |||
} | |||
public abstract class OpusConverter : IDisposable | |||
internal abstract class OpusConverter : IDisposable | |||
{ | |||
protected enum Ctl : int | |||
{ | |||
@@ -2,7 +2,6 @@ | |||
namespace Discord.Audio.Opus | |||
{ | |||
/// <summary> Opus codec wrapper. </summary> | |||
internal class OpusDecoder : OpusConverter | |||
{ | |||
/// <summary> Creates a new Opus decoder. </summary> | |||
@@ -2,7 +2,6 @@ | |||
namespace Discord.Audio.Opus | |||
{ | |||
/// <summary> Opus codec wrapper. </summary> | |||
internal class OpusEncoder : OpusConverter | |||
{ | |||
/// <summary> Gets the bit rate in kbit/s. </summary> | |||
@@ -1,4 +1,7 @@ | |||
using System.IO; | |||
using Discord.Net.Rest; | |||
using Discord.Net.WebSockets; | |||
using System.IO; | |||
using System.Threading; | |||
using System.Threading.Tasks; | |||
namespace Discord.Audio | |||
@@ -9,9 +12,17 @@ namespace Discord.Audio | |||
public Server Server { get; } | |||
public ConnectionState State => _client.VoiceSocket.Server == Server ? _client.VoiceSocket.State : ConnectionState.Disconnected; | |||
public Channel Channel => _client.VoiceSocket.Server == Server ? _client.VoiceSocket.Channel : null; | |||
public Stream OutputStream => _client.VoiceSocket.Server == Server ? _client.OutputStream : null; | |||
public int Id => 0; | |||
public string SessionId => _client.Server == Server ? _client.SessionId : null; | |||
public ConnectionState State => _client.Server == Server ? _client.State : ConnectionState.Disconnected; | |||
public Channel Channel => _client.Server == Server ? _client.Channel : null; | |||
public Stream OutputStream => _client.Server == Server ? _client.OutputStream : null; | |||
public CancellationToken CancelToken => _client.Server == Server ? _client.CancelToken : CancellationToken.None; | |||
public RestClient ClientAPI => _client.Server == Server ? _client.ClientAPI : null; | |||
public GatewaySocket GatewaySocket => _client.Server == Server ? _client.GatewaySocket : null; | |||
public VoiceSocket VoiceSocket => _client.Server == Server ? _client.VoiceSocket : null; | |||
public VirtualClient(AudioClient client, Server server) | |||
{ | |||