summaryrefslogtreecommitdiff
path: root/libs/ardour/transport_master_manager.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2019-01-24 22:05:20 -0700
committerPaul Davis <paul@linuxaudiosystems.com>2019-01-25 09:23:08 -0700
commit1be3301342c74fdbb92febcbc85e8d60fb09de0e (patch)
tree4fbdc594951ed02e89c0b47e10ccaae75e9b69fd /libs/ardour/transport_master_manager.cc
parentc01ab83e1f13f6d56a2e8ec13e9d26683dc9bb25 (diff)
new approach to handling Transport Masters when engine is restarted
Trust that ::reset() works for all transport masters, and call it when engine is stopped. This way the transport masters are ready to be called again as soon as the engine restarts.
Diffstat (limited to 'libs/ardour/transport_master_manager.cc')
-rw-r--r--libs/ardour/transport_master_manager.cc60
1 files changed, 50 insertions, 10 deletions
diff --git a/libs/ardour/transport_master_manager.cc b/libs/ardour/transport_master_manager.cc
index fafbf6042b..508d677a8a 100644
--- a/libs/ardour/transport_master_manager.cc
+++ b/libs/ardour/transport_master_manager.cc
@@ -22,6 +22,7 @@
#include "ardour/session.h"
#include "ardour/transport_master_manager.h"
+#include "pbd/boost_debug.cc"
#include "pbd/i18n.h"
#if __cplusplus > 199711L
@@ -54,19 +55,24 @@ int
TransportMasterManager::set_default_configuration ()
{
try {
+
+ clear ();
+
/* setup default transport masters. Most people will never need any
others
*/
+
add (Engine, X_("JACK Transport"), false);
add (MTC, X_("MTC"), false);
add (LTC, X_("LTC"), false);
add (MIDIClock, X_("MIDI Clock"), false);
+
} catch (...) {
return -1;
}
_current_master = _transport_masters.back();
-
+ cerr << "default current master (back) is " << _current_master->name() << endl;
return 0;
}
@@ -324,6 +330,7 @@ TransportMasterManager::add (SyncSource type, std::string const & name, bool rem
}
tm = TransportMaster::factory (type, name, removeable);
+ boost_debug_shared_ptr_mark_interesting (tm.get(), "tm");
ret = add_locked (tm);
}
@@ -382,9 +389,11 @@ TransportMasterManager::remove (std::string const & name)
int
TransportMasterManager::set_current_locked (boost::shared_ptr<TransportMaster> c)
{
- if (find (_transport_masters.begin(), _transport_masters.end(), c) == _transport_masters.end()) {
- warning << string_compose (X_("programming error: attempt to use unknown transport master named \"%1\"\n"), c->name());
- return -1;
+ if (c) {
+ if (find (_transport_masters.begin(), _transport_masters.end(), c) == _transport_masters.end()) {
+ warning << string_compose (X_("programming error: attempt to use unknown transport master \"%1\"\n"), c->name());
+ return -1;
+ }
}
_current_master = c;
@@ -393,7 +402,7 @@ TransportMasterManager::set_current_locked (boost::shared_ptr<TransportMaster> c
master_dll_initstate = 0;
- DEBUG_TRACE (DEBUG::Slave, string_compose ("current transport master set to %1\n", c->name()));
+ DEBUG_TRACE (DEBUG::Slave, string_compose ("current transport master set to %1\n", (c ? c->name() : string ("none"))));
return 0;
}
@@ -471,6 +480,7 @@ TransportMasterManager::clear ()
{
{
Glib::Threads::RWLock::WriterLock lm (lock);
+ _current_master.reset ();
_transport_masters.clear ();
}
@@ -484,18 +494,18 @@ TransportMasterManager::set_state (XMLNode const & node, int version)
XMLNodeList const & children = node.children();
-
- if (!children.empty()) {
- _transport_masters.clear ();
- }
-
{
Glib::Threads::RWLock::WriterLock lm (lock);
+ _current_master.reset ();
+ boost_debug_list_ptrs ();
+
+ _transport_masters.clear ();
for (XMLNodeList::const_iterator c = children.begin(); c != children.end(); ++c) {
boost::shared_ptr<TransportMaster> tm = TransportMaster::factory (**c);
+ boost_debug_shared_ptr_mark_interesting (tm.get(), "tm");
if (add_locked (tm)) {
continue;
@@ -548,3 +558,33 @@ TransportMasterManager::master_by_type (SyncSource src) const
return boost::shared_ptr<TransportMaster> ();
}
+
+void
+TransportMasterManager::engine_stopped ()
+{
+ {
+ Glib::Threads::RWLock::ReaderLock lm (lock);
+
+ for (TransportMasters::const_iterator tm = _transport_masters.begin(); tm != _transport_masters.end(); ++tm) {
+ (*tm)->reset (false);
+ }
+ }
+}
+
+void
+TransportMasterManager::restart ()
+{
+ XMLNode* node;
+
+ if ((node = Config->transport_master_state()) != 0) {
+ if (TransportMasterManager::instance().set_state (*node, Stateful::loading_state_version)) {
+ error << _("Cannot restore transport master manager") << endmsg;
+ /* XXX now what? */
+ }
+ } else {
+ if (TransportMasterManager::instance().set_default_configuration ()) {
+ error << _("Cannot initialize transport master manager") << endmsg;
+ /* XXX now what? */
+ }
+ }
+}