JUCE Assertion failure in juce_Timer.cpp:327 when removing plugin from host. Maybe related to binary asset loading

I am getting the assertion in the title when I remove my plugin from the host, or when I close the host while the plugin is loaded.

How do I get rid of this assertion? Am I failing to free the image data? Can I safely ignore it? Is this a bug somewhere in JUCE?

Details:

Starting from a blank plugin, all I need to do is add a background image in the editor and I’ll get the assertion:

// In the .h I have:
class AudioPluginAudioProcessorEditor  : public juce::AudioProcessorEditor {
private:
    juce::Image backgroundImage;
    //...
}

// In the .cpp
AudioPluginAudioProcessorEditor::AudioPluginAudioProcessorEditor (AudioPluginAudioProcessor& p)
    : AudioProcessorEditor (&p), processorRef (p)
{
    juce::ignoreUnused (processorRef);

    // HERE !!! 
    backgroundImage = juce::ImageCache::getFromMemory (BinaryData::Background_png, BinaryData::Background_pngSize);

    setSize ((int) (backgroundImage.getWidth()), (int) (backgroundImage.getHeight()));
}

Here’s the code around juce_Timer.cpp:327:

Timer::~Timer()
{
    // If you're destroying a timer on a background thread, make sure the timer has
    // been stopped before execution reaches this point. A simple way to achieve this
    // is to add a call to `stopTimer()` to the destructor of your class which inherits
    // from Timer.
    jassert (! isTimerRunning()
             || MessageManager::getInstanceWithoutCreating() == nullptr
             || MessageManager::getInstanceWithoutCreating()->currentThreadHasLockedMessageManager());

    stopTimer();
}

Here’s a minimal project where the assertion is triggered every time you remove the plugin from the host, or you close the host while the plugin is active. I’m using JUCE 7.0.3, CMake, Clang and ninja in Linux. Tested in Reaper and in AudioPluginHost compiled in debug mode with clang.

If someone wants to compile the attached project, uncompress the zip file, change the path to JUCE in the CMakeLists.txt file, and then do

cd path/to/uncompressed/directory
cmake --preset=clang .
cd Build
ninja

Any backtrace you could provide using a debugger?

I’m not too familiarized with gdb so I’m not sure if this is the full picture we need.
I set a breakpoint in the line where the assertion is triggered and when the execution reached the breakpoint, I ran the gdb command backtrace full. Here’s the output:

backtrace full
#0  juce::Timer::~Timer (this=0x555556508758) at /home/Rafa/Projects/Active/project/repo/Frameworks/JUCE/modules/juce_events/timers/juce_Timer.cpp:329
No locals.
#1  0x00007fffee90f90d in juce::LinuxComponentPeer::LinuxVBlankManager::~LinuxVBlankManager (this=0x555556508758) at /home/Rafa/Projects/Active/project/repo/Frameworks/JUCE/modules/juce_gui_basics/native/juce_linux_Windowing.cpp:519
No locals.
#2  0x00007fffee90fa8a in juce::LinuxComponentPeer::~LinuxComponentPeer (this=0x5555565086b0) at /home/Rafa/Projects/Active/project/repo/Frameworks/JUCE/modules/juce_gui_basics/native/juce_linux_Windowing.cpp:83
        instance = 0x7fffe0000bb0
#3  0x00007fffee90fae9 in juce::LinuxComponentPeer::~LinuxComponentPeer (this=0x5555565086b0) at /home/Rafa/Projects/Active/project/repo/Frameworks/JUCE/modules/juce_gui_basics/native/juce_linux_Windowing.cpp:69
No locals.
#4  0x00007fffee7430e0 in juce::Component::removeFromDesktop (this=0x5555567e8c60) at /home/Rafa/Projects/Active/project/repo/Frameworks/JUCE/modules/juce_gui_basics/components/juce_Component.cpp:772
        peer = 0x5555565086b0
