From 8571bd11d6daabb84a8dc11dbcac8a25f9aa3c9d Mon Sep 17 00:00:00 2001 From: wethecom Date: Tue, 14 Apr 2026 15:42:23 -0400 Subject: [PATCH 01/13] . . --- BasicMicrophoneRecorder.cs | 10 ++++++---- CircularAudioBuffer.cs | 27 ++++++++++++++------------- VoiceChatInterface.cs | 15 ++++++++------- 3 files changed, 28 insertions(+), 24 deletions(-) diff --git a/BasicMicrophoneRecorder.cs b/BasicMicrophoneRecorder.cs index b2e1696..ad3fd19 100644 --- a/BasicMicrophoneRecorder.cs +++ b/BasicMicrophoneRecorder.cs @@ -1,4 +1,4 @@ -using NAudio.Wave; +using NAudio.Wave; namespace OpenVoiceSharp { @@ -32,7 +32,7 @@ public void SetMicrophone(int index) WaveInCapabilities[] microphones = GetMicrophones(); if (index > microphones.Length - 1) return; - CurrentMicrophone = GetMicrophones()[index]; + CurrentMicrophone = microphones[index]; CurrentMicrophoneIndex = index; AudioInputChanged?.Invoke(CurrentMicrophoneIndex, CurrentMicrophone); @@ -52,13 +52,15 @@ public static WaveInCapabilities[] GetMicrophones() // recording public bool IsRecording { get; private set; } = false; + public void StartRecording() { - if (IsRecording) return; + if (IsRecording) return; IsRecording = true; MicrophoneRecorder.StartRecording(); } + public void StopRecording() { if (!IsRecording) return; @@ -66,10 +68,10 @@ public void StopRecording() MicrophoneRecorder.StopRecording(); } + private void WhenRecordingStopped(object? sender, StoppedEventArgs e) => RecordingStopped?.Invoke(e); private void WhenDataAvailable(object? sender, WaveInEventArgs e) => DataAvailable?.Invoke(e.Buffer, e.BytesRecorded); - public BasicMicrophoneRecorder(bool stereo = false) { // wave format for recording diff --git a/CircularAudioBuffer.cs b/CircularAudioBuffer.cs index 0b1a823..582dc4c 100644 --- a/CircularAudioBuffer.cs +++ b/CircularAudioBuffer.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace OpenVoiceSharp { @@ -14,7 +14,7 @@ public enum RecommendedChunkAmount /// Useful for Unity or other engines that do not support streamed pcm reading by default. /// /// Byte/short/float depending on your needs. - public struct CircularAudioBuffer where T: struct + public struct CircularAudioBuffer where T : struct { /// /// The raw length of the buffer, in samples. @@ -26,7 +26,7 @@ public struct CircularAudioBuffer where T: struct public int ChunkSize { get; private set; } public readonly int BufferAvailable => ChunksAvailable * ChunkSize; - public int ChunksAvailable = 0; + public int ChunksAvailable; private readonly T[] Buffer; @@ -34,8 +34,6 @@ public struct CircularAudioBuffer where T: struct public readonly bool CanReadChunk => ChunksAvailable > 0; - // no need to do a for loop to rewrite the buffer. - // just dont give it. /// /// Reads the first chunk available at the front of the buffer. /// @@ -45,11 +43,14 @@ public T[] ReadChunk() if (!CanReadChunk) throw new Exception("No chunks are available."); - // slice the chunk - T[] chunk = Buffer[ChunksAvailable..ChunkSize]; + // copy the first chunk out + T[] chunk = new T[ChunkSize]; + Array.Copy(Buffer, 0, chunk, 0, ChunkSize); - // grab the rest and put it at the front - chunk.CopyTo(Buffer[ChunkSize..BufferLength], 0); + // shift remaining data to the front + int remaining = (ChunksAvailable - 1) * ChunkSize; + if (remaining > 0) + Array.Copy(Buffer, ChunkSize, Buffer, 0, remaining); ChunksAvailable--; @@ -91,13 +92,11 @@ public T[] ReadAllBuffer() /// Chunk/frame public void PushChunk(T[] chunk) { - // push chunk back if not full if (BufferFull) return; - // if size doesnt match - if (chunk.Length != ChunkSize) throw new Exception($"Invalid chunk size. Submitted {chunk.Length} - should be {ChunkSize}"); + if (chunk.Length != ChunkSize) + throw new Exception($"Invalid chunk size. Submitted {chunk.Length} - should be {ChunkSize}"); - // copy to Array.Copy(chunk, 0, Buffer, BufferAvailable, chunk.Length); ChunksAvailable++; } @@ -112,7 +111,9 @@ public CircularAudioBuffer(int chunkSize, int amountOfChunks = 18) ChunkSize = chunkSize; BufferLength = chunkSize * amountOfChunks; Buffer = new T[BufferLength]; + ChunksAvailable = 0; } + /// /// Creates a circular audio buffer. /// diff --git a/VoiceChatInterface.cs b/VoiceChatInterface.cs index 24292a7..4d8ba76 100644 --- a/VoiceChatInterface.cs +++ b/VoiceChatInterface.cs @@ -1,4 +1,4 @@ -using OpusDotNet; +using OpusDotNet; using RNNoise.NET; using WebRtcVadSharp; @@ -54,7 +54,6 @@ public sealed class VoiceChatInterface SampleRate = WebRtcVadSharp.SampleRate.Is48kHz }; - /// /// Returns if voice activity was detected using the WebRTC VAD. /// @@ -81,12 +80,13 @@ private void ApplyNoiseSuppression(byte[] pcmData) /// Encodes and processes audio data. Also handles noise suppression if needed. /// /// The 16 bit PCM data according to your needs. + /// The length of the data /// The encoded Opus data, along with its length. public (byte[] encodedOpusData, int encodedLength) SubmitAudioData(byte[] pcmData, int length) { if (EnableNoiseSuppression) ApplyNoiseSuppression(pcmData); - + return (OpusEncoder.Encode(pcmData, length, out int encodedLength), encodedLength); } @@ -108,10 +108,10 @@ private void ApplyNoiseSuppression(byte[] pcmData) /// Favor audio streaming and less compressed packets to favor audio quality. /// The VAD (voice activity detection) operating mode. public VoiceChatInterface( - int bitrate = DefaultBitrate, - bool stereo = false, + int bitrate = DefaultBitrate, + bool stereo = false, bool enableNoiseSuppression = true, - bool favorAudioStreaming = false, + bool favorAudioStreaming = false, OperatingMode? vadOperatingMode = null ) { Bitrate = bitrate; @@ -134,7 +134,8 @@ public VoiceChatInterface( ForceChannels = Stereo ? ForceChannels.Stereo : ForceChannels.Mono }; - OpusDecoder = new(FrameLength, SampleRate, channels); + // OpusDecoder takes (sampleRate, channels) — FrameLength is not a parameter + OpusDecoder = new(SampleRate, channels); if (vadOperatingMode != null) VoiceActivityDetector.OperatingMode = (OperatingMode)vadOperatingMode; From 943eaee065bfae595ff80ab897a95abc28c46e4a Mon Sep 17 00:00:00 2001 From: wethecom Date: Thu, 16 Apr 2026 19:16:43 -0400 Subject: [PATCH 02/13] . --- BasicMicrophoneRecorder.cs | 52 +++++++++++++++++++++++++++++---- CircularAudioBuffer.cs | 35 +++++++++++++++++++--- OpenVoiceSharp.csproj | 2 ++ OpenVoiceSharp.sln | 12 ++++---- VoiceChatInterface.cs | 55 +++++++++++++++++++++++++++++----- VoiceUtilities.cs | 60 +++++++++++++++++++++++++++++++++----- 6 files changed, 185 insertions(+), 31 deletions(-) diff --git a/BasicMicrophoneRecorder.cs b/BasicMicrophoneRecorder.cs index ad3fd19..aee5551 100644 --- a/BasicMicrophoneRecorder.cs +++ b/BasicMicrophoneRecorder.cs @@ -5,17 +5,17 @@ namespace OpenVoiceSharp /// /// Handles basic microphone recording for a voice chat interface using NAudio. /// - public sealed class BasicMicrophoneRecorder + public sealed class BasicMicrophoneRecorder : IDisposable { // events public delegate void AudioInputChangedEvent(int index, WaveInCapabilities microphone); - public event AudioInputChangedEvent AudioInputChanged; + public event AudioInputChangedEvent? AudioInputChanged; public delegate void MicrophoneDataAvailableEvent(byte[] pcmData, int length); - public event MicrophoneDataAvailableEvent DataAvailable; + public event MicrophoneDataAvailableEvent? DataAvailable; public delegate void MicrophoneStoppedRecordingEvent(StoppedEventArgs arguments); - public event MicrophoneStoppedRecordingEvent RecordingStopped; + public event MicrophoneStoppedRecordingEvent? RecordingStopped; // wave format/recorder private readonly WaveFormat WaveFormat; @@ -24,18 +24,30 @@ public sealed class BasicMicrophoneRecorder // setting to a specific microphone public int CurrentMicrophoneIndex { get; private set; } = 0; // default public WaveInCapabilities CurrentMicrophone { get; private set; } + private bool IsDisposed; public void SetMicrophone(int index) { - if (index < 0) return; + ThrowIfDisposed(); WaveInCapabilities[] microphones = GetMicrophones(); - if (index > microphones.Length - 1) return; + if (microphones.Length == 0) + throw new InvalidOperationException("No microphones are available."); + if (index < 0 || index >= microphones.Length) + throw new ArgumentOutOfRangeException(nameof(index)); + + bool wasRecording = IsRecording; + if (wasRecording) + StopRecording(); CurrentMicrophone = microphones[index]; CurrentMicrophoneIndex = index; + MicrophoneRecorder.DeviceNumber = CurrentMicrophoneIndex; AudioInputChanged?.Invoke(CurrentMicrophoneIndex, CurrentMicrophone); + + if (wasRecording) + StartRecording(); } public static WaveInCapabilities[] GetMicrophones() @@ -55,6 +67,7 @@ public static WaveInCapabilities[] GetMicrophones() public void StartRecording() { + ThrowIfDisposed(); if (IsRecording) return; IsRecording = true; @@ -63,6 +76,7 @@ public void StartRecording() public void StopRecording() { + ThrowIfDisposed(); if (!IsRecording) return; IsRecording = false; @@ -90,5 +104,31 @@ public BasicMicrophoneRecorder(bool stereo = false) // set to default microphone SetToDefaultMicrophone(); } + + public void Dispose() + { + if (IsDisposed) return; + + try + { + if (IsRecording) + MicrophoneRecorder.StopRecording(); + } + catch + { + // ignored: dispose should not throw on shutdown paths + } + + MicrophoneRecorder.DataAvailable -= WhenDataAvailable; + MicrophoneRecorder.RecordingStopped -= WhenRecordingStopped; + MicrophoneRecorder.Dispose(); + IsDisposed = true; + } + + private void ThrowIfDisposed() + { + if (IsDisposed) + throw new ObjectDisposedException(nameof(BasicMicrophoneRecorder)); + } } } diff --git a/CircularAudioBuffer.cs b/CircularAudioBuffer.cs index 582dc4c..f4ae565 100644 --- a/CircularAudioBuffer.cs +++ b/CircularAudioBuffer.cs @@ -41,7 +41,7 @@ public struct CircularAudioBuffer where T : struct public T[] ReadChunk() { if (!CanReadChunk) - throw new Exception("No chunks are available."); + throw new InvalidOperationException("No chunks are available."); // copy the first chunk out T[] chunk = new T[ChunkSize]; @@ -62,7 +62,15 @@ public T[] ReadChunk() /// /// The target buffer to which it'll be copied to /// The begin offset to which it'll begin copying to - public void ReadChunkTo(T[] target, int offset = 0) => ReadChunk().CopyTo(target, offset); + public void ReadChunkTo(T[] target, int offset = 0) + { + if (target is null) + throw new ArgumentNullException(nameof(target)); + if (offset < 0 || offset > target.Length - ChunkSize) + throw new ArgumentOutOfRangeException(nameof(offset)); + + ReadChunk().CopyTo(target, offset); + } /// /// Reads all the buffer that is available. @@ -84,7 +92,16 @@ public T[] ReadAllBuffer() /// /// The target buffer to which it'll be copied to /// The begin offset to which it'll begin copying to - public void ReadAllBufferTo(T[] target, int offset = 0) => ReadAllBuffer().CopyTo(target, offset); + public void ReadAllBufferTo(T[] target, int offset = 0) + { + if (target is null) + throw new ArgumentNullException(nameof(target)); + int available = BufferAvailable; + if (offset < 0 || offset > target.Length - available) + throw new ArgumentOutOfRangeException(nameof(offset)); + + ReadAllBuffer().CopyTo(target, offset); + } /// /// Pushes a chunk into the buffer. Will be ignored if the buffer is full. (no overflow) @@ -92,10 +109,15 @@ public T[] ReadAllBuffer() /// Chunk/frame public void PushChunk(T[] chunk) { + if (chunk is null) + throw new ArgumentNullException(nameof(chunk)); if (BufferFull) return; if (chunk.Length != ChunkSize) - throw new Exception($"Invalid chunk size. Submitted {chunk.Length} - should be {ChunkSize}"); + throw new ArgumentException( + $"Invalid chunk size. Submitted {chunk.Length} - should be {ChunkSize}", + nameof(chunk) + ); Array.Copy(chunk, 0, Buffer, BufferAvailable, chunk.Length); ChunksAvailable++; @@ -108,6 +130,11 @@ public void PushChunk(T[] chunk) /// Amount of chunks the circular audio buffer can take in. Higher values are usually more stable and lower values usually cause more audio cracking, but will do more latency (20 * amountOfChunks ms). public CircularAudioBuffer(int chunkSize, int amountOfChunks = 18) { + if (chunkSize <= 0) + throw new ArgumentOutOfRangeException(nameof(chunkSize)); + if (amountOfChunks <= 0) + throw new ArgumentOutOfRangeException(nameof(amountOfChunks)); + ChunkSize = chunkSize; BufferLength = chunkSize * amountOfChunks; Buffer = new T[BufferLength]; diff --git a/OpenVoiceSharp.csproj b/OpenVoiceSharp.csproj index a5656ee..b5b783f 100644 --- a/OpenVoiceSharp.csproj +++ b/OpenVoiceSharp.csproj @@ -2,6 +2,8 @@ netstandard2.1;net6.0 + x64 + x64 enable enable OpenVoiceSharp diff --git a/OpenVoiceSharp.sln b/OpenVoiceSharp.sln index c7c9fcd..d8f2af2 100644 --- a/OpenVoiceSharp.sln +++ b/OpenVoiceSharp.sln @@ -7,14 +7,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenVoiceSharp", "OpenVoice EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU + Debug|x64 = Debug|x64 + Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {9AB99863-C04D-4CC2-A43D-71F174566DEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9AB99863-C04D-4CC2-A43D-71F174566DEC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9AB99863-C04D-4CC2-A43D-71F174566DEC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9AB99863-C04D-4CC2-A43D-71F174566DEC}.Release|Any CPU.Build.0 = Release|Any CPU + {9AB99863-C04D-4CC2-A43D-71F174566DEC}.Debug|x64.ActiveCfg = Debug|x64 + {9AB99863-C04D-4CC2-A43D-71F174566DEC}.Debug|x64.Build.0 = Debug|x64 + {9AB99863-C04D-4CC2-A43D-71F174566DEC}.Release|x64.ActiveCfg = Release|x64 + {9AB99863-C04D-4CC2-A43D-71F174566DEC}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/VoiceChatInterface.cs b/VoiceChatInterface.cs index 4d8ba76..cff16dd 100644 --- a/VoiceChatInterface.cs +++ b/VoiceChatInterface.cs @@ -4,7 +4,7 @@ namespace OpenVoiceSharp { - public sealed class VoiceChatInterface + public sealed class VoiceChatInterface : IDisposable { /// /// Opus frame length. (20ms) @@ -43,6 +43,7 @@ public sealed class VoiceChatInterface public bool FavorAudioStreaming { get; private set; } = false; private int ChannelsAmount => Stereo ? 2 : 1; + private int PcmFrameSize => VoiceUtilities.GetSampleSize(ChannelsAmount); // instances private readonly OpusEncoder OpusEncoder; @@ -63,17 +64,18 @@ public sealed class VoiceChatInterface // stores float samples if needed private readonly float[] FloatSamples; + private bool IsDisposed; - private void ApplyNoiseSuppression(byte[] pcmData) + private void ApplyNoiseSuppression(byte[] pcmData, int length) { // convert to float32 - VoiceUtilities.Convert16BitToFloat(pcmData, FloatSamples); + VoiceUtilities.Convert16BitToFloat(pcmData, FloatSamples, length); // apply noise suppression Denoiser.Denoise(FloatSamples); // convert back to 16 bit pcm - VoiceUtilities.ConvertFloatTo16Bit(FloatSamples, pcmData); + VoiceUtilities.ConvertFloatTo16Bit(FloatSamples, pcmData, length); } /// @@ -84,8 +86,19 @@ private void ApplyNoiseSuppression(byte[] pcmData) /// The encoded Opus data, along with its length. public (byte[] encodedOpusData, int encodedLength) SubmitAudioData(byte[] pcmData, int length) { + ThrowIfDisposed(); + if (pcmData is null) + throw new ArgumentNullException(nameof(pcmData)); + if (length <= 0 || length > pcmData.Length) + throw new ArgumentOutOfRangeException(nameof(length)); + if (length != PcmFrameSize) + throw new ArgumentException( + $"Expected exactly one {FrameLength}ms PCM frame ({PcmFrameSize} bytes), got {length}.", + nameof(length) + ); + if (EnableNoiseSuppression) - ApplyNoiseSuppression(pcmData); + ApplyNoiseSuppression(pcmData, length); return (OpusEncoder.Encode(pcmData, length, out int encodedLength), encodedLength); } @@ -97,7 +110,15 @@ private void ApplyNoiseSuppression(byte[] pcmData) /// The length of the data /// The decoded Opus data, along with its length. public (byte[] decodedOpusData, int decodedLength) WhenDataReceived(byte[] encodedData, int length) - => (OpusDecoder.Decode(encodedData, length, out int decodedLength), decodedLength); + { + ThrowIfDisposed(); + if (encodedData is null) + throw new ArgumentNullException(nameof(encodedData)); + if (length <= 0 || length > encodedData.Length) + throw new ArgumentOutOfRangeException(nameof(length)); + + return (OpusDecoder.Decode(encodedData, length, out int decodedLength), decodedLength); + } /// /// Creates a brand new OpenVoiceSharp voice chat interface to manage voice chat. @@ -114,6 +135,9 @@ public VoiceChatInterface( bool favorAudioStreaming = false, OperatingMode? vadOperatingMode = null ) { + if (bitrate < 8_000 || bitrate > 512_000) + throw new ArgumentOutOfRangeException(nameof(bitrate), "Bitrate must be between 8000 and 512000."); + Bitrate = bitrate; Stereo = stereo; EnableNoiseSuppression = enableNoiseSuppression; @@ -121,7 +145,7 @@ public VoiceChatInterface( int channels = ChannelsAmount; // fill float samples for noise suppression - FloatSamples = new float[VoiceUtilities.GetSampleSize(channels) / 2]; + FloatSamples = new float[PcmFrameSize / 2]; // create opus encoder/decoder OpusEncoder = new( @@ -140,5 +164,22 @@ public VoiceChatInterface( if (vadOperatingMode != null) VoiceActivityDetector.OperatingMode = (OperatingMode)vadOperatingMode; } + + public void Dispose() + { + if (IsDisposed) return; + + OpusEncoder.Dispose(); + OpusDecoder.Dispose(); + Denoiser.Dispose(); + VoiceActivityDetector.Dispose(); + IsDisposed = true; + } + + private void ThrowIfDisposed() + { + if (IsDisposed) + throw new ObjectDisposedException(nameof(VoiceChatInterface)); + } } } diff --git a/VoiceUtilities.cs b/VoiceUtilities.cs index 8e250cd..f18c00a 100644 --- a/VoiceUtilities.cs +++ b/VoiceUtilities.cs @@ -28,14 +28,33 @@ public static int GetSampleSize(int channels) /// The output data in which the result will be returned. /// The 16 bit byte array. public static void Convert16BitToFloat(byte[] input, float[] output) + => Convert16BitToFloat(input, output, input.Length); + + /// + /// Converts 16 bit PCM data into float 32 for a specific input length. + /// + /// The 16 bit PCM data according to your needs. + /// The output data in which the result will be returned. + /// How many bytes to convert from . + public static void Convert16BitToFloat(byte[] input, float[] output, int inputLengthBytes) { - int outputIndex = 0; - short sample; + if (input is null) + throw new ArgumentNullException(nameof(input)); + if (output is null) + throw new ArgumentNullException(nameof(output)); + if (inputLengthBytes < 0 || inputLengthBytes > input.Length) + throw new ArgumentOutOfRangeException(nameof(inputLengthBytes)); + if ((inputLengthBytes & 1) != 0) + throw new ArgumentException("Input length must be even for 16-bit PCM.", nameof(inputLengthBytes)); + + int samples = inputLengthBytes / 2; + if (output.Length < samples) + throw new ArgumentException("Output buffer is too small for the requested input length.", nameof(output)); - for (int n = 0; n < output.Length; n++) + for (int n = 0; n < samples; n++) { - sample = BitConverter.ToInt16(input, n * 2); - output[outputIndex++] = sample / 32768f; + short sample = BitConverter.ToInt16(input, n * 2); + output[n] = sample / 32768f; } } @@ -47,12 +66,37 @@ public static void Convert16BitToFloat(byte[] input, float[] output) /// The output data in which the result will be returned. /// The float32 PCM array. public static void ConvertFloatTo16Bit(float[] input, byte[] output) + => ConvertFloatTo16Bit(input, output, output.Length); + + /// + /// Converts float 32 PCM data into 16 bit for a specific output length. + /// + /// The float 32 PCM data according to your needs. + /// The output data in which the result will be returned. + /// How many bytes to write into . + public static void ConvertFloatTo16Bit(float[] input, byte[] output, int outputLengthBytes) { - int sampleIndex = 0, pcmIndex = 0; + if (input is null) + throw new ArgumentNullException(nameof(input)); + if (output is null) + throw new ArgumentNullException(nameof(output)); + if (outputLengthBytes < 0 || outputLengthBytes > output.Length) + throw new ArgumentOutOfRangeException(nameof(outputLengthBytes)); + if ((outputLengthBytes & 1) != 0) + throw new ArgumentException("Output length must be even for 16-bit PCM.", nameof(outputLengthBytes)); - while (sampleIndex < input.Length) + int samples = outputLengthBytes / 2; + if (input.Length < samples) + throw new ArgumentException("Input buffer is too small for the requested output length.", nameof(input)); + + int sampleIndex = 0, pcmIndex = 0; + while (sampleIndex < samples) { - short outsample = (short)(input[sampleIndex] * short.MaxValue); + float sample = input[sampleIndex]; + if (sample > 1f) sample = 1f; + else if (sample < -1f) sample = -1f; + + short outsample = (short)(sample * short.MaxValue); output[pcmIndex] = (byte)(outsample & 0xff); output[pcmIndex + 1] = (byte)((outsample >> 8) & 0xff); From 5d111b48014bb8963a1a38d9c15dff84a8d01021 Mon Sep 17 00:00:00 2001 From: wethecom Date: Thu, 16 Apr 2026 19:26:11 -0400 Subject: [PATCH 03/13] , --- Example.cs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Example.cs b/Example.cs index 3bdfbb7..6e9ee24 100644 --- a/Example.cs +++ b/Example.cs @@ -2,12 +2,13 @@ { internal static class Example { - static VoiceChatInterface voiceChatInterface = new(); + private static readonly VoiceChatInterface VoiceChatInterface = new(); + private static readonly int ExpectedFrameSize = VoiceUtilities.GetSampleSize(1); // basic recorder public static void Main() { - BasicMicrophoneRecorder recorder = new(); + using BasicMicrophoneRecorder recorder = new(); recorder.DataAvailable += WhenDataAvailable; recorder.StartRecording(); @@ -16,7 +17,11 @@ public static void Main() // encoding & sending private static void WhenDataAvailable(byte[] pcmData, int length) { - (byte[] encodedData, int encodedLength) = voiceChatInterface.SubmitAudioData(pcmData, length); + // Ignore incomplete frames that can occasionally happen at stream boundaries. + if (length != ExpectedFrameSize) + return; + + (byte[] encodedData, int encodedLength) = VoiceChatInterface.SubmitAudioData(pcmData, length); Send(encodedData, encodedLength); } private static void Send(byte[] encodedData, int encodedLength) @@ -28,7 +33,7 @@ private static void Send(byte[] encodedData, int encodedLength) private static void WhenVoicePacketReceived(byte[] encodedData, int encodedLength) { // here we assume that encodedData contains the bytes of the opus encoded data - (byte[] decodedData, int decodedLength) = voiceChatInterface.WhenDataReceived(encodedData, encodedLength); + (byte[] decodedData, int decodedLength) = VoiceChatInterface.WhenDataReceived(encodedData, encodedLength); SubmitBuffer(decodedData, decodedLength); } From 13d143282c99365ed57641f47fad6f77472f0a0e Mon Sep 17 00:00:00 2001 From: wethecom Date: Thu, 16 Apr 2026 19:34:00 -0400 Subject: [PATCH 04/13] , --- .../ClientSession.cs | 24 ++ .../OpenVoiceSharp.AuthoritativeServer.csproj | 10 + OpenVoiceSharp.AuthoritativeServer/Program.cs | 12 + .../Protocol.cs | 174 +++++++++++ .../ServerOptions.cs | 48 +++ .../TokenBucket.cs | 39 +++ .../VoiceAuthoritativeServer.cs | 288 ++++++++++++++++++ OpenVoiceSharp.csproj | 5 + OpenVoiceSharp.sln | 6 + README.md | 16 + docs/AUTHORITATIVE_SERVER_PROTOCOL.md | 131 ++++++++ 11 files changed, 753 insertions(+) create mode 100644 OpenVoiceSharp.AuthoritativeServer/ClientSession.cs create mode 100644 OpenVoiceSharp.AuthoritativeServer/OpenVoiceSharp.AuthoritativeServer.csproj create mode 100644 OpenVoiceSharp.AuthoritativeServer/Program.cs create mode 100644 OpenVoiceSharp.AuthoritativeServer/Protocol.cs create mode 100644 OpenVoiceSharp.AuthoritativeServer/ServerOptions.cs create mode 100644 OpenVoiceSharp.AuthoritativeServer/TokenBucket.cs create mode 100644 OpenVoiceSharp.AuthoritativeServer/VoiceAuthoritativeServer.cs create mode 100644 docs/AUTHORITATIVE_SERVER_PROTOCOL.md diff --git a/OpenVoiceSharp.AuthoritativeServer/ClientSession.cs b/OpenVoiceSharp.AuthoritativeServer/ClientSession.cs new file mode 100644 index 0000000..e1fe0c7 --- /dev/null +++ b/OpenVoiceSharp.AuthoritativeServer/ClientSession.cs @@ -0,0 +1,24 @@ +using System.Net; + +namespace OpenVoiceSharp.AuthoritativeServer; + +internal sealed class ClientSession +{ + public Guid ClientId { get; } + public string RoomName { get; set; } + public string UserName { get; set; } + public IPEndPoint Endpoint { get; set; } + public DateTime LastSeenUtc { get; set; } + public uint LastVoiceSequence { get; set; } + public TokenBucket VoiceRateLimiter { get; } + + public ClientSession(Guid clientId, string roomName, string userName, IPEndPoint endpoint, int maxVoicePacketsPerSecond) + { + ClientId = clientId; + RoomName = roomName; + UserName = userName; + Endpoint = endpoint; + LastSeenUtc = DateTime.UtcNow; + VoiceRateLimiter = new TokenBucket(maxVoicePacketsPerSecond); + } +} diff --git a/OpenVoiceSharp.AuthoritativeServer/OpenVoiceSharp.AuthoritativeServer.csproj b/OpenVoiceSharp.AuthoritativeServer/OpenVoiceSharp.AuthoritativeServer.csproj new file mode 100644 index 0000000..ed9781c --- /dev/null +++ b/OpenVoiceSharp.AuthoritativeServer/OpenVoiceSharp.AuthoritativeServer.csproj @@ -0,0 +1,10 @@ + + + + Exe + net10.0 + enable + enable + + + diff --git a/OpenVoiceSharp.AuthoritativeServer/Program.cs b/OpenVoiceSharp.AuthoritativeServer/Program.cs new file mode 100644 index 0000000..1186286 --- /dev/null +++ b/OpenVoiceSharp.AuthoritativeServer/Program.cs @@ -0,0 +1,12 @@ +using OpenVoiceSharp.AuthoritativeServer; + +var options = ServerOptions.FromArgs(args); + +using var server = new VoiceAuthoritativeServer(options); +Console.CancelKeyPress += (_, eventArgs) => +{ + eventArgs.Cancel = true; + server.RequestStop(); +}; + +await server.RunAsync(); diff --git a/OpenVoiceSharp.AuthoritativeServer/Protocol.cs b/OpenVoiceSharp.AuthoritativeServer/Protocol.cs new file mode 100644 index 0000000..1bc652d --- /dev/null +++ b/OpenVoiceSharp.AuthoritativeServer/Protocol.cs @@ -0,0 +1,174 @@ +using System.Buffers.Binary; +using System.Text; + +namespace OpenVoiceSharp.AuthoritativeServer; + +internal enum ClientPacketType : byte +{ + Hello = 1, + Voice = 2, + Leave = 3, + Ping = 4 +} + +internal enum ServerPacketType : byte +{ + Welcome = 11, + VoiceRelay = 12, + Error = 13, + PeerJoined = 14, + PeerLeft = 15, + Pong = 16 +} + +internal enum ErrorCode : byte +{ + InvalidPacket = 1, + NotRegistered = 2, + UnauthorizedEndpoint = 3, + RoomFull = 4, + RateLimited = 5, + PayloadTooLarge = 6 +} + +internal static class Protocol +{ + public static bool TryReadHello( + ReadOnlySpan packet, + out Guid clientId, + out string room, + out string userName + ) + { + clientId = Guid.Empty; + room = string.Empty; + userName = string.Empty; + + // Type(1) + ClientId(16) + RoomLen(1) + UserLen(1) + if (packet.Length < 19 || packet[0] != (byte)ClientPacketType.Hello) + return false; + + clientId = new Guid(packet.Slice(1, 16)); + byte roomLength = packet[17]; + int roomStart = 18; + int userLenIndex = roomStart + roomLength; + + if (packet.Length < userLenIndex + 1) + return false; + + byte userLength = packet[userLenIndex]; + int userStart = userLenIndex + 1; + if (packet.Length != userStart + userLength) + return false; + + room = Encoding.UTF8.GetString(packet.Slice(roomStart, roomLength)); + userName = Encoding.UTF8.GetString(packet.Slice(userStart, userLength)); + return room.Length > 0 && userName.Length > 0; + } + + public static bool TryReadVoice( + ReadOnlySpan packet, + out Guid clientId, + out uint sequence, + out ReadOnlySpan payload + ) + { + clientId = Guid.Empty; + sequence = 0; + payload = default; + + // Type(1) + ClientId(16) + Sequence(4) + PayloadLen(2) + if (packet.Length < 23 || packet[0] != (byte)ClientPacketType.Voice) + return false; + + clientId = new Guid(packet.Slice(1, 16)); + sequence = BinaryPrimitives.ReadUInt32LittleEndian(packet.Slice(17, 4)); + ushort payloadLength = BinaryPrimitives.ReadUInt16LittleEndian(packet.Slice(21, 2)); + + if (packet.Length != 23 + payloadLength) + return false; + + payload = packet.Slice(23, payloadLength); + return true; + } + + public static bool TryReadLeave(ReadOnlySpan packet, out Guid clientId) + { + clientId = Guid.Empty; + if (packet.Length != 17 || packet[0] != (byte)ClientPacketType.Leave) + return false; + + clientId = new Guid(packet.Slice(1, 16)); + return true; + } + + public static bool TryReadPing(ReadOnlySpan packet, out Guid clientId) + { + clientId = Guid.Empty; + if (packet.Length != 17 || packet[0] != (byte)ClientPacketType.Ping) + return false; + + clientId = new Guid(packet.Slice(1, 16)); + return true; + } + + public static byte[] BuildWelcome(Guid clientId) + { + byte[] packet = new byte[17]; + packet[0] = (byte)ServerPacketType.Welcome; + clientId.TryWriteBytes(packet.AsSpan(1, 16)); + return packet; + } + + public static byte[] BuildPeerJoined(Guid clientId, string userName) + { + byte[] userNameBytes = Encoding.UTF8.GetBytes(userName); + byte[] packet = new byte[18 + userNameBytes.Length]; + packet[0] = (byte)ServerPacketType.PeerJoined; + clientId.TryWriteBytes(packet.AsSpan(1, 16)); + packet[17] = checked((byte)userNameBytes.Length); + userNameBytes.CopyTo(packet.AsSpan(18)); + return packet; + } + + public static byte[] BuildPeerLeft(Guid clientId) + { + byte[] packet = new byte[17]; + packet[0] = (byte)ServerPacketType.PeerLeft; + clientId.TryWriteBytes(packet.AsSpan(1, 16)); + return packet; + } + + public static byte[] BuildVoiceRelay(Guid speakerClientId, uint sequence, ReadOnlySpan payload) + { + byte[] packet = new byte[23 + payload.Length]; + packet[0] = (byte)ServerPacketType.VoiceRelay; + speakerClientId.TryWriteBytes(packet.AsSpan(1, 16)); + BinaryPrimitives.WriteUInt32LittleEndian(packet.AsSpan(17, 4), sequence); + BinaryPrimitives.WriteUInt16LittleEndian(packet.AsSpan(21, 2), checked((ushort)payload.Length)); + payload.CopyTo(packet.AsSpan(23)); + return packet; + } + + public static byte[] BuildError(ErrorCode code, string message) + { + byte[] messageBytes = Encoding.UTF8.GetBytes(message); + if (messageBytes.Length > byte.MaxValue) + messageBytes = messageBytes[..byte.MaxValue]; + + byte[] packet = new byte[3 + messageBytes.Length]; + packet[0] = (byte)ServerPacketType.Error; + packet[1] = (byte)code; + packet[2] = (byte)messageBytes.Length; + messageBytes.CopyTo(packet.AsSpan(3)); + return packet; + } + + public static byte[] BuildPong(Guid clientId) + { + byte[] packet = new byte[17]; + packet[0] = (byte)ServerPacketType.Pong; + clientId.TryWriteBytes(packet.AsSpan(1, 16)); + return packet; + } +} diff --git a/OpenVoiceSharp.AuthoritativeServer/ServerOptions.cs b/OpenVoiceSharp.AuthoritativeServer/ServerOptions.cs new file mode 100644 index 0000000..044f00d --- /dev/null +++ b/OpenVoiceSharp.AuthoritativeServer/ServerOptions.cs @@ -0,0 +1,48 @@ +namespace OpenVoiceSharp.AuthoritativeServer; + +internal sealed record ServerOptions +{ + public int Port { get; init; } = 7777; + public int MaxRoomMembers { get; init; } = 64; + public int MaxVoicePayloadBytes { get; init; } = 4096; + public int MaxVoicePacketsPerSecond { get; init; } = 80; + public int ClientTimeoutSeconds { get; init; } = 30; + + public static ServerOptions FromArgs(string[] args) + { + ServerOptions options = new(); + + for (int i = 0; i < args.Length; i++) + { + string arg = args[i]; + if (i + 1 >= args.Length) + break; + + switch (arg) + { + case "--port": + if (int.TryParse(args[++i], out int port) && port > 0 && port <= 65535) + options = options with { Port = port }; + break; + case "--max-room-members": + if (int.TryParse(args[++i], out int maxRoomMembers) && maxRoomMembers > 1) + options = options with { MaxRoomMembers = maxRoomMembers }; + break; + case "--max-voice-bytes": + if (int.TryParse(args[++i], out int maxVoiceBytes) && maxVoiceBytes >= 128) + options = options with { MaxVoicePayloadBytes = maxVoiceBytes }; + break; + case "--max-pps": + if (int.TryParse(args[++i], out int maxPps) && maxPps >= 10) + options = options with { MaxVoicePacketsPerSecond = maxPps }; + break; + case "--timeout-seconds": + if (int.TryParse(args[++i], out int timeoutSeconds) && timeoutSeconds >= 5) + options = options with { ClientTimeoutSeconds = timeoutSeconds }; + break; + } + } + + return options; + } +} diff --git a/OpenVoiceSharp.AuthoritativeServer/TokenBucket.cs b/OpenVoiceSharp.AuthoritativeServer/TokenBucket.cs new file mode 100644 index 0000000..cd32223 --- /dev/null +++ b/OpenVoiceSharp.AuthoritativeServer/TokenBucket.cs @@ -0,0 +1,39 @@ +namespace OpenVoiceSharp.AuthoritativeServer; + +internal sealed class TokenBucket +{ + private readonly double FillRatePerSecond; + private readonly double Capacity; + private double Tokens; + private DateTime LastRefillUtc; + + public TokenBucket(int fillRatePerSecond) + { + FillRatePerSecond = fillRatePerSecond; + Capacity = fillRatePerSecond; + Tokens = fillRatePerSecond; + LastRefillUtc = DateTime.UtcNow; + } + + public bool TryConsume(int tokens) + { + Refill(); + + if (Tokens < tokens) + return false; + + Tokens -= tokens; + return true; + } + + private void Refill() + { + DateTime now = DateTime.UtcNow; + double elapsedSeconds = (now - LastRefillUtc).TotalSeconds; + if (elapsedSeconds <= 0) + return; + + Tokens = Math.Min(Capacity, Tokens + elapsedSeconds * FillRatePerSecond); + LastRefillUtc = now; + } +} diff --git a/OpenVoiceSharp.AuthoritativeServer/VoiceAuthoritativeServer.cs b/OpenVoiceSharp.AuthoritativeServer/VoiceAuthoritativeServer.cs new file mode 100644 index 0000000..1fae410 --- /dev/null +++ b/OpenVoiceSharp.AuthoritativeServer/VoiceAuthoritativeServer.cs @@ -0,0 +1,288 @@ +using System.Net; +using System.Net.Sockets; + +namespace OpenVoiceSharp.AuthoritativeServer; + +internal sealed class VoiceAuthoritativeServer : IDisposable +{ + private readonly ServerOptions Options; + private readonly UdpClient Socket; + private readonly Dictionary SessionsById = []; + private readonly Dictionary> RoomMembers = new(StringComparer.Ordinal); + private readonly CancellationTokenSource StopTokenSource = new(); + + public VoiceAuthoritativeServer(ServerOptions options) + { + Options = options; + Socket = new UdpClient(new IPEndPoint(IPAddress.Any, Options.Port)); + } + + public void RequestStop() => StopTokenSource.Cancel(); + + public async Task RunAsync() + { + Console.WriteLine($"Authoritative voice server listening on udp://0.0.0.0:{Options.Port}"); + using PeriodicTimer cleanupTimer = new(TimeSpan.FromSeconds(1)); + + Task receiveLoop = ReceiveLoopAsync(StopTokenSource.Token); + Task cleanupLoop = CleanupLoopAsync(cleanupTimer, StopTokenSource.Token); + + await Task.WhenAny(receiveLoop, cleanupLoop); + StopTokenSource.Cancel(); + + try + { + await Task.WhenAll(receiveLoop, cleanupLoop); + } + catch (OperationCanceledException) + { + // expected on shutdown + } + } + + private async Task ReceiveLoopAsync(CancellationToken cancellationToken) + { + while (!cancellationToken.IsCancellationRequested) + { + UdpReceiveResult result = await Socket.ReceiveAsync(cancellationToken); + HandlePacket(result.Buffer, result.RemoteEndPoint); + } + } + + private async Task CleanupLoopAsync(PeriodicTimer timer, CancellationToken cancellationToken) + { + while (await timer.WaitForNextTickAsync(cancellationToken)) + { + DateTime cutoffUtc = DateTime.UtcNow.AddSeconds(-Options.ClientTimeoutSeconds); + List staleClientIds = []; + + foreach (KeyValuePair pair in SessionsById) + { + if (pair.Value.LastSeenUtc < cutoffUtc) + staleClientIds.Add(pair.Key); + } + + foreach (Guid staleClientId in staleClientIds) + RemoveClient(staleClientId, notifyRoom: true); + } + } + + private void HandlePacket(byte[] packet, IPEndPoint remoteEndpoint) + { + if (packet.Length == 0) + return; + + ClientPacketType packetType = (ClientPacketType)packet[0]; + switch (packetType) + { + case ClientPacketType.Hello: + HandleHello(packet, remoteEndpoint); + break; + case ClientPacketType.Voice: + HandleVoice(packet, remoteEndpoint); + break; + case ClientPacketType.Leave: + HandleLeave(packet, remoteEndpoint); + break; + case ClientPacketType.Ping: + HandlePing(packet, remoteEndpoint); + break; + default: + SendToEndpoint(Protocol.BuildError(ErrorCode.InvalidPacket, "Unknown packet type"), remoteEndpoint); + break; + } + } + + private void HandleHello(byte[] packet, IPEndPoint remoteEndpoint) + { + if (!Protocol.TryReadHello(packet, out Guid clientId, out string room, out string userName)) + { + SendToEndpoint(Protocol.BuildError(ErrorCode.InvalidPacket, "Invalid hello packet"), remoteEndpoint); + return; + } + + room = room.Trim(); + userName = userName.Trim(); + if (room.Length == 0 || room.Length > 64 || userName.Length == 0 || userName.Length > 64) + { + SendToEndpoint(Protocol.BuildError(ErrorCode.InvalidPacket, "Invalid room or user name"), remoteEndpoint); + return; + } + + if (!RoomMembers.TryGetValue(room, out HashSet? existingRoomMembers)) + { + existingRoomMembers = []; + RoomMembers[room] = existingRoomMembers; + } + + if (!SessionsById.TryGetValue(clientId, out ClientSession? session)) + { + if (existingRoomMembers.Count >= Options.MaxRoomMembers) + { + SendToEndpoint(Protocol.BuildError(ErrorCode.RoomFull, "Room is full"), remoteEndpoint); + return; + } + + session = new ClientSession(clientId, room, userName, remoteEndpoint, Options.MaxVoicePacketsPerSecond); + SessionsById[clientId] = session; + existingRoomMembers.Add(clientId); + + SendToEndpoint(Protocol.BuildWelcome(clientId), remoteEndpoint); + BroadcastToRoom(room, Protocol.BuildPeerJoined(clientId, userName), exceptClientId: clientId); + + Console.WriteLine($"Client {clientId} joined room '{room}' as '{userName}' from {remoteEndpoint}"); + return; + } + + // Rejoin or endpoint migration for existing client id. + if (!StringComparer.Ordinal.Equals(session.RoomName, room)) + { + RemoveFromRoom(session.ClientId, session.RoomName); + if (existingRoomMembers.Count >= Options.MaxRoomMembers) + { + SendToEndpoint(Protocol.BuildError(ErrorCode.RoomFull, "Room is full"), remoteEndpoint); + return; + } + + existingRoomMembers.Add(session.ClientId); + session.RoomName = room; + } + + if (!StringComparer.Ordinal.Equals(session.UserName, userName)) + session.UserName = userName; + + session.Endpoint = remoteEndpoint; + session.LastSeenUtc = DateTime.UtcNow; + + SendToEndpoint(Protocol.BuildWelcome(clientId), remoteEndpoint); + Console.WriteLine($"Client {clientId} refreshed session in room '{room}' from {remoteEndpoint}"); + } + + private void HandleVoice(byte[] packet, IPEndPoint remoteEndpoint) + { + if (!Protocol.TryReadVoice(packet, out Guid clientId, out uint sequence, out ReadOnlySpan payload)) + { + SendToEndpoint(Protocol.BuildError(ErrorCode.InvalidPacket, "Invalid voice packet"), remoteEndpoint); + return; + } + + if (!SessionsById.TryGetValue(clientId, out ClientSession? session)) + { + SendToEndpoint(Protocol.BuildError(ErrorCode.NotRegistered, "Client not registered"), remoteEndpoint); + return; + } + + if (!EndpointsEqual(session.Endpoint, remoteEndpoint)) + { + SendToEndpoint(Protocol.BuildError(ErrorCode.UnauthorizedEndpoint, "Invalid source endpoint"), remoteEndpoint); + return; + } + + if (payload.Length == 0 || payload.Length > Options.MaxVoicePayloadBytes) + { + SendToEndpoint(Protocol.BuildError(ErrorCode.PayloadTooLarge, "Voice payload out of range"), remoteEndpoint); + return; + } + + if (!session.VoiceRateLimiter.TryConsume(1)) + { + SendToEndpoint(Protocol.BuildError(ErrorCode.RateLimited, "Voice packet rate exceeded"), remoteEndpoint); + return; + } + + if (sequence <= session.LastVoiceSequence) + return; + + session.LastVoiceSequence = sequence; + session.LastSeenUtc = DateTime.UtcNow; + + byte[] relayPacket = Protocol.BuildVoiceRelay(clientId, sequence, payload); + BroadcastToRoom(session.RoomName, relayPacket, exceptClientId: clientId); + } + + private void HandleLeave(byte[] packet, IPEndPoint remoteEndpoint) + { + if (!Protocol.TryReadLeave(packet, out Guid clientId)) + { + SendToEndpoint(Protocol.BuildError(ErrorCode.InvalidPacket, "Invalid leave packet"), remoteEndpoint); + return; + } + + if (!SessionsById.TryGetValue(clientId, out ClientSession? session)) + return; + + if (!EndpointsEqual(session.Endpoint, remoteEndpoint)) + { + SendToEndpoint(Protocol.BuildError(ErrorCode.UnauthorizedEndpoint, "Invalid source endpoint"), remoteEndpoint); + return; + } + + RemoveClient(clientId, notifyRoom: true); + } + + private void HandlePing(byte[] packet, IPEndPoint remoteEndpoint) + { + if (!Protocol.TryReadPing(packet, out Guid clientId)) + return; + + if (SessionsById.TryGetValue(clientId, out ClientSession? session) && EndpointsEqual(session.Endpoint, remoteEndpoint)) + session.LastSeenUtc = DateTime.UtcNow; + + SendToEndpoint(Protocol.BuildPong(clientId), remoteEndpoint); + } + + private void BroadcastToRoom(string room, byte[] packet, Guid? exceptClientId = null) + { + if (!RoomMembers.TryGetValue(room, out HashSet? memberIds)) + return; + + foreach (Guid memberId in memberIds) + { + if (exceptClientId.HasValue && memberId == exceptClientId.Value) + continue; + if (!SessionsById.TryGetValue(memberId, out ClientSession? memberSession)) + continue; + + SendToEndpoint(packet, memberSession.Endpoint); + } + } + + private void RemoveClient(Guid clientId, bool notifyRoom) + { + if (!SessionsById.TryGetValue(clientId, out ClientSession? session)) + return; + + SessionsById.Remove(clientId); + RemoveFromRoom(clientId, session.RoomName); + + if (notifyRoom) + BroadcastToRoom(session.RoomName, Protocol.BuildPeerLeft(clientId), exceptClientId: clientId); + + Console.WriteLine($"Client {clientId} left room '{session.RoomName}'"); + } + + private void RemoveFromRoom(Guid clientId, string roomName) + { + if (!RoomMembers.TryGetValue(roomName, out HashSet? memberIds)) + return; + + memberIds.Remove(clientId); + if (memberIds.Count == 0) + RoomMembers.Remove(roomName); + } + + private void SendToEndpoint(byte[] packet, IPEndPoint endpoint) + { + _ = Socket.SendAsync(packet, endpoint); + } + + private static bool EndpointsEqual(IPEndPoint a, IPEndPoint b) + => a.Port == b.Port && Equals(a.Address, b.Address); + + public void Dispose() + { + StopTokenSource.Cancel(); + Socket.Dispose(); + StopTokenSource.Dispose(); + } +} diff --git a/OpenVoiceSharp.csproj b/OpenVoiceSharp.csproj index b5b783f..7b007b1 100644 --- a/OpenVoiceSharp.csproj +++ b/OpenVoiceSharp.csproj @@ -24,6 +24,11 @@ + + + + + diff --git a/OpenVoiceSharp.sln b/OpenVoiceSharp.sln index d8f2af2..d57a94c 100644 --- a/OpenVoiceSharp.sln +++ b/OpenVoiceSharp.sln @@ -5,6 +5,8 @@ VisualStudioVersion = 17.7.34024.191 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenVoiceSharp", "OpenVoiceSharp.csproj", "{9AB99863-C04D-4CC2-A43D-71F174566DEC}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenVoiceSharp.AuthoritativeServer", "OpenVoiceSharp.AuthoritativeServer\OpenVoiceSharp.AuthoritativeServer.csproj", "{3D18F3C8-5B28-4809-B0B7-F49FD9FDD700}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -15,6 +17,10 @@ Global {9AB99863-C04D-4CC2-A43D-71F174566DEC}.Debug|x64.Build.0 = Debug|x64 {9AB99863-C04D-4CC2-A43D-71F174566DEC}.Release|x64.ActiveCfg = Release|x64 {9AB99863-C04D-4CC2-A43D-71F174566DEC}.Release|x64.Build.0 = Release|x64 + {3D18F3C8-5B28-4809-B0B7-F49FD9FDD700}.Debug|x64.ActiveCfg = Debug|Any CPU + {3D18F3C8-5B28-4809-B0B7-F49FD9FDD700}.Debug|x64.Build.0 = Debug|Any CPU + {3D18F3C8-5B28-4809-B0B7-F49FD9FDD700}.Release|x64.ActiveCfg = Release|Any CPU + {3D18F3C8-5B28-4809-B0B7-F49FD9FDD700}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/README.md b/README.md index 62072ab..4b2b9b2 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,22 @@ So upon learning how to make VoIP myself, I decided to share the knowledge into Everything you need to know or do can be found [in the wiki](https://github.com/realcoloride/OpenVoiceSharp/wiki). +## Authoritative Server + +This repository now includes a basic UDP authoritative voice server project: + +- `OpenVoiceSharp.AuthoritativeServer` + +Run it with: + +```bash +dotnet run --project OpenVoiceSharp.AuthoritativeServer -- --port 7777 +``` + +Protocol details are documented in: + +- `docs/AUTHORITATIVE_SERVER_PROTOCOL.md` + ## Contribute If you wish to contribute, you have a few ways: diff --git a/docs/AUTHORITATIVE_SERVER_PROTOCOL.md b/docs/AUTHORITATIVE_SERVER_PROTOCOL.md new file mode 100644 index 0000000..ca03680 --- /dev/null +++ b/docs/AUTHORITATIVE_SERVER_PROTOCOL.md @@ -0,0 +1,131 @@ +# OpenVoiceSharp Authoritative UDP Protocol + +This protocol is room-based and server-authoritative for voice packet routing. + +## Transport + +- UDP only. +- Default server endpoint: `0.0.0.0:7777`. +- Packet layout uses little-endian integers. + +## Client -> Server + +### `Hello` (`type=1`) + +Register or refresh a client session. + +```text +byte Type = 1 +bytes16 ClientId (GUID bytes) +byte RoomLength (0-255) +bytesN RoomUtf8 +byte UserLength (0-255) +bytesM UserUtf8 +``` + +### `Voice` (`type=2`) + +Submit one encoded Opus frame. + +```text +byte Type = 2 +bytes16 ClientId +uint32 Sequence +uint16 PayloadLength +bytesN OpusPayload +``` + +### `Leave` (`type=3`) + +```text +byte Type = 3 +bytes16 ClientId +``` + +### `Ping` (`type=4`) + +```text +byte Type = 4 +bytes16 ClientId +``` + +## Server -> Client + +### `Welcome` (`type=11`) + +```text +byte Type = 11 +bytes16 ClientId +``` + +### `VoiceRelay` (`type=12`) + +Forwarded voice packet from another peer in the same room. + +```text +byte Type = 12 +bytes16 SpeakerClientId +uint32 Sequence +uint16 PayloadLength +bytesN OpusPayload +``` + +### `Error` (`type=13`) + +```text +byte Type = 13 +byte ErrorCode +byte MessageLength +bytesN MessageUtf8 +``` + +Codes: + +- `1` InvalidPacket +- `2` NotRegistered +- `3` UnauthorizedEndpoint +- `4` RoomFull +- `5` RateLimited +- `6` PayloadTooLarge + +### `PeerJoined` (`type=14`) + +```text +byte Type = 14 +bytes16 ClientId +byte UserLength +bytesN UserUtf8 +``` + +### `PeerLeft` (`type=15`) + +```text +byte Type = 15 +bytes16 ClientId +``` + +### `Pong` (`type=16`) + +```text +byte Type = 16 +bytes16 ClientId +``` + +## Server Behavior + +- A client can only send voice from the endpoint that sent `Hello`. +- Voice packets are rate-limited per client. +- Voice sequence must be strictly increasing. +- Voice payload max size is configurable (`--max-voice-bytes`). +- Inactive clients are removed automatically (`--timeout-seconds`). + +## Running Server + +```bash +dotnet run --project OpenVoiceSharp.AuthoritativeServer -- \ + --port 7777 \ + --max-room-members 64 \ + --max-voice-bytes 4096 \ + --max-pps 80 \ + --timeout-seconds 30 +``` From aa984111a06b6e9b93899f27a973a15d5a7b8b23 Mon Sep 17 00:00:00 2001 From: wethecom Date: Thu, 16 Apr 2026 19:54:27 -0400 Subject: [PATCH 05/13] . --- AuthoritativeVoiceClient.cs | 432 +++++++++++++++++++++++++++++++++++ AuthoritativeVoiceSession.cs | 198 ++++++++++++++++ OpenVoiceSharp.csproj | 3 +- README.md | 28 +++ VoiceChatInterface.cs | 29 ++- 5 files changed, 684 insertions(+), 6 deletions(-) create mode 100644 AuthoritativeVoiceClient.cs create mode 100644 AuthoritativeVoiceSession.cs diff --git a/AuthoritativeVoiceClient.cs b/AuthoritativeVoiceClient.cs new file mode 100644 index 0000000..6ab8703 --- /dev/null +++ b/AuthoritativeVoiceClient.cs @@ -0,0 +1,432 @@ +using System.Buffers.Binary; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading; + +namespace OpenVoiceSharp +{ + /// + /// UDP client for the OpenVoiceSharp authoritative voice server. + /// Handles room join/leave, voice packet send/receive, and peer events. + /// + public sealed class AuthoritativeVoiceClient : IDisposable + { + // protocol packet types + private const byte ClientHello = 1; + private const byte ClientVoice = 2; + private const byte ClientLeave = 3; + private const byte ClientPing = 4; + + private const byte ServerWelcome = 11; + private const byte ServerVoiceRelay = 12; + private const byte ServerError = 13; + private const byte ServerPeerJoined = 14; + private const byte ServerPeerLeft = 15; + private const byte ServerPong = 16; + + // events + public delegate void ConnectedEvent(Guid clientId); + public event ConnectedEvent? Connected; + + public delegate void PeerJoinedEvent(Guid clientId, string userName); + public event PeerJoinedEvent? PeerJoined; + + public delegate void PeerLeftEvent(Guid clientId); + public event PeerLeftEvent? PeerLeft; + + public delegate void VoicePacketReceivedEvent(Guid speakerClientId, uint sequence, byte[] payload, int length); + public event VoicePacketReceivedEvent? VoicePacketReceived; + + public delegate void ServerErrorEvent(byte errorCode, string message); + public event ServerErrorEvent? ErrorReceived; + + public delegate void PongReceivedEvent(Guid clientId); + public event PongReceivedEvent? PongReceived; + + public delegate void DisconnectedEvent(); + public event DisconnectedEvent? Disconnected; + + // settings + public string ServerHost { get; } + public int ServerPort { get; } + public string RoomName { get; private set; } + public string UserName { get; private set; } + public Guid ClientId { get; } + public bool IsConnected { get; private set; } + + private IPEndPoint? ServerEndpoint; + private UdpClient? UdpClient; + private CancellationTokenSource? ReceiveCancellationTokenSource; + private Task? ReceiveTask; + private TaskCompletionSource? PendingWelcomeTaskCompletionSource; + private int NextVoiceSequence; + private bool IsDisposed; + + public AuthoritativeVoiceClient( + string serverHost, + int serverPort, + string roomName, + string userName, + Guid? clientId = null + ) + { + if (string.IsNullOrWhiteSpace(serverHost)) + throw new ArgumentException("Server host is required.", nameof(serverHost)); + if (serverPort <= 0 || serverPort > 65535) + throw new ArgumentOutOfRangeException(nameof(serverPort)); + if (string.IsNullOrWhiteSpace(roomName)) + throw new ArgumentException("Room name is required.", nameof(roomName)); + if (string.IsNullOrWhiteSpace(userName)) + throw new ArgumentException("User name is required.", nameof(userName)); + + ServerHost = serverHost; + ServerPort = serverPort; + RoomName = roomName.Trim(); + UserName = userName.Trim(); + ClientId = clientId ?? Guid.NewGuid(); + } + + /// + /// Connects to the authoritative server and waits for welcome. + /// + /// Handshake timeout in milliseconds. + public async Task ConnectAsync(int handshakeTimeoutMs = 5000) + { + ThrowIfDisposed(); + if (IsConnected) + return; + if (handshakeTimeoutMs <= 0) + throw new ArgumentOutOfRangeException(nameof(handshakeTimeoutMs)); + + IPAddress[] addresses = await Dns.GetHostAddressesAsync(ServerHost).ConfigureAwait(false); + IPAddress? address = Array.Find(addresses, static ip => ip.AddressFamily == AddressFamily.InterNetwork) + ?? Array.Find(addresses, static ip => ip.AddressFamily == AddressFamily.InterNetworkV6); + + if (address is null) + throw new InvalidOperationException($"Could not resolve server host: {ServerHost}"); + + ServerEndpoint = new IPEndPoint(address, ServerPort); + UdpClient = new UdpClient(address.AddressFamily); + ReceiveCancellationTokenSource = new CancellationTokenSource(); + PendingWelcomeTaskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + ReceiveTask = Task.Run(ReceiveLoopAsync); + + byte[] helloPacket = BuildHelloPacket(ClientId, RoomName, UserName); + await UdpClient.SendAsync(helloPacket, helloPacket.Length, ServerEndpoint).ConfigureAwait(false); + + Task delayTask = Task.Delay(handshakeTimeoutMs); + Task completedTask = await Task.WhenAny(PendingWelcomeTaskCompletionSource.Task, delayTask).ConfigureAwait(false); + if (completedTask != PendingWelcomeTaskCompletionSource.Task) + { + await DisconnectAsync().ConfigureAwait(false); + throw new TimeoutException("Did not receive welcome packet from server in time."); + } + + // Observe the task in case it faulted. + _ = await PendingWelcomeTaskCompletionSource.Task.ConfigureAwait(false); + } + + /// + /// Sends an encoded Opus payload to the server for room broadcast. + /// + public async Task SendVoiceAsync(byte[] encodedOpusPayload, int length) + { + ThrowIfDisposed(); + if (!IsConnected || UdpClient is null || ServerEndpoint is null) + throw new InvalidOperationException("Client is not connected."); + if (encodedOpusPayload is null) + throw new ArgumentNullException(nameof(encodedOpusPayload)); + if (length <= 0 || length > encodedOpusPayload.Length) + throw new ArgumentOutOfRangeException(nameof(length)); + if (length > ushort.MaxValue) + throw new ArgumentOutOfRangeException(nameof(length), "Payload length must be <= 65535."); + + uint sequence = unchecked((uint)Interlocked.Increment(ref NextVoiceSequence)); + byte[] packet = BuildVoicePacket(ClientId, sequence, encodedOpusPayload, length); + await UdpClient.SendAsync(packet, packet.Length, ServerEndpoint).ConfigureAwait(false); + } + + /// + /// Sends a ping packet. + /// + public async Task PingAsync() + { + ThrowIfDisposed(); + if (!IsConnected || UdpClient is null || ServerEndpoint is null) + throw new InvalidOperationException("Client is not connected."); + + byte[] pingPacket = BuildSingleGuidPacket(ClientPing, ClientId); + await UdpClient.SendAsync(pingPacket, pingPacket.Length, ServerEndpoint).ConfigureAwait(false); + } + + /// + /// Disconnects from the server and stops receive loop. + /// + public async Task DisconnectAsync() + { + if (UdpClient is not null && ServerEndpoint is not null) + { + try + { + byte[] leavePacket = BuildSingleGuidPacket(ClientLeave, ClientId); + await UdpClient.SendAsync(leavePacket, leavePacket.Length, ServerEndpoint).ConfigureAwait(false); + } + catch + { + // ignore transport errors during disconnect + } + } + + await StopNetworkingAsync().ConfigureAwait(false); + } + + private async Task ReceiveLoopAsync() + { + if (UdpClient is null) + return; + + try + { + while (!ReceiveCancellationTokenSource!.IsCancellationRequested) + { + UdpReceiveResult result = await UdpClient.ReceiveAsync().ConfigureAwait(false); + if (ServerEndpoint is null || !EndpointsEqual(result.RemoteEndPoint, ServerEndpoint)) + continue; + + HandleServerPacket(result.Buffer); + } + } + catch (ObjectDisposedException) + { + // expected on shutdown + } + catch (SocketException) + { + // expected on shutdown/close path + } + catch (Exception exception) + { + ErrorReceived?.Invoke(0, $"Receive loop failed: {exception.Message}"); + } + finally + { + if (IsConnected) + { + IsConnected = false; + Disconnected?.Invoke(); + } + } + } + + private void HandleServerPacket(byte[] packet) + { + if (packet.Length == 0) + return; + + switch (packet[0]) + { + case ServerWelcome: + HandleWelcome(packet); + break; + case ServerVoiceRelay: + HandleVoiceRelay(packet); + break; + case ServerError: + HandleServerError(packet); + break; + case ServerPeerJoined: + HandlePeerJoined(packet); + break; + case ServerPeerLeft: + HandlePeerLeft(packet); + break; + case ServerPong: + HandlePong(packet); + break; + } + } + + private void HandleWelcome(byte[] packet) + { + if (packet.Length != 17) + return; + + Guid welcomeClientId = ReadGuid(packet, 1); + if (welcomeClientId != ClientId) + return; + + IsConnected = true; + PendingWelcomeTaskCompletionSource?.TrySetResult(welcomeClientId); + Connected?.Invoke(welcomeClientId); + } + + private void HandleVoiceRelay(byte[] packet) + { + if (packet.Length < 23) + return; + + Guid speakerClientId = ReadGuid(packet, 1); + uint sequence = BinaryPrimitives.ReadUInt32LittleEndian(packet.AsSpan(17, 4)); + ushort payloadLength = BinaryPrimitives.ReadUInt16LittleEndian(packet.AsSpan(21, 2)); + if (packet.Length != 23 + payloadLength) + return; + + byte[] payload = new byte[payloadLength]; + Buffer.BlockCopy(packet, 23, payload, 0, payloadLength); + VoicePacketReceived?.Invoke(speakerClientId, sequence, payload, payload.Length); + } + + private void HandleServerError(byte[] packet) + { + if (packet.Length < 3) + return; + + byte errorCode = packet[1]; + byte messageLength = packet[2]; + if (packet.Length != 3 + messageLength) + return; + + string message = Encoding.UTF8.GetString(packet, 3, messageLength); + ErrorReceived?.Invoke(errorCode, message); + } + + private void HandlePeerJoined(byte[] packet) + { + if (packet.Length < 18) + return; + + Guid peerClientId = ReadGuid(packet, 1); + byte userNameLength = packet[17]; + if (packet.Length != 18 + userNameLength) + return; + + string userName = Encoding.UTF8.GetString(packet, 18, userNameLength); + PeerJoined?.Invoke(peerClientId, userName); + } + + private void HandlePeerLeft(byte[] packet) + { + if (packet.Length != 17) + return; + + Guid peerClientId = ReadGuid(packet, 1); + PeerLeft?.Invoke(peerClientId); + } + + private void HandlePong(byte[] packet) + { + if (packet.Length != 17) + return; + + Guid pongClientId = ReadGuid(packet, 1); + if (pongClientId == ClientId) + PongReceived?.Invoke(pongClientId); + } + + private async Task StopNetworkingAsync() + { + ReceiveCancellationTokenSource?.Cancel(); + + try + { + UdpClient?.Close(); + } + catch + { + // ignore close errors + } + + if (ReceiveTask is not null) + { + try + { + await ReceiveTask.ConfigureAwait(false); + } + catch + { + // ignore receive loop errors on shutdown + } + } + + ReceiveTask = null; + PendingWelcomeTaskCompletionSource = null; + UdpClient?.Dispose(); + UdpClient = null; + ReceiveCancellationTokenSource?.Dispose(); + ReceiveCancellationTokenSource = null; + ServerEndpoint = null; + + if (IsConnected) + { + IsConnected = false; + Disconnected?.Invoke(); + } + } + + public void Dispose() + { + if (IsDisposed) + return; + + IsDisposed = true; + StopNetworkingAsync().GetAwaiter().GetResult(); + } + + private void ThrowIfDisposed() + { + if (IsDisposed) + throw new ObjectDisposedException(nameof(AuthoritativeVoiceClient)); + } + + private static bool EndpointsEqual(IPEndPoint a, IPEndPoint b) + => a.Port == b.Port && Equals(a.Address, b.Address); + + private static Guid ReadGuid(byte[] data, int startIndex) + { + byte[] guidBytes = new byte[16]; + Buffer.BlockCopy(data, startIndex, guidBytes, 0, 16); + return new Guid(guidBytes); + } + + private static byte[] BuildSingleGuidPacket(byte packetType, Guid clientId) + { + byte[] packet = new byte[17]; + packet[0] = packetType; + clientId.TryWriteBytes(packet.AsSpan(1, 16)); + return packet; + } + + private static byte[] BuildHelloPacket(Guid clientId, string roomName, string userName) + { + byte[] roomNameBytes = Encoding.UTF8.GetBytes(roomName); + byte[] userNameBytes = Encoding.UTF8.GetBytes(userName); + if (roomNameBytes.Length > byte.MaxValue) + throw new ArgumentException("Room name is too long after UTF8 encoding.", nameof(roomName)); + if (userNameBytes.Length > byte.MaxValue) + throw new ArgumentException("User name is too long after UTF8 encoding.", nameof(userName)); + + byte[] packet = new byte[19 + roomNameBytes.Length + userNameBytes.Length]; + packet[0] = ClientHello; + clientId.TryWriteBytes(packet.AsSpan(1, 16)); + packet[17] = (byte)roomNameBytes.Length; + roomNameBytes.CopyTo(packet.AsSpan(18)); + + int userLengthIndex = 18 + roomNameBytes.Length; + packet[userLengthIndex] = (byte)userNameBytes.Length; + userNameBytes.CopyTo(packet.AsSpan(userLengthIndex + 1)); + return packet; + } + + private static byte[] BuildVoicePacket(Guid clientId, uint sequence, byte[] payload, int payloadLength) + { + byte[] packet = new byte[23 + payloadLength]; + packet[0] = ClientVoice; + clientId.TryWriteBytes(packet.AsSpan(1, 16)); + BinaryPrimitives.WriteUInt32LittleEndian(packet.AsSpan(17, 4), sequence); + BinaryPrimitives.WriteUInt16LittleEndian(packet.AsSpan(21, 2), (ushort)payloadLength); + Buffer.BlockCopy(payload, 0, packet, 23, payloadLength); + return packet; + } + } +} diff --git a/AuthoritativeVoiceSession.cs b/AuthoritativeVoiceSession.cs new file mode 100644 index 0000000..1241209 --- /dev/null +++ b/AuthoritativeVoiceSession.cs @@ -0,0 +1,198 @@ +using WebRtcVadSharp; + +namespace OpenVoiceSharp +{ + /// + /// High-level helper that wires microphone capture, Opus encode/decode, + /// and authoritative server networking into one session. + /// + public sealed class AuthoritativeVoiceSession : IDisposable + { + public delegate void DecodedVoiceFrameEvent(Guid speakerClientId, uint sequence, byte[] pcmData, int length); + public event DecodedVoiceFrameEvent? VoiceFrameDecoded; + + public delegate void SessionErrorEvent(string message, Exception? exception); + public event SessionErrorEvent? SessionError; + + public AuthoritativeVoiceClient Client { get; } + public VoiceChatInterface VoiceChatInterface { get; } + public BasicMicrophoneRecorder Recorder { get; } + + public bool GateOutgoingByVoiceActivity { get; set; } = true; + public bool IsRunning { get; private set; } + + private readonly int ExpectedPcmFrameSize; + private bool IsDisposed; + private bool IsSubscribed; + + public AuthoritativeVoiceSession( + string serverHost, + int serverPort, + string roomName, + string userName, + int bitrate = VoiceChatInterface.DefaultBitrate, + bool stereo = false, + bool enableNoiseSuppression = true, + bool favorAudioStreaming = false, + OperatingMode? vadOperatingMode = null + ) + { + Client = new AuthoritativeVoiceClient(serverHost, serverPort, roomName, userName); + VoiceChatInterface = new VoiceChatInterface( + bitrate, + stereo, + enableNoiseSuppression, + favorAudioStreaming, + vadOperatingMode + ); + Recorder = new BasicMicrophoneRecorder(stereo); + ExpectedPcmFrameSize = VoiceUtilities.GetSampleSize(stereo ? 2 : 1); + } + + /// + /// Connects to the authoritative server and starts microphone capture. + /// + public async Task StartAsync(int handshakeTimeoutMs = 5000) + { + ThrowIfDisposed(); + if (IsRunning) + return; + + SubscribeEvents(); + + try + { + await Client.ConnectAsync(handshakeTimeoutMs).ConfigureAwait(false); + Recorder.StartRecording(); + IsRunning = true; + } + catch (Exception exception) + { + SessionError?.Invoke("Failed to start voice session.", exception); + await StopAsync().ConfigureAwait(false); + throw; + } + } + + /// + /// Stops microphone capture and disconnects from the server. + /// + public async Task StopAsync() + { + if (!IsRunning && !IsSubscribed) + return; + + try + { + if (Recorder.IsRecording) + Recorder.StopRecording(); + } + catch (Exception exception) + { + SessionError?.Invoke("Failed to stop microphone recorder cleanly.", exception); + } + + try + { + await Client.DisconnectAsync().ConfigureAwait(false); + } + catch (Exception exception) + { + SessionError?.Invoke("Failed to disconnect voice client cleanly.", exception); + } + + UnsubscribeEvents(); + IsRunning = false; + } + + private void SubscribeEvents() + { + if (IsSubscribed) + return; + + Recorder.DataAvailable += OnMicrophoneDataAvailable; + Client.VoicePacketReceived += OnVoicePacketReceived; + Client.ErrorReceived += OnClientErrorReceived; + IsSubscribed = true; + } + + private void UnsubscribeEvents() + { + if (!IsSubscribed) + return; + + Recorder.DataAvailable -= OnMicrophoneDataAvailable; + Client.VoicePacketReceived -= OnVoicePacketReceived; + Client.ErrorReceived -= OnClientErrorReceived; + IsSubscribed = false; + } + + private void OnClientErrorReceived(byte errorCode, string message) + => SessionError?.Invoke($"Server error ({errorCode}): {message}", null); + + private void OnMicrophoneDataAvailable(byte[] pcmData, int length) + { + if (!IsRunning) + return; + + if (length != ExpectedPcmFrameSize) + return; + + if (GateOutgoingByVoiceActivity && !VoiceChatInterface.IsSpeaking(pcmData)) + return; + + try + { + (byte[] encodedData, int encodedLength) = VoiceChatInterface.SubmitAudioData(pcmData, length); + _ = SendEncodedFrameAsync(encodedData, encodedLength); + } + catch (Exception exception) + { + SessionError?.Invoke("Failed to encode or enqueue outgoing voice frame.", exception); + } + } + + private async Task SendEncodedFrameAsync(byte[] encodedData, int encodedLength) + { + try + { + await Client.SendVoiceAsync(encodedData, encodedLength).ConfigureAwait(false); + } + catch (Exception exception) + { + SessionError?.Invoke("Failed to send outgoing voice frame.", exception); + } + } + + private void OnVoicePacketReceived(Guid speakerClientId, uint sequence, byte[] payload, int length) + { + try + { + (byte[] decodedData, int decodedLength) = VoiceChatInterface.WhenDataReceived(payload, length); + VoiceFrameDecoded?.Invoke(speakerClientId, sequence, decodedData, decodedLength); + } + catch (Exception exception) + { + SessionError?.Invoke("Failed to decode incoming voice frame.", exception); + } + } + + public void Dispose() + { + if (IsDisposed) + return; + + IsDisposed = true; + StopAsync().GetAwaiter().GetResult(); + Recorder.Dispose(); + VoiceChatInterface.Dispose(); + Client.Dispose(); + } + + private void ThrowIfDisposed() + { + if (IsDisposed) + throw new ObjectDisposedException(nameof(AuthoritativeVoiceSession)); + } + } +} diff --git a/OpenVoiceSharp.csproj b/OpenVoiceSharp.csproj index 7b007b1..9e6c3d2 100644 --- a/OpenVoiceSharp.csproj +++ b/OpenVoiceSharp.csproj @@ -30,7 +30,8 @@ - + + diff --git a/README.md b/README.md index 4b2b9b2..63b61a4 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,34 @@ Protocol details are documented in: - `docs/AUTHORITATIVE_SERVER_PROTOCOL.md` +Client helper in the main library: + +- `AuthoritativeVoiceClient` + +Example: + +```csharp +var client = new AuthoritativeVoiceClient("127.0.0.1", 7777, "lobby", "PlayerOne"); +await client.ConnectAsync(); + +client.VoicePacketReceived += (speakerId, sequence, payload, length) => +{ + // decode payload with VoiceChatInterface.WhenDataReceived(...) +}; +``` + +One-call session helper: + +```csharp +var session = new AuthoritativeVoiceSession("127.0.0.1", 7777, "lobby", "PlayerOne"); +session.VoiceFrameDecoded += (speakerId, sequence, pcmData, length) => +{ + // submit pcmData to your playback pipeline +}; + +await session.StartAsync(); +``` + ## Contribute If you wish to contribute, you have a few ways: diff --git a/VoiceChatInterface.cs b/VoiceChatInterface.cs index cff16dd..e58bba6 100644 --- a/VoiceChatInterface.cs +++ b/VoiceChatInterface.cs @@ -64,6 +64,10 @@ public sealed class VoiceChatInterface : IDisposable // stores float samples if needed private readonly float[] FloatSamples; + private readonly byte[] EncodeBuffer; + private readonly byte[] DecodeBuffer; + private readonly object EncodeLock = new(); + private readonly object DecodeLock = new(); private bool IsDisposed; private void ApplyNoiseSuppression(byte[] pcmData, int length) @@ -97,10 +101,16 @@ private void ApplyNoiseSuppression(byte[] pcmData, int length) nameof(length) ); - if (EnableNoiseSuppression) - ApplyNoiseSuppression(pcmData, length); + lock (EncodeLock) + { + if (EnableNoiseSuppression) + ApplyNoiseSuppression(pcmData, length); - return (OpusEncoder.Encode(pcmData, length, out int encodedLength), encodedLength); + int encodedLength = OpusEncoder.Encode(pcmData, length, EncodeBuffer, EncodeBuffer.Length); + byte[] encodedData = new byte[encodedLength]; + Buffer.BlockCopy(EncodeBuffer, 0, encodedData, 0, encodedLength); + return (encodedData, encodedLength); + } } /// @@ -117,7 +127,13 @@ private void ApplyNoiseSuppression(byte[] pcmData, int length) if (length <= 0 || length > encodedData.Length) throw new ArgumentOutOfRangeException(nameof(length)); - return (OpusDecoder.Decode(encodedData, length, out int decodedLength), decodedLength); + lock (DecodeLock) + { + int decodedLength = OpusDecoder.Decode(encodedData, length, DecodeBuffer, DecodeBuffer.Length); + byte[] decodedData = new byte[decodedLength]; + Buffer.BlockCopy(DecodeBuffer, 0, decodedData, 0, decodedLength); + return (decodedData, decodedLength); + } } /// @@ -146,6 +162,8 @@ public VoiceChatInterface( // fill float samples for noise suppression FloatSamples = new float[PcmFrameSize / 2]; + EncodeBuffer = new byte[PcmFrameSize]; + DecodeBuffer = new byte[PcmFrameSize]; // create opus encoder/decoder OpusEncoder = new( @@ -153,10 +171,11 @@ public VoiceChatInterface( SampleRate, channels ) { - Bitrate = Bitrate, VBR = false, ForceChannels = Stereo ? ForceChannels.Stereo : ForceChannels.Mono }; + // OpusDotNet 1.0.3 exposes bitrate through an obsolete property but still provides the setter method. + typeof(OpusEncoder).GetMethod("set_Bitrate")?.Invoke(OpusEncoder, new object[] { Bitrate }); // OpusDecoder takes (sampleRate, channels) — FrameLength is not a parameter OpusDecoder = new(SampleRate, channels); From 40f8c5e6f620f4b5c67351b082cb898915949147 Mon Sep 17 00:00:00 2001 From: wethecom Date: Thu, 16 Apr 2026 20:02:43 -0400 Subject: [PATCH 06/13] , --- AuthoritativeVoiceClient.cs | 36 +++++- AuthoritativeVoiceSession.cs | 3 +- .../Protocol.cs | 47 +++++++- .../ServerOptions.cs | 17 +++ .../VoiceAuthoritativeServer.cs | 54 ++++++++- .../WordPressAuthVerifier.cs | 112 ++++++++++++++++++ README.md | 25 +++- docs/AUTHORITATIVE_SERVER_PROTOCOL.md | 34 ++++++ 8 files changed, 317 insertions(+), 11 deletions(-) create mode 100644 OpenVoiceSharp.AuthoritativeServer/WordPressAuthVerifier.cs diff --git a/AuthoritativeVoiceClient.cs b/AuthoritativeVoiceClient.cs index 6ab8703..1484421 100644 --- a/AuthoritativeVoiceClient.cs +++ b/AuthoritativeVoiceClient.cs @@ -17,6 +17,7 @@ public sealed class AuthoritativeVoiceClient : IDisposable private const byte ClientVoice = 2; private const byte ClientLeave = 3; private const byte ClientPing = 4; + private const byte ClientAuthHello = 5; private const byte ServerWelcome = 11; private const byte ServerVoiceRelay = 12; @@ -52,6 +53,7 @@ public sealed class AuthoritativeVoiceClient : IDisposable public int ServerPort { get; } public string RoomName { get; private set; } public string UserName { get; private set; } + public string? AuthToken { get; } public Guid ClientId { get; } public bool IsConnected { get; private set; } @@ -68,6 +70,7 @@ public AuthoritativeVoiceClient( int serverPort, string roomName, string userName, + string? authToken = null, Guid? clientId = null ) { @@ -84,6 +87,7 @@ public AuthoritativeVoiceClient( ServerPort = serverPort; RoomName = roomName.Trim(); UserName = userName.Trim(); + AuthToken = string.IsNullOrWhiteSpace(authToken) ? null : authToken.Trim(); ClientId = clientId ?? Guid.NewGuid(); } @@ -112,7 +116,9 @@ public async Task ConnectAsync(int handshakeTimeoutMs = 5000) PendingWelcomeTaskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); ReceiveTask = Task.Run(ReceiveLoopAsync); - byte[] helloPacket = BuildHelloPacket(ClientId, RoomName, UserName); + byte[] helloPacket = string.IsNullOrWhiteSpace(AuthToken) + ? BuildHelloPacket(ClientId, RoomName, UserName) + : BuildAuthHelloPacket(ClientId, RoomName, UserName, AuthToken); await UdpClient.SendAsync(helloPacket, helloPacket.Length, ServerEndpoint).ConfigureAwait(false); Task delayTask = Task.Delay(handshakeTimeoutMs); @@ -428,5 +434,33 @@ private static byte[] BuildVoicePacket(Guid clientId, uint sequence, byte[] payl Buffer.BlockCopy(payload, 0, packet, 23, payloadLength); return packet; } + + private static byte[] BuildAuthHelloPacket(Guid clientId, string roomName, string userName, string authToken) + { + byte[] roomNameBytes = Encoding.UTF8.GetBytes(roomName); + byte[] userNameBytes = Encoding.UTF8.GetBytes(userName); + byte[] authTokenBytes = Encoding.UTF8.GetBytes(authToken); + if (roomNameBytes.Length > byte.MaxValue) + throw new ArgumentException("Room name is too long after UTF8 encoding.", nameof(roomName)); + if (userNameBytes.Length > byte.MaxValue) + throw new ArgumentException("User name is too long after UTF8 encoding.", nameof(userName)); + if (authTokenBytes.Length > ushort.MaxValue) + throw new ArgumentException("Auth token is too long after UTF8 encoding.", nameof(authToken)); + + byte[] packet = new byte[21 + roomNameBytes.Length + userNameBytes.Length + authTokenBytes.Length]; + packet[0] = ClientAuthHello; + clientId.TryWriteBytes(packet.AsSpan(1, 16)); + packet[17] = (byte)roomNameBytes.Length; + roomNameBytes.CopyTo(packet.AsSpan(18)); + + int userLengthIndex = 18 + roomNameBytes.Length; + packet[userLengthIndex] = (byte)userNameBytes.Length; + userNameBytes.CopyTo(packet.AsSpan(userLengthIndex + 1)); + + int tokenLengthIndex = userLengthIndex + 1 + userNameBytes.Length; + BinaryPrimitives.WriteUInt16LittleEndian(packet.AsSpan(tokenLengthIndex, 2), (ushort)authTokenBytes.Length); + authTokenBytes.CopyTo(packet.AsSpan(tokenLengthIndex + 2)); + return packet; + } } } diff --git a/AuthoritativeVoiceSession.cs b/AuthoritativeVoiceSession.cs index 1241209..15a6920 100644 --- a/AuthoritativeVoiceSession.cs +++ b/AuthoritativeVoiceSession.cs @@ -30,6 +30,7 @@ public AuthoritativeVoiceSession( int serverPort, string roomName, string userName, + string? authToken = null, int bitrate = VoiceChatInterface.DefaultBitrate, bool stereo = false, bool enableNoiseSuppression = true, @@ -37,7 +38,7 @@ public AuthoritativeVoiceSession( OperatingMode? vadOperatingMode = null ) { - Client = new AuthoritativeVoiceClient(serverHost, serverPort, roomName, userName); + Client = new AuthoritativeVoiceClient(serverHost, serverPort, roomName, userName, authToken); VoiceChatInterface = new VoiceChatInterface( bitrate, stereo, diff --git a/OpenVoiceSharp.AuthoritativeServer/Protocol.cs b/OpenVoiceSharp.AuthoritativeServer/Protocol.cs index 1bc652d..1510aff 100644 --- a/OpenVoiceSharp.AuthoritativeServer/Protocol.cs +++ b/OpenVoiceSharp.AuthoritativeServer/Protocol.cs @@ -8,7 +8,8 @@ internal enum ClientPacketType : byte Hello = 1, Voice = 2, Leave = 3, - Ping = 4 + Ping = 4, + AuthHello = 5 } internal enum ServerPacketType : byte @@ -28,7 +29,8 @@ internal enum ErrorCode : byte UnauthorizedEndpoint = 3, RoomFull = 4, RateLimited = 5, - PayloadTooLarge = 6 + PayloadTooLarge = 6, + AuthFailed = 7 } internal static class Protocol @@ -92,6 +94,47 @@ out ReadOnlySpan payload return true; } + public static bool TryReadAuthHello( + ReadOnlySpan packet, + out Guid clientId, + out string room, + out string userName, + out string authToken + ) + { + clientId = Guid.Empty; + room = string.Empty; + userName = string.Empty; + authToken = string.Empty; + + // Type(1) + ClientId(16) + RoomLen(1) + UserLen(1) + TokenLen(2) + if (packet.Length < 21 || packet[0] != (byte)ClientPacketType.AuthHello) + return false; + + clientId = new Guid(packet.Slice(1, 16)); + byte roomLength = packet[17]; + int roomStart = 18; + int userLenIndex = roomStart + roomLength; + if (packet.Length < userLenIndex + 1) + return false; + + byte userLength = packet[userLenIndex]; + int userStart = userLenIndex + 1; + int tokenLenIndex = userStart + userLength; + if (packet.Length < tokenLenIndex + 2) + return false; + + ushort tokenLength = BinaryPrimitives.ReadUInt16LittleEndian(packet.Slice(tokenLenIndex, 2)); + int tokenStart = tokenLenIndex + 2; + if (packet.Length != tokenStart + tokenLength) + return false; + + room = Encoding.UTF8.GetString(packet.Slice(roomStart, roomLength)); + userName = Encoding.UTF8.GetString(packet.Slice(userStart, userLength)); + authToken = Encoding.UTF8.GetString(packet.Slice(tokenStart, tokenLength)); + return room.Length > 0 && userName.Length > 0 && authToken.Length > 0; + } + public static bool TryReadLeave(ReadOnlySpan packet, out Guid clientId) { clientId = Guid.Empty; diff --git a/OpenVoiceSharp.AuthoritativeServer/ServerOptions.cs b/OpenVoiceSharp.AuthoritativeServer/ServerOptions.cs index 044f00d..f029dcd 100644 --- a/OpenVoiceSharp.AuthoritativeServer/ServerOptions.cs +++ b/OpenVoiceSharp.AuthoritativeServer/ServerOptions.cs @@ -7,6 +7,9 @@ internal sealed record ServerOptions public int MaxVoicePayloadBytes { get; init; } = 4096; public int MaxVoicePacketsPerSecond { get; init; } = 80; public int ClientTimeoutSeconds { get; init; } = 30; + public string? WordPressVerifyUrl { get; init; } + public string? WordPressSharedSecret { get; init; } + public int WordPressTimeoutSeconds { get; init; } = 5; public static ServerOptions FromArgs(string[] args) { @@ -40,6 +43,20 @@ public static ServerOptions FromArgs(string[] args) if (int.TryParse(args[++i], out int timeoutSeconds) && timeoutSeconds >= 5) options = options with { ClientTimeoutSeconds = timeoutSeconds }; break; + case "--wp-verify-url": + string verifyUrl = args[++i].Trim(); + if (!string.IsNullOrWhiteSpace(verifyUrl)) + options = options with { WordPressVerifyUrl = verifyUrl }; + break; + case "--wp-shared-secret": + string sharedSecret = args[++i].Trim(); + if (!string.IsNullOrWhiteSpace(sharedSecret)) + options = options with { WordPressSharedSecret = sharedSecret }; + break; + case "--wp-timeout-seconds": + if (int.TryParse(args[++i], out int wpTimeoutSeconds) && wpTimeoutSeconds >= 1) + options = options with { WordPressTimeoutSeconds = wpTimeoutSeconds }; + break; } } diff --git a/OpenVoiceSharp.AuthoritativeServer/VoiceAuthoritativeServer.cs b/OpenVoiceSharp.AuthoritativeServer/VoiceAuthoritativeServer.cs index 1fae410..70953b4 100644 --- a/OpenVoiceSharp.AuthoritativeServer/VoiceAuthoritativeServer.cs +++ b/OpenVoiceSharp.AuthoritativeServer/VoiceAuthoritativeServer.cs @@ -7,6 +7,7 @@ internal sealed class VoiceAuthoritativeServer : IDisposable { private readonly ServerOptions Options; private readonly UdpClient Socket; + private readonly WordPressAuthVerifier? WordPressAuthVerifier; private readonly Dictionary SessionsById = []; private readonly Dictionary> RoomMembers = new(StringComparer.Ordinal); private readonly CancellationTokenSource StopTokenSource = new(); @@ -15,6 +16,14 @@ public VoiceAuthoritativeServer(ServerOptions options) { Options = options; Socket = new UdpClient(new IPEndPoint(IPAddress.Any, Options.Port)); + if (!string.IsNullOrWhiteSpace(Options.WordPressVerifyUrl)) + { + WordPressAuthVerifier = new WordPressAuthVerifier( + Options.WordPressVerifyUrl, + Options.WordPressSharedSecret, + Options.WordPressTimeoutSeconds + ); + } } public void RequestStop() => StopTokenSource.Cancel(); @@ -22,6 +31,8 @@ public VoiceAuthoritativeServer(ServerOptions options) public async Task RunAsync() { Console.WriteLine($"Authoritative voice server listening on udp://0.0.0.0:{Options.Port}"); + if (WordPressAuthVerifier is not null) + Console.WriteLine("WordPress auth verification is enabled."); using PeriodicTimer cleanupTimer = new(TimeSpan.FromSeconds(1)); Task receiveLoop = ReceiveLoopAsync(StopTokenSource.Token); @@ -45,7 +56,7 @@ private async Task ReceiveLoopAsync(CancellationToken cancellationToken) while (!cancellationToken.IsCancellationRequested) { UdpReceiveResult result = await Socket.ReceiveAsync(cancellationToken); - HandlePacket(result.Buffer, result.RemoteEndPoint); + await HandlePacketAsync(result.Buffer, result.RemoteEndPoint, cancellationToken).ConfigureAwait(false); } } @@ -67,7 +78,7 @@ private async Task CleanupLoopAsync(PeriodicTimer timer, CancellationToken cance } } - private void HandlePacket(byte[] packet, IPEndPoint remoteEndpoint) + private async Task HandlePacketAsync(byte[] packet, IPEndPoint remoteEndpoint, CancellationToken cancellationToken) { if (packet.Length == 0) return; @@ -76,7 +87,10 @@ private void HandlePacket(byte[] packet, IPEndPoint remoteEndpoint) switch (packetType) { case ClientPacketType.Hello: - HandleHello(packet, remoteEndpoint); + await HandleHelloAsync(packet, remoteEndpoint, isAuthHello: false, cancellationToken).ConfigureAwait(false); + break; + case ClientPacketType.AuthHello: + await HandleHelloAsync(packet, remoteEndpoint, isAuthHello: true, cancellationToken).ConfigureAwait(false); break; case ClientPacketType.Voice: HandleVoice(packet, remoteEndpoint); @@ -93,14 +107,43 @@ private void HandlePacket(byte[] packet, IPEndPoint remoteEndpoint) } } - private void HandleHello(byte[] packet, IPEndPoint remoteEndpoint) + private async Task HandleHelloAsync( + byte[] packet, + IPEndPoint remoteEndpoint, + bool isAuthHello, + CancellationToken cancellationToken + ) { - if (!Protocol.TryReadHello(packet, out Guid clientId, out string room, out string userName)) + Guid clientId; + string room; + string userName; + string authToken = string.Empty; + + bool parsed = isAuthHello + ? Protocol.TryReadAuthHello(packet, out clientId, out room, out userName, out authToken) + : Protocol.TryReadHello(packet, out clientId, out room, out userName); + if (!parsed) { SendToEndpoint(Protocol.BuildError(ErrorCode.InvalidPacket, "Invalid hello packet"), remoteEndpoint); return; } + if (WordPressAuthVerifier is not null) + { + if (!isAuthHello || string.IsNullOrWhiteSpace(authToken)) + { + SendToEndpoint(Protocol.BuildError(ErrorCode.AuthFailed, "Authentication token is required."), remoteEndpoint); + return; + } + + (bool valid, string message) = await WordPressAuthVerifier.VerifyAsync(authToken, cancellationToken).ConfigureAwait(false); + if (!valid) + { + SendToEndpoint(Protocol.BuildError(ErrorCode.AuthFailed, message), remoteEndpoint); + return; + } + } + room = room.Trim(); userName = userName.Trim(); if (room.Length == 0 || room.Length > 64 || userName.Length == 0 || userName.Length > 64) @@ -282,6 +325,7 @@ private static bool EndpointsEqual(IPEndPoint a, IPEndPoint b) public void Dispose() { StopTokenSource.Cancel(); + WordPressAuthVerifier?.Dispose(); Socket.Dispose(); StopTokenSource.Dispose(); } diff --git a/OpenVoiceSharp.AuthoritativeServer/WordPressAuthVerifier.cs b/OpenVoiceSharp.AuthoritativeServer/WordPressAuthVerifier.cs new file mode 100644 index 0000000..b19a84f --- /dev/null +++ b/OpenVoiceSharp.AuthoritativeServer/WordPressAuthVerifier.cs @@ -0,0 +1,112 @@ +using System.Net.Http.Headers; +using System.Text.Json; + +namespace OpenVoiceSharp.AuthoritativeServer; + +internal sealed class WordPressAuthVerifier : IDisposable +{ + private readonly Uri VerifyUri; + private readonly string? SharedSecret; + private readonly HttpClient HttpClient; + + public WordPressAuthVerifier(string verifyUrl, string? sharedSecret, int timeoutSeconds) + { + VerifyUri = new Uri(verifyUrl, UriKind.Absolute); + SharedSecret = string.IsNullOrWhiteSpace(sharedSecret) ? null : sharedSecret; + HttpClient = new HttpClient + { + Timeout = TimeSpan.FromSeconds(timeoutSeconds) + }; + } + + public async Task<(bool isValid, string message)> VerifyAsync(string token, CancellationToken cancellationToken) + { + using HttpRequestMessage request = new(HttpMethod.Get, VerifyUri); + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token); + if (!string.IsNullOrWhiteSpace(SharedSecret)) + request.Headers.Add("X-OpenVoiceSharp-Secret", SharedSecret); + + HttpResponseMessage response; + try + { + response = await HttpClient.SendAsync(request, cancellationToken).ConfigureAwait(false); + } + catch (Exception exception) + { + return (false, $"WordPress verify request failed: {exception.Message}"); + } + + string responseText = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); + if (!response.IsSuccessStatusCode) + return (false, $"WordPress verify rejected token ({(int)response.StatusCode})."); + + if (TryParseValidFlag(responseText, out bool valid)) + return valid ? (true, "ok") : (false, "WordPress token invalid."); + + // If endpoint returns 200 with non-standard body, treat as failure for safety. + return (false, "WordPress verify response did not contain a valid=true flag."); + } + + private static bool TryParseValidFlag(string json, out bool valid) + { + valid = false; + if (string.IsNullOrWhiteSpace(json)) + return false; + + try + { + using JsonDocument document = JsonDocument.Parse(json); + JsonElement root = document.RootElement; + + if (TryReadBoolean(root, "valid", out valid) || + TryReadBoolean(root, "success", out valid) || + TryReadBoolean(root, "authenticated", out valid)) + return true; + + if (root.TryGetProperty("data", out JsonElement data) && data.ValueKind == JsonValueKind.Object) + { + if (TryReadBoolean(data, "valid", out valid) || + TryReadBoolean(data, "success", out valid) || + TryReadBoolean(data, "authenticated", out valid)) + return true; + } + } + catch + { + return false; + } + + return false; + } + + private static bool TryReadBoolean(JsonElement element, string propertyName, out bool value) + { + value = false; + if (!element.TryGetProperty(propertyName, out JsonElement property)) + return false; + + if (property.ValueKind == JsonValueKind.True) + { + value = true; + return true; + } + if (property.ValueKind == JsonValueKind.False) + { + value = false; + return true; + } + if (property.ValueKind == JsonValueKind.String) + { + string text = property.GetString() ?? string.Empty; + if (bool.TryParse(text, out bool parsed)) + { + value = parsed; + return true; + } + } + + return false; + } + + public void Dispose() => HttpClient.Dispose(); +} diff --git a/README.md b/README.md index 63b61a4..cdd6913 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,15 @@ Run it with: dotnet run --project OpenVoiceSharp.AuthoritativeServer -- --port 7777 ``` +With optional WordPress auth verification: + +```bash +dotnet run --project OpenVoiceSharp.AuthoritativeServer -- \ + --port 7777 \ + --wp-verify-url "https://your-site.com/wp-json/openvoicesharp/v1/verify" \ + --wp-shared-secret "server-to-wp-shared-secret" +``` + Protocol details are documented in: - `docs/AUTHORITATIVE_SERVER_PROTOCOL.md` @@ -75,7 +84,13 @@ Client helper in the main library: Example: ```csharp -var client = new AuthoritativeVoiceClient("127.0.0.1", 7777, "lobby", "PlayerOne"); +var client = new AuthoritativeVoiceClient( + "127.0.0.1", + 7777, + "lobby", + "PlayerOne", + authToken: "wordpress-access-token" +); await client.ConnectAsync(); client.VoicePacketReceived += (speakerId, sequence, payload, length) => @@ -87,7 +102,13 @@ client.VoicePacketReceived += (speakerId, sequence, payload, length) => One-call session helper: ```csharp -var session = new AuthoritativeVoiceSession("127.0.0.1", 7777, "lobby", "PlayerOne"); +var session = new AuthoritativeVoiceSession( + "127.0.0.1", + 7777, + "lobby", + "PlayerOne", + authToken: "wordpress-access-token" +); session.VoiceFrameDecoded += (speakerId, sequence, pcmData, length) => { // submit pcmData to your playback pipeline diff --git a/docs/AUTHORITATIVE_SERVER_PROTOCOL.md b/docs/AUTHORITATIVE_SERVER_PROTOCOL.md index ca03680..256914c 100644 --- a/docs/AUTHORITATIVE_SERVER_PROTOCOL.md +++ b/docs/AUTHORITATIVE_SERVER_PROTOCOL.md @@ -49,6 +49,21 @@ byte Type = 4 bytes16 ClientId ``` +### `AuthHello` (`type=5`) + +`AuthHello` is required when WordPress verification is enabled on the server. + +```text +byte Type = 5 +bytes16 ClientId (GUID bytes) +byte RoomLength +bytesN RoomUtf8 +byte UserLength +bytesM UserUtf8 +uint16 TokenLength +bytesK AuthTokenUtf8 +``` + ## Server -> Client ### `Welcome` (`type=11`) @@ -87,6 +102,7 @@ Codes: - `4` RoomFull - `5` RateLimited - `6` PayloadTooLarge +- `7` AuthFailed ### `PeerJoined` (`type=14`) @@ -129,3 +145,21 @@ dotnet run --project OpenVoiceSharp.AuthoritativeServer -- \ --max-pps 80 \ --timeout-seconds 30 ``` + +## WordPress Verification Mode + +Enable token verification against a WordPress endpoint: + +```bash +dotnet run --project OpenVoiceSharp.AuthoritativeServer -- \ + --port 7777 \ + --wp-verify-url "https://your-site.com/wp-json/openvoicesharp/v1/verify" \ + --wp-shared-secret "server-to-wp-shared-secret" \ + --wp-timeout-seconds 5 +``` + +Server request behavior: + +- Sends `Authorization: Bearer ` to your `--wp-verify-url`. +- Sends `X-OpenVoiceSharp-Secret` header when `--wp-shared-secret` is provided. +- Expects JSON containing one of: `valid`, `success`, or `authenticated` boolean fields (either at root or under `data`). From 37c2c20a49b7bd11ae5662b959c8d0564e33d09f Mon Sep 17 00:00:00 2001 From: wethecom Date: Thu, 16 Apr 2026 20:12:48 -0400 Subject: [PATCH 07/13] . --- AuthoritativeVoiceSession.cs | 42 ++++++++- .../ClientSession.cs | 2 +- .../SequenceWindow.cs | 42 +++++++++ .../ServerMetrics.cs | 19 ++++ .../VoiceAuthoritativeServer.cs | 81 ++++++++++++++-- VoiceJitterBuffer.cs | 93 +++++++++++++++++++ 6 files changed, 271 insertions(+), 8 deletions(-) create mode 100644 OpenVoiceSharp.AuthoritativeServer/SequenceWindow.cs create mode 100644 OpenVoiceSharp.AuthoritativeServer/ServerMetrics.cs create mode 100644 VoiceJitterBuffer.cs diff --git a/AuthoritativeVoiceSession.cs b/AuthoritativeVoiceSession.cs index 15a6920..7b20339 100644 --- a/AuthoritativeVoiceSession.cs +++ b/AuthoritativeVoiceSession.cs @@ -19,9 +19,13 @@ public sealed class AuthoritativeVoiceSession : IDisposable public BasicMicrophoneRecorder Recorder { get; } public bool GateOutgoingByVoiceActivity { get; set; } = true; + public bool EnableJitterBuffer { get; set; } = true; + public int JitterTargetPackets { get; } + public int JitterMaxPackets { get; } public bool IsRunning { get; private set; } private readonly int ExpectedPcmFrameSize; + private readonly Dictionary SpeakerJitterBuffers = new(); private bool IsDisposed; private bool IsSubscribed; @@ -35,9 +39,16 @@ public AuthoritativeVoiceSession( bool stereo = false, bool enableNoiseSuppression = true, bool favorAudioStreaming = false, - OperatingMode? vadOperatingMode = null + OperatingMode? vadOperatingMode = null, + int jitterTargetPackets = 3, + int jitterMaxPackets = 24 ) { + if (jitterTargetPackets < 1) + throw new ArgumentOutOfRangeException(nameof(jitterTargetPackets)); + if (jitterMaxPackets < jitterTargetPackets + 2) + throw new ArgumentOutOfRangeException(nameof(jitterMaxPackets)); + Client = new AuthoritativeVoiceClient(serverHost, serverPort, roomName, userName, authToken); VoiceChatInterface = new VoiceChatInterface( bitrate, @@ -48,6 +59,8 @@ public AuthoritativeVoiceSession( ); Recorder = new BasicMicrophoneRecorder(stereo); ExpectedPcmFrameSize = VoiceUtilities.GetSampleSize(stereo ? 2 : 1); + JitterTargetPackets = jitterTargetPackets; + JitterMaxPackets = jitterMaxPackets; } /// @@ -103,6 +116,7 @@ public async Task StopAsync() } UnsubscribeEvents(); + SpeakerJitterBuffers.Clear(); IsRunning = false; } @@ -166,6 +180,32 @@ private async Task SendEncodedFrameAsync(byte[] encodedData, int encodedLength) } private void OnVoicePacketReceived(Guid speakerClientId, uint sequence, byte[] payload, int length) + { + if (!EnableJitterBuffer) + { + DecodeAndEmit(speakerClientId, sequence, payload, length); + return; + } + + try + { + if (!SpeakerJitterBuffers.TryGetValue(speakerClientId, out VoiceJitterBuffer? buffer)) + { + buffer = new VoiceJitterBuffer(JitterTargetPackets, JitterMaxPackets); + SpeakerJitterBuffers[speakerClientId] = buffer; + } + + buffer.Add(sequence, payload, length); + foreach ((uint bufferedSequence, byte[] bufferedPayload) in buffer.DrainReady()) + DecodeAndEmit(speakerClientId, bufferedSequence, bufferedPayload, bufferedPayload.Length); + } + catch (Exception exception) + { + SessionError?.Invoke("Failed to decode incoming voice frame.", exception); + } + } + + private void DecodeAndEmit(Guid speakerClientId, uint sequence, byte[] payload, int length) { try { diff --git a/OpenVoiceSharp.AuthoritativeServer/ClientSession.cs b/OpenVoiceSharp.AuthoritativeServer/ClientSession.cs index e1fe0c7..e76fb03 100644 --- a/OpenVoiceSharp.AuthoritativeServer/ClientSession.cs +++ b/OpenVoiceSharp.AuthoritativeServer/ClientSession.cs @@ -9,8 +9,8 @@ internal sealed class ClientSession public string UserName { get; set; } public IPEndPoint Endpoint { get; set; } public DateTime LastSeenUtc { get; set; } - public uint LastVoiceSequence { get; set; } public TokenBucket VoiceRateLimiter { get; } + public SequenceWindow VoiceSequenceWindow { get; } = new(); public ClientSession(Guid clientId, string roomName, string userName, IPEndPoint endpoint, int maxVoicePacketsPerSecond) { diff --git a/OpenVoiceSharp.AuthoritativeServer/SequenceWindow.cs b/OpenVoiceSharp.AuthoritativeServer/SequenceWindow.cs new file mode 100644 index 0000000..47f2900 --- /dev/null +++ b/OpenVoiceSharp.AuthoritativeServer/SequenceWindow.cs @@ -0,0 +1,42 @@ +namespace OpenVoiceSharp.AuthoritativeServer; + +/// +/// Sliding anti-replay window for monotonic packet sequences. +/// Accepts out-of-order packets within a 64-sequence window. +/// +internal sealed class SequenceWindow +{ + private bool Initialized; + private uint NewestSequence; + private ulong SeenBitmap; + + public bool TryAccept(uint sequence) + { + if (!Initialized) + { + Initialized = true; + NewestSequence = sequence; + SeenBitmap = 1UL; + return true; + } + + if (sequence > NewestSequence) + { + uint shift = sequence - NewestSequence; + SeenBitmap = shift >= 64 ? 1UL : (SeenBitmap << (int)shift) | 1UL; + NewestSequence = sequence; + return true; + } + + uint delta = NewestSequence - sequence; + if (delta >= 64) + return false; + + ulong mask = 1UL << (int)delta; + if ((SeenBitmap & mask) != 0) + return false; + + SeenBitmap |= mask; + return true; + } +} diff --git a/OpenVoiceSharp.AuthoritativeServer/ServerMetrics.cs b/OpenVoiceSharp.AuthoritativeServer/ServerMetrics.cs new file mode 100644 index 0000000..d4478bc --- /dev/null +++ b/OpenVoiceSharp.AuthoritativeServer/ServerMetrics.cs @@ -0,0 +1,19 @@ +namespace OpenVoiceSharp.AuthoritativeServer; + +internal sealed class ServerMetrics +{ + public long PacketsReceived; + public long HelloPackets; + public long AuthHelloPackets; + public long VoicePacketsReceived; + public long VoicePacketsRelayed; + public long ErrorPacketsSent; + public long InvalidPacketsDropped; + public long RateLimitedDropped; + public long ReplayDropped; + public long PayloadDropped; + public long AuthFailures; + public long ClientsJoined; + public long ClientsLeft; + public long PingPackets; +} diff --git a/OpenVoiceSharp.AuthoritativeServer/VoiceAuthoritativeServer.cs b/OpenVoiceSharp.AuthoritativeServer/VoiceAuthoritativeServer.cs index 70953b4..cda329c 100644 --- a/OpenVoiceSharp.AuthoritativeServer/VoiceAuthoritativeServer.cs +++ b/OpenVoiceSharp.AuthoritativeServer/VoiceAuthoritativeServer.cs @@ -1,5 +1,7 @@ using System.Net; using System.Net.Sockets; +using System.Text.Json; +using System.Threading; namespace OpenVoiceSharp.AuthoritativeServer; @@ -11,6 +13,7 @@ internal sealed class VoiceAuthoritativeServer : IDisposable private readonly Dictionary SessionsById = []; private readonly Dictionary> RoomMembers = new(StringComparer.Ordinal); private readonly CancellationTokenSource StopTokenSource = new(); + private readonly ServerMetrics Metrics = new(); public VoiceAuthoritativeServer(ServerOptions options) { @@ -62,6 +65,7 @@ private async Task ReceiveLoopAsync(CancellationToken cancellationToken) private async Task CleanupLoopAsync(PeriodicTimer timer, CancellationToken cancellationToken) { + int ticks = 0; while (await timer.WaitForNextTickAsync(cancellationToken)) { DateTime cutoffUtc = DateTime.UtcNow.AddSeconds(-Options.ClientTimeoutSeconds); @@ -75,6 +79,10 @@ private async Task CleanupLoopAsync(PeriodicTimer timer, CancellationToken cance foreach (Guid staleClientId in staleClientIds) RemoveClient(staleClientId, notifyRoom: true); + + ticks++; + if (ticks % 10 == 0) + LogMetrics(); } } @@ -82,27 +90,33 @@ private async Task HandlePacketAsync(byte[] packet, IPEndPoint remoteEndpoint, C { if (packet.Length == 0) return; + Interlocked.Increment(ref Metrics.PacketsReceived); ClientPacketType packetType = (ClientPacketType)packet[0]; switch (packetType) { case ClientPacketType.Hello: + Interlocked.Increment(ref Metrics.HelloPackets); await HandleHelloAsync(packet, remoteEndpoint, isAuthHello: false, cancellationToken).ConfigureAwait(false); break; case ClientPacketType.AuthHello: + Interlocked.Increment(ref Metrics.AuthHelloPackets); await HandleHelloAsync(packet, remoteEndpoint, isAuthHello: true, cancellationToken).ConfigureAwait(false); break; case ClientPacketType.Voice: + Interlocked.Increment(ref Metrics.VoicePacketsReceived); HandleVoice(packet, remoteEndpoint); break; case ClientPacketType.Leave: HandleLeave(packet, remoteEndpoint); break; case ClientPacketType.Ping: + Interlocked.Increment(ref Metrics.PingPackets); HandlePing(packet, remoteEndpoint); break; default: SendToEndpoint(Protocol.BuildError(ErrorCode.InvalidPacket, "Unknown packet type"), remoteEndpoint); + Interlocked.Increment(ref Metrics.InvalidPacketsDropped); break; } } @@ -125,6 +139,7 @@ CancellationToken cancellationToken if (!parsed) { SendToEndpoint(Protocol.BuildError(ErrorCode.InvalidPacket, "Invalid hello packet"), remoteEndpoint); + Interlocked.Increment(ref Metrics.InvalidPacketsDropped); return; } @@ -133,6 +148,7 @@ CancellationToken cancellationToken if (!isAuthHello || string.IsNullOrWhiteSpace(authToken)) { SendToEndpoint(Protocol.BuildError(ErrorCode.AuthFailed, "Authentication token is required."), remoteEndpoint); + Interlocked.Increment(ref Metrics.AuthFailures); return; } @@ -140,6 +156,8 @@ CancellationToken cancellationToken if (!valid) { SendToEndpoint(Protocol.BuildError(ErrorCode.AuthFailed, message), remoteEndpoint); + Interlocked.Increment(ref Metrics.AuthFailures); + LogEvent("auth_failed", ("endpoint", remoteEndpoint.ToString()), ("reason", message)); return; } } @@ -149,6 +167,7 @@ CancellationToken cancellationToken if (room.Length == 0 || room.Length > 64 || userName.Length == 0 || userName.Length > 64) { SendToEndpoint(Protocol.BuildError(ErrorCode.InvalidPacket, "Invalid room or user name"), remoteEndpoint); + Interlocked.Increment(ref Metrics.InvalidPacketsDropped); return; } @@ -169,11 +188,12 @@ CancellationToken cancellationToken session = new ClientSession(clientId, room, userName, remoteEndpoint, Options.MaxVoicePacketsPerSecond); SessionsById[clientId] = session; existingRoomMembers.Add(clientId); + Interlocked.Increment(ref Metrics.ClientsJoined); SendToEndpoint(Protocol.BuildWelcome(clientId), remoteEndpoint); BroadcastToRoom(room, Protocol.BuildPeerJoined(clientId, userName), exceptClientId: clientId); - Console.WriteLine($"Client {clientId} joined room '{room}' as '{userName}' from {remoteEndpoint}"); + LogEvent("client_joined", ("clientId", clientId), ("room", room), ("user", userName), ("endpoint", remoteEndpoint.ToString())); return; } @@ -198,7 +218,7 @@ CancellationToken cancellationToken session.LastSeenUtc = DateTime.UtcNow; SendToEndpoint(Protocol.BuildWelcome(clientId), remoteEndpoint); - Console.WriteLine($"Client {clientId} refreshed session in room '{room}' from {remoteEndpoint}"); + LogEvent("client_refreshed", ("clientId", clientId), ("room", room), ("endpoint", remoteEndpoint.ToString())); } private void HandleVoice(byte[] packet, IPEndPoint remoteEndpoint) @@ -206,6 +226,7 @@ private void HandleVoice(byte[] packet, IPEndPoint remoteEndpoint) if (!Protocol.TryReadVoice(packet, out Guid clientId, out uint sequence, out ReadOnlySpan payload)) { SendToEndpoint(Protocol.BuildError(ErrorCode.InvalidPacket, "Invalid voice packet"), remoteEndpoint); + Interlocked.Increment(ref Metrics.InvalidPacketsDropped); return; } @@ -218,29 +239,34 @@ private void HandleVoice(byte[] packet, IPEndPoint remoteEndpoint) if (!EndpointsEqual(session.Endpoint, remoteEndpoint)) { SendToEndpoint(Protocol.BuildError(ErrorCode.UnauthorizedEndpoint, "Invalid source endpoint"), remoteEndpoint); + Interlocked.Increment(ref Metrics.InvalidPacketsDropped); return; } if (payload.Length == 0 || payload.Length > Options.MaxVoicePayloadBytes) { SendToEndpoint(Protocol.BuildError(ErrorCode.PayloadTooLarge, "Voice payload out of range"), remoteEndpoint); + Interlocked.Increment(ref Metrics.PayloadDropped); return; } if (!session.VoiceRateLimiter.TryConsume(1)) { SendToEndpoint(Protocol.BuildError(ErrorCode.RateLimited, "Voice packet rate exceeded"), remoteEndpoint); + Interlocked.Increment(ref Metrics.RateLimitedDropped); return; } - if (sequence <= session.LastVoiceSequence) + if (!session.VoiceSequenceWindow.TryAccept(sequence)) + { + Interlocked.Increment(ref Metrics.ReplayDropped); return; - - session.LastVoiceSequence = sequence; + } session.LastSeenUtc = DateTime.UtcNow; byte[] relayPacket = Protocol.BuildVoiceRelay(clientId, sequence, payload); BroadcastToRoom(session.RoomName, relayPacket, exceptClientId: clientId); + Interlocked.Increment(ref Metrics.VoicePacketsRelayed); } private void HandleLeave(byte[] packet, IPEndPoint remoteEndpoint) @@ -248,6 +274,7 @@ private void HandleLeave(byte[] packet, IPEndPoint remoteEndpoint) if (!Protocol.TryReadLeave(packet, out Guid clientId)) { SendToEndpoint(Protocol.BuildError(ErrorCode.InvalidPacket, "Invalid leave packet"), remoteEndpoint); + Interlocked.Increment(ref Metrics.InvalidPacketsDropped); return; } @@ -257,6 +284,7 @@ private void HandleLeave(byte[] packet, IPEndPoint remoteEndpoint) if (!EndpointsEqual(session.Endpoint, remoteEndpoint)) { SendToEndpoint(Protocol.BuildError(ErrorCode.UnauthorizedEndpoint, "Invalid source endpoint"), remoteEndpoint); + Interlocked.Increment(ref Metrics.InvalidPacketsDropped); return; } @@ -300,8 +328,9 @@ private void RemoveClient(Guid clientId, bool notifyRoom) if (notifyRoom) BroadcastToRoom(session.RoomName, Protocol.BuildPeerLeft(clientId), exceptClientId: clientId); + Interlocked.Increment(ref Metrics.ClientsLeft); - Console.WriteLine($"Client {clientId} left room '{session.RoomName}'"); + LogEvent("client_left", ("clientId", clientId), ("room", session.RoomName)); } private void RemoveFromRoom(Guid clientId, string roomName) @@ -316,6 +345,9 @@ private void RemoveFromRoom(Guid clientId, string roomName) private void SendToEndpoint(byte[] packet, IPEndPoint endpoint) { + if (packet.Length > 0 && packet[0] == (byte)ServerPacketType.Error) + Interlocked.Increment(ref Metrics.ErrorPacketsSent); + _ = Socket.SendAsync(packet, endpoint); } @@ -329,4 +361,41 @@ public void Dispose() Socket.Dispose(); StopTokenSource.Dispose(); } + + private void LogMetrics() + { + LogEvent( + "metrics", + ("activeClients", SessionsById.Count), + ("activeRooms", RoomMembers.Count), + ("packetsReceived", Interlocked.Read(ref Metrics.PacketsReceived)), + ("helloPackets", Interlocked.Read(ref Metrics.HelloPackets)), + ("authHelloPackets", Interlocked.Read(ref Metrics.AuthHelloPackets)), + ("voicePacketsReceived", Interlocked.Read(ref Metrics.VoicePacketsReceived)), + ("voicePacketsRelayed", Interlocked.Read(ref Metrics.VoicePacketsRelayed)), + ("pingPackets", Interlocked.Read(ref Metrics.PingPackets)), + ("errorPacketsSent", Interlocked.Read(ref Metrics.ErrorPacketsSent)), + ("invalidPacketsDropped", Interlocked.Read(ref Metrics.InvalidPacketsDropped)), + ("payloadDropped", Interlocked.Read(ref Metrics.PayloadDropped)), + ("rateLimitedDropped", Interlocked.Read(ref Metrics.RateLimitedDropped)), + ("replayDropped", Interlocked.Read(ref Metrics.ReplayDropped)), + ("authFailures", Interlocked.Read(ref Metrics.AuthFailures)), + ("clientsJoined", Interlocked.Read(ref Metrics.ClientsJoined)), + ("clientsLeft", Interlocked.Read(ref Metrics.ClientsLeft)) + ); + } + + private static void LogEvent(string eventName, params (string key, object? value)[] fields) + { + Dictionary payload = new(StringComparer.Ordinal) + { + ["ts"] = DateTimeOffset.UtcNow.ToString("O"), + ["event"] = eventName + }; + + foreach ((string key, object? value) in fields) + payload[key] = value; + + Console.WriteLine(JsonSerializer.Serialize(payload)); + } } diff --git a/VoiceJitterBuffer.cs b/VoiceJitterBuffer.cs new file mode 100644 index 0000000..de5438d --- /dev/null +++ b/VoiceJitterBuffer.cs @@ -0,0 +1,93 @@ +namespace OpenVoiceSharp +{ + /// + /// Per-speaker jitter buffer for packet reordering and limited loss tolerance. + /// + public sealed class VoiceJitterBuffer + { + private readonly SortedDictionary Packets = new(); + private readonly int TargetDelayPackets; + private readonly int MaxBufferPackets; + + private bool Started; + private uint ExpectedSequence; + private int MissingSequenceSkips; + + public VoiceJitterBuffer(int targetDelayPackets = 3, int maxBufferPackets = 24) + { + if (targetDelayPackets < 1) + throw new ArgumentOutOfRangeException(nameof(targetDelayPackets)); + if (maxBufferPackets < targetDelayPackets + 2) + throw new ArgumentOutOfRangeException(nameof(maxBufferPackets)); + + TargetDelayPackets = targetDelayPackets; + MaxBufferPackets = maxBufferPackets; + } + + public void Add(uint sequence, byte[] payload, int length) + { + if (payload is null) + throw new ArgumentNullException(nameof(payload)); + if (length <= 0 || length > payload.Length) + throw new ArgumentOutOfRangeException(nameof(length)); + + if (Started && sequence < ExpectedSequence) + return; + if (Packets.ContainsKey(sequence)) + return; + + byte[] copy = new byte[length]; + Buffer.BlockCopy(payload, 0, copy, 0, length); + Packets[sequence] = copy; + + // Prevent unbounded growth under extreme disorder. + while (Packets.Count > MaxBufferPackets) + { + uint oldest = GetFirstKey(); + Packets.Remove(oldest); + } + } + + public IEnumerable<(uint sequence, byte[] payload)> DrainReady() + { + if (!Started) + { + if (Packets.Count < TargetDelayPackets) + yield break; + + ExpectedSequence = GetFirstKey(); + Started = true; + MissingSequenceSkips = 0; + } + + while (Packets.Count > 0) + { + if (Packets.TryGetValue(ExpectedSequence, out byte[]? payload)) + { + Packets.Remove(ExpectedSequence); + uint sequence = ExpectedSequence; + ExpectedSequence++; + MissingSequenceSkips = 0; + yield return (sequence, payload); + continue; + } + + bool forceAdvance = Packets.Count >= MaxBufferPackets || MissingSequenceSkips >= TargetDelayPackets; + if (!forceAdvance) + yield break; + + ExpectedSequence++; + MissingSequenceSkips++; + } + } + + private uint GetFirstKey() + { + using IEnumerator enumerator = Packets.Keys.GetEnumerator(); + if (!enumerator.MoveNext()) + throw new InvalidOperationException("Jitter buffer is empty."); + + return enumerator.Current; + } + } +} From b11aece7e6c54b985bf9b59750e160abc96a665a Mon Sep 17 00:00:00 2001 From: wethecom Date: Thu, 16 Apr 2026 20:13:00 -0400 Subject: [PATCH 08/13] . --- OpenVoiceSharp.AuthoritativeServer/ServerOptions.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/OpenVoiceSharp.AuthoritativeServer/ServerOptions.cs b/OpenVoiceSharp.AuthoritativeServer/ServerOptions.cs index f029dcd..125b11a 100644 --- a/OpenVoiceSharp.AuthoritativeServer/ServerOptions.cs +++ b/OpenVoiceSharp.AuthoritativeServer/ServerOptions.cs @@ -10,6 +10,7 @@ internal sealed record ServerOptions public string? WordPressVerifyUrl { get; init; } public string? WordPressSharedSecret { get; init; } public int WordPressTimeoutSeconds { get; init; } = 5; + public int StatsPort { get; init; } = 0; public static ServerOptions FromArgs(string[] args) { @@ -57,6 +58,10 @@ public static ServerOptions FromArgs(string[] args) if (int.TryParse(args[++i], out int wpTimeoutSeconds) && wpTimeoutSeconds >= 1) options = options with { WordPressTimeoutSeconds = wpTimeoutSeconds }; break; + case "--stats-port": + if (int.TryParse(args[++i], out int statsPort) && statsPort >= 0 && statsPort <= 65535) + options = options with { StatsPort = statsPort }; + break; } } From f9dfb1befd639734149157d174b21c2283971084 Mon Sep 17 00:00:00 2001 From: wethecom Date: Thu, 16 Apr 2026 20:18:11 -0400 Subject: [PATCH 09/13] . --- .../VoiceAuthoritativeServer.cs | 330 ++++++++++++------ README.md | 7 + docs/AUTHORITATIVE_SERVER_PROTOCOL.md | 11 +- 3 files changed, 245 insertions(+), 103 deletions(-) diff --git a/OpenVoiceSharp.AuthoritativeServer/VoiceAuthoritativeServer.cs b/OpenVoiceSharp.AuthoritativeServer/VoiceAuthoritativeServer.cs index cda329c..eaa5c6a 100644 --- a/OpenVoiceSharp.AuthoritativeServer/VoiceAuthoritativeServer.cs +++ b/OpenVoiceSharp.AuthoritativeServer/VoiceAuthoritativeServer.cs @@ -1,5 +1,6 @@ using System.Net; using System.Net.Sockets; +using System.Text; using System.Text.Json; using System.Threading; @@ -14,6 +15,8 @@ internal sealed class VoiceAuthoritativeServer : IDisposable private readonly Dictionary> RoomMembers = new(StringComparer.Ordinal); private readonly CancellationTokenSource StopTokenSource = new(); private readonly ServerMetrics Metrics = new(); + private readonly object StateLock = new(); + private TcpListener? StatsListener; public VoiceAuthoritativeServer(ServerOptions options) { @@ -36,17 +39,22 @@ public async Task RunAsync() Console.WriteLine($"Authoritative voice server listening on udp://0.0.0.0:{Options.Port}"); if (WordPressAuthVerifier is not null) Console.WriteLine("WordPress auth verification is enabled."); + if (Options.StatsPort > 0) + Console.WriteLine($"Stats endpoint enabled on http://127.0.0.1:{Options.StatsPort}/stats"); using PeriodicTimer cleanupTimer = new(TimeSpan.FromSeconds(1)); Task receiveLoop = ReceiveLoopAsync(StopTokenSource.Token); Task cleanupLoop = CleanupLoopAsync(cleanupTimer, StopTokenSource.Token); + Task statsLoop = Options.StatsPort > 0 + ? StatsLoopAsync(StopTokenSource.Token) + : Task.CompletedTask; - await Task.WhenAny(receiveLoop, cleanupLoop); + await Task.WhenAny(receiveLoop, cleanupLoop, statsLoop); StopTokenSource.Cancel(); try { - await Task.WhenAll(receiveLoop, cleanupLoop); + await Task.WhenAll(receiveLoop, cleanupLoop, statsLoop); } catch (OperationCanceledException) { @@ -71,10 +79,13 @@ private async Task CleanupLoopAsync(PeriodicTimer timer, CancellationToken cance DateTime cutoffUtc = DateTime.UtcNow.AddSeconds(-Options.ClientTimeoutSeconds); List staleClientIds = []; - foreach (KeyValuePair pair in SessionsById) + lock (StateLock) { - if (pair.Value.LastSeenUtc < cutoffUtc) - staleClientIds.Add(pair.Key); + foreach (KeyValuePair pair in SessionsById) + { + if (pair.Value.LastSeenUtc < cutoffUtc) + staleClientIds.Add(pair.Key); + } } foreach (Guid staleClientId in staleClientIds) @@ -171,54 +182,57 @@ CancellationToken cancellationToken return; } - if (!RoomMembers.TryGetValue(room, out HashSet? existingRoomMembers)) + lock (StateLock) { - existingRoomMembers = []; - RoomMembers[room] = existingRoomMembers; - } - - if (!SessionsById.TryGetValue(clientId, out ClientSession? session)) - { - if (existingRoomMembers.Count >= Options.MaxRoomMembers) + if (!RoomMembers.TryGetValue(room, out HashSet? existingRoomMembers)) { - SendToEndpoint(Protocol.BuildError(ErrorCode.RoomFull, "Room is full"), remoteEndpoint); - return; + existingRoomMembers = []; + RoomMembers[room] = existingRoomMembers; } - session = new ClientSession(clientId, room, userName, remoteEndpoint, Options.MaxVoicePacketsPerSecond); - SessionsById[clientId] = session; - existingRoomMembers.Add(clientId); - Interlocked.Increment(ref Metrics.ClientsJoined); + if (!SessionsById.TryGetValue(clientId, out ClientSession? session)) + { + if (existingRoomMembers.Count >= Options.MaxRoomMembers) + { + SendToEndpoint(Protocol.BuildError(ErrorCode.RoomFull, "Room is full"), remoteEndpoint); + return; + } - SendToEndpoint(Protocol.BuildWelcome(clientId), remoteEndpoint); - BroadcastToRoom(room, Protocol.BuildPeerJoined(clientId, userName), exceptClientId: clientId); + session = new ClientSession(clientId, room, userName, remoteEndpoint, Options.MaxVoicePacketsPerSecond); + SessionsById[clientId] = session; + existingRoomMembers.Add(clientId); + Interlocked.Increment(ref Metrics.ClientsJoined); - LogEvent("client_joined", ("clientId", clientId), ("room", room), ("user", userName), ("endpoint", remoteEndpoint.ToString())); - return; - } + SendToEndpoint(Protocol.BuildWelcome(clientId), remoteEndpoint); + BroadcastToRoom(room, Protocol.BuildPeerJoined(clientId, userName), exceptClientId: clientId); - // Rejoin or endpoint migration for existing client id. - if (!StringComparer.Ordinal.Equals(session.RoomName, room)) - { - RemoveFromRoom(session.ClientId, session.RoomName); - if (existingRoomMembers.Count >= Options.MaxRoomMembers) - { - SendToEndpoint(Protocol.BuildError(ErrorCode.RoomFull, "Room is full"), remoteEndpoint); + LogEvent("client_joined", ("clientId", clientId), ("room", room), ("user", userName), ("endpoint", remoteEndpoint.ToString())); return; } - existingRoomMembers.Add(session.ClientId); - session.RoomName = room; - } + // Rejoin or endpoint migration for existing client id. + if (!StringComparer.Ordinal.Equals(session.RoomName, room)) + { + RemoveFromRoom(session.ClientId, session.RoomName); + if (existingRoomMembers.Count >= Options.MaxRoomMembers) + { + SendToEndpoint(Protocol.BuildError(ErrorCode.RoomFull, "Room is full"), remoteEndpoint); + return; + } + + existingRoomMembers.Add(session.ClientId); + session.RoomName = room; + } - if (!StringComparer.Ordinal.Equals(session.UserName, userName)) - session.UserName = userName; + if (!StringComparer.Ordinal.Equals(session.UserName, userName)) + session.UserName = userName; - session.Endpoint = remoteEndpoint; - session.LastSeenUtc = DateTime.UtcNow; + session.Endpoint = remoteEndpoint; + session.LastSeenUtc = DateTime.UtcNow; - SendToEndpoint(Protocol.BuildWelcome(clientId), remoteEndpoint); - LogEvent("client_refreshed", ("clientId", clientId), ("room", room), ("endpoint", remoteEndpoint.ToString())); + SendToEndpoint(Protocol.BuildWelcome(clientId), remoteEndpoint); + LogEvent("client_refreshed", ("clientId", clientId), ("room", room), ("endpoint", remoteEndpoint.ToString())); + } } private void HandleVoice(byte[] packet, IPEndPoint remoteEndpoint) @@ -230,43 +244,46 @@ private void HandleVoice(byte[] packet, IPEndPoint remoteEndpoint) return; } - if (!SessionsById.TryGetValue(clientId, out ClientSession? session)) + lock (StateLock) { - SendToEndpoint(Protocol.BuildError(ErrorCode.NotRegistered, "Client not registered"), remoteEndpoint); - return; - } + if (!SessionsById.TryGetValue(clientId, out ClientSession? session)) + { + SendToEndpoint(Protocol.BuildError(ErrorCode.NotRegistered, "Client not registered"), remoteEndpoint); + return; + } - if (!EndpointsEqual(session.Endpoint, remoteEndpoint)) - { - SendToEndpoint(Protocol.BuildError(ErrorCode.UnauthorizedEndpoint, "Invalid source endpoint"), remoteEndpoint); - Interlocked.Increment(ref Metrics.InvalidPacketsDropped); - return; - } + if (!EndpointsEqual(session.Endpoint, remoteEndpoint)) + { + SendToEndpoint(Protocol.BuildError(ErrorCode.UnauthorizedEndpoint, "Invalid source endpoint"), remoteEndpoint); + Interlocked.Increment(ref Metrics.InvalidPacketsDropped); + return; + } - if (payload.Length == 0 || payload.Length > Options.MaxVoicePayloadBytes) - { - SendToEndpoint(Protocol.BuildError(ErrorCode.PayloadTooLarge, "Voice payload out of range"), remoteEndpoint); - Interlocked.Increment(ref Metrics.PayloadDropped); - return; - } + if (payload.Length == 0 || payload.Length > Options.MaxVoicePayloadBytes) + { + SendToEndpoint(Protocol.BuildError(ErrorCode.PayloadTooLarge, "Voice payload out of range"), remoteEndpoint); + Interlocked.Increment(ref Metrics.PayloadDropped); + return; + } - if (!session.VoiceRateLimiter.TryConsume(1)) - { - SendToEndpoint(Protocol.BuildError(ErrorCode.RateLimited, "Voice packet rate exceeded"), remoteEndpoint); - Interlocked.Increment(ref Metrics.RateLimitedDropped); - return; - } + if (!session.VoiceRateLimiter.TryConsume(1)) + { + SendToEndpoint(Protocol.BuildError(ErrorCode.RateLimited, "Voice packet rate exceeded"), remoteEndpoint); + Interlocked.Increment(ref Metrics.RateLimitedDropped); + return; + } - if (!session.VoiceSequenceWindow.TryAccept(sequence)) - { - Interlocked.Increment(ref Metrics.ReplayDropped); - return; - } - session.LastSeenUtc = DateTime.UtcNow; + if (!session.VoiceSequenceWindow.TryAccept(sequence)) + { + Interlocked.Increment(ref Metrics.ReplayDropped); + return; + } + session.LastSeenUtc = DateTime.UtcNow; - byte[] relayPacket = Protocol.BuildVoiceRelay(clientId, sequence, payload); - BroadcastToRoom(session.RoomName, relayPacket, exceptClientId: clientId); - Interlocked.Increment(ref Metrics.VoicePacketsRelayed); + byte[] relayPacket = Protocol.BuildVoiceRelay(clientId, sequence, payload); + BroadcastToRoom(session.RoomName, relayPacket, exceptClientId: clientId); + Interlocked.Increment(ref Metrics.VoicePacketsRelayed); + } } private void HandleLeave(byte[] packet, IPEndPoint remoteEndpoint) @@ -278,17 +295,20 @@ private void HandleLeave(byte[] packet, IPEndPoint remoteEndpoint) return; } - if (!SessionsById.TryGetValue(clientId, out ClientSession? session)) - return; - - if (!EndpointsEqual(session.Endpoint, remoteEndpoint)) + lock (StateLock) { - SendToEndpoint(Protocol.BuildError(ErrorCode.UnauthorizedEndpoint, "Invalid source endpoint"), remoteEndpoint); - Interlocked.Increment(ref Metrics.InvalidPacketsDropped); - return; - } + if (!SessionsById.TryGetValue(clientId, out ClientSession? session)) + return; - RemoveClient(clientId, notifyRoom: true); + if (!EndpointsEqual(session.Endpoint, remoteEndpoint)) + { + SendToEndpoint(Protocol.BuildError(ErrorCode.UnauthorizedEndpoint, "Invalid source endpoint"), remoteEndpoint); + Interlocked.Increment(ref Metrics.InvalidPacketsDropped); + return; + } + + RemoveClient(clientId, notifyRoom: true); + } } private void HandlePing(byte[] packet, IPEndPoint remoteEndpoint) @@ -296,41 +316,50 @@ private void HandlePing(byte[] packet, IPEndPoint remoteEndpoint) if (!Protocol.TryReadPing(packet, out Guid clientId)) return; - if (SessionsById.TryGetValue(clientId, out ClientSession? session) && EndpointsEqual(session.Endpoint, remoteEndpoint)) - session.LastSeenUtc = DateTime.UtcNow; + lock (StateLock) + { + if (SessionsById.TryGetValue(clientId, out ClientSession? session) && EndpointsEqual(session.Endpoint, remoteEndpoint)) + session.LastSeenUtc = DateTime.UtcNow; + } SendToEndpoint(Protocol.BuildPong(clientId), remoteEndpoint); } private void BroadcastToRoom(string room, byte[] packet, Guid? exceptClientId = null) { - if (!RoomMembers.TryGetValue(room, out HashSet? memberIds)) - return; - - foreach (Guid memberId in memberIds) + lock (StateLock) { - if (exceptClientId.HasValue && memberId == exceptClientId.Value) - continue; - if (!SessionsById.TryGetValue(memberId, out ClientSession? memberSession)) - continue; + if (!RoomMembers.TryGetValue(room, out HashSet? memberIds)) + return; + + foreach (Guid memberId in memberIds) + { + if (exceptClientId.HasValue && memberId == exceptClientId.Value) + continue; + if (!SessionsById.TryGetValue(memberId, out ClientSession? memberSession)) + continue; - SendToEndpoint(packet, memberSession.Endpoint); + SendToEndpoint(packet, memberSession.Endpoint); + } } } private void RemoveClient(Guid clientId, bool notifyRoom) { - if (!SessionsById.TryGetValue(clientId, out ClientSession? session)) - return; + lock (StateLock) + { + if (!SessionsById.TryGetValue(clientId, out ClientSession? session)) + return; - SessionsById.Remove(clientId); - RemoveFromRoom(clientId, session.RoomName); + SessionsById.Remove(clientId); + RemoveFromRoom(clientId, session.RoomName); - if (notifyRoom) - BroadcastToRoom(session.RoomName, Protocol.BuildPeerLeft(clientId), exceptClientId: clientId); - Interlocked.Increment(ref Metrics.ClientsLeft); + if (notifyRoom) + BroadcastToRoom(session.RoomName, Protocol.BuildPeerLeft(clientId), exceptClientId: clientId); + Interlocked.Increment(ref Metrics.ClientsLeft); - LogEvent("client_left", ("clientId", clientId), ("room", session.RoomName)); + LogEvent("client_left", ("clientId", clientId), ("room", session.RoomName)); + } } private void RemoveFromRoom(Guid clientId, string roomName) @@ -358,16 +387,26 @@ public void Dispose() { StopTokenSource.Cancel(); WordPressAuthVerifier?.Dispose(); + StatsListener?.Stop(); + StatsListener = null; Socket.Dispose(); StopTokenSource.Dispose(); } private void LogMetrics() { + int activeClients; + int activeRooms; + lock (StateLock) + { + activeClients = SessionsById.Count; + activeRooms = RoomMembers.Count; + } + LogEvent( "metrics", - ("activeClients", SessionsById.Count), - ("activeRooms", RoomMembers.Count), + ("activeClients", activeClients), + ("activeRooms", activeRooms), ("packetsReceived", Interlocked.Read(ref Metrics.PacketsReceived)), ("helloPackets", Interlocked.Read(ref Metrics.HelloPackets)), ("authHelloPackets", Interlocked.Read(ref Metrics.AuthHelloPackets)), @@ -398,4 +437,93 @@ private static void LogEvent(string eventName, params (string key, object? value Console.WriteLine(JsonSerializer.Serialize(payload)); } + + private async Task StatsLoopAsync(CancellationToken cancellationToken) + { + StatsListener = new TcpListener(IPAddress.Loopback, Options.StatsPort); + StatsListener.Start(); + + try + { + while (!cancellationToken.IsCancellationRequested) + { + TcpClient client = await StatsListener.AcceptTcpClientAsync(cancellationToken).ConfigureAwait(false); + _ = Task.Run(() => HandleStatsClientAsync(client), cancellationToken); + } + } + catch (OperationCanceledException) + { + // expected on shutdown + } + catch (ObjectDisposedException) + { + // expected on shutdown + } + } + + private async Task HandleStatsClientAsync(TcpClient client) + { + await using NetworkStream stream = client.GetStream(); + using StreamReader reader = new(stream, Encoding.ASCII, detectEncodingFromByteOrderMarks: false, leaveOpen: true); + + string? requestLine = await reader.ReadLineAsync().ConfigureAwait(false); + if (string.IsNullOrWhiteSpace(requestLine)) + return; + + while (true) + { + string? headerLine = await reader.ReadLineAsync().ConfigureAwait(false); + if (string.IsNullOrEmpty(headerLine)) + break; + } + + bool isStatsRequest = requestLine.StartsWith("GET /stats", StringComparison.OrdinalIgnoreCase); + string body = isStatsRequest ? BuildStatsSnapshotJson() : "{\"error\":\"not_found\"}"; + string status = isStatsRequest ? "200 OK" : "404 Not Found"; + + byte[] bodyBytes = Encoding.UTF8.GetBytes(body); + string responseHeaders = + $"HTTP/1.1 {status}\r\n" + + "Content-Type: application/json\r\n" + + $"Content-Length: {bodyBytes.Length}\r\n" + + "Connection: close\r\n\r\n"; + + byte[] headerBytes = Encoding.ASCII.GetBytes(responseHeaders); + await stream.WriteAsync(headerBytes, 0, headerBytes.Length).ConfigureAwait(false); + await stream.WriteAsync(bodyBytes, 0, bodyBytes.Length).ConfigureAwait(false); + } + + private string BuildStatsSnapshotJson() + { + int activeClients; + int activeRooms; + lock (StateLock) + { + activeClients = SessionsById.Count; + activeRooms = RoomMembers.Count; + } + + Dictionary snapshot = new(StringComparer.Ordinal) + { + ["ts"] = DateTimeOffset.UtcNow.ToString("O"), + ["activeClients"] = activeClients, + ["activeRooms"] = activeRooms, + ["packetsReceived"] = Interlocked.Read(ref Metrics.PacketsReceived), + ["helloPackets"] = Interlocked.Read(ref Metrics.HelloPackets), + ["authHelloPackets"] = Interlocked.Read(ref Metrics.AuthHelloPackets), + ["voicePacketsReceived"] = Interlocked.Read(ref Metrics.VoicePacketsReceived), + ["voicePacketsRelayed"] = Interlocked.Read(ref Metrics.VoicePacketsRelayed), + ["pingPackets"] = Interlocked.Read(ref Metrics.PingPackets), + ["errorPacketsSent"] = Interlocked.Read(ref Metrics.ErrorPacketsSent), + ["invalidPacketsDropped"] = Interlocked.Read(ref Metrics.InvalidPacketsDropped), + ["payloadDropped"] = Interlocked.Read(ref Metrics.PayloadDropped), + ["rateLimitedDropped"] = Interlocked.Read(ref Metrics.RateLimitedDropped), + ["replayDropped"] = Interlocked.Read(ref Metrics.ReplayDropped), + ["authFailures"] = Interlocked.Read(ref Metrics.AuthFailures), + ["clientsJoined"] = Interlocked.Read(ref Metrics.ClientsJoined), + ["clientsLeft"] = Interlocked.Read(ref Metrics.ClientsLeft) + }; + + return JsonSerializer.Serialize(snapshot); + } } diff --git a/README.md b/README.md index cdd6913..a36ebbb 100644 --- a/README.md +++ b/README.md @@ -69,10 +69,17 @@ With optional WordPress auth verification: ```bash dotnet run --project OpenVoiceSharp.AuthoritativeServer -- \ --port 7777 \ + --stats-port 9090 \ --wp-verify-url "https://your-site.com/wp-json/openvoicesharp/v1/verify" \ --wp-shared-secret "server-to-wp-shared-secret" ``` +Read runtime stats: + +```bash +curl http://127.0.0.1:9090/stats +``` + Protocol details are documented in: - `docs/AUTHORITATIVE_SERVER_PROTOCOL.md` diff --git a/docs/AUTHORITATIVE_SERVER_PROTOCOL.md b/docs/AUTHORITATIVE_SERVER_PROTOCOL.md index 256914c..348836f 100644 --- a/docs/AUTHORITATIVE_SERVER_PROTOCOL.md +++ b/docs/AUTHORITATIVE_SERVER_PROTOCOL.md @@ -131,7 +131,7 @@ bytes16 ClientId - A client can only send voice from the endpoint that sent `Hello`. - Voice packets are rate-limited per client. -- Voice sequence must be strictly increasing. +- Voice sequence uses a 64-packet anti-replay window (duplicates/replays are dropped, limited out-of-order packets are accepted). - Voice payload max size is configurable (`--max-voice-bytes`). - Inactive clients are removed automatically (`--timeout-seconds`). @@ -143,7 +143,14 @@ dotnet run --project OpenVoiceSharp.AuthoritativeServer -- \ --max-room-members 64 \ --max-voice-bytes 4096 \ --max-pps 80 \ - --timeout-seconds 30 + --timeout-seconds 30 \ + --stats-port 9090 +``` + +Read live stats: + +```bash +curl http://127.0.0.1:9090/stats ``` ## WordPress Verification Mode From 0d2664b18ca36272e55450f26b9b4dc3f2acda83 Mon Sep 17 00:00:00 2001 From: wethecom Date: Thu, 16 Apr 2026 20:47:09 -0400 Subject: [PATCH 10/13] , --- AuthoritativeVoiceSession.cs | 63 +++++++++ OpenVoiceSharp.csproj | 1 + README.md | 14 ++ VoicePlaybackBuffer.cs | 121 ++++++++++++++++ .../Plugins/OpenVoiceSharp/OpenVoiceSharp.dll | Bin 0 -> 45568 bytes unity/OpenVoiceSharp.Unity/README.md | 29 ++++ .../Runtime/OpenVoiceSharp.Unity.asmdef | 16 +++ .../Runtime/UnityVoicePlaybackSource.cs | 101 ++++++++++++++ .../Runtime/UnityVoiceSessionBehaviour.cs | 132 ++++++++++++++++++ unity/OpenVoiceSharp.Unity/package.json | 18 +++ 10 files changed, 495 insertions(+) create mode 100644 VoicePlaybackBuffer.cs create mode 100644 unity/OpenVoiceSharp.Unity/Plugins/OpenVoiceSharp/OpenVoiceSharp.dll create mode 100644 unity/OpenVoiceSharp.Unity/README.md create mode 100644 unity/OpenVoiceSharp.Unity/Runtime/OpenVoiceSharp.Unity.asmdef create mode 100644 unity/OpenVoiceSharp.Unity/Runtime/UnityVoicePlaybackSource.cs create mode 100644 unity/OpenVoiceSharp.Unity/Runtime/UnityVoiceSessionBehaviour.cs create mode 100644 unity/OpenVoiceSharp.Unity/package.json diff --git a/AuthoritativeVoiceSession.cs b/AuthoritativeVoiceSession.cs index 7b20339..a206ade 100644 --- a/AuthoritativeVoiceSession.cs +++ b/AuthoritativeVoiceSession.cs @@ -20,12 +20,14 @@ public sealed class AuthoritativeVoiceSession : IDisposable public bool GateOutgoingByVoiceActivity { get; set; } = true; public bool EnableJitterBuffer { get; set; } = true; + public bool EnableSpeakerPlaybackBuffers { get; set; } = true; public int JitterTargetPackets { get; } public int JitterMaxPackets { get; } public bool IsRunning { get; private set; } private readonly int ExpectedPcmFrameSize; private readonly Dictionary SpeakerJitterBuffers = new(); + private readonly Dictionary SpeakerPlaybackBuffers = new(); private bool IsDisposed; private bool IsSubscribed; @@ -117,6 +119,8 @@ public async Task StopAsync() UnsubscribeEvents(); SpeakerJitterBuffers.Clear(); + lock (SpeakerPlaybackBuffers) + SpeakerPlaybackBuffers.Clear(); IsRunning = false; } @@ -210,6 +214,21 @@ private void DecodeAndEmit(Guid speakerClientId, uint sequence, byte[] payload, try { (byte[] decodedData, int decodedLength) = VoiceChatInterface.WhenDataReceived(payload, length); + + if (EnableSpeakerPlaybackBuffers) + { + VoicePlaybackBuffer playbackBuffer; + lock (SpeakerPlaybackBuffers) + { + if (!SpeakerPlaybackBuffers.TryGetValue(speakerClientId, out playbackBuffer!)) + { + playbackBuffer = new VoicePlaybackBuffer(); + SpeakerPlaybackBuffers[speakerClientId] = playbackBuffer; + } + } + playbackBuffer.Enqueue(decodedData, decodedLength); + } + VoiceFrameDecoded?.Invoke(speakerClientId, sequence, decodedData, decodedLength); } catch (Exception exception) @@ -218,6 +237,50 @@ private void DecodeAndEmit(Guid speakerClientId, uint sequence, byte[] payload, } } + /// + /// Reads speaker PCM into output and fills missing bytes with silence. + /// Returns copied PCM bytes before silence fill. + /// + public int ReadSpeakerPlayback(Guid speakerClientId, byte[] output, int count, int offset = 0) + { + if (output is null) + throw new ArgumentNullException(nameof(output)); + + VoicePlaybackBuffer? buffer; + lock (SpeakerPlaybackBuffers) + SpeakerPlaybackBuffers.TryGetValue(speakerClientId, out buffer); + + if (buffer is null) + { + if (count > 0) + Array.Clear(output, offset, count); + return 0; + } + + return buffer.ReadAndFillSilence(output, count, offset); + } + + /// + /// Drains and returns all remaining speaker PCM bytes. + /// + public byte[] FlushSpeakerPlayback(Guid speakerClientId) + { + VoicePlaybackBuffer? buffer; + lock (SpeakerPlaybackBuffers) + SpeakerPlaybackBuffers.TryGetValue(speakerClientId, out buffer); + + return buffer?.Flush() ?? Array.Empty(); + } + + /// + /// Returns active speaker ids with playback buffers. + /// + public Guid[] GetSpeakersWithPlayback() + { + lock (SpeakerPlaybackBuffers) + return SpeakerPlaybackBuffers.Keys.ToArray(); + } + public void Dispose() { if (IsDisposed) diff --git a/OpenVoiceSharp.csproj b/OpenVoiceSharp.csproj index 9e6c3d2..b414f81 100644 --- a/OpenVoiceSharp.csproj +++ b/OpenVoiceSharp.csproj @@ -26,6 +26,7 @@ + diff --git a/README.md b/README.md index a36ebbb..59c6325 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,10 @@ Protocol details are documented in: - `docs/AUTHORITATIVE_SERVER_PROTOCOL.md` +Unity integration package (scaffold): + +- `unity/OpenVoiceSharp.Unity` + Client helper in the main library: - `AuthoritativeVoiceClient` @@ -124,6 +128,16 @@ session.VoiceFrameDecoded += (speakerId, sequence, pcmData, length) => await session.StartAsync(); ``` +Playback remainder handling helper: + +```csharp +// In your audio callback requesting fixed-size PCM chunks: +Guid speakerId = /* target speaker id */; +byte[] pcmOut = new byte[1920]; // example callback size +int copied = session.ReadSpeakerPlayback(speakerId, pcmOut, pcmOut.Length); +// copied bytes are real data; remaining bytes are already zero-filled (silence) +``` + ## Contribute If you wish to contribute, you have a few ways: diff --git a/VoicePlaybackBuffer.cs b/VoicePlaybackBuffer.cs new file mode 100644 index 0000000..745f8d0 --- /dev/null +++ b/VoicePlaybackBuffer.cs @@ -0,0 +1,121 @@ +namespace OpenVoiceSharp +{ + /// + /// Thread-safe PCM playback buffer with partial-read support and silence fill. + /// Useful for audio callbacks that request fixed-size chunks. + /// + public sealed class VoicePlaybackBuffer + { + private readonly Queue> Segments = new(); + private readonly object Sync = new(); + private int AvailableBytes; + + /// + /// Number of queued PCM bytes available to read. + /// + public int Available + { + get + { + lock (Sync) + return AvailableBytes; + } + } + + /// + /// Enqueues decoded PCM bytes. + /// + public void Enqueue(byte[] pcmData, int length) + { + if (pcmData is null) + throw new ArgumentNullException(nameof(pcmData)); + if (length <= 0 || length > pcmData.Length) + throw new ArgumentOutOfRangeException(nameof(length)); + + byte[] copy = new byte[length]; + Buffer.BlockCopy(pcmData, 0, copy, 0, length); + + lock (Sync) + { + Segments.Enqueue(new ArraySegment(copy, 0, copy.Length)); + AvailableBytes += copy.Length; + } + } + + /// + /// Reads up to bytes into . + /// Any missing bytes are filled with zero (silence). + /// Returns the amount of real PCM bytes copied before silence fill. + /// + public int ReadAndFillSilence(byte[] output, int count, int offset = 0) + { + if (output is null) + throw new ArgumentNullException(nameof(output)); + if (count < 0) + throw new ArgumentOutOfRangeException(nameof(count)); + if (offset < 0 || offset > output.Length - count) + throw new ArgumentOutOfRangeException(nameof(offset)); + + int copied = 0; + lock (Sync) + { + while (copied < count && Segments.Count > 0) + { + ArraySegment current = Segments.Dequeue(); + int take = Math.Min(current.Count, count - copied); + + Buffer.BlockCopy(current.Array!, current.Offset, output, offset + copied, take); + copied += take; + AvailableBytes -= take; + + int remaining = current.Count - take; + if (remaining > 0) + { + Segments.Enqueue(new ArraySegment(current.Array!, current.Offset + take, remaining)); + } + } + } + + if (copied < count) + Array.Clear(output, offset + copied, count - copied); + + return copied; + } + + /// + /// Drains and returns all queued bytes. + /// + public byte[] Flush() + { + lock (Sync) + { + if (AvailableBytes == 0) + return Array.Empty(); + + byte[] output = new byte[AvailableBytes]; + int offset = 0; + while (Segments.Count > 0) + { + ArraySegment segment = Segments.Dequeue(); + Buffer.BlockCopy(segment.Array!, segment.Offset, output, offset, segment.Count); + offset += segment.Count; + } + + AvailableBytes = 0; + return output; + } + } + + /// + /// Clears all queued PCM bytes. + /// + public void Clear() + { + lock (Sync) + { + Segments.Clear(); + AvailableBytes = 0; + } + } + } +} diff --git a/unity/OpenVoiceSharp.Unity/Plugins/OpenVoiceSharp/OpenVoiceSharp.dll b/unity/OpenVoiceSharp.Unity/Plugins/OpenVoiceSharp/OpenVoiceSharp.dll new file mode 100644 index 0000000000000000000000000000000000000000..359d437c12c037582ef5030a185b47446dad01e1 GIT binary patch literal 45568 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 literal 0 HcmV?d00001 diff --git a/unity/OpenVoiceSharp.Unity/README.md b/unity/OpenVoiceSharp.Unity/README.md new file mode 100644 index 0000000..f05919c --- /dev/null +++ b/unity/OpenVoiceSharp.Unity/README.md @@ -0,0 +1,29 @@ +# OpenVoiceSharp Unity Integration + +This package provides Unity-side components for OpenVoiceSharp authoritative voice usage. + +## Included Runtime Components + +- `UnityVoiceSessionBehaviour` +- `UnityVoicePlaybackSource` + +## Important Requirement + +This package is an integration layer and expects the core `OpenVoiceSharp` assembly to be available in your Unity project. + +This package now includes the managed core DLL at: + +- `Plugins/OpenVoiceSharp/OpenVoiceSharp.dll` + +You still need native codec/runtime dependencies required by Opus/RNNoise in your Unity project plugins (typically `Assets/Plugins/x86_64`). + +## Quick Setup + +1. Add this package folder to Unity (local package or copy). +2. Ensure `OpenVoiceSharp` core assembly is present. +3. Create a GameObject and add `UnityVoiceSessionBehaviour`. +4. Configure host/port/room/user. +5. For each remote speaker object, add `UnityVoicePlaybackSource` and set `SpeakerId`. +6. Route decoded speaker IDs from your networking/player system to the correct playback source. + +See `Samples~/QuickStart/README.md` for an example flow. diff --git a/unity/OpenVoiceSharp.Unity/Runtime/OpenVoiceSharp.Unity.asmdef b/unity/OpenVoiceSharp.Unity/Runtime/OpenVoiceSharp.Unity.asmdef new file mode 100644 index 0000000..88b95ce --- /dev/null +++ b/unity/OpenVoiceSharp.Unity/Runtime/OpenVoiceSharp.Unity.asmdef @@ -0,0 +1,16 @@ +{ + "name": "OpenVoiceSharp.Unity", + "rootNamespace": "OpenVoiceSharp.Unity", + "references": [ + "OpenVoiceSharp" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} diff --git a/unity/OpenVoiceSharp.Unity/Runtime/UnityVoicePlaybackSource.cs b/unity/OpenVoiceSharp.Unity/Runtime/UnityVoicePlaybackSource.cs new file mode 100644 index 0000000..537e748 --- /dev/null +++ b/unity/OpenVoiceSharp.Unity/Runtime/UnityVoicePlaybackSource.cs @@ -0,0 +1,101 @@ +using System; +using UnityEngine; + +namespace OpenVoiceSharp.Unity +{ + /// + /// Unity audio playback component for one remote speaker id. + /// Reads PCM from AuthoritativeVoiceSession playback buffers and outputs audio in OnAudioFilterRead. + /// + [RequireComponent(typeof(AudioSource))] + public sealed class UnityVoicePlaybackSource : MonoBehaviour + { + [SerializeField] private UnityVoiceSessionBehaviour? sessionBehaviour; + [SerializeField] private string speakerId = ""; + [SerializeField] private bool logParseErrors; + + private Guid parsedSpeakerId; + private bool hasValidSpeakerId; + private byte[] pcmBuffer = Array.Empty(); + private float[] monoFloatBuffer = Array.Empty(); + + public string SpeakerId + { + get => speakerId; + set + { + speakerId = value; + ParseSpeakerId(); + } + } + + private void Awake() + { + ParseSpeakerId(); + } + + private void OnValidate() + { + ParseSpeakerId(); + } + + private void OnAudioFilterRead(float[] data, int channels) + { + if (channels <= 0) + { + Array.Clear(data, 0, data.Length); + return; + } + + if (!TryGetSession(out AuthoritativeVoiceSession? session) || !hasValidSpeakerId) + { + Array.Clear(data, 0, data.Length); + return; + } + + int monoSampleCount = data.Length / channels; + int bytesNeeded = monoSampleCount * 2; + EnsureTempBuffers(bytesNeeded, monoSampleCount); + + // This call fills remaining bytes with silence automatically. + session.ReadSpeakerPlayback(parsedSpeakerId, pcmBuffer, bytesNeeded); + VoiceUtilities.Convert16BitToFloat(pcmBuffer, monoFloatBuffer, bytesNeeded); + + int sampleIndex = 0; + for (int i = 0; i < monoSampleCount; i++) + { + float sample = monoFloatBuffer[i]; + for (int c = 0; c < channels; c++) + data[sampleIndex++] = sample; + } + } + + private bool TryGetSession(out AuthoritativeVoiceSession? session) + { + session = sessionBehaviour?.Session; + return session is not null && sessionBehaviour is not null && sessionBehaviour.IsConnected; + } + + private void ParseSpeakerId() + { + if (Guid.TryParse(speakerId, out Guid parsed)) + { + parsedSpeakerId = parsed; + hasValidSpeakerId = true; + return; + } + + hasValidSpeakerId = false; + if (logParseErrors && !string.IsNullOrWhiteSpace(speakerId)) + Debug.LogWarning($"[OpenVoiceSharp.Unity] Invalid speaker id guid: {speakerId}"); + } + + private void EnsureTempBuffers(int bytesNeeded, int monoSampleCount) + { + if (pcmBuffer.Length < bytesNeeded) + pcmBuffer = new byte[bytesNeeded]; + if (monoFloatBuffer.Length < monoSampleCount) + monoFloatBuffer = new float[monoSampleCount]; + } + } +} diff --git a/unity/OpenVoiceSharp.Unity/Runtime/UnityVoiceSessionBehaviour.cs b/unity/OpenVoiceSharp.Unity/Runtime/UnityVoiceSessionBehaviour.cs new file mode 100644 index 0000000..6c7571d --- /dev/null +++ b/unity/OpenVoiceSharp.Unity/Runtime/UnityVoiceSessionBehaviour.cs @@ -0,0 +1,132 @@ +using System; +using System.Threading.Tasks; +using UnityEngine; + +namespace OpenVoiceSharp.Unity +{ + /// + /// Unity MonoBehaviour wrapper around AuthoritativeVoiceSession. + /// + public sealed class UnityVoiceSessionBehaviour : MonoBehaviour + { + [Header("Connection")] + [SerializeField] private string serverHost = "127.0.0.1"; + [SerializeField] private int serverPort = 7777; + [SerializeField] private string roomName = "lobby"; + [SerializeField] private string userName = "Player"; + [SerializeField] private string authToken = ""; + [SerializeField] private bool autoConnectOnStart = true; + + [Header("Audio")] + [SerializeField] private int bitrate = VoiceChatInterface.DefaultBitrate; + [SerializeField] private bool stereo = false; + [SerializeField] private bool enableNoiseSuppression = true; + [SerializeField] private bool favorAudioStreaming = false; + + [Header("Jitter")] + [SerializeField] private bool enableJitterBuffer = true; + [SerializeField] private int jitterTargetPackets = 3; + [SerializeField] private int jitterMaxPackets = 24; + + public AuthoritativeVoiceSession? Session { get; private set; } + public bool IsConnected => Session?.Client.IsConnected ?? false; + + private bool isConnecting; + + private void Awake() + { + CreateSessionIfNeeded(); + } + + private async void Start() + { + if (autoConnectOnStart) + await ConnectAsync(); + } + + private void OnDestroy() + { + DisposeSession(); + } + + public async Task ConnectAsync() + { + CreateSessionIfNeeded(); + if (Session is null || IsConnected || isConnecting) + return; + + isConnecting = true; + try + { + await Session.StartAsync(); + } + catch (Exception exception) + { + Debug.LogError($"[OpenVoiceSharp.Unity] Connect failed: {exception}"); + } + finally + { + isConnecting = false; + } + } + + public async Task DisconnectAsync() + { + if (Session is null) + return; + + try + { + await Session.StopAsync(); + } + catch (Exception exception) + { + Debug.LogWarning($"[OpenVoiceSharp.Unity] Disconnect warning: {exception.Message}"); + } + } + + private void CreateSessionIfNeeded() + { + if (Session is not null) + return; + + string? token = string.IsNullOrWhiteSpace(authToken) ? null : authToken; + Session = new AuthoritativeVoiceSession( + serverHost, + serverPort, + roomName, + userName, + token, + bitrate, + stereo, + enableNoiseSuppression, + favorAudioStreaming, + vadOperatingMode: null, + jitterTargetPackets: jitterTargetPackets, + jitterMaxPackets: jitterMaxPackets + ) + { + EnableJitterBuffer = enableJitterBuffer + }; + Session.SessionError += OnSessionError; + } + + private void DisposeSession() + { + if (Session is null) + return; + + Session.SessionError -= OnSessionError; + Session.Dispose(); + Session = null; + } + + private void OnSessionError(string message, Exception? exception) + { + if (exception is not null) + Debug.LogWarning($"[OpenVoiceSharp.Unity] {message} {exception.Message}"); + else + Debug.LogWarning($"[OpenVoiceSharp.Unity] {message}"); + } + } +} diff --git a/unity/OpenVoiceSharp.Unity/package.json b/unity/OpenVoiceSharp.Unity/package.json new file mode 100644 index 0000000..2133878 --- /dev/null +++ b/unity/OpenVoiceSharp.Unity/package.json @@ -0,0 +1,18 @@ +{ + "name": "com.openvoicesharp.unity", + "version": "0.1.0", + "displayName": "OpenVoiceSharp Unity Integration", + "description": "Unity integration layer for OpenVoiceSharp authoritative voice client/session playback.", + "unity": "2021.3", + "author": { + "name": "OpenVoiceSharp Contributors" + }, + "keywords": [ + "voice", + "voip", + "opus", + "webrtc", + "audio", + "multiplayer" + ] +} From 0c6a46d3ce65121bd00741d1438bae29c81357b1 Mon Sep 17 00:00:00 2001 From: wethecom Date: Thu, 16 Apr 2026 20:51:57 -0400 Subject: [PATCH 11/13] , --- .../Plugins/OpenVoiceSharp/NAudio.Core.dll | Bin 0 -> 187904 bytes .../Plugins/OpenVoiceSharp/NAudio.WinMM.dll | Bin 0 -> 57344 bytes .../Plugins/OpenVoiceSharp/OpusDotNet.dll | Bin 0 -> 15360 bytes .../Plugins/OpenVoiceSharp/RNNoise.NET.dll | Bin 0 -> 7168 bytes .../Plugins/OpenVoiceSharp/WebRtcVadSharp.dll | Bin 0 -> 11264 bytes .../Plugins/x86_64/WebRtcVad.dll | Bin 0 -> 50176 bytes .../Plugins/x86_64/opus.dll | Bin 0 -> 367616 bytes .../Plugins/x86_64/rnnoise.dll | Bin 0 -> 140288 bytes unity/OpenVoiceSharp.Unity/README.md | 23 ++++++++++++------ 9 files changed, 16 insertions(+), 7 deletions(-) create mode 100644 unity/OpenVoiceSharp.Unity/Plugins/OpenVoiceSharp/NAudio.Core.dll create mode 100644 unity/OpenVoiceSharp.Unity/Plugins/OpenVoiceSharp/NAudio.WinMM.dll create mode 100644 unity/OpenVoiceSharp.Unity/Plugins/OpenVoiceSharp/OpusDotNet.dll create mode 100644 unity/OpenVoiceSharp.Unity/Plugins/OpenVoiceSharp/RNNoise.NET.dll create mode 100644 unity/OpenVoiceSharp.Unity/Plugins/OpenVoiceSharp/WebRtcVadSharp.dll create mode 100644 unity/OpenVoiceSharp.Unity/Plugins/x86_64/WebRtcVad.dll create mode 100644 unity/OpenVoiceSharp.Unity/Plugins/x86_64/opus.dll create mode 100644 unity/OpenVoiceSharp.Unity/Plugins/x86_64/rnnoise.dll diff --git a/unity/OpenVoiceSharp.Unity/Plugins/OpenVoiceSharp/NAudio.Core.dll b/unity/OpenVoiceSharp.Unity/Plugins/OpenVoiceSharp/NAudio.Core.dll new file mode 100644 index 0000000000000000000000000000000000000000..254cd2c5fae24f4b91c64ff035947cf680811404 GIT binary patch literal 187904 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 CoxPv{ literal 0 HcmV?d00001 diff --git a/unity/OpenVoiceSharp.Unity/Plugins/OpenVoiceSharp/NAudio.WinMM.dll b/unity/OpenVoiceSharp.Unity/Plugins/OpenVoiceSharp/NAudio.WinMM.dll new file mode 100644 index 0000000000000000000000000000000000000000..62668f763e4dd80f2fb4845bd9ca10a7247af829 GIT binary patch literal 57344 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 w)3sC94Zi=BdTfLCd4tZI=&an{+DDm$atHVx z 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 literal 0 HcmV?d00001 diff --git a/unity/OpenVoiceSharp.Unity/Plugins/OpenVoiceSharp/WebRtcVadSharp.dll b/unity/OpenVoiceSharp.Unity/Plugins/OpenVoiceSharp/WebRtcVadSharp.dll new file mode 100644 index 0000000000000000000000000000000000000000..4b605ad2beb3a8b85d8167bd5ba9dd1180221414 GIT binary patch literal 11264 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 literal 0 HcmV?d00001 diff --git a/unity/OpenVoiceSharp.Unity/Plugins/x86_64/WebRtcVad.dll b/unity/OpenVoiceSharp.Unity/Plugins/x86_64/WebRtcVad.dll new file mode 100644 index 0000000000000000000000000000000000000000..8e80b8764bf1ed59ae956ded93ae24ea913245e9 GIT binary patch literal 50176 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ⅈ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

*3sph72DY`1 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 literal 0 HcmV?d00001 diff --git a/unity/OpenVoiceSharp.Unity/Plugins/x86_64/rnnoise.dll b/unity/OpenVoiceSharp.Unity/Plugins/x86_64/rnnoise.dll new file mode 100644 index 0000000000000000000000000000000000000000..1d8e155082d4085cd5de623729a9a0afa272d374 GIT binary patch literal 140288 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 gq2sjU2algTe){ Date: Thu, 16 Apr 2026 21:13:46 -0400 Subject: [PATCH 12/13] , --- OpenVoiceSharp.csproj | 2 + README.md | 18 + godot/OpenVoiceSharp.Godot/README.md | 75 ++++ .../openvoicesharp/OpenVoiceSharpPlugin.cs | 13 + .../OpenVoiceSharpSessionNode.cs | 199 ++++++++++ .../addons/openvoicesharp/lib/README.md | 18 + .../addons/openvoicesharp/plugin.cfg | 6 + .../OpenVoiceSharp.Godot/demo/DemoVoiceUI.cs | 201 ++++++++++ .../demo/DemoVoiceUI.tscn | 122 ++++++ unity/OpenVoiceSharp.Unity/README.md | 7 + .../OpenVoiceSharpUnreal.uplugin | 23 ++ unreal/OpenVoiceSharpUnreal/README.md | 50 +++ .../OpenVoiceSharpUnreal.Build.cs | 25 ++ .../Private/OVSAuthoritativeClient.cpp | 347 ++++++++++++++++++ .../Private/OpenVoiceSharpUnreal.cpp | 16 + .../Public/OVSAuthoritativeClient.h | 83 +++++ .../Public/OpenVoiceSharpUnreal.h | 10 + 17 files changed, 1215 insertions(+) create mode 100644 godot/OpenVoiceSharp.Godot/README.md create mode 100644 godot/OpenVoiceSharp.Godot/addons/openvoicesharp/OpenVoiceSharpPlugin.cs create mode 100644 godot/OpenVoiceSharp.Godot/addons/openvoicesharp/OpenVoiceSharpSessionNode.cs create mode 100644 godot/OpenVoiceSharp.Godot/addons/openvoicesharp/lib/README.md create mode 100644 godot/OpenVoiceSharp.Godot/addons/openvoicesharp/plugin.cfg create mode 100644 godot/OpenVoiceSharp.Godot/demo/DemoVoiceUI.cs create mode 100644 godot/OpenVoiceSharp.Godot/demo/DemoVoiceUI.tscn create mode 100644 unreal/OpenVoiceSharpUnreal/OpenVoiceSharpUnreal.uplugin create mode 100644 unreal/OpenVoiceSharpUnreal/README.md create mode 100644 unreal/OpenVoiceSharpUnreal/Source/OpenVoiceSharpUnreal/OpenVoiceSharpUnreal.Build.cs create mode 100644 unreal/OpenVoiceSharpUnreal/Source/OpenVoiceSharpUnreal/Private/OVSAuthoritativeClient.cpp create mode 100644 unreal/OpenVoiceSharpUnreal/Source/OpenVoiceSharpUnreal/Private/OpenVoiceSharpUnreal.cpp create mode 100644 unreal/OpenVoiceSharpUnreal/Source/OpenVoiceSharpUnreal/Public/OVSAuthoritativeClient.h create mode 100644 unreal/OpenVoiceSharpUnreal/Source/OpenVoiceSharpUnreal/Public/OpenVoiceSharpUnreal.h diff --git a/OpenVoiceSharp.csproj b/OpenVoiceSharp.csproj index b414f81..1193b26 100644 --- a/OpenVoiceSharp.csproj +++ b/OpenVoiceSharp.csproj @@ -27,6 +27,8 @@ + + diff --git a/README.md b/README.md index 59c6325..9a18c14 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,15 @@ This repository now includes a basic UDP authoritative voice server project: - `OpenVoiceSharp.AuthoritativeServer` +## Architecture + +- `OpenVoiceSharp.AuthoritativeServer` is the authoritative voice server. +- Unity projects using `unity/OpenVoiceSharp.Unity` act as clients. +- Unreal projects using `unreal/OpenVoiceSharpUnreal` act as clients (starter scaffold). +- Godot projects using `godot/OpenVoiceSharp.Godot` act as clients (starter scaffold). +- Clients capture/encode/send voice and receive/decode/playback routed voice. +- The server validates and relays voice packets between clients in rooms. + Run it with: ```bash @@ -88,6 +97,15 @@ Unity integration package (scaffold): - `unity/OpenVoiceSharp.Unity` +Unreal integration package (scaffold): + +- `unreal/OpenVoiceSharpUnreal` + +Godot integration package (scaffold): + +- `godot/OpenVoiceSharp.Godot` +- Includes demo scene at `godot/OpenVoiceSharp.Godot/demo/DemoVoiceUI.tscn` + Client helper in the main library: - `AuthoritativeVoiceClient` diff --git a/godot/OpenVoiceSharp.Godot/README.md b/godot/OpenVoiceSharp.Godot/README.md new file mode 100644 index 0000000..2ea6e32 --- /dev/null +++ b/godot/OpenVoiceSharp.Godot/README.md @@ -0,0 +1,75 @@ +# OpenVoiceSharp Godot (Starter Package) + +This is a Godot 4 C# integration scaffold for connecting Godot clients to `OpenVoiceSharp.AuthoritativeServer`. + +## What you get + +- `addons/openvoicesharp/OpenVoiceSharpSessionNode.cs` + - Wraps `AuthoritativeVoiceSession` + - Connect/start/stop helpers + - Godot signals for decoded voice and lifecycle + - Helper to read per-speaker playback remainder +- `addons/openvoicesharp/plugin.cfg` and `OpenVoiceSharpPlugin.cs` starter plugin shell + +## What this does not include yet + +- Native Godot microphone capture/playback graph implementation +- Opus/RNNoise/WebRTC native runtime packaging per platform +- UI for rooms/users/device selection + +## Install in your Godot project + +1. Copy this folder into your Godot project: + - `res://addons/openvoicesharp/` +2. Add managed OpenVoiceSharp dependencies to your Godot project: + - `OpenVoiceSharp.dll` + - `OpusDotNet.dll` + - `RNNoise.NET.dll` + - `WebRtcVadSharp.dll` + - `NAudio.Core.dll` (if used on your target runtime path) + - `NAudio.WinMM.dll` (Windows microphone path) +3. Ensure native runtime DLLs are available for your target platform (for example Windows x64). +4. Enable the plugin in Godot: `Project -> Project Settings -> Plugins -> OpenVoiceSharp`. +5. Add `OpenVoiceSharpSessionNode` to a scene and set exported properties. + +## Minimal usage + +```csharp +public override async void _Ready() +{ + var voice = GetNode("OpenVoiceSharpSessionNode"); + voice.ServerHost = "127.0.0.1"; + voice.ServerPort = 7777; + voice.RoomName = "lobby"; + voice.UserName = "PlayerOne"; + voice.AuthToken = ""; + + bool ok = await voice.StartSessionAsync(); +GD.Print($"Voice connected: {ok}"); +} +``` + +## Demo scene included + +- Scene: `res://demo/DemoVoiceUI.tscn` +- Script: `res://demo/DemoVoiceUI.cs` + +The demo includes: + +- Server/room/user/token inputs +- Connect and disconnect buttons +- Push-to-talk mode toggle +- Hold-to-talk button (active only when push-to-talk mode is enabled) +- Basic playback pumping from `ReadSpeakerPlayback(...)` + +To run: + +1. Copy `godot/OpenVoiceSharp.Godot` contents into a Godot 4 C# project. +2. Ensure the `addons/openvoicesharp` plugin is enabled. +3. Add dependencies (managed + native) from `addons/openvoicesharp/lib/README.md`. +4. Open `res://demo/DemoVoiceUI.tscn` and run scene. + +## Architecture note + +- Godot package = client integration layer. +- `OpenVoiceSharp.AuthoritativeServer` = authoritative UDP voice relay server. diff --git a/godot/OpenVoiceSharp.Godot/addons/openvoicesharp/OpenVoiceSharpPlugin.cs b/godot/OpenVoiceSharp.Godot/addons/openvoicesharp/OpenVoiceSharpPlugin.cs new file mode 100644 index 0000000..5fefac8 --- /dev/null +++ b/godot/OpenVoiceSharp.Godot/addons/openvoicesharp/OpenVoiceSharpPlugin.cs @@ -0,0 +1,13 @@ +using Godot; + +[Tool] +public partial class OpenVoiceSharpPlugin : EditorPlugin +{ + public override void _EnterTree() + { + } + + public override void _ExitTree() + { + } +} diff --git a/godot/OpenVoiceSharp.Godot/addons/openvoicesharp/OpenVoiceSharpSessionNode.cs b/godot/OpenVoiceSharp.Godot/addons/openvoicesharp/OpenVoiceSharpSessionNode.cs new file mode 100644 index 0000000..3c0308a --- /dev/null +++ b/godot/OpenVoiceSharp.Godot/addons/openvoicesharp/OpenVoiceSharpSessionNode.cs @@ -0,0 +1,199 @@ +using Godot; +using System; +using System.Threading.Tasks; + +[GlobalClass] +public partial class OpenVoiceSharpSessionNode : Node +{ + [Signal] + public delegate void SessionStartedEventHandler(); + + [Signal] + public delegate void SessionStoppedEventHandler(); + + [Signal] + public delegate void SessionErrorEventHandler(string message); + + [Signal] + public delegate void VoiceFrameDecodedEventHandler(string speakerId, long sequence, byte[] pcmData, int length); + + [Export] + public string ServerHost { get; set; } = "127.0.0.1"; + + [Export] + public int ServerPort { get; set; } = 7777; + + [Export] + public string RoomName { get; set; } = "lobby"; + + [Export] + public string UserName { get; set; } = "Player"; + + [Export] + public string AuthToken { get; set; } = string.Empty; + + [Export] + public int Bitrate { get; set; } = 24000; + + [Export] + public bool UseNoiseSuppression { get; set; } = true; + + [Export] + public bool PushToTalkMode { get; set; } + + private AuthoritativeVoiceSession? _session; + private bool _isStarting; + private bool _isStopping; + + public bool IsSessionRunning => _session != null; + + public async Task StartSessionAsync() + { + if (_session != null || _isStarting) + { + return true; + } + + _isStarting = true; + try + { + var session = new AuthoritativeVoiceSession( + ServerHost, + ServerPort, + RoomName, + UserName, + AuthToken, + bitrate: Bitrate, + enableNoiseSuppression: UseNoiseSuppression); + + session.VoiceFrameDecoded += OnVoiceFrameDecoded; + + await session.StartAsync().ConfigureAwait(false); + + _session = session; + + if (PushToTalkMode && _session.Recorder.IsRecording) + { + _session.Recorder.StopRecording(); + } + + CallDeferred(nameof(EmitSessionStarted)); + return true; + } + catch (Exception ex) + { + CallDeferred(nameof(EmitSessionError), ex.Message); + return false; + } + finally + { + _isStarting = false; + } + } + + public async Task StopSessionAsync() + { + if (_session == null || _isStopping) + { + return; + } + + _isStopping = true; + try + { + var activeSession = _session; + _session = null; + + activeSession.VoiceFrameDecoded -= OnVoiceFrameDecoded; + await activeSession.StopAsync().ConfigureAwait(false); + activeSession.Dispose(); + + CallDeferred(nameof(EmitSessionStopped)); + } + catch (Exception ex) + { + CallDeferred(nameof(EmitSessionError), ex.Message); + } + finally + { + _isStopping = false; + } + } + + public int ReadSpeakerPlayback(string speakerId, byte[] pcmOut, int length) + { + if (_session == null) + { + return 0; + } + + if (!Guid.TryParse(speakerId, out Guid parsedSpeakerId)) + { + return 0; + } + + return _session.ReadSpeakerPlayback(parsedSpeakerId, pcmOut, length); + } + + public void BeginPushToTalk() + { + if (_session == null || !PushToTalkMode) + { + return; + } + + if (!_session.Recorder.IsRecording) + { + _session.Recorder.StartRecording(); + } + } + + public void EndPushToTalk() + { + if (_session == null || !PushToTalkMode) + { + return; + } + + if (_session.Recorder.IsRecording) + { + _session.Recorder.StopRecording(); + } + } + + public override void _ExitTree() + { + if (_session != null) + { + var activeSession = _session; + _session = null; + activeSession.VoiceFrameDecoded -= OnVoiceFrameDecoded; + activeSession.Dispose(); + } + } + + private void OnVoiceFrameDecoded(Guid speakerId, uint sequence, byte[] pcmData, int length) + { + CallDeferred(nameof(EmitVoiceFrameDecoded), speakerId.ToString(), (long)sequence, pcmData, length); + } + + private void EmitSessionStarted() + { + EmitSignal(SignalName.SessionStarted); + } + + private void EmitSessionStopped() + { + EmitSignal(SignalName.SessionStopped); + } + + private void EmitSessionError(string message) + { + EmitSignal(SignalName.SessionError, message); + } + + private void EmitVoiceFrameDecoded(string speakerId, long sequence, byte[] pcmData, int length) + { + EmitSignal(SignalName.VoiceFrameDecoded, speakerId, sequence, pcmData, length); + } +} diff --git a/godot/OpenVoiceSharp.Godot/addons/openvoicesharp/lib/README.md b/godot/OpenVoiceSharp.Godot/addons/openvoicesharp/lib/README.md new file mode 100644 index 0000000..339c365 --- /dev/null +++ b/godot/OpenVoiceSharp.Godot/addons/openvoicesharp/lib/README.md @@ -0,0 +1,18 @@ +# Managed and Native Dependencies + +Place required managed and native runtime dependencies here (or in your Godot project's preferred plugin runtime path). + +Typical managed dependencies: + +- `OpenVoiceSharp.dll` +- `OpusDotNet.dll` +- `RNNoise.NET.dll` +- `WebRtcVadSharp.dll` +- `NAudio.Core.dll` +- `NAudio.WinMM.dll` (Windows microphone path) + +Typical native dependencies (Windows x64): + +- `opus.dll` +- `rnnoise.dll` +- `WebRtcVad.dll` diff --git a/godot/OpenVoiceSharp.Godot/addons/openvoicesharp/plugin.cfg b/godot/OpenVoiceSharp.Godot/addons/openvoicesharp/plugin.cfg new file mode 100644 index 0000000..2ee7021 --- /dev/null +++ b/godot/OpenVoiceSharp.Godot/addons/openvoicesharp/plugin.cfg @@ -0,0 +1,6 @@ +[plugin] +name="OpenVoiceSharp" +description="OpenVoiceSharp Godot C# integration starter." +author="OpenVoiceSharp" +version="0.1.0" +script="res://addons/openvoicesharp/OpenVoiceSharpPlugin.cs" diff --git a/godot/OpenVoiceSharp.Godot/demo/DemoVoiceUI.cs b/godot/OpenVoiceSharp.Godot/demo/DemoVoiceUI.cs new file mode 100644 index 0000000..1c1ee57 --- /dev/null +++ b/godot/OpenVoiceSharp.Godot/demo/DemoVoiceUI.cs @@ -0,0 +1,201 @@ +using Godot; +using System; +using System.Text; +using System.Threading.Tasks; + +public partial class DemoVoiceUI : Control +{ + private LineEdit _serverHost = null!; + private SpinBox _serverPort = null!; + private LineEdit _roomName = null!; + private LineEdit _userName = null!; + private LineEdit _authToken = null!; + private Label _status = null!; + private RichTextLabel _log = null!; + private Button _connectButton = null!; + private Button _disconnectButton = null!; + private CheckButton _pushToTalkMode = null!; + private Button _holdToTalkButton = null!; + private AudioStreamPlayer _playbackPlayer = null!; + private Timer _playbackTimer = null!; + + private OpenVoiceSharpSessionNode _voiceSession = null!; + private AudioStreamGeneratorPlayback? _playback; + private string _activeSpeakerId = string.Empty; + private byte[] _pcmScratch = Array.Empty(); + + private const int SampleRate = 48000; + private const float PlaybackBufferSeconds = 0.3f; + private const int PlaybackChunkSamples = 960; // 20ms @ 48kHz + + public override void _Ready() + { + _serverHost = GetNode("Root/Margin/VBox/ConnectionGrid/ServerHost"); + _serverPort = GetNode("Root/Margin/VBox/ConnectionGrid/ServerPort"); + _roomName = GetNode("Root/Margin/VBox/ConnectionGrid/RoomName"); + _userName = GetNode("Root/Margin/VBox/ConnectionGrid/UserName"); + _authToken = GetNode("Root/Margin/VBox/ConnectionGrid/AuthToken"); + _status = GetNode

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̺c$fu5p6xhjNo=MH}v$o;1ftVX)5f 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