-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathResonance.cs
85 lines (71 loc) · 3.14 KB
/
Resonance.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
using HarmonyLib;
using ResoniteModLoader;
using FrooxEngine;
using Elements.Assets;
namespace Resonance;
public partial class Resonance : ResoniteMod
{
public override string Name => "<color=hero.cyan>🔊</color><color=hero.purple>🎶</color> Resonance";
public override string Author => "Cyro";
public override string Version => typeof(Resonance).Assembly.GetName().Version.ToString();
public override string Link => "https://github.com/RileyGuy/Resonance";
public static ModConfiguration? Config;
public override void OnEngineInit()
{
Config = GetConfiguration();
Config!.Save(true);
Harmony harmony = new("net.Cyro.Resonance");
harmony.PatchAll();
HandleEvents();
}
[HarmonyPatch(typeof(UserAudioStream<StereoSample>))]
static class UserAudioStreamPatcher
{
[HarmonyPostfix]
[HarmonyPatch("OnAwake")]
public static void OnAwake_Postfix(UserAudioStream<StereoSample> __instance)
{
__instance.ReferenceID.ExtractIDs(out _, out byte user);
if (__instance.LocalUser != __instance.World.GetUserByAllocationID(user))
return;
__instance.RunSynchronously(() => {
int index = __instance.TargetDeviceIndex ?? -1;
int sampleRate = index > 0 ? __instance.AudioSystem.AudioInputs[index].SampleRate : __instance.AudioSystem.DefaultAudioInput.SampleRate;
FFTStreamSettings settings =
new
(
VisibleBins,
sampleRate,
(CSCore.DSP.FftSize)ConfigFftWidth,
NoiseFloor,
AutoGainSpeed,
Smoothing,
Gain,
Normalize_Fft,
AutoGain,
Quantize_Bins
);
FFTStreamHandler streamHandler = new(__instance, settings);
streamHandler.Setup();
streamHandler.PrintDebugInfo();
var audioStream = __instance.Stream.Target;
if (audioStream != null && LowLatencyAudio)
{
audioStream.BufferSize.Value = 12000;
audioStream.MinimumBufferDelay.Value = 0.05f;
}
__instance.Destroyed += FFTStreamHandler.Destroy;
});
}
[HarmonyPostfix]
[HarmonyPatch("OnNewAudioData")]
public static void OnNewAudioData_Postfix(UserAudioStream<StereoSample> __instance, Span<StereoSample> buffer, ref int ___lastDeviceIndex)
{
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);
}
}
}