mirror of
https://github.com/Ellpeck/MLEM.git
synced 2024-11-23 05:08:34 +01:00
allow enumerating SoundEffectInstanceHandler entries
This commit is contained in:
parent
0c45f2d8e6
commit
db7ee04d30
2 changed files with 22 additions and 7 deletions
|
@ -16,6 +16,7 @@ Improvements
|
||||||
- Added customizable overloads for Keybind, Combination and GenericInput ToString methods
|
- Added customizable overloads for Keybind, Combination and GenericInput ToString methods
|
||||||
- Moved ColorHelper.Invert to ColorExtensions.Invert
|
- Moved ColorHelper.Invert to ColorExtensions.Invert
|
||||||
- Removed LINQ Any and All usage in various methods to improve memory usage
|
- Removed LINQ Any and All usage in various methods to improve memory usage
|
||||||
|
- Allow enumerating SoundEffectInstanceHandler entries
|
||||||
|
|
||||||
Fixes
|
Fixes
|
||||||
- Set default values for InputHandler held and pressed keys to avoid an exception if buttons are held in the very first frame
|
- Set default values for InputHandler held and pressed keys to avoid an exception if buttons are held in the very first frame
|
||||||
|
|
|
@ -10,7 +10,7 @@ namespace MLEM.Sound {
|
||||||
/// Additionally, a callback can be registered that is invoked when the <see cref="SoundEffectInstance"/> finishes playing.
|
/// Additionally, a callback can be registered that is invoked when the <see cref="SoundEffectInstance"/> finishes playing.
|
||||||
/// Note that an object of this class can be added to a <see cref="Game"/> using its <see cref="GameComponentCollection"/>.
|
/// Note that an object of this class can be added to a <see cref="Game"/> using its <see cref="GameComponentCollection"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class SoundEffectInstanceHandler : GameComponent, IEnumerable<SoundEffectInstance> {
|
public class SoundEffectInstanceHandler : GameComponent, IEnumerable<SoundEffectInstanceHandler.Entry> {
|
||||||
|
|
||||||
private readonly List<Entry> playingSounds = new List<Entry>();
|
private readonly List<Entry> playingSounds = new List<Entry>();
|
||||||
private AudioListener[] listeners;
|
private AudioListener[] listeners;
|
||||||
|
@ -110,28 +110,42 @@ namespace MLEM.Sound {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public IEnumerator<SoundEffectInstance> GetEnumerator() {
|
public IEnumerator<Entry> GetEnumerator() {
|
||||||
foreach (var sound in this.playingSounds)
|
return this.playingSounds.GetEnumerator();
|
||||||
yield return sound.Instance;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
IEnumerator IEnumerable.GetEnumerator() {
|
IEnumerator IEnumerable.GetEnumerator() {
|
||||||
return this.GetEnumerator();
|
return this.GetEnumerator();
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly struct Entry {
|
/// <summary>
|
||||||
|
/// An entry in a <see cref="SoundEffectInstanceHandler"/>.
|
||||||
|
/// Each entry stores the <see cref="SoundEffectInstance"/> that is being played, as well as the additional data passed through <see cref="SoundEffectInstanceHandler.Add(Microsoft.Xna.Framework.Audio.SoundEffectInstance,System.Action{Microsoft.Xna.Framework.Audio.SoundEffectInstance},Microsoft.Xna.Framework.Audio.AudioEmitter)"/>.
|
||||||
|
/// </summary>
|
||||||
|
public readonly struct Entry {
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The sound effect instance that this entry is playing
|
||||||
|
/// </summary>
|
||||||
public readonly SoundEffectInstance Instance;
|
public readonly SoundEffectInstance Instance;
|
||||||
|
/// <summary>
|
||||||
|
/// An action that is invoked when this entry's <see cref="Instance"/> is stopped.
|
||||||
|
/// This action is invoked in <see cref="SoundEffectInstanceHandler.Update()"/>.
|
||||||
|
/// </summary>
|
||||||
public readonly Action<SoundEffectInstance> OnStopped;
|
public readonly Action<SoundEffectInstance> OnStopped;
|
||||||
|
/// <summary>
|
||||||
|
/// The <see cref="AudioEmitter"/> that this sound effect instance is linked to.
|
||||||
|
/// If the underlying handler's <see cref="SoundEffectInstanceHandler.SetListeners"/> method has been called, 3D sound will be applied.
|
||||||
|
/// </summary>
|
||||||
public readonly AudioEmitter Emitter;
|
public readonly AudioEmitter Emitter;
|
||||||
|
|
||||||
public Entry(SoundEffectInstance instance, Action<SoundEffectInstance> onStopped, AudioEmitter emitter) {
|
internal Entry(SoundEffectInstance instance, Action<SoundEffectInstance> onStopped, AudioEmitter emitter) {
|
||||||
this.Instance = instance;
|
this.Instance = instance;
|
||||||
this.OnStopped = onStopped;
|
this.OnStopped = onStopped;
|
||||||
this.Emitter = emitter;
|
this.Emitter = emitter;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void TryApply3D(AudioListener[] listeners) {
|
internal void TryApply3D(AudioListener[] listeners) {
|
||||||
if (listeners != null && listeners.Length > 0 && this.Emitter != null)
|
if (listeners != null && listeners.Length > 0 && this.Emitter != null)
|
||||||
this.Instance.Apply3D(listeners, this.Emitter);
|
this.Instance.Apply3D(listeners, this.Emitter);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue