From d5127001bb60a8648a277f77e9ae4e8fd5943c9a Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 16 May 2016 11:08:32 -0400 Subject: [PATCH] move ControllableDescriptor from libpbd to libardour; add support for describing VCAs --- .../ardour}/controllable_descriptor.h | 22 +++--- libs/ardour/ardour/session.h | 4 +- libs/ardour/ardour/stripable.h | 3 - .../controllable_descriptor.cc | 34 +++++++-- libs/ardour/session.cc | 11 +-- libs/ardour/session_state.cc | 70 +++++++++++++------ libs/ardour/stripable.cc | 27 +++---- libs/ardour/wscript | 3 +- libs/pbd/wscript | 1 - libs/surfaces/faderport/faderport.cc | 2 +- .../generic_midi_control_protocol.cc | 2 +- .../generic_midi_control_protocol.h | 4 +- .../surfaces/generic_midi/midicontrollable.cc | 2 +- libs/surfaces/generic_midi/midicontrollable.h | 6 +- 14 files changed, 109 insertions(+), 82 deletions(-) rename libs/{pbd/pbd => ardour/ardour}/controllable_descriptor.h (82%) rename libs/{pbd => ardour}/controllable_descriptor.cc (79%) diff --git a/libs/pbd/pbd/controllable_descriptor.h b/libs/ardour/ardour/controllable_descriptor.h similarity index 82% rename from libs/pbd/pbd/controllable_descriptor.h rename to libs/ardour/ardour/controllable_descriptor.h index b7eb26988e..1d647ff648 100644 --- a/libs/pbd/pbd/controllable_descriptor.h +++ b/libs/ardour/ardour/controllable_descriptor.h @@ -16,21 +16,22 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#ifndef __pbd_controllable_descriptor_h__ -#define __pbd_controllable_descriptor_h__ +#ifndef __libardour_controllable_descriptor_h__ +#define __libardour_controllable_descriptor_h__ #include #include #include -#include "pbd/libpbd_visibility.h" +#include "ardour/libardour_visibility.h" -namespace PBD { +namespace ARDOUR { -class LIBPBD_API ControllableDescriptor { +class LIBARDOUR_API ControllableDescriptor { public: enum TopLevelType { - RemoteControlID, + PresentationOrderRoute, + PresentationOrderVCA, NamedRoute, SelectionCount, }; @@ -50,9 +51,8 @@ public: }; ControllableDescriptor () - : _top_level_type (RemoteControlID) + : _top_level_type (PresentationOrderRoute) , _subtype (Gain) - , _rid (0) , _banked (false) , _bank_offset (0) {} @@ -68,7 +68,7 @@ public: SubType subtype() const { return _subtype; } - uint32_t rid() const; + uint32_t presentation_order() const; uint32_t selection_id() const; uint32_t target (uint32_t n) const; bool banked() const { return _banked; } @@ -80,7 +80,7 @@ private: SubType _subtype; std::string _top_level_name; union { - uint32_t _rid; + uint32_t _presentation_order; uint32_t _selection_id; }; std::vector _target; @@ -90,4 +90,4 @@ private: } -#endif /* __pbd_controllable_descriptor_h__ */ +#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_by_id (PBD::ID) const; boost::shared_ptr controllable_by_id (const PBD::ID&); - boost::shared_ptr controllable_by_descriptor (const PBD::ControllableDescriptor&); + boost::shared_ptr controllable_by_descriptor (const ARDOUR::ControllableDescriptor&); void add_controllable (boost::shared_ptr); 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/pbd/controllable_descriptor.cc b/libs/ardour/controllable_descriptor.cc similarity index 79% rename from libs/pbd/controllable_descriptor.cc rename to libs/ardour/controllable_descriptor.cc index dce734127d..05aa1845a3 100644 --- a/libs/pbd/controllable_descriptor.cc +++ b/libs/ardour/controllable_descriptor.cc @@ -16,12 +16,14 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include "pbd/controllable_descriptor.h" #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) @@ -51,18 +53,36 @@ ControllableDescriptor::set (const std::string& str) if (path[0] == "route" || path[0] == "rid") { - _top_level_type = RemoteControlID; + _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; - _rid = atoi (rest[0].substr (1)); + _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; - _rid = atoi (rest[0]); + _presentation_order = atoi (rest[0]); } else { return -1; } @@ -127,13 +147,13 @@ ControllableDescriptor::set (const std::string& str) } uint32_t -ControllableDescriptor::rid () const +ControllableDescriptor::presentation_order () const { if (banked()) { - return _rid + _bank_offset; + return _presentation_order + _bank_offset; } - return _rid; + return _presentation_order; } uint32_t 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 r = routes.reader (); vector > v; - if (n > r->size()) { + if (n >= r->size()) { return boost::shared_ptr (); } @@ -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 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 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 Session::controllable_by_descriptor (const ControllableDescriptor& desc) { boost::shared_ptr c; + boost::shared_ptr s; boost::shared_ptr 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 (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 t = boost::dynamic_pointer_cast(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 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 @@ -54,16 +54,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()) { @@ -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', diff --git a/libs/pbd/wscript b/libs/pbd/wscript index 18b13e3054..a996c1913c 100644 --- a/libs/pbd/wscript +++ b/libs/pbd/wscript @@ -37,7 +37,6 @@ libpbd_sources = [ 'configuration_variable.cc', 'convert.cc', 'controllable.cc', - 'controllable_descriptor.cc', 'crossthread.cc', 'cpus.cc', 'debug.cc', diff --git a/libs/surfaces/faderport/faderport.cc b/libs/surfaces/faderport/faderport.cc index 3d549348f4..7b76e9950d 100644 --- a/libs/surfaces/faderport/faderport.cc +++ b/libs/surfaces/faderport/faderport.cc @@ -26,7 +26,6 @@ #include #include -#include "pbd/controllable_descriptor.h" #include "pbd/error.h" #include "pbd/failed_constructor.h" #include "pbd/file_utils.h" @@ -40,6 +39,7 @@ #include "ardour/audioengine.h" #include "ardour/amp.h" #include "ardour/bundle.h" +#include "ardour/controllable_descriptor.h" #include "ardour/debug.h" #include "ardour/filesystem_paths.h" #include "ardour/midi_port.h" diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc index 6277adc84e..d4dbb69cb2 100644 --- a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc +++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc @@ -25,7 +25,6 @@ #include #include -#include "pbd/controllable_descriptor.h" #include "pbd/error.h" #include "pbd/failed_constructor.h" #include "pbd/file_utils.h" @@ -37,6 +36,7 @@ #include "ardour/async_midi_port.h" #include "ardour/audioengine.h" #include "ardour/audioengine.h" +#include "ardour/controllable_descriptor.h" #include "ardour/filesystem_paths.h" #include "ardour/session.h" #include "ardour/route.h" diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.h b/libs/surfaces/generic_midi/generic_midi_control_protocol.h index a453716e95..c1e59bc0dc 100644 --- a/libs/surfaces/generic_midi/generic_midi_control_protocol.h +++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.h @@ -30,11 +30,11 @@ namespace PBD { class Controllable; - class ControllableDescriptor; } namespace ARDOUR { class AsyncMIDIPort; + class ControllableDescriptor; class MidiPort; class Session; } @@ -63,7 +63,7 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol { int set_feedback (bool yn); bool get_feedback () const; - boost::shared_ptr lookup_controllable (const PBD::ControllableDescriptor&) const; + boost::shared_ptr lookup_controllable (const ARDOUR::ControllableDescriptor&) const; XMLNode& get_state (); int set_state (const XMLNode&, int version); diff --git a/libs/surfaces/generic_midi/midicontrollable.cc b/libs/surfaces/generic_midi/midicontrollable.cc index 1051503fc4..d99f319f65 100644 --- a/libs/surfaces/generic_midi/midicontrollable.cc +++ b/libs/surfaces/generic_midi/midicontrollable.cc @@ -23,7 +23,6 @@ #include #include "pbd/error.h" -#include "pbd/controllable_descriptor.h" #include "pbd/xml++.h" #include "pbd/stacktrace.h" #include "pbd/compose.h" @@ -34,6 +33,7 @@ #include "ardour/async_midi_port.h" #include "ardour/automation_control.h" +#include "ardour/controllable_descriptor.h" #include "ardour/midi_ui.h" #include "ardour/utils.h" #include "ardour/debug.h" diff --git a/libs/surfaces/generic_midi/midicontrollable.h b/libs/surfaces/generic_midi/midicontrollable.h index 8c14856742..ebae2e9294 100644 --- a/libs/surfaces/generic_midi/midicontrollable.h +++ b/libs/surfaces/generic_midi/midicontrollable.h @@ -30,7 +30,7 @@ #include "ardour/types.h" -namespace PBD { +namespace ARDOUR { class ControllableDescriptor; } @@ -91,7 +91,7 @@ class MIDIControllable : public PBD::Stateful void set_controllable (PBD::Controllable*); const std::string& current_uri() const { return _current_uri; } - PBD::ControllableDescriptor& descriptor() const { return *_descriptor; } + ARDOUR::ControllableDescriptor& descriptor() const { return *_descriptor; } std::string control_description() const { return _control_description; } @@ -116,7 +116,7 @@ class MIDIControllable : public PBD::Stateful GenericMidiControlProtocol* _surface; PBD::Controllable* controllable; - PBD::ControllableDescriptor* _descriptor; + ARDOUR::ControllableDescriptor* _descriptor; std::string _current_uri; MIDI::Parser& _parser; bool setting; -- 2.30.2