summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2019-01-16 15:29:21 -0600
committerPaul Davis <paul@linuxaudiosystems.com>2019-01-16 15:29:38 -0600
commit4c064081af23656c6b1bef756e23b20b9770a213 (patch)
treeccc99fc9b7e22192209432a93f96aafb13d8839a /libs/ardour
parentcd70c6bda5b34bc254a5bf0f1e462f988c631f6a (diff)
(libs) call ARDOUR::init_post_engine() from within libardour rather than requiring "users" of the library to arrange for it
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/ardour.h2
-rw-r--r--libs/ardour/ardour/audioengine.h3
-rw-r--r--libs/ardour/audioengine.cc5
-rw-r--r--libs/ardour/globals.cc15
-rw-r--r--libs/ardour/test/audio_engine_test.cc2
-rw-r--r--libs/ardour/test/test_util.cc2
6 files changed, 21 insertions, 8 deletions
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<void> Running;
+ PBD::Signal1<void,uint32_t> Running;
PBD::Signal0<void> 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);
}