X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fvca_manager.cc;h=20e9e38ca2aaf0b7e0bc7ec73f7a15df04fee546;hb=d92686afb4105b84b014372b6feb0ccc454a5171;hp=c8e3a009e4eed27f02a64674c1d5ded0c24577ad;hpb=dd31ef2d1b95d05e74307f075d2070b10ae94884;p=ardour.git diff --git a/libs/ardour/vca_manager.cc b/libs/ardour/vca_manager.cc index c8e3a009e4..20e9e38ca2 100644 --- a/libs/ardour/vca_manager.cc +++ b/libs/ardour/vca_manager.cc @@ -18,21 +18,27 @@ */ #include "pbd/convert.h" +#include "pbd/error.h" #include "pbd/replace_all.h" +#include "ardour/boost_debug.h" +#include "ardour/session.h" +#include "ardour/slavable.h" #include "ardour/vca.h" #include "ardour/vca_manager.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace ARDOUR; using namespace Glib::Threads; +using namespace PBD; using std::string; string VCAManager::xml_node_name (X_("VCAManager")); VCAManager::VCAManager (Session& s) : SessionHandleRef (s) + , _vcas_loaded (false) { } @@ -45,6 +51,9 @@ void VCAManager::clear () { Mutex::Lock lm (lock); + for (VCAList::const_iterator i = _vcas.begin(); i != _vcas.end(); ++i) { + (*i)->DropReferences (); + } _vcas.clear (); } @@ -74,6 +83,9 @@ VCAManager::create_vca (uint32_t howmany, std::string const & name_template) } boost::shared_ptr vca = boost::shared_ptr (new VCA (_session, num, name)); + BOOST_MARK_VCA (vca); + + vca->init (); _vcas.push_back (vca); vcal.push_back (vca); @@ -82,6 +94,8 @@ VCAManager::create_vca (uint32_t howmany, std::string const & name_template) VCAAdded (vcal); /* EMIT SIGNAL */ + _session.set_dirty (); + return 0; } @@ -94,14 +108,15 @@ VCAManager::remove_vca (boost::shared_ptr vca) _vcas.remove (vca); } - VCAList vcal; - vcal.push_back (vca); + /* this should cause deassignment and deletion */ - VCARemoved (vcal); /* EMIT SIGNAL */ + vca->DropReferences (); + + _session.set_dirty (); } boost::shared_ptr -VCAManager::vca_by_number (uint32_t n) const +VCAManager::vca_by_number (int32_t n) const { Mutex::Lock lm (lock); @@ -140,20 +155,45 @@ VCAManager::set_state (XMLNode const& node, int version) XMLNodeList const & children = node.children(); VCAList vcal; - { + _vcas_loaded = false; - Mutex::Lock lm (lock); + for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) { + if ((*i)->name() == VCA::xml_node_name) { + boost::shared_ptr vca = boost::shared_ptr (new VCA (_session, 0, X_("tobereset"))); + BOOST_MARK_VCA (vca); + + if (vca->init() || vca->set_state (**i, version)) { + error << _("Cannot set state of a VCA") << endmsg; + return -1; + } - for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) { - if ((*i)->name() == VCA::xml_node_name) { - boost::shared_ptr vca = boost::shared_ptr (new VCA (_session, **i, version)); + /* can't hold the lock for the entire loop, + * because the new VCA maybe slaved and needs + * to call back into us to set up its own + * slave/master relationship + */ + + { + Mutex::Lock lm (lock); _vcas.push_back (vca); vcal.push_back (vca); } } } + _vcas_loaded = true; + VCAAdded (vcal); /* EMIT SIGNAL */ return 0; } + +void +VCAManager::clear_all_solo_state () +{ + Mutex::Lock lm (lock); + + for (VCAList::const_iterator i = _vcas.begin(); i != _vcas.end(); ++i) { + (*i)->clear_all_solo_state (); + } +}