#5  0x00007fffee74291e in juce::Component::~Component (this=0x5555567e8c60) at /home/Rafa/Projects/Active/project/repo/Frameworks/JUCE/modules/juce_gui_basics/components/juce_Component.cpp:526
No locals.
#6  0x00007fffee68fc49 in juce::JuceVST3EditController::JuceVST3Editor::ContentWrapperComponent::~ContentWrapperComponent (this=0x5555567e8c60) at /home/Rafa/Projects/Active/project/repo/Frameworks/JUCE/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp:2079
No locals.
#7  0x00007fffee68fc79 in juce::JuceVST3EditController::JuceVST3Editor::ContentWrapperComponent::~ContentWrapperComponent (this=0x5555567e8c60) at /home/Rafa/Projects/Active/project/repo/Frameworks/JUCE/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp:2073
No locals.
#8  0x00007fffee68f7d0 in juce::JuceVST3EditController::JuceVST3Editor::MessageManagerLockedDeleter::operator()<juce::JuceVST3EditController::JuceVST3Editor::ContentWrapperComponent> (this=0x55555661f860, object=0x5555567e8c60) at /home/Rafa/Projects/Active/project/repo/Frameworks/JUCE/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp:2285
        mmLock = {<juce::Thread::Listener> = {_vptr.Listener = 0x7fffeefea920 <vtable for juce::MessageManagerLock+16>}, mmLock = {blockingMessage = {referencedObject = 0x0}, lockedEvent = {useManualReset = false, mutex = {<std::__mutex_base> = {_M_mutex = {__data = {__lock = 0, __count = 0, __owner = 0, __nusers = 0, __kind = 0, __spins = 0, __elision = 0, __list = {__prev = 0x0, __next = 0x0}}, __size = '\\000' <repeats 39 times>, __align = 0}}, <No data fields>}, condition = {_M_cond = {_M_cond = {__data = {__wseq = {__value64 = 0, __value32 = {__low = 0, __high = 0}}, __g1_start = {__value64 = 0, __value32 = {__low = 0, __high = 0}}, __g_refs = {0, 0}, __g_size = {0, 0}, __g1_orig_size = 0, __wrefs = 0, __g_signals = {0, 0}}, __size = '\\000' <repeats 47 times>, __align = 0}}}, triggered = std::atomic<bool> = { false }, leakDetector96 = {<No data fields>}}, abortWait = {value = std::atomic<int> = { 0 }}, lockGained = {value = std::atomic<int> = { 0 }}}, locked = true}
#9  0x00007fffee68f71c in std::__uniq_ptr_impl<juce::JuceVST3EditController::JuceVST3Editor::ContentWrapperComponent, juce::JuceVST3EditController::JuceVST3Editor::MessageManagerLockedDeleter>::reset (this=0x55555661f860, __p=0x0) at /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.2.1/../../../../include/c++/12.2.1/bits/unique_ptr.h:203
        __old_p = 0x5555567e8c60
#10 0x00007fffee68f1ed in std::unique_ptr<juce::JuceVST3EditController::JuceVST3Editor::ContentWrapperComponent, juce::JuceVST3EditController::JuceVST3Editor::MessageManagerLockedDeleter>::reset (this=0x55555661f860, __p=0x0) at /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.2.1/../../../../include/c++/12.2.1/bits/unique_ptr.h:501
No locals.
#11 0x00007fffee695b71 in std::unique_ptr<juce::JuceVST3EditController::JuceVST3Editor::ContentWrapperComponent, juce::JuceVST3EditController::JuceVST3Editor::MessageManagerLockedDeleter>::operator=(decltype(nullptr)) (this=0x55555661f860) at /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.2.1/../../../../include/c++/12.2.1/bits/unique_ptr.h:434
No locals.
#12 0x00007fffee68c185 in juce::JuceVST3EditController::JuceVST3Editor::removed (this=0x55555661f7d0) at /home/Rafa/Projects/Active/project/repo/Frameworks/JUCE/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp:1837
No locals.
#13 0x000055555586b7a3 in juce::VST3PluginWindow::~VST3PluginWindow (this=0x555556514670, __in_chrg=<optimized out>) at ../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp:1478
No locals.
#14 0x000055555586b8ba in juce::VST3PluginWindow::~VST3PluginWindow (this=0x555556514670, __in_chrg=<optimized out>) at ../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp:1489
No locals.
#15 0x0000555555898666 in juce::Component::SafePointer<juce::Component>::deleteAndZero (this=0x5555565092d0) at ../../../../modules/juce_gui_basics/components/juce_Component.h:2314
No locals.
#16 0x0000555555cc95e4 in juce::ResizableWindow::clearContentComponent (this=0x5555565091c0) at ../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.cpp:107
No locals.
#17 0x00005555556d44f2 in PluginWindow::~PluginWindow (this=0x5555565091c0, __in_chrg=<optimized out>) at ../../Source/Plugins/../UI/../Plugins/../UI/PluginWindow.h:202
No locals.
#18 0x00005555556d453e in PluginWindow::~PluginWindow (this=0x5555565091c0, __in_chrg=<optimized out>) at ../../Source/Plugins/../UI/../Plugins/../UI/PluginWindow.h:203
No locals.
#19 0x00005555556d868a in juce::ContainerDeletePolicy<PluginWindow>::destroy (object=0x5555565091c0) at ../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h:54
        size = 520
