mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-08 07:45:00 +01:00
move ControllableDescriptor from libpbd to libardour; add support for describing VCAs
This commit is contained in:
parent
52d4cea712
commit
d5127001bb
14 changed files with 109 additions and 82 deletions
|
|
@ -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 <vector>
|
||||
#include <string>
|
||||
#include <stdint.h>
|
||||
|
||||
#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<uint32_t> _target;
|
||||
|
|
@ -90,4 +90,4 @@ private:
|
|||
|
||||
}
|
||||
|
||||
#endif /* __pbd_controllable_descriptor_h__ */
|
||||
#endif /* __libardour_controllable_descriptor_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*);
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
_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;
|
||||
}
|
||||
|
||||
} 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;
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -37,7 +37,6 @@ libpbd_sources = [
|
|||
'configuration_variable.cc',
|
||||
'convert.cc',
|
||||
'controllable.cc',
|
||||
'controllable_descriptor.cc',
|
||||
'crossthread.cc',
|
||||
'cpus.cc',
|
||||
'debug.cc',
|
||||
|
|
|
|||
|
|
@ -26,7 +26,6 @@
|
|||
#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"
|
||||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@
|
|||
#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"
|
||||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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<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);
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@
|
|||
#include <iostream>
|
||||
|
||||
#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"
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue