diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2016-05-16 11:08:32 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2016-05-31 15:30:42 -0400 |
commit | d5127001bb60a8648a277f77e9ae4e8fd5943c9a (patch) | |
tree | 993c959fa7737b1e5e63870928e72e41ae7e5d0a /libs/ardour | |
parent | 52d4cea712b09cff9536bd5f4c8bb465281480de (diff) |
move ControllableDescriptor from libpbd to libardour; add support for describing VCAs
Diffstat (limited to 'libs/ardour')
-rw-r--r-- | libs/ardour/ardour/controllable_descriptor.h | 93 | ||||
-rw-r--r-- | libs/ardour/ardour/session.h | 4 | ||||
-rw-r--r-- | libs/ardour/ardour/stripable.h | 3 | ||||
-rw-r--r-- | libs/ardour/controllable_descriptor.cc | 177 | ||||
-rw-r--r-- | libs/ardour/session.cc | 11 | ||||
-rw-r--r-- | libs/ardour/session_state.cc | 70 | ||||
-rw-r--r-- | libs/ardour/stripable.cc | 27 | ||||
-rw-r--r-- | libs/ardour/wscript | 3 |
8 files changed, 333 insertions, 55 deletions
diff --git a/libs/ardour/ardour/controllable_descriptor.h b/libs/ardour/ardour/controllable_descriptor.h new file mode 100644 index 0000000000..1d647ff648 --- /dev/null +++ b/libs/ardour/ardour/controllable_descriptor.h @@ -0,0 +1,93 @@ +/* + Copyright (C) 2009 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef __libardour_controllable_descriptor_h__ +#define __libardour_controllable_descriptor_h__ + +#include <vector> +#include <string> +#include <stdint.h> + +#include "ardour/libardour_visibility.h" + +namespace ARDOUR { + +class LIBARDOUR_API ControllableDescriptor { +public: + enum TopLevelType { + PresentationOrderRoute, + PresentationOrderVCA, + NamedRoute, + SelectionCount, + }; + + enum SubType { + Gain, + Trim, + Solo, + Mute, + Recenable, + PanDirection, + PanWidth, + PanElevation, + Balance, + SendGain, + PluginParameter + }; + + ControllableDescriptor () + : _top_level_type (PresentationOrderRoute) + , _subtype (Gain) + , _banked (false) + , _bank_offset (0) + {} + + int set (const std::string&); + + /* it is only valid to call top_level_name() if top_level_type() returns + NamedRoute + */ + + TopLevelType top_level_type() const { return _top_level_type; } + const std::string& top_level_name() const { return _top_level_name; } + + SubType subtype() const { return _subtype; } + + uint32_t presentation_order() const; + uint32_t selection_id() const; + uint32_t target (uint32_t n) const; + bool banked() const { return _banked; } + + void set_bank_offset (uint32_t o) { _bank_offset = o; } + +private: + TopLevelType _top_level_type; + SubType _subtype; + std::string _top_level_name; + union { + uint32_t _presentation_order; + uint32_t _selection_id; + }; + std::vector<uint32_t> _target; + uint32_t _banked; + uint32_t _bank_offset; +}; + +} + +#endif /* __libardour_controllable_descriptor_h__ */ diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index f3a11a953c..0dcad54b6c 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -88,7 +88,6 @@ class Parser; namespace PBD { class Controllable; -class ControllableDescriptor; } namespace luabridge { @@ -114,6 +113,7 @@ class BufferSet; class Bundle; class Butler; class Click; +class ControllableDescriptor; class Diskstream; class ExportHandler; class ExportStatus; @@ -988,7 +988,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop boost::shared_ptr<Processor> processor_by_id (PBD::ID) const; boost::shared_ptr<PBD::Controllable> controllable_by_id (const PBD::ID&); - boost::shared_ptr<PBD::Controllable> controllable_by_descriptor (const PBD::ControllableDescriptor&); + boost::shared_ptr<PBD::Controllable> controllable_by_descriptor (const ARDOUR::ControllableDescriptor&); void add_controllable (boost::shared_ptr<PBD::Controllable>); void remove_controllable (PBD::Controllable*); diff --git a/libs/ardour/ardour/stripable.h b/libs/ardour/ardour/stripable.h index 1b82397074..274a0109dc 100644 --- a/libs/ardour/ardour/stripable.h +++ b/libs/ardour/ardour/stripable.h @@ -183,9 +183,6 @@ class LIBARDOUR_API Stripable : public SessionObject { void set_presentation_info_explicit (PresentationInfo); void add_state (XMLNode&) const; - - private: - void set_presentation_info_internal (PresentationInfo id, bool notify_class_listeners = true); }; struct PresentationInfoSorter { diff --git a/libs/ardour/controllable_descriptor.cc b/libs/ardour/controllable_descriptor.cc new file mode 100644 index 0000000000..05aa1845a3 --- /dev/null +++ b/libs/ardour/controllable_descriptor.cc @@ -0,0 +1,177 @@ +/* + Copyright (C) 2009 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "pbd/strsplit.h" +#include "pbd/convert.h" + +#include "ardour/controllable_descriptor.h" + +using namespace std; +using namespace PBD; +using namespace ARDOUR; + +int +ControllableDescriptor::set (const std::string& str) +{ + string::size_type first_space = str.find_first_of (" "); + + if (first_space == string::npos) { + return -1; + } + + string front = str.substr (0, first_space); + string back = str.substr (first_space); + + vector<string> path; + split (front, path, '/'); + + if (path.size() < 2) { + return -1; + } + + vector<string> rest; + split (back, rest, ' '); + + if (rest.size() < 1) { + return -1; + } + + if (path[0] == "route" || path[0] == "rid") { + + _top_level_type = PresentationOrderRoute; + + if (rest[0][0] == 'B') { + _banked = true; + _presentation_order = atoi (rest[0].substr (1)); + } else if (rest[0][0] == 'S') { + _top_level_type = SelectionCount; + _banked = true; + _selection_id = atoi (rest[0].substr (1)); + } else if (isdigit (rest[0][0])) { + _banked = false; + _presentation_order = atoi (rest[0]); + } else { + return -1; + } + + } else if (path[0] == "vca") { + + _top_level_type = PresentationOrderVCA; + + if (rest[0][0] == 'B') { + _banked = true; + _presentation_order = atoi (rest[0].substr (1)); + } else if (rest[0][0] == 'S') { + _top_level_type = SelectionCount; + _banked = true; + _selection_id = atoi (rest[0].substr (1)); + } else if (isdigit (rest[0][0])) { + _banked = false; + _presentation_order = atoi (rest[0]); + } else { + return -1; + } + + } else if (path[0] == "bus" || path[0] == "track") { + + _top_level_type = NamedRoute; + _top_level_name = rest[0]; + } + + if (path[1] == "gain") { + _subtype = Gain; + + } else if (path[1] == "trim") { + _subtype = Trim; + + } else if (path[1] == "solo") { + _subtype = Solo; + + } else if (path[1] == "mute") { + _subtype = Mute; + + } else if (path[1] == "recenable") { + _subtype = Recenable; + + } else if (path[1] == "balance") { + _subtype = Balance; + + } else if (path[1] == "panwidth") { + _subtype = PanWidth; + + } else if (path[1] == "pandirection") { + _subtype = PanDirection; + + } else if (path[1] == "plugin") { + if (path.size() == 3 && rest.size() == 3) { + if (path[2] == "parameter") { + _subtype = PluginParameter; + _target.push_back (atoi (rest[1])); + _target.push_back (atoi (rest[2])); + } else { + return -1; + } + } else { + return -1; + } + } else if (path[1] == "send") { + + if (path.size() == 3 && rest.size() == 2) { + if (path[2] == "gain") { + _subtype = SendGain; + _target.push_back (atoi (rest[1])); + } else { + return -1; + } + } else { + return -1; + } + } + + return 0; +} + +uint32_t +ControllableDescriptor::presentation_order () const +{ + if (banked()) { + return _presentation_order + _bank_offset; + } + + return _presentation_order; +} + +uint32_t +ControllableDescriptor::selection_id () const +{ + if (banked()) { + return _selection_id + _bank_offset; + } + + return _selection_id; +} + +uint32_t +ControllableDescriptor::target (uint32_t n) const +{ + if (n < _target.size()) { + return _target[n]; + } + + return 0; +} diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 8856d9d323..5d452728ee 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -4206,7 +4206,7 @@ Session::get_remote_nth_stripable (uint16_t n, PresentationInfo::Flag flags) con boost::shared_ptr<RouteList> r = routes.reader (); vector<boost::shared_ptr<Route> > v; - if (n > r->size()) { + if (n >= r->size()) { return boost::shared_ptr<Route> (); } @@ -6676,14 +6676,7 @@ Session::notify_presentation_info_change () return; } - switch (Config->get_remote_model()) { - case MixerOrdered: - Stripable::PresentationInfoChange (); /* EMIT SIGNAL */ - break; - default: - break; - } - + Stripable::PresentationInfoChange (); /* EMIT SIGNAL */ reassign_track_numbers(); #ifdef USE_TRACKS_CODE_FEATURES diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 5b10389a3f..0fcda1c3f9 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -62,7 +62,6 @@ #include "evoral/SMF.hpp" #include "pbd/basename.h" -#include "pbd/controllable_descriptor.h" #include "pbd/debug.h" #include "pbd/enumwriter.h" #include "pbd/error.h" @@ -84,6 +83,7 @@ #include "ardour/automation_control.h" #include "ardour/boost_debug.h" #include "ardour/butler.h" +#include "ardour/controllable_descriptor.h" #include "ardour/control_protocol_manager.h" #include "ardour/directory_names.h" #include "ardour/filename_extensions.h" @@ -1597,6 +1597,24 @@ Session::load_routes (const XMLNode& node, int version) BootMessage (_("Finished adding tracks/busses")); + boost::shared_ptr<Route> r; + uint32_t n = nroutes (); + + for (uint32_t nn = 0; nn < n + 1; ++nn) { + r = get_remote_nth_route (nn); + if (r) { + std::cerr << "Nth-route = " << r->name() << endl; + } else { + std::cerr << "Nth-route: undefined\n"; + } + } + + boost::shared_ptr<Stripable> s; + s = get_remote_nth_stripable (0, PresentationInfo::MasterOut); + std::cerr << " Master = " << s << std::endl; + s = get_remote_nth_stripable (0, PresentationInfo::MonitorOut); + std::cerr << " Monitor = " << s << std::endl; + return 0; } @@ -3396,6 +3414,7 @@ boost::shared_ptr<Controllable> Session::controllable_by_descriptor (const ControllableDescriptor& desc) { boost::shared_ptr<Controllable> c; + boost::shared_ptr<Stripable> s; boost::shared_ptr<Route> r; switch (desc.top_level_type()) { @@ -3403,65 +3422,65 @@ Session::controllable_by_descriptor (const ControllableDescriptor& desc) { std::string str = desc.top_level_name(); if (str == "Master" || str == "master") { - r = _master_out; + s = _master_out; } else if (str == "control" || str == "listen") { - r = _monitor_out; + s = _monitor_out; } else { - r = route_by_name (desc.top_level_name()); + s = route_by_name (desc.top_level_name()); } break; } - case ControllableDescriptor::RemoteControlID: - r = get_remote_nth_route (desc.rid()); + case ControllableDescriptor::PresentationOrderRoute: + s = get_remote_nth_stripable (desc.presentation_order(), PresentationInfo::Route); + break; + + case ControllableDescriptor::PresentationOrderVCA: + s = get_remote_nth_stripable (desc.presentation_order(), PresentationInfo::VCA); break; case ControllableDescriptor::SelectionCount: - r = route_by_selected_count (desc.selection_id()); + s = route_by_selected_count (desc.selection_id()); break; } - if (!r) { + if (!s) { return c; } + r = boost::dynamic_pointer_cast<Route> (s); + switch (desc.subtype()) { case ControllableDescriptor::Gain: - c = r->gain_control (); + c = s->gain_control (); break; case ControllableDescriptor::Trim: - c = r->trim()->gain_control (); + c = s->trim_control (); break; case ControllableDescriptor::Solo: - c = r->solo_control(); + c = s->solo_control(); break; case ControllableDescriptor::Mute: - c = r->mute_control(); + c = s->mute_control(); break; case ControllableDescriptor::Recenable: - { - boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(r); - - if (t) { - c = t->rec_enable_control (); - } + c = s->recenable_control (); break; - } case ControllableDescriptor::PanDirection: - c = r->pan_azimuth_control(); + c = s->pan_azimuth_control(); break; case ControllableDescriptor::PanWidth: - c = r->pan_width_control(); + c = s->pan_width_control(); break; case ControllableDescriptor::PanElevation: - c = r->pan_elevation_control(); + c = s->pan_elevation_control(); break; case ControllableDescriptor::Balance: @@ -3483,6 +3502,10 @@ Session::controllable_by_descriptor (const ControllableDescriptor& desc) --parameter_index; } + if (!r) { + return c; + } + boost::shared_ptr<Processor> p = r->nth_plugin (plugin); if (p) { @@ -3497,6 +3520,9 @@ Session::controllable_by_descriptor (const ControllableDescriptor& desc) if (send > 0) { --send; } + if (!r) { + return c; + } c = r->send_level_controllable (send); break; } diff --git a/libs/ardour/stripable.cc b/libs/ardour/stripable.cc index d322fd75de..a9f8b2b01a 100644 --- a/libs/ardour/stripable.cc +++ b/libs/ardour/stripable.cc @@ -43,7 +43,7 @@ Stripable::Stripable (Session& s, string const & name, PresentationInfo const & void Stripable::set_presentation_group_order (PresentationInfo::order_t order, bool notify_class_listeners) { - set_presentation_info_internal (PresentationInfo (order, _presentation_info.flags()), notify_class_listeners); + set_presentation_info (PresentationInfo (order, _presentation_info.flags()), notify_class_listeners); } void @@ -55,16 +55,6 @@ Stripable::set_presentation_group_order_explicit (PresentationInfo::order_t orde void Stripable::set_presentation_info (PresentationInfo pi, bool notify_class_listeners) { - if (Config->get_remote_model() != UserOrdered) { - return; - } - - set_presentation_info_internal (pi, notify_class_listeners); -} - -void -Stripable::set_presentation_info_internal (PresentationInfo pi, bool notify_class_listeners) -{ if (pi != presentation_info()) { DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1: set edit-based RID to %2\n", name(), pi)); @@ -88,7 +78,7 @@ Stripable::set_presentation_info_internal (PresentationInfo pi, bool notify_clas void Stripable::set_presentation_info_explicit (PresentationInfo pi) { - set_presentation_info_internal (pi, false); + set_presentation_info (pi, false); } int @@ -99,24 +89,19 @@ Stripable::set_state (XMLNode const& node, int version) XMLNodeConstIterator niter; XMLNode *child; - if (version > 3000) { - - std::cerr << "Looking for PI\n"; + if (version > 3001) { for (niter = nlist.begin(); niter != nlist.end(); ++niter){ child = *niter; if (child->name() == X_("PresentationInfo")) { - std::cerr << "Found it\n"; if ((prop = child->property (X_("value"))) != 0) { _presentation_info = prop->value (); - std::cerr << "Set pinfo to " << _presentation_info << " from " << prop->value() << std::endl; } } } } else { - std::cerr << "Old\n"; /* Older versions of Ardour stored "_flags" as a property of the Route * node, only for 3 special Routes (MasterOut, MonitorOut, Auditioner. @@ -146,6 +131,12 @@ Stripable::set_state (XMLNode const& node, int version) _presentation_info.set_flags (flags); } + + if (!_presentation_info.special()) { + if ((prop = node.property (X_("order-key"))) != 0) { + _presentation_info.set_group_order (atol (prop->value())); + } + } } return 0; diff --git a/libs/ardour/wscript b/libs/ardour/wscript index 1be40f7f63..44e2f21c65 100644 --- a/libs/ardour/wscript +++ b/libs/ardour/wscript @@ -8,7 +8,7 @@ import subprocess import sys # default state file version for this build -CURRENT_SESSION_FILE_VERSION = 3001 +CURRENT_SESSION_FILE_VERSION = 3002 I18N_PACKAGE = 'ardour' @@ -57,6 +57,7 @@ libardour_sources = [ 'chan_count.cc', 'chan_mapping.cc', 'config_text.cc', + 'controllable_descriptor.cc', 'control_group.cc', 'control_protocol_manager.cc', 'cycle_timer.cc', |