Files
sbox-public/engine/Sandbox.Engine/Systems/Audio/Processors/AudioProcessor.State.cs
s&box team 71f266059a Open source release
This commit imports the C# engine code and game files, excluding C++ source code.

[Source-Commit: ceb3d758046e50faa6258bc3b658a30c97743268]
2025-11-24 09:05:18 +00:00

116 lines
2.3 KiB
C#

namespace Sandbox.Audio;
/// <summary>
/// Audio processor that allows per listener state.
/// </summary>
public abstract class AudioProcessor<T> : AudioProcessor where T : AudioProcessor.ListenerState, new()
{
/// <summary>
/// Per listener states.
/// </summary>
private Dictionary<Listener, T> _states;
/// <summary>
/// Current state for listener.
/// </summary>
protected T CurrentState { get; private set; }
/// <summary>
/// Set current state for listener.
/// </summary>
internal override void SetListener( Listener listener )
{
// Try get state and set it as current state.
if ( _states?.TryGetValue( listener, out T state ) == true )
{
CurrentState = state;
return;
}
// New current state.
CurrentState = new T();
_states ??= new();
_states[listener] = CurrentState;
}
/// <summary>
/// Remove any states associated with these listeners.
/// </summary>
internal override void RemoveListeners( IReadOnlyList<Listener> listeners )
{
if ( _states is null )
return;
foreach ( var listener in listeners )
{
// Remove and destroy state if it exists.
if ( _states.Remove( listener, out var data ) )
{
data.Destroy();
}
}
}
/// <summary>
/// Destroy and clear all states.
/// </summary>
internal override void OnRemovedInternal()
{
base.OnRemovedInternal();
if ( _states is null )
return;
// Destroy all states.
foreach ( var data in _states.Values )
{
data.Destroy();
}
_states.Clear();
_states = default;
}
}
partial class AudioProcessor
{
/// <summary>
/// One of these is created for every listener that uses an audio processor.
/// </summary>
public abstract class ListenerState
{
internal void Destroy()
{
OnDestroy();
}
/// <summary>
/// Called when audio processor or the listener is removed.
/// </summary>
protected virtual void OnDestroy()
{
}
}
/// <summary>
/// Optionally target a listener, this processor will only run for a specific listener.
/// </summary>
internal Listener TargetListener { get; set; }
/// <summary>
/// Set current state for listener.
/// </summary>
internal virtual void SetListener( Listener listener )
{
}
/// <summary>
/// Remove any states associated with these listeners.
/// </summary>
internal virtual void RemoveListeners( IReadOnlyList<Listener> listeners )
{
}
}