From 1bdf94da640aebfb89f2cd1447a38d4b7ce220c6 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Mon, 11 Dec 2023 21:26:55 +1100 Subject: [PATCH] Audio fixes (#22324) --- Content.Client/Audio/BackgroundAudioSystem.cs | 11 +++++++---- .../Audio/ContentAudioSystem.AmbientMusic.cs | 2 +- Content.Client/Audio/ContentAudioSystem.cs | 19 +++++++++++++++++++ Content.Server/Audio/ContentAudioSystem.cs | 8 ++++++++ .../Audio/SharedContentAudioSystem.cs | 11 +++++++++++ 5 files changed, 46 insertions(+), 5 deletions(-) diff --git a/Content.Client/Audio/BackgroundAudioSystem.cs b/Content.Client/Audio/BackgroundAudioSystem.cs index 3206cfde29..09ac1efcd6 100644 --- a/Content.Client/Audio/BackgroundAudioSystem.cs +++ b/Content.Client/Audio/BackgroundAudioSystem.cs @@ -14,6 +14,9 @@ namespace Content.Client.Audio; [UsedImplicitly] public sealed class BackgroundAudioSystem : EntitySystem { + /* + * TODO: Nuke this system and merge into contentaudiosystem + */ [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly IBaseClient _client = default!; [Dependency] private readonly IConfigurationManager _configManager = default!; @@ -22,7 +25,7 @@ public sealed class BackgroundAudioSystem : EntitySystem private readonly AudioParams _lobbyParams = new(-5f, 1, "Master", 0, 0, 0, true, 0f); - private EntityUid? _lobbyStream; + public EntityUid? LobbyStream; public override void Initialize() { @@ -109,7 +112,7 @@ public sealed class BackgroundAudioSystem : EntitySystem public void StartLobbyMusic() { - if (_lobbyStream != null || !_configManager.GetCVar(CCVars.LobbyMusicEnabled)) + if (LobbyStream != null || !_configManager.GetCVar(CCVars.LobbyMusicEnabled)) return; var file = _gameTicker.LobbySong; @@ -118,12 +121,12 @@ public sealed class BackgroundAudioSystem : EntitySystem return; } - _lobbyStream = _audio.PlayGlobal(file, Filter.Local(), false, + LobbyStream = _audio.PlayGlobal(file, Filter.Local(), false, _lobbyParams.WithVolume(_lobbyParams.Volume + SharedAudioSystem.GainToVolume(_configManager.GetCVar(CCVars.LobbyMusicVolume))))?.Entity; } private void EndLobbyMusic() { - _lobbyStream = _audio.Stop(_lobbyStream); + LobbyStream = _audio.Stop(LobbyStream); } } diff --git a/Content.Client/Audio/ContentAudioSystem.AmbientMusic.cs b/Content.Client/Audio/ContentAudioSystem.AmbientMusic.cs index 6eb25aec1e..0fc0c18b62 100644 --- a/Content.Client/Audio/ContentAudioSystem.AmbientMusic.cs +++ b/Content.Client/Audio/ContentAudioSystem.AmbientMusic.cs @@ -159,7 +159,7 @@ public sealed partial class ContentAudioSystem // Update still runs in lobby so just ignore it. if (_state.CurrentState is not GameplayState) { - FadeOut(_ambientMusicStream); + Audio.Stop(_ambientMusicStream); _ambientMusicStream = null; _musicProto = null; return; diff --git a/Content.Client/Audio/ContentAudioSystem.cs b/Content.Client/Audio/ContentAudioSystem.cs index 2dc950ee26..603b1086d8 100644 --- a/Content.Client/Audio/ContentAudioSystem.cs +++ b/Content.Client/Audio/ContentAudioSystem.cs @@ -1,5 +1,6 @@ using Content.Shared.Audio; using Content.Shared.CCVar; +using Content.Shared.GameTicking; using Robust.Client.GameObjects; using Robust.Shared; using Robust.Shared.Audio; @@ -37,6 +38,24 @@ public sealed partial class ContentAudioSystem : SharedContentAudioSystem base.Initialize(); UpdatesOutsidePrediction = true; InitializeAmbientMusic(); + SubscribeNetworkEvent(OnRoundCleanup); + } + + private void OnRoundCleanup(RoundRestartCleanupEvent ev) + { + _fadingOut.Clear(); + + // Preserve lobby music but everything else should get dumped. + var lobbyStream = EntityManager.System().LobbyStream; + TryComp(lobbyStream, out AudioComponent? audioComp); + var oldGain = audioComp?.Gain; + + SilenceAudio(); + + if (oldGain != null) + { + Audio.SetGain(lobbyStream, oldGain.Value, audioComp); + } } public override void Shutdown() diff --git a/Content.Server/Audio/ContentAudioSystem.cs b/Content.Server/Audio/ContentAudioSystem.cs index 1c5625b0b8..51bd3183b6 100644 --- a/Content.Server/Audio/ContentAudioSystem.cs +++ b/Content.Server/Audio/ContentAudioSystem.cs @@ -1,7 +1,9 @@ using Content.Server.GameTicking.Events; using Content.Shared.Audio; +using Content.Shared.GameTicking; using Robust.Server.Audio; using Robust.Shared.Audio; +using Robust.Shared.Audio.Components; using Robust.Shared.Prototypes; namespace Content.Server.Audio; @@ -14,10 +16,16 @@ public sealed class ContentAudioSystem : SharedContentAudioSystem public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnRoundCleanup); SubscribeLocalEvent(OnRoundStart); _protoManager.PrototypesReloaded += OnProtoReload; } + private void OnRoundCleanup(RoundRestartCleanupEvent ev) + { + SilenceAudio(); + } + private void OnProtoReload(PrototypesReloadedEventArgs obj) { if (!obj.ByType.ContainsKey(typeof(AudioPresetPrototype))) diff --git a/Content.Shared/Audio/SharedContentAudioSystem.cs b/Content.Shared/Audio/SharedContentAudioSystem.cs index 3563f2f846..932174981f 100644 --- a/Content.Shared/Audio/SharedContentAudioSystem.cs +++ b/Content.Shared/Audio/SharedContentAudioSystem.cs @@ -1,5 +1,6 @@ using Content.Shared.Physics; using Robust.Shared.Audio; +using Robust.Shared.Audio.Components; using Robust.Shared.Audio.Systems; namespace Content.Shared.Audio; @@ -18,4 +19,14 @@ public abstract class SharedContentAudioSystem : EntitySystem base.Initialize(); Audio.OcclusionCollisionMask = (int) CollisionGroup.Impassable; } + + protected void SilenceAudio() + { + var query = AllEntityQuery(); + + while (query.MoveNext(out var uid, out var comp)) + { + Audio.SetGain(uid, 0f, comp); + } + } }