diff --git a/servers/audio/audio_server.cpp b/servers/audio/audio_server.cpp index fa6715dec9..b90ce16929 100644 --- a/servers/audio/audio_server.cpp +++ b/servers/audio/audio_server.cpp @@ -1608,6 +1608,11 @@ void AudioServer::update() { for (CallbackItem *ci : update_callback_list) { ci->callback(ci->userdata); } + + _cleanup_lists(); +} + +void AudioServer::_cleanup_lists() { mix_callback_list.maybe_cleanup(); update_callback_list.maybe_cleanup(); listener_changed_callback_list.maybe_cleanup(); @@ -2124,6 +2129,10 @@ AudioServer::AudioServer() { } AudioServer::~AudioServer() { + // Cleanup resources while we still have an active AudioServer singleton, + // for resources that depend on the singleton still existing. + _cleanup_lists(); + singleton = nullptr; } diff --git a/servers/audio/audio_server.h b/servers/audio/audio_server.h index a7a4decf83..5c2a9befda 100644 --- a/servers/audio/audio_server.h +++ b/servers/audio/audio_server.h @@ -315,6 +315,8 @@ private: void _delete_stream_playback(Ref p_playback); void _delete_stream_playback_list_node(AudioStreamPlaybackListNode *p_node); + void _cleanup_lists(); + // TODO document if this is necessary. SafeList bus_details_graveyard_frame_old;