AudioUIController.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. using Content.Shared.CCVar;
  2. using Robust.Client.Audio;
  3. using Robust.Client.ResourceManagement;
  4. using Robust.Client.UserInterface.Controllers;
  5. using Robust.Shared.Audio.Sources;
  6. using Robust.Shared.Configuration;
  7. namespace Content.Client.Audio;
  8. public sealed class AudioUIController : UIController
  9. {
  10. [Dependency] private readonly IAudioManager _audioManager = default!;
  11. [Dependency] private readonly IConfigurationManager _configManager = default!;
  12. [Dependency] private readonly IResourceCache _cache = default!;
  13. private float _interfaceGain;
  14. private IAudioSource? _clickSource;
  15. private IAudioSource? _hoverSource;
  16. private const float ClickGain = 0.25f;
  17. private const float HoverGain = 0.05f;
  18. public override void Initialize()
  19. {
  20. base.Initialize();
  21. /*
  22. * This exists to load UI sounds outside of the game sim.
  23. */
  24. // No unsub coz never shuts down until program exit.
  25. _configManager.OnValueChanged(CCVars.UIClickSound, SetClickSound, true);
  26. _configManager.OnValueChanged(CCVars.UIHoverSound, SetHoverSound, true);
  27. _configManager.OnValueChanged(CCVars.InterfaceVolume, SetInterfaceVolume, true);
  28. }
  29. private void SetInterfaceVolume(float obj)
  30. {
  31. _interfaceGain = obj;
  32. if (_clickSource != null)
  33. {
  34. _clickSource.Gain = ClickGain * _interfaceGain;
  35. }
  36. if (_hoverSource != null)
  37. {
  38. _hoverSource.Gain = HoverGain * _interfaceGain;
  39. }
  40. }
  41. private void SetClickSound(string value)
  42. {
  43. if (!string.IsNullOrEmpty(value))
  44. {
  45. var resource = GetSoundOrFallback(value, CCVars.UIClickSound.DefaultValue);
  46. var source =
  47. _audioManager.CreateAudioSource(resource);
  48. if (source != null)
  49. {
  50. source.Gain = ClickGain * _interfaceGain;
  51. source.Global = true;
  52. }
  53. _clickSource = source;
  54. UIManager.SetClickSound(source);
  55. }
  56. else
  57. {
  58. UIManager.SetClickSound(null);
  59. }
  60. }
  61. private void SetHoverSound(string value)
  62. {
  63. if (!string.IsNullOrEmpty(value))
  64. {
  65. var hoverResource = GetSoundOrFallback(value, CCVars.UIHoverSound.DefaultValue);
  66. var hoverSource =
  67. _audioManager.CreateAudioSource(hoverResource);
  68. if (hoverSource != null)
  69. {
  70. hoverSource.Gain = HoverGain * _interfaceGain;
  71. hoverSource.Global = true;
  72. }
  73. _hoverSource = hoverSource;
  74. UIManager.SetHoverSound(hoverSource);
  75. }
  76. else
  77. {
  78. UIManager.SetHoverSound(null);
  79. }
  80. }
  81. private AudioResource GetSoundOrFallback(string path, string fallback)
  82. {
  83. if (!_cache.TryGetResource(path, out AudioResource? resource))
  84. return _cache.GetResource<AudioResource>(fallback);
  85. return resource;
  86. }
  87. }