diff --git a/src/Discord.Net.WebSocket/Audio/AudioClient.Events.cs b/src/Discord.Net.WebSocket/Audio/AudioClient.Events.cs new file mode 100644 index 000000000..5ab5ea1bb --- /dev/null +++ b/src/Discord.Net.WebSocket/Audio/AudioClient.Events.cs @@ -0,0 +1,46 @@ +using Discord.Audio; +using System; +using System.Threading.Tasks; + +namespace Discord.Audio +{ + internal partial class AudioClient + { + public event Func Connected + { + add { _connectedEvent.Add(value); } + remove { _connectedEvent.Remove(value); } + } + private readonly AsyncEvent> _connectedEvent = new AsyncEvent>(); + public event Func Disconnected + { + add { _disconnectedEvent.Add(value); } + remove { _disconnectedEvent.Remove(value); } + } + private readonly AsyncEvent> _disconnectedEvent = new AsyncEvent>(); + public event Func LatencyUpdated + { + add { _latencyUpdatedEvent.Add(value); } + remove { _latencyUpdatedEvent.Remove(value); } + } + private readonly AsyncEvent> _latencyUpdatedEvent = new AsyncEvent>(); + public event Func StreamCreated + { + add { _streamCreatedEvent.Add(value); } + remove { _streamCreatedEvent.Remove(value); } + } + private readonly AsyncEvent> _streamCreatedEvent = new AsyncEvent>(); + public event Func StreamDestroyed + { + add { _streamDestroyedEvent.Add(value); } + remove { _streamDestroyedEvent.Remove(value); } + } + private readonly AsyncEvent> _streamDestroyedEvent = new AsyncEvent>(); + public event Func SpeakingUpdated + { + add { _speakingUpdatedEvent.Add(value); } + remove { _speakingUpdatedEvent.Remove(value); } + } + private readonly AsyncEvent> _speakingUpdatedEvent = new AsyncEvent>(); + } +} diff --git a/src/Discord.Net.WebSocket/Audio/AudioClient.cs b/src/Discord.Net.WebSocket/Audio/AudioClient.cs index 2030ed477..0736b9626 100644 --- a/src/Discord.Net.WebSocket/Audio/AudioClient.cs +++ b/src/Discord.Net.WebSocket/Audio/AudioClient.cs @@ -15,7 +15,7 @@ using System.Threading.Tasks; namespace Discord.Audio { //TODO: Add audio reconnecting - internal class AudioClient : IAudioClient, IDisposable + internal partial class AudioClient : IAudioClient, IDisposable { internal struct StreamPair { @@ -29,37 +29,6 @@ namespace Discord.Audio } } - public event Func Connected - { - add { _connectedEvent.Add(value); } - remove { _connectedEvent.Remove(value); } - } - private readonly AsyncEvent> _connectedEvent = new AsyncEvent>(); - public event Func Disconnected - { - add { _disconnectedEvent.Add(value); } - remove { _disconnectedEvent.Remove(value); } - } - private readonly AsyncEvent> _disconnectedEvent = new AsyncEvent>(); - public event Func LatencyUpdated - { - add { _latencyUpdatedEvent.Add(value); } - remove { _latencyUpdatedEvent.Remove(value); } - } - private readonly AsyncEvent> _latencyUpdatedEvent = new AsyncEvent>(); - public event Func StreamCreated - { - add { _streamCreated.Add(value); } - remove { _streamCreated.Remove(value); } - } - private readonly AsyncEvent> _streamCreated = new AsyncEvent>(); - public event Func StreamDestroyed - { - add { _streamDestroyed.Add(value); } - remove { _streamDestroyed.Remove(value); } - } - private readonly AsyncEvent> _streamDestroyed = new AsyncEvent>(); - private readonly Logger _audioLogger; private readonly JsonSerializer _serializer; private readonly ConnectionManager _connection; @@ -202,7 +171,7 @@ namespace Discord.Audio var readerStream = new InputStream(); var writerStream = new OpusDecodeStream(new RTPReadStream(readerStream, _secretKey)); _streams.TryAdd(userId, new StreamPair(readerStream, writerStream)); - await _streamCreated.InvokeAsync(userId, readerStream); + await _streamCreatedEvent.InvokeAsync(userId, readerStream); } } internal AudioInStream GetInputStream(ulong id) @@ -215,14 +184,14 @@ namespace Discord.Audio internal async Task RemoveInputStreamAsync(ulong userId) { if (_streams.TryRemove(userId, out var ignored)) - await _streamDestroyed.InvokeAsync(userId).ConfigureAwait(false); + await _streamDestroyedEvent.InvokeAsync(userId).ConfigureAwait(false); } internal async Task ClearInputStreamsAsync() { foreach (var pair in _streams) { pair.Value.Reader.Dispose(); - await _streamDestroyed.InvokeAsync(pair.Key).ConfigureAwait(false); + await _streamDestroyedEvent.InvokeAsync(pair.Key).ConfigureAwait(false); } _ssrcMap.Clear(); _streams.Clear(); @@ -287,6 +256,8 @@ namespace Discord.Audio var data = (payload as JToken).ToObject(_serializer); _ssrcMap[data.Ssrc] = data.UserId; //TODO: Memory Leak: SSRCs are never cleaned up + + await _speakingUpdatedEvent.InvokeAsync(data.UserId, data.Speaking); } break; default: