X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fvca_manager.cc;h=62589c8fdfa44371f8dc354e34fe1208694df28e;hb=b69d818ce9fb86728b0033c6396e17dea56508a8;hp=9a96dc8a38b389658742c8a87c6642b2d27aae83;hpb=aa80321976726b745741ce525f2b1b1becb29671;p=ardour.git diff --git a/libs/ardour/vca_manager.cc b/libs/ardour/vca_manager.cc index 9a96dc8a38..62589c8fdf 100644 --- a/libs/ardour/vca_manager.cc +++ b/libs/ardour/vca_manager.cc @@ -17,22 +17,29 @@ */ -#include "pbd/convert.h" +#include "pbd/error.h" #include "pbd/replace_all.h" +#include "pbd/string_convert.h" +#include "ardour/boost_debug.h" +#include "ardour/selection.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) { } @@ -44,8 +51,24 @@ VCAManager::~VCAManager () void VCAManager::clear () { - Mutex::Lock lm (lock); - _vcas.clear (); + bool send = false; + { + Mutex::Lock lm (lock); + for (VCAList::const_iterator i = _vcas.begin(); i != _vcas.end(); ++i) { + if ((*i)->is_selected ()) { + _session.selection().remove_stripable_by_id ((*i)->id()); + send = true; + } + (*i)->DropReferences (); + } + _vcas.clear (); + } + + if (send && !_session.deletion_in_progress ()) { + PropertyChange pc; + pc.add (Properties::selected); + PresentationInfo::Change (pc); + } } VCAList @@ -60,6 +83,8 @@ VCAManager::create_vca (uint32_t howmany, std::string const & name_template) { VCAList vcal; + uint32_t n_stripables = _session.nstripables (); + { Mutex::Lock lm (lock); @@ -69,11 +94,15 @@ VCAManager::create_vca (uint32_t howmany, std::string const & name_template) string name = name_template; if (name.find ("%n")) { - string sn = PBD::to_string (num, std::dec); + string sn = PBD::to_string (num); replace_all (name, "%n", sn); } boost::shared_ptr vca = boost::shared_ptr (new VCA (_session, num, name)); + BOOST_MARK_VCA (vca); + + vca->init (); + vca->set_presentation_order (n + n_stripables); _vcas.push_back (vca); vcal.push_back (vca); @@ -82,6 +111,8 @@ VCAManager::create_vca (uint32_t howmany, std::string const & name_template) VCAAdded (vcal); /* EMIT SIGNAL */ + _session.set_dirty (); + return 0; } @@ -94,14 +125,21 @@ 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 (); + + if (vca->is_selected () && !_session.deletion_in_progress ()) { + _session.selection().remove_stripable_by_id (vca->id()); + PropertyChange pc; + pc.add (Properties::selected); + PresentationInfo::Change (pc); + } + _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); @@ -114,6 +152,20 @@ VCAManager::vca_by_number (uint32_t n) const return boost::shared_ptr(); } +boost::shared_ptr +VCAManager::vca_by_name (std::string const& name) const +{ + Mutex::Lock lm (lock); + + for (VCAList::const_iterator i = _vcas.begin(); i != _vcas.end(); ++i) { + if ((*i)->name() == name || (*i)->full_name() == name) { + return *i; + } + } + + return boost::shared_ptr(); +} + XMLNode& VCAManager::get_state () { @@ -140,9 +192,17 @@ VCAManager::set_state (XMLNode const& node, int version) XMLNodeList const & children = node.children(); VCAList vcal; + _vcas_loaded = false; + 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)); + 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; + } /* can't hold the lock for the entire loop, * because the new VCA maybe slaved and needs @@ -158,7 +218,19 @@ VCAManager::set_state (XMLNode const& node, int version) } } + _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 (); + } +}