--- /dev/null
+/*
+ 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__ */
namespace PBD {
class Controllable;
-class ControllableDescriptor;
}
namespace luabridge {
class Bundle;
class Butler;
class Click;
+class ControllableDescriptor;
class Diskstream;
class ExportHandler;
class ExportStatus;
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*);
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 {
--- /dev/null
+/*
+ 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;
+}
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> ();
}
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
#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"
#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"
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;
}
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()) {
{
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:
--parameter_index;
}
+ if (!r) {
+ return c;
+ }
+
boost::shared_ptr<Processor> p = r->nth_plugin (plugin);
if (p) {
if (send > 0) {
--send;
}
+ if (!r) {
+ return c;
+ }
c = r->send_level_controllable (send);
break;
}
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
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()) {
void
Stripable::set_presentation_info_explicit (PresentationInfo pi)
{
- set_presentation_info_internal (pi, false);
+ set_presentation_info (pi, false);
}
int
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.
_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;
import sys
# default state file version for this build
-CURRENT_SESSION_FILE_VERSION = 3001
+CURRENT_SESSION_FILE_VERSION = 3002
I18N_PACKAGE = 'ardour'
'chan_count.cc',
'chan_mapping.cc',
'config_text.cc',
+ 'controllable_descriptor.cc',
'control_group.cc',
'control_protocol_manager.cc',
'cycle_timer.cc',
+++ /dev/null
-/*
- 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/controllable_descriptor.h"
-#include "pbd/strsplit.h"
-#include "pbd/convert.h"
-
-using namespace std;
-using namespace PBD;
-
-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 = RemoteControlID;
-
- if (rest[0][0] == 'B') {
- _banked = true;
- _rid = 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]);
- } 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::rid () const
-{
- if (banked()) {
- return _rid + _bank_offset;
- }
-
- return _rid;
-}
-
-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;
-}
+++ /dev/null
-/*
- 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 __pbd_controllable_descriptor_h__
-#define __pbd_controllable_descriptor_h__
-
-#include <vector>
-#include <string>
-#include <stdint.h>
-
-#include "pbd/libpbd_visibility.h"
-
-namespace PBD {
-
-class LIBPBD_API ControllableDescriptor {
-public:
- enum TopLevelType {
- RemoteControlID,
- NamedRoute,
- SelectionCount,
- };
-
- enum SubType {
- Gain,
- Trim,
- Solo,
- Mute,
- Recenable,
- PanDirection,
- PanWidth,
- PanElevation,
- Balance,
- SendGain,
- PluginParameter
- };
-
- ControllableDescriptor ()
- : _top_level_type (RemoteControlID)
- , _subtype (Gain)
- , _rid (0)
- , _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 rid() 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 _rid;
- uint32_t _selection_id;
- };
- std::vector<uint32_t> _target;
- uint32_t _banked;
- uint32_t _bank_offset;
-};
-
-}
-
-#endif /* __pbd_controllable_descriptor_h__ */
'configuration_variable.cc',
'convert.cc',
'controllable.cc',
- 'controllable_descriptor.cc',
'crossthread.cc',
'cpus.cc',
'debug.cc',
#include <glibmm/fileutils.h>
#include <glibmm/miscutils.h>
-#include "pbd/controllable_descriptor.h"
#include "pbd/error.h"
#include "pbd/failed_constructor.h"
#include "pbd/file_utils.h"
#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"
#include <glibmm/fileutils.h>
#include <glibmm/miscutils.h>
-#include "pbd/controllable_descriptor.h"
#include "pbd/error.h"
#include "pbd/failed_constructor.h"
#include "pbd/file_utils.h"
#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"
namespace PBD {
class Controllable;
- class ControllableDescriptor;
}
namespace ARDOUR {
class AsyncMIDIPort;
+ class ControllableDescriptor;
class MidiPort;
class Session;
}
int set_feedback (bool yn);
bool get_feedback () const;
- boost::shared_ptr<PBD::Controllable> lookup_controllable (const PBD::ControllableDescriptor&) const;
+ boost::shared_ptr<PBD::Controllable> lookup_controllable (const ARDOUR::ControllableDescriptor&) const;
XMLNode& get_state ();
int set_state (const XMLNode&, int version);
#include <iostream>
#include "pbd/error.h"
-#include "pbd/controllable_descriptor.h"
#include "pbd/xml++.h"
#include "pbd/stacktrace.h"
#include "pbd/compose.h"
#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"
#include "ardour/types.h"
-namespace PBD {
+namespace ARDOUR {
class ControllableDescriptor;
}
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; }
GenericMidiControlProtocol* _surface;
PBD::Controllable* controllable;
- PBD::ControllableDescriptor* _descriptor;
+ ARDOUR::ControllableDescriptor* _descriptor;
std::string _current_uri;
MIDI::Parser& _parser;
bool setting;