diff --git a/Assets/Script/Gameplay/GameManager.Loading.cs b/Assets/Script/Gameplay/GameManager.Loading.cs index e9aee826c..6fa1ba684 100644 --- a/Assets/Script/Gameplay/GameManager.Loading.cs +++ b/Assets/Script/Gameplay/GameManager.Loading.cs @@ -155,11 +155,16 @@ private async void Start() FinalizeChart(); + // Get audio calibration + int audioCalibration = SettingsManager.Settings.AudioCalibration.Value; + if (SettingsManager.Settings.AccountForHardwareLatency.Value) + audioCalibration += GlobalAudioHandler.PlaybackLatency; + // Initialize song runner _songRunner = new SongRunner( _mixer, GlobalVariables.State.SongSpeed, - SettingsManager.Settings.AudioCalibration.Value, + audioCalibration, SettingsManager.Settings.VideoCalibration.Value, Song.SongOffsetSeconds); diff --git a/Assets/Script/Menu/Calibrator/Calibrator.cs b/Assets/Script/Menu/Calibrator/Calibrator.cs index 7471afac2..0d3def78a 100644 --- a/Assets/Script/Menu/Calibrator/Calibrator.cs +++ b/Assets/Script/Menu/Calibrator/Calibrator.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections; using System.Collections.Generic; using System.IO; @@ -218,7 +218,9 @@ private void CalculateAudioLatency() double median = diffs.Count % 2 != 0 ? diffs[mid] : (diffs[mid] + diffs[mid - 1]) / 2f; // Set calibration - int calibration = (int)Math.Round(median * 1000) - GlobalAudioHandler.PlaybackLatency; + int calibration = (int)Math.Round(median * 1000); + if (SettingsManager.Settings.AccountForHardwareLatency.Value) + calibration -= GlobalAudioHandler.PlaybackLatency; SettingsManager.Settings.AudioCalibration.Value = calibration; // Set text diff --git a/Assets/Script/Playback/SongRunner.cs b/Assets/Script/Playback/SongRunner.cs index af34b0948..15a59c0d6 100644 --- a/Assets/Script/Playback/SongRunner.cs +++ b/Assets/Script/Playback/SongRunner.cs @@ -241,7 +241,7 @@ public SongRunner(StemMixer mixer, float songSpeed = 1f, int audioCalibration = _mixer = mixer; SongSpeed = songSpeed; VideoCalibration = -videoCalibration / 1000.0; - AudioCalibration = (-(audioCalibration + GlobalAudioHandler.PlaybackLatency) / 1000.0) - VideoCalibration; + AudioCalibration = (-audioCalibration / 1000.0) - VideoCalibration; SongOffset = -songOffset; diff --git a/Assets/Script/Settings/SettingsManager.Settings.cs b/Assets/Script/Settings/SettingsManager.Settings.cs index 59fec610a..843106ef0 100644 --- a/Assets/Script/Settings/SettingsManager.Settings.cs +++ b/Assets/Script/Settings/SettingsManager.Settings.cs @@ -52,6 +52,8 @@ public void OpenCalibrator() public IntSetting AudioCalibration { get; } = new(0); public IntSetting VideoCalibration { get; } = new(0); + public ToggleSetting AccountForHardwareLatency { get; } = new(true); + public void OpenVenueFolder() { FileExplorerHelper.OpenFolder(VenueLoader.VenueFolder.FullName); diff --git a/Assets/Script/Settings/SettingsManager.cs b/Assets/Script/Settings/SettingsManager.cs index c34bce6ae..4557b8d25 100644 --- a/Assets/Script/Settings/SettingsManager.cs +++ b/Assets/Script/Settings/SettingsManager.cs @@ -24,6 +24,7 @@ public static partial class SettingsManager new ButtonRowMetadata(nameof(Settings.OpenCalibrator)), nameof(Settings.AudioCalibration), nameof(Settings.VideoCalibration), + nameof(Settings.AccountForHardwareLatency), new HeaderMetadata("Venues"), new ButtonRowMetadata(nameof(Settings.OpenVenueFolder)), diff --git a/Assets/StreamingAssets/lang/en-US.json b/Assets/StreamingAssets/lang/en-US.json index 7ee642600..aaa1d0a26 100644 --- a/Assets/StreamingAssets/lang/en-US.json +++ b/Assets/StreamingAssets/lang/en-US.json @@ -427,6 +427,10 @@ "Name": "Audio Calibration (ms)", "Description": "Audio calibration in milliseconds. Use the calibrator to automatically calibrate. Higher values make the audio play earlier, while lower ones make the audio play later." }, + "AccountForHardwareLatency": { + "Name": "Account For Audio Hardware Latency", + "Description": "Automatically accounts for the detected playback latency of your audio hardware. This latency may be inaccurate, disable this setting if your audio calibration is negative." + }, "BassVolume": { "Name": "Bass Volume", "Description": "Adjusts the song's bass guitar track volume. Only does something if the song is multi-track."