#20 0x00005555556d7449 in juce::OwnedArray<PluginWindow, juce::DummyCriticalSection>::deleteAllObjects (this=0x5555567419c8) at ../../../../modules/juce_core/containers/juce_OwnedArray.h:815
        e = 0x5555565091c0
        i = 0
#21 0x00005555556d7a58 in juce::OwnedArray<PluginWindow, juce::DummyCriticalSection>::clearQuick (this=0x5555567419c8, deleteObjects=true) at ../../../../modules/juce_core/containers/juce_OwnedArray.h:120
        lock = {<No data fields>}
#22 0x00005555556d65be in juce::OwnedArray<PluginWindow, juce::DummyCriticalSection>::clear (this=0x5555567419c8, deleteObjects=true) at ../../../../modules/juce_core/containers/juce_OwnedArray.h:109
        lock = {<No data fields>}
#23 0x00005555556cd814 in PluginGraph::closeAnyOpenPluginWindows (this=0x5555567416c0) at ../../Source/Plugins/PluginGraph.cpp:190
        wasEmpty = false
#24 0x00005555556dd5cd in GraphDocumentComponent::closeAnyOpenPluginWindows (this=0x555556765080) at ../../Source/UI/GraphEditorPanel.cpp:1382
No locals.
#25 0x00005555556f0914 in MainHostWindow::tryToQuitApplication (this=0x55555660c900) at ../../Source/UI/MainHostWindow.cpp:405
No locals.
#26 0x00005555556f084a in MainHostWindow::closeButtonPressed (this=0x55555660c900) at ../../Source/UI/MainHostWindow.cpp:386
No locals.
#27 0x0000555555cc8e67 in juce::DocumentWindow::userTriedToCloseWindow (this=0x55555660c900) at ../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.cpp:357
No locals.
#28 0x0000555555cc7217 in juce::ComponentPeer::handleUserClosingWindow (this=0x555556634bd0) at ../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.cpp:576
No locals.
#29 0x0000555555ce6d28 in juce::XWindowSystem::handleClientMessageEvent (this=0x5555564d1d30, peer=0x555556634bd0, clientMsg=..., event=...) at ../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp:3818
        atom = 361
#30 0x0000555555ce50b7 in juce::XWindowSystem::handleWindowMessage (this=0x5555564d1d30, peer=0x555556634bd0, event=...) at ../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp:3331
No locals.
#31 0x0000555555ce7209 in juce::XWindowSystem::windowMessageReceive (event=...) at ../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp:3909
        peer = 0x555556634bd0
        instance = 0x5555564d1d30
