diff --git a/libs/ardour/ardour/ardour.h b/libs/ardour/ardour/ardour.h index 7183841889..432937fd61 100644 --- a/libs/ardour/ardour/ardour.h +++ b/libs/ardour/ardour/ardour.h @@ -62,7 +62,7 @@ namespace ARDOUR { * @return true if Ardour library was successfully initialized */ LIBARDOUR_API bool init (bool with_vst, bool try_optimization, const char* localedir); - LIBARDOUR_API void init_post_engine (); + LIBARDOUR_API void init_post_engine (uint32_t); LIBARDOUR_API void cleanup (); LIBARDOUR_API bool no_auto_connect (); LIBARDOUR_API void make_property_quarks (); diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h index 664309e935..053a6b6750 100644 --- a/libs/ardour/ardour/audioengine.h +++ b/libs/ardour/ardour/audioengine.h @@ -196,7 +196,7 @@ class LIBARDOUR_API AudioEngine : public PortManager, public SessionHandlePtr started and stopped */ - PBD::Signal0 Running; + PBD::Signal1 Running; PBD::Signal0 Stopped; /* these two are emitted when a device reset is initiated/finished @@ -306,6 +306,7 @@ class LIBARDOUR_API AudioEngine : public PortManager, public SessionHandlePtr Glib::Threads::Cond _hw_devicelist_update_condition; Glib::Threads::Mutex _devicelist_update_lock; gint _stop_hw_devicelist_processing; + uint32_t _start_cnt; void start_hw_event_processing(); void stop_hw_event_processing(); diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index e568603020..5e9948ef8d 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -98,6 +98,7 @@ AudioEngine::AudioEngine () , _hw_devicelist_update_thread(0) , _hw_devicelist_update_count(0) , _stop_hw_devicelist_processing(0) + , _start_cnt (0) #ifdef SILENCE_AFTER_SECONDS , _silence_countdown (0) , _silence_hit_cnt (0) @@ -929,9 +930,11 @@ AudioEngine::start (bool for_latency) PortManager::fill_midi_port_info (); if (!for_latency) { - Running(); /* EMIT SIGNAL */ + Running (_start_cnt); /* EMIT SIGNAL */ } + _start_cnt++; + return 0; } diff --git a/libs/ardour/globals.cc b/libs/ardour/globals.cc index 77aff20c1a..b40db9466c 100644 --- a/libs/ardour/globals.cc +++ b/libs/ardour/globals.cc @@ -161,6 +161,8 @@ extern void setup_enum_writer (); */ PBD::PropertyChange ARDOUR::bounds_change; +static PBD::ScopedConnection engine_startup_connection; + void setup_hardware_optimization (bool try_optimization) { @@ -559,6 +561,9 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir ARDOUR::AudioEngine::create (); + /* This will run only once in whatever thread calls AudioEngine::start() */ + ARDOUR::AudioEngine::instance()->Running.connect_same_thread (engine_startup_connection, ARDOUR::init_post_engine); + /* it is unfortunate that we need to include reserved names here that refer to control surfaces. But there's no way to ensure a complete lack of collisions without doing this, since the control surface @@ -594,7 +599,7 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir } void -ARDOUR::init_post_engine () +ARDOUR::init_post_engine (uint32_t /* ignored */) { XMLNode* node; @@ -617,6 +622,12 @@ ARDOUR::init_post_engine () /* find plugins */ ARDOUR::PluginManager::instance().refresh (!Config->get_discover_vst_on_start()); + + /* Don't do this again - we are only meant to execute on the first + * engine start, not any subsequence starts + */ + + engine_startup_connection.disconnect (); } void @@ -626,6 +637,8 @@ void return; } + engine_startup_connection.disconnect (); + delete &ControlProtocolManager::instance(); ARDOUR::AudioEngine::destroy (); diff --git a/libs/ardour/test/audio_engine_test.cc b/libs/ardour/test/audio_engine_test.cc index c5801bf84b..794c331332 100644 --- a/libs/ardour/test/audio_engine_test.cc +++ b/libs/ardour/test/audio_engine_test.cc @@ -51,8 +51,6 @@ AudioEngineTest::test_start () CPPUNIT_ASSERT (backend); - init_post_engine (); - CPPUNIT_ASSERT (engine->start () == 0); Glib::usleep(2000); diff --git a/libs/ardour/test/test_util.cc b/libs/ardour/test/test_util.cc index 9b33f26762..58fc3752b6 100644 --- a/libs/ardour/test/test_util.cc +++ b/libs/ardour/test/test_util.cc @@ -105,8 +105,6 @@ create_and_start_dummy_backend () CPPUNIT_ASSERT (engine); CPPUNIT_ASSERT (engine->set_backend ("None (Dummy)", "Unit-Test", "")); - init_post_engine (); - CPPUNIT_ASSERT (engine->start () == 0); }