From 080c734bd74aaeb99c23fd159f79f1ed646f410f Mon Sep 17 00:00:00 2001 From: Pointer Offset Date: Tue, 26 Aug 2025 20:24:42 -0700 Subject: [PATCH 1/4] csproj and reference maintenance --- FFTStreamHandlerFields.cs | 3 +-- Resonance.csproj | 25 ++++++++++++++----------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/FFTStreamHandlerFields.cs b/FFTStreamHandlerFields.cs index 41451e6..8e0fb10 100644 --- a/FFTStreamHandlerFields.cs +++ b/FFTStreamHandlerFields.cs @@ -1,7 +1,6 @@ using FrooxEngine; using Elements.Assets; using CSCore.DSP; -using Elements.Core; namespace Resonance; @@ -32,4 +31,4 @@ public partial class FFTStreamHandler(UserAudioStream stream, FFTS public const string BINSIZE_VARIABLE = "fft_bin_size"; public const string NORMALIZED_VARIABLE = "fft_data_normalized"; public static readonly float[] BAND_RANGES = { 20, 60, 250, 500, 2000, 4000, 6000, 20000 }; -} \ No newline at end of file +} diff --git a/Resonance.csproj b/Resonance.csproj index 9bef97b..d96a3b8 100644 --- a/Resonance.csproj +++ b/Resonance.csproj @@ -1,10 +1,10 @@ - net472 + net9 enable enable - preview + latest 1.0.3 $(Version) Cyro @@ -13,8 +13,12 @@ Copyright (c) 2023 Riley Fields + - C:\Program Files (x86)\Steam\steamapps\common\Resonite\ + C:\Program Files (x86)\Steam\steamapps\common\Resonite\ + $(HOME)/.local/share/Steam/steamapps/common/Resonite/ + + /Custom/Resonite/Install/Path @@ -27,16 +31,19 @@ $(ResonitePath)Libraries\0Harmony.dll - $(ResonitePath)Resonite_Data\Managed\FrooxEngine.dll + $(ResonitePath)FrooxEngine.dll - $(ResonitePath)Resonite_Data\Managed\Elements.Core.dll + $(ResonitePath)Elements.Core.dll - $(ResonitePath)Resonite_Data\Managed\Elements.Assets.dll + $(ResonitePath)Elements.Assets.dll - $(ResonitePath)Resonite_Data\Managed\CSCore.dll + $(ResonitePath)CSCore.dll + + + $(ResonitePath)SDL3-CS.dll @@ -44,8 +51,4 @@ - - - - From d18c0af420ee46e0cab94823dde8d3d24310185f Mon Sep 17 00:00:00 2001 From: Pointer Offset Date: Wed, 27 Aug 2025 01:17:38 -0700 Subject: [PATCH 2/4] Get sample rate from SDLRecordingDevice on Linux --- Resonance.cs | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/Resonance.cs b/Resonance.cs index adb38d5..c6addb4 100644 --- a/Resonance.cs +++ b/Resonance.cs @@ -36,8 +36,28 @@ public static void OnAwake_Postfix(UserAudioStream __instance) __instance.RunSynchronously(() => { int index = __instance.TargetDeviceIndex ?? -1; - int sampleRate = index > 0 ? __instance.AudioSystem.AudioInputs[index].SampleRate : __instance.AudioSystem.DefaultAudioInput.SampleRate; - + //44100; + int sampleRate; + + // Check if we're on Linux. + if (!Engine.Current.UseWineRenderer) + { + sampleRate = index > 0 ? __instance.AudioSystem.AudioInputs[index].SampleRate : __instance.AudioSystem.DefaultAudioInput.SampleRate; + } + else + { + // We need to cast AudioInput to SDLRecordingDevice to get Format.spec.Freq and set sampleRate. + Resonance.Msg("AudioInput is actually SDLRecordingDevice on Linux. Casting and getting sample rate..."); + + Type? audioInputType = __instance.AudioSystem.DefaultAudioInput.GetType(); + var selectedInput = index > 0 ? __instance.AudioSystem.AudioInputs[index] : __instance.AudioSystem.DefaultAudioInput; + + ValueTuple sdlRecordingDevice_Format = + (ValueTuple)audioInputType.GetProperty("Format").GetValue(selectedInput); + + sampleRate = sdlRecordingDevice_Format.Item1.Freq; + } + FFTStreamSettings settings = new ( @@ -82,4 +102,4 @@ public static void OnNewAudioData_Postfix(UserAudioStream __instan handler.UpdateFFTData(buffer); } } -} \ No newline at end of file +} From 4da591f6af9d36069edac1db63f4564895bfe99d Mon Sep 17 00:00:00 2001 From: Pointer Offset Date: Wed, 27 Aug 2025 02:08:37 -0700 Subject: [PATCH 3/4] Accomodating ForceSDLAudio on Windows --- Resonance.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Resonance.cs b/Resonance.cs index c6addb4..e4795e6 100644 --- a/Resonance.cs +++ b/Resonance.cs @@ -39,8 +39,9 @@ public static void OnAwake_Postfix(UserAudioStream __instance) //44100; int sampleRate; - // Check if we're on Linux. - if (!Engine.Current.UseWineRenderer) + // Check if we're using SDL. Either non-Windows platform or ForceSDLAudio launch argument + Type? audioInputType = __instance.AudioSystem.DefaultAudioInput.GetType(); + if (audioInputType.Name != "SDLRecordingDevice") { sampleRate = index > 0 ? __instance.AudioSystem.AudioInputs[index].SampleRate : __instance.AudioSystem.DefaultAudioInput.SampleRate; } @@ -49,7 +50,6 @@ public static void OnAwake_Postfix(UserAudioStream __instance) // We need to cast AudioInput to SDLRecordingDevice to get Format.spec.Freq and set sampleRate. Resonance.Msg("AudioInput is actually SDLRecordingDevice on Linux. Casting and getting sample rate..."); - Type? audioInputType = __instance.AudioSystem.DefaultAudioInput.GetType(); var selectedInput = index > 0 ? __instance.AudioSystem.AudioInputs[index] : __instance.AudioSystem.DefaultAudioInput; ValueTuple sdlRecordingDevice_Format = From 7dff25e0aea83c15c97463bb2b5b0650c6e04971 Mon Sep 17 00:00:00 2001 From: Pointer Offset Date: Thu, 28 Aug 2025 19:29:38 -0700 Subject: [PATCH 4/4] Handling case where Steam Voice might be the only audio input. --- Resonance.cs | 19 ++++++++++++------- Resonance.csproj | 2 +- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Resonance.cs b/Resonance.cs index e4795e6..c3ded53 100644 --- a/Resonance.cs +++ b/Resonance.cs @@ -33,14 +33,19 @@ public static void OnAwake_Postfix(UserAudioStream __instance) return; - __instance.RunSynchronously(() => { + __instance.RunSynchronously(() => + { int index = __instance.TargetDeviceIndex ?? -1; - + //44100; int sampleRate; // Check if we're using SDL. Either non-Windows platform or ForceSDLAudio launch argument - Type? audioInputType = __instance.AudioSystem.DefaultAudioInput.GetType(); + // Filter out Steam Voice as a special case. Unless it's the only and Default option somehow. + Type? audioInputType = __instance.AudioSystem.AudioInputCount > 1 ? + __instance.AudioSystem.AudioInputs.First(ain => ain.DeviceID != "SteamVoice").GetType() : + __instance.AudioSystem.DefaultAudioInput.GetType(); + if (audioInputType.Name != "SDLRecordingDevice") { sampleRate = index > 0 ? __instance.AudioSystem.AudioInputs[index].SampleRate : __instance.AudioSystem.DefaultAudioInput.SampleRate; @@ -55,7 +60,7 @@ public static void OnAwake_Postfix(UserAudioStream __instance) ValueTuple sdlRecordingDevice_Format = (ValueTuple)audioInputType.GetProperty("Format").GetValue(selectedInput); - sampleRate = sdlRecordingDevice_Format.Item1.Freq; + sampleRate = sdlRecordingDevice_Format.Item1.Freq; } FFTStreamSettings settings = @@ -72,7 +77,7 @@ public static void OnAwake_Postfix(UserAudioStream __instance) AutoGain, Quantize_Bins ); - + FFTStreamHandler streamHandler = new(__instance, settings); streamHandler.Setup(); @@ -84,7 +89,7 @@ public static void OnAwake_Postfix(UserAudioStream __instance) { audioStream.BufferSize.Value = 12000; audioStream.MinimumBufferDelay.Value = 0.05f; - } + } __instance.Destroyed += FFTStreamHandler.Destroy; }); @@ -97,7 +102,7 @@ public static void OnNewAudioData_Postfix(UserAudioStream __instan var world = __instance.World; if (world.Focus != World.WorldFocus.Focused || __instance.LocalUser.IsSilenced || (ContactsDialog.RecordingVoiceMessage && ___lastDeviceIndex == __instance.AudioSystem.DefaultAudioInputIndex)) return; - + if (FFTStreamHandler.FFTDict.TryGetValue(__instance, out FFTStreamHandler handler)) handler.UpdateFFTData(buffer); } diff --git a/Resonance.csproj b/Resonance.csproj index d96a3b8..fa888b0 100644 --- a/Resonance.csproj +++ b/Resonance.csproj @@ -5,7 +5,7 @@ enable enable latest - 1.0.3 + 1.0.4 $(Version) Cyro Resonance FFT