#32 0x0000555555ce478c in operator() (__closure=0x5555564ef310) at ../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp:3245
        evt = {type = 33, xany = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, window = 98566152}, xkey = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, window = 98566152, root = 363, subwindow = 32, time = 361, x = 21308576, y = 0, x_root = 0, y_root = 0, state = 3, keycode = 0, same_screen = 275301978}, xbutton = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, window = 98566152, root = 363, subwindow = 32, time = 361, x = 21308576, y = 0, x_root = 0, y_root = 0, state = 3, button = 0, same_screen = 275301978}, xmotion = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, window = 98566152, root = 363, subwindow = 32, time = 361, x = 21308576, y = 0, x_root = 0, y_root = 0, state = 3, is_hint = 0 '\\000', same_screen = 275301978}, xcrossing = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, window = 98566152, root = 363, subwindow = 32, time = 361, x = 21308576, y = 0, x_root = 0, y_root = 0, mode = 3, detail = 0, same_screen = 275301978, focus = 0, state = 0}, xfocus = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, window = 98566152, mode = 363, detail = 0}, xexpose = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, window = 98566152, x = 363, y = 0, width = 32, height = 0, count = 361}, xgraphicsexpose = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, drawable = 98566152, x = 363, y = 0, width = 32, height = 0, count = 361, major_code = 0, minor_code = 21308576}, xnoexpose = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, drawable = 98566152, major_code = 363, minor_code = 0}, xvisibility = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, window = 98566152, state = 363}, xcreatewindow = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, parent = 98566152, window = 363, x = 32, y = 0, width = 361, height = 0, border_width = 21308576, override_redirect = 0}, xdestroywindow = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, event = 98566152, window = 363}, xunmap = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, event = 98566152, window = 363, from_configure = 32}, xmap = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, event = 98566152, window = 363, override_redirect = 32}, xmaprequest = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, parent = 98566152, window = 363}, xreparent = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, event = 98566152, window = 363, parent = 32, x = 361, y = 0, override_redirect = 21308576}, xconfigure = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, event = 98566152, window = 363, x = 32, y = 0, width = 361, height = 0, border_width = 21308576, above = 0, override_redirect = 3}, xgravity = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, event = 98566152, window = 363, x = 32, y = 0}, xresizerequest = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, window = 98566152, width = 363, height = 0}, xconfigurerequest = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, parent = 98566152, window = 363, x = 32, y = 0, width = 361, height = 0, border_width = 21308576, above = 0, detail = 3, value_mask = 275301978}, xcirculate = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, event = 98566152, window = 363, place = 32}, xcirculaterequest = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, parent = 98566152, window = 363, place = 32}, xproperty = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, window = 98566152, atom = 363, time = 32, state = 361}, xselectionclear = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, window = 98566152, selection = 363, time = 32}, xselectionrequest = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, owner = 98566152, requestor = 363, selection = 32, target = 361, property = 21308576, time = 0}, xselection = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, requestor = 98566152, selection = 363, target = 32, property = 361, time = 21308576}, xcolormap = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, window = 98566152, colormap = 363, c_new = 32, state = 0}, xclient = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, window = 98566152, message_type = 363, format = 32, data = {b = "i\\001\\000\\000\\000\\000\\000\\000\\240$E\\001\\000\\000\\000\\000\\000\\000\\000", s = {361, 0, 0, 0, 9376, 325, 0, 0, 0, 0}, l = {361, 21308576, 0, 3, 275301978}}}, xmapping = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, window = 98566152, request = 363, first_keycode = 0, count = 32}, xerror = {type = 33, display = 0x885, resourceid = 1, serial = 93825008491488, error_code = 8 '\\b', request_code = 0 '\\000', minor_code = 224 '\\340'}, xkeymap = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, window = 98566152, key_vector = "k\\001\\000\\000\\000\\000\\000\\000 \\000\\000\\000\\000\\000\\000\\000i\\001\\000\\000\\000\\000\\000\\000\\240$E\\001\\000\\000\\000"}, xgeneric = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, extension = 98566152, evtype = 0}, xcookie = {type = 33, serial = 2181, send_event = 1, display = 0x5555564d5be0, extension = 98566152, evtype = 0, cookie = 363, data = 0x20}, pad = {140733193388065, 2181, 1, 93825008491488, 98566152, 363, 32, 361, 21308576, 0, 3, 275301978, 0, 0, 0, 0, 161, 93825008815776, 93825008965040, 93825008893024, 0, 48, 64, 93802136249139}}
        this = 0x5555564d1d30
#33 0x0000555555cfe646 in std::__invoke_impl<void, juce::XWindowSystem::initialiseXDisplay()::<lambda(int)>&, int>(std::__invoke_other, struct {...} &) (__f=...) at /usr/include/c++/12.2.1/bits/invoke.h:61
No locals.
#34 0x0000555555cf96de in std::__invoke_r<void, juce::XWindowSystem::initialiseXDisplay()::<lambda(int)>&, int>(struct {...} &) (__fn=...) at /usr/include/c++/12.2.1/bits/invoke.h:111
No locals.
#35 0x0000555555cf406b in std::_Function_handler<void(int), juce::XWindowSystem::initialiseXDisplay()::<lambda(int)> >::_M_invoke(const std::_Any_data &, int &&) (__functor=..., __args#0=@0x7fffffffcf24: 5) at /usr/include/c++/12.2.1/bits/std_function.h:290
No locals.
#36 0x0000555555b20f30 in std::function<void (int)>::operator()(int) const (this=0x5555564ef310, __args#0=5) at /usr/include/c++/12.2.1/bits/std_function.h:591
No locals.
#37 0x0000555555b15d6b in operator() (__closure=0x5555564ef310) at ../../../../modules/juce_events/native/juce_linux_Messaging.cpp:357
        fd = 5
        cb = {<std::_Maybe_unary_or_binary_function<void, int>> = {<std::unary_function<int, void>> = {<No data fields>}, <No data fields>}, <std::_Function_base> = {static _M_max_size = 16, static _M_max_align = 8, _M_functor = {_M_unused = {_M_object = 0x5555564d1d30, _M_const_object = 0x5555564d1d30, _M_function_pointer = 0x5555564d1d30, _M_member_pointer = (void (std::_Undefined_class::*)(std::_Undefined_class * const)) 0x5555564d1d30}, _M_pod_data = "0\\035MVUU\\000\\000\\000\\000\\000\\000\\000\\000\\000"}, _M_manager = 0x555555cf4072 <std::_Function_handler<void(int), juce::XWindowSystem::initialiseXDisplay()::<lambda(int)> >::_M_manager(std::_Any_data &, const std::_Any_data &, std::_Manager_operation)>}, _M_invoker = 0x555555cf4034 <std::_Function_handler<void(int), juce::XWindowSystem::initialiseXDisplay()::<lambda(int)> >::_M_invoke(const std::_Any_data &, int &&)>}
#38 0x0000555555b16d34 in std::__invoke_impl<void, juce::LinuxEventLoop::registerFdCallback(int, std::function<void(int)>, short int)::<lambda()>&>(std::__invoke_other, struct {...} &) (__f=...) at /usr/include/c++/12.2.1/bits/invoke.h:61
No locals.
#39 0x0000555555b16792 in std::__invoke_r<void, juce::LinuxEventLoop::registerFdCallback(int, std::function<void(int)>, short int)::<lambda()>&>(struct {...} &) (__fn=...) at /usr/include/c++/12.2.1/bits/invoke.h:111
No locals.
#40 0x0000555555b1644c in std::_Function_handler<void(), juce::LinuxEventLoop::registerFdCallback(int, std::function<void(int)>, short int)::<lambda()> >::_M_invoke(const std::_Any_data &) (__functor=...) at /usr/include/c++/12.2.1/bits/std_function.h:290
No locals.
#41 0x0000555555672ccc in std::function<void ()>::operator()() const (this=0x5555564ef860) at /usr/include/c++/12.2.1/bits/std_function.h:591
No locals.
#42 0x0000555555b1b644 in juce::InternalRunLoop::dispatchPendingEvents (this=0x5555564d1130) at ../../../../modules/juce_events/native/juce_linux_Messaging.cpp:180
        fn = std::shared_ptr<std::function<void()>> (use count 2, weak count 0) = {get() = 0x5555564ef860}
        __for_range = std::vector of length 1, capacity 4 = {std::shared_ptr<std::function<void()>> (use count 2, weak count 0) = {get() = 0x5555564ef860}}
        __for_begin = std::shared_ptr<std::function<void()>> (use count 2, weak count 0) = {get() = 0x5555564ef860}
        __for_end = std::shared_ptr<std::function<void()>> (use count 1, weak count 0) = {get() = 0x5555565a1ef0}
#43 0x0000555555b15d1e in juce::dispatchNextMessageOnSystemQueue (returnIfNoPendingMessages=false) at ../../../../modules/juce_events/native/juce_linux_Messaging.cpp:340
        runLoop = 0x5555564d1130
#44 0x0000555555b10019 in juce::MessageManager::runDispatchLoop (this=0x5555564d1090) at ../../../../modules/juce_events/messages/juce_MessageManager.cpp:109
No locals.
#45 0x0000555555b0f534 in juce::JUCEApplicationBase::main () at ../../../../modules/juce_events/messages/juce_ApplicationBase.cpp:265
        libraryInitialiser = {<No data fields>}
        app = std::unique_ptr<juce::JUCEApplicationBase> = {get() = 0x5555564d12c0}
#46 0x0000555555b0f430 in juce::JUCEApplicationBase::main (argc=2, argv=0x7fffffffd218) at ../../../../modules/juce_events/messages/juce_ApplicationBase.cpp:243
No locals.
#47 0x0000555555702812 in main (argc=2, argv=0x7fffffffd218) at ../../Source/HostStartup.cpp:393
No locals.

I just tried to run your code on Linux (Debian 11.3 ARM64, Xorg) with AudioPluginHost and didn’t hit any assertion :frowning:

Your editor opens…

And after I closed it, removed the plugin, and quitted AudioPluginHost, everything was fine:

Can’t help any further I’m afraid, sorry.

Thanks for giving it a try!!

Could you please try quitting the host while the UI is open and visible?

Are you calling stopTimer() in the AudioPluginAudioProcessorEditor class’ destructor?

Rail

No. I’m not using any timers.

I have the same issue in my project. If I don’t close my plugin window before quitting APH, it throws the assertion. I am using Juce 7.0.2 on Ubuntu 20.04.5 LTS.

I am using a Timer, but I am destructing it. Seems to work on Windows and Mac without the assertion.

Stack trace on the left. I have not had time to step through…

@Mitchco Glad to hear I’m not alone :confused:

Just did, with both Reaper and AudioPluginHost: same result, no assertion.

@mathieudemange , which compiler are you using?