Skip to content

Commit c3aad7f

Browse files
authored
Prevent intermittent crash when closing OvEditor (#736)
1 parent 7fba5bb commit c3aad7f

2 files changed

Lines changed: 33 additions & 5 deletions

File tree

Sources/OvAudio/include/OvAudio/Core/AudioEngine.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,11 @@ namespace OvAudio::Core
116116
std::vector<std::reference_wrapper<Entities::AudioSource>> m_audioSources;
117117
std::vector<std::reference_wrapper<Entities::AudioSource>> m_suspendedAudioSources;
118118
std::vector<std::reference_wrapper<Entities::AudioListener>> m_audioListeners;
119+
std::optional<OvTools::Eventing::ListenerID> m_audioSourceCreatedListenerID;
120+
std::optional<OvTools::Eventing::ListenerID> m_audioSourceDestroyedListenerID;
121+
std::optional<OvTools::Eventing::ListenerID> m_audioListenerCreatedListenerID;
122+
std::optional<OvTools::Eventing::ListenerID> m_audioListenerDestroyedListenerID;
119123

120124
std::unique_ptr<SoLoud::Soloud> m_backend;
121125
};
122-
}
126+
}

Sources/OvAudio/src/OvAudio/Core/AudioEngine.cpp

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,38 @@ OvAudio::Core::AudioEngine::AudioEngine()
3030
using AudioSourceReceiver = void(AudioEngine::*)(OvAudio::Entities::AudioSource&);
3131
using AudioListenerReceiver = void(AudioEngine::*)(OvAudio::Entities::AudioListener&);
3232

33-
Entities::AudioSource::CreatedEvent += std::bind(static_cast<AudioSourceReceiver>(&AudioEngine::Consider), this, std::placeholders::_1);
34-
Entities::AudioSource::DestroyedEvent += std::bind(static_cast<AudioSourceReceiver>(&AudioEngine::Unconsider), this, std::placeholders::_1);
35-
Entities::AudioListener::CreatedEvent += std::bind(static_cast<AudioListenerReceiver>(&AudioEngine::Consider), this, std::placeholders::_1);
36-
Entities::AudioListener::DestroyedEvent += std::bind(static_cast<AudioListenerReceiver>(&AudioEngine::Unconsider), this, std::placeholders::_1);
33+
m_audioSourceCreatedListenerID = Entities::AudioSource::CreatedEvent +=
34+
std::bind(static_cast<AudioSourceReceiver>(&AudioEngine::Consider), this, std::placeholders::_1);
35+
m_audioSourceDestroyedListenerID = Entities::AudioSource::DestroyedEvent +=
36+
std::bind(static_cast<AudioSourceReceiver>(&AudioEngine::Unconsider), this, std::placeholders::_1);
37+
m_audioListenerCreatedListenerID = Entities::AudioListener::CreatedEvent +=
38+
std::bind(static_cast<AudioListenerReceiver>(&AudioEngine::Consider), this, std::placeholders::_1);
39+
m_audioListenerDestroyedListenerID = Entities::AudioListener::DestroyedEvent +=
40+
std::bind(static_cast<AudioListenerReceiver>(&AudioEngine::Unconsider), this, std::placeholders::_1);
3741
}
3842

3943
OvAudio::Core::AudioEngine::~AudioEngine()
4044
{
45+
if (m_audioSourceCreatedListenerID.has_value())
46+
{
47+
Entities::AudioSource::CreatedEvent.RemoveListener(m_audioSourceCreatedListenerID.value());
48+
}
49+
50+
if (m_audioSourceDestroyedListenerID.has_value())
51+
{
52+
Entities::AudioSource::DestroyedEvent.RemoveListener(m_audioSourceDestroyedListenerID.value());
53+
}
54+
55+
if (m_audioListenerCreatedListenerID.has_value())
56+
{
57+
Entities::AudioListener::CreatedEvent.RemoveListener(m_audioListenerCreatedListenerID.value());
58+
}
59+
60+
if (m_audioListenerDestroyedListenerID.has_value())
61+
{
62+
Entities::AudioListener::DestroyedEvent.RemoveListener(m_audioListenerDestroyedListenerID.value());
63+
}
64+
4165
if (IsValid())
4266
{
4367
m_backend->deinit();

0 commit comments

Comments
 (0)