From 97dd112e7a37d74d7b4cb8cfb47375c4bf54e92b Mon Sep 17 00:00:00 2001 From: cosmonaut Date: Wed, 13 Dec 2023 13:57:53 -0800 Subject: [PATCH] stop updating audio on dispose --- src/Audio/AudioDevice.cs | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/Audio/AudioDevice.cs b/src/Audio/AudioDevice.cs index c6f2cda..de5e847 100644 --- a/src/Audio/AudioDevice.cs +++ b/src/Audio/AudioDevice.cs @@ -25,7 +25,7 @@ namespace MoonWorks.Audio public float DopplerScale = 1f; public float SpeedOfSound = 343.5f; - private readonly HashSet resources = new HashSet(); + private readonly HashSet resourceHandles = new HashSet(); private readonly HashSet updatingSourceVoices = new HashSet(); private AudioTweenManager AudioTweenManager; @@ -265,7 +265,7 @@ namespace MoonWorks.Audio { lock (StateLock) { - resources.Add(resourceReference); + resourceHandles.Add(resourceReference); if (resourceReference.Target is UpdatingSourceVoice updatableVoice) { @@ -278,7 +278,12 @@ namespace MoonWorks.Audio { lock (StateLock) { - resources.Remove(resourceReference); + resourceHandles.Remove(resourceReference); + + if (resourceReference.Target is UpdatingSourceVoice updatableVoice) + { + updatingSourceVoices.Remove(updatableVoice); + } } } @@ -293,18 +298,18 @@ namespace MoonWorks.Audio Thread.Join(); // dispose all source voices first - foreach (var resource in resources) + foreach (var handle in resourceHandles) { - if (resource.Target is SourceVoice voice) + if (handle.Target is SourceVoice voice) { voice.Dispose(); } } // dispose all submix voices except the faux mastering voice - foreach (var resource in resources) + foreach (var handle in resourceHandles) { - if (resource.Target is SubmixVoice voice && voice != fauxMasteringVoice) + if (handle.Target is SubmixVoice voice && voice != fauxMasteringVoice) { voice.Dispose(); } @@ -317,15 +322,15 @@ namespace MoonWorks.Audio FAudio.FAudioVoice_DestroyVoice(trueMasteringVoice); // destroy all other audio resources - foreach (var resource in resources) + foreach (var handle in resourceHandles) { - if (resource.Target is IDisposable disposable) + if (handle.Target is AudioResource resource) { - disposable.Dispose(); + resource.Dispose(); } } - resources.Clear(); + resourceHandles.Clear(); } FAudio.FAudio_Release(Handle);