mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-20 13:46:30 +01:00
Unify editor / mixer ordering.
This commit is contained in:
parent
f5c386bbb4
commit
5b62e88fbf
29 changed files with 112 additions and 270 deletions
|
|
@ -173,7 +173,6 @@ CONFIG_VARIABLE (bool, use_overlap_equivalency, "use-overlap-equivalency", false
|
|||
CONFIG_VARIABLE (bool, periodic_safety_backups, "periodic-safety-backups", true)
|
||||
CONFIG_VARIABLE (uint32_t, periodic_safety_backup_interval, "periodic-safety-backup-interval", 120)
|
||||
CONFIG_VARIABLE (float, automation_interval_msecs, "automation-interval-msecs", 30)
|
||||
CONFIG_VARIABLE (bool, sync_all_route_ordering, "sync-all-route-ordering", true)
|
||||
CONFIG_VARIABLE (bool, only_copy_imported_files, "only-copy-imported-files", false)
|
||||
CONFIG_VARIABLE (bool, keep_tearoffs, "keep-tearoffs", false)
|
||||
CONFIG_VARIABLE (bool, new_plugins_active, "new-plugins-active", true)
|
||||
|
|
|
|||
|
|
@ -101,10 +101,9 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember,
|
|||
bool set_name (const std::string& str);
|
||||
static void set_name_in_state (XMLNode &, const std::string &);
|
||||
|
||||
uint32_t order_key (RouteSortOrderKey) const;
|
||||
bool has_order_key (RouteSortOrderKey) const;
|
||||
void set_order_key (RouteSortOrderKey, uint32_t);
|
||||
void sync_order_keys (RouteSortOrderKey);
|
||||
uint32_t order_key () const;
|
||||
bool has_order_key () const;
|
||||
void set_order_key (uint32_t);
|
||||
|
||||
bool is_auditioner() const { return _flags & Auditioner; }
|
||||
bool is_master() const { return _flags & MasterOut; }
|
||||
|
|
@ -426,7 +425,7 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember,
|
|||
|
||||
void set_remote_control_id (uint32_t id, bool notify_class_listeners = true);
|
||||
uint32_t remote_control_id () const;
|
||||
void set_remote_control_id_from_order_key (RouteSortOrderKey, uint32_t order_key);
|
||||
void set_remote_control_id_explicit (uint32_t order_key);
|
||||
|
||||
/* for things concerned about *this* route's RID */
|
||||
|
||||
|
|
@ -435,7 +434,7 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember,
|
|||
/* for things concerned about *any* route's RID changes */
|
||||
|
||||
static PBD::Signal0<void> RemoteControlIDChange;
|
||||
static PBD::Signal1<void,RouteSortOrderKey> SyncOrderKeys;
|
||||
static PBD::Signal0<void> SyncOrderKeys;
|
||||
|
||||
bool has_external_redirects() const;
|
||||
|
||||
|
|
@ -546,8 +545,8 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember,
|
|||
int set_state_2X (const XMLNode&, int);
|
||||
void set_processor_state_2X (XMLNodeList const &, int);
|
||||
|
||||
typedef std::map<RouteSortOrderKey,uint32_t> OrderKeys;
|
||||
OrderKeys order_keys;
|
||||
uint32_t _order_key;
|
||||
bool _has_order_key;
|
||||
uint32_t _remote_control_id;
|
||||
|
||||
void input_change_handler (IOChange, void *src);
|
||||
|
|
|
|||
|
|
@ -242,7 +242,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
|
|||
};
|
||||
|
||||
void notify_remote_id_change ();
|
||||
void sync_order_keys (RouteSortOrderKey);
|
||||
void sync_order_keys ();
|
||||
|
||||
template<class T> void foreach_route (T *obj, void (T::*func)(Route&));
|
||||
template<class T> void foreach_route (T *obj, void (T::*func)(boost::shared_ptr<Route>));
|
||||
|
|
|
|||
|
|
@ -353,11 +353,6 @@ namespace ARDOUR {
|
|||
PostFader
|
||||
};
|
||||
|
||||
enum RouteSortOrderKey {
|
||||
EditorSort,
|
||||
MixerSort
|
||||
};
|
||||
|
||||
enum MonitorModel {
|
||||
HardwareMonitoring, ///< JACK does monitoring
|
||||
SoftwareMonitoring, ///< Ardour does monitoring
|
||||
|
|
@ -419,8 +414,7 @@ namespace ARDOUR {
|
|||
|
||||
enum RemoteModel {
|
||||
UserOrdered,
|
||||
MixerOrdered,
|
||||
EditorOrdered
|
||||
MixerOrdered
|
||||
};
|
||||
|
||||
enum CrossfadeModel {
|
||||
|
|
|
|||
|
|
@ -95,7 +95,6 @@ setup_enum_writer ()
|
|||
AutoState _AutoState;
|
||||
AutoStyle _AutoStyle;
|
||||
AutoConnectOption _AutoConnectOption;
|
||||
RouteSortOrderKey _RouteSortOrderKey;
|
||||
Session::StateOfTheState _Session_StateOfTheState;
|
||||
Route::Flag _Route_Flag;
|
||||
Source::Flag _Source_Flag;
|
||||
|
|
@ -281,8 +280,13 @@ setup_enum_writer ()
|
|||
|
||||
REGISTER_ENUM (UserOrdered);
|
||||
REGISTER_ENUM (MixerOrdered);
|
||||
REGISTER_ENUM (EditorOrdered);
|
||||
REGISTER (_RemoteModel);
|
||||
/*
|
||||
* EditorOrdered has been deprecated
|
||||
* since the removal of independent
|
||||
* editor / mixer ordering.
|
||||
*/
|
||||
enum_writer.add_to_hack_table ("EditorOrdered", "MixerOrdered");
|
||||
|
||||
REGISTER_ENUM (FullCrossfade);
|
||||
REGISTER_ENUM (ShortCrossfade);
|
||||
|
|
@ -434,10 +438,6 @@ setup_enum_writer ()
|
|||
REGISTER_CLASS_ENUM (Route, MonitorOut);
|
||||
REGISTER_BITS (_Route_Flag);
|
||||
|
||||
REGISTER_ENUM (MixerSort);
|
||||
REGISTER_ENUM (EditorSort);
|
||||
REGISTER (_RouteSortOrderKey);
|
||||
|
||||
REGISTER_CLASS_ENUM (Source, Writable);
|
||||
REGISTER_CLASS_ENUM (Source, CanRename);
|
||||
REGISTER_CLASS_ENUM (Source, Broadcast);
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ using namespace std;
|
|||
using namespace ARDOUR;
|
||||
using namespace PBD;
|
||||
|
||||
PBD::Signal1<void,RouteSortOrderKey> Route::SyncOrderKeys;
|
||||
PBD::Signal0<void> Route::SyncOrderKeys;
|
||||
PBD::Signal0<void> Route::RemoteControlIDChange;
|
||||
|
||||
Route::Route (Session& sess, string name, Flag flg, DataType default_type)
|
||||
|
|
@ -96,6 +96,7 @@ Route::Route (Session& sess, string name, Flag flg, DataType default_type)
|
|||
, _have_internal_generator (false)
|
||||
, _solo_safe (false)
|
||||
, _default_type (default_type)
|
||||
, _has_order_key (false)
|
||||
, _remote_control_id (0)
|
||||
, _in_configure_processors (false)
|
||||
, _initial_io_setup (false)
|
||||
|
|
@ -268,52 +269,19 @@ Route::remote_control_id() const
|
|||
}
|
||||
|
||||
bool
|
||||
Route::has_order_key (RouteSortOrderKey key) const
|
||||
Route::has_order_key () const
|
||||
{
|
||||
return (order_keys.find (key) != order_keys.end());
|
||||
return _has_order_key;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
Route::order_key (RouteSortOrderKey key) const
|
||||
Route::order_key () const
|
||||
{
|
||||
OrderKeys::const_iterator i = order_keys.find (key);
|
||||
|
||||
if (i == order_keys.end()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return i->second;
|
||||
return _order_key;
|
||||
}
|
||||
|
||||
void
|
||||
Route::sync_order_keys (RouteSortOrderKey base)
|
||||
{
|
||||
/* this is called after changes to 1 or more route order keys have been
|
||||
* made, and we want to sync up.
|
||||
*/
|
||||
|
||||
OrderKeys::iterator i = order_keys.find (base);
|
||||
|
||||
if (i == order_keys.end()) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (OrderKeys::iterator k = order_keys.begin(); k != order_keys.end(); ++k) {
|
||||
|
||||
if (k->first != base) {
|
||||
DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 set key for %2 to %3 from %4\n",
|
||||
name(),
|
||||
enum_2_string (k->first),
|
||||
i->second,
|
||||
enum_2_string (base)));
|
||||
|
||||
k->second = i->second;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Route::set_remote_control_id_from_order_key (RouteSortOrderKey /*key*/, uint32_t rid)
|
||||
Route::set_remote_control_id_explicit (uint32_t rid)
|
||||
{
|
||||
if (is_master() || is_monitor() || is_auditioner()) {
|
||||
/* hard-coded remote IDs, or no remote ID */
|
||||
|
|
@ -337,18 +305,18 @@ Route::set_remote_control_id_from_order_key (RouteSortOrderKey /*key*/, uint32_t
|
|||
}
|
||||
|
||||
void
|
||||
Route::set_order_key (RouteSortOrderKey key, uint32_t n)
|
||||
Route::set_order_key (uint32_t n)
|
||||
{
|
||||
OrderKeys::iterator i = order_keys.find (key);
|
||||
_has_order_key = true;
|
||||
|
||||
if (i != order_keys.end() && i->second == n) {
|
||||
if (_order_key == n) {
|
||||
return;
|
||||
}
|
||||
|
||||
order_keys[key] = n;
|
||||
_order_key = n;
|
||||
|
||||
DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 order key %2 set to %3\n",
|
||||
name(), enum_2_string (key), order_key (key)));
|
||||
DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 order key set to %2\n",
|
||||
name(), order_key ()));
|
||||
|
||||
_session.set_dirty ();
|
||||
}
|
||||
|
|
@ -1909,24 +1877,8 @@ Route::state(bool full_state)
|
|||
node->add_property("route-group", _route_group->name());
|
||||
}
|
||||
|
||||
string order_string;
|
||||
OrderKeys::iterator x = order_keys.begin();
|
||||
|
||||
while (x != order_keys.end()) {
|
||||
order_string += enum_2_string ((*x).first);
|
||||
order_string += '=';
|
||||
snprintf (buf, sizeof(buf), "%" PRId32, (*x).second);
|
||||
order_string += buf;
|
||||
|
||||
++x;
|
||||
|
||||
if (x == order_keys.end()) {
|
||||
break;
|
||||
}
|
||||
|
||||
order_string += ':';
|
||||
}
|
||||
node->add_property ("order-keys", order_string);
|
||||
snprintf (buf, sizeof (buf), "%d", _order_key);
|
||||
node->add_property ("order-key", buf);
|
||||
node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
|
||||
snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
|
||||
node->add_property ("soloed-by-upstream", buf);
|
||||
|
|
@ -2127,7 +2079,11 @@ Route::set_state (const XMLNode& node, int version)
|
|||
set_active (yn, this);
|
||||
}
|
||||
|
||||
if ((prop = node.property (X_("order-keys"))) != 0) {
|
||||
if ((prop = node.property (X_("order-key"))) != 0) { // New order key (no separate mixer/editor ordering)
|
||||
set_order_key (atoi(prop->value()));
|
||||
}
|
||||
|
||||
if ((prop = node.property (X_("order-keys"))) != 0) { // Deprecated order keys
|
||||
|
||||
int32_t n;
|
||||
|
||||
|
|
@ -2145,17 +2101,11 @@ Route::set_state (const XMLNode& node, int version)
|
|||
<< endmsg;
|
||||
} else {
|
||||
string keyname = remaining.substr (0, equal);
|
||||
RouteSortOrderKey sk;
|
||||
|
||||
if (keyname == "signal") {
|
||||
sk = MixerSort;
|
||||
} else if (keyname == "editor") {
|
||||
sk = EditorSort;
|
||||
} else {
|
||||
sk = (RouteSortOrderKey) string_2_enum (remaining.substr (0, equal), sk);
|
||||
if ((keyname == "EditorSort") || (keyname == "editor")) {
|
||||
cerr << "Setting " << name() << " order key to " << n << " using saved Editor order." << endl;
|
||||
set_order_key (n);
|
||||
}
|
||||
|
||||
set_order_key (sk, n);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2356,17 +2306,11 @@ Route::set_state_2X (const XMLNode& node, int version)
|
|||
<< endmsg;
|
||||
} else {
|
||||
string keyname = remaining.substr (0, equal);
|
||||
RouteSortOrderKey sk;
|
||||
|
||||
if (keyname == "signal") {
|
||||
sk = MixerSort;
|
||||
} else if (keyname == "editor") {
|
||||
sk = EditorSort;
|
||||
} else {
|
||||
sk = (RouteSortOrderKey) string_2_enum (remaining.substr (0, equal), sk);
|
||||
if (keyname == "EditorSort" || keyname == "editor") {
|
||||
info << string_compose(_("Converting deprecated order key for %1 using Editor order %2"), name (), n) << endmsg;
|
||||
set_order_key (n);
|
||||
}
|
||||
|
||||
set_order_key (sk, n);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -170,7 +170,7 @@ struct RouteRecEnabledComparator
|
|||
if (r1->record_enabled()) {
|
||||
if (r2->record_enabled()) {
|
||||
/* both rec-enabled, just use signal order */
|
||||
return r1->order_key (MixerSort) < r2->order_key (MixerSort);
|
||||
return r1->order_key () < r2->order_key ();
|
||||
} else {
|
||||
/* r1 rec-enabled, r2 not rec-enabled, run r2 early */
|
||||
return false;
|
||||
|
|
@ -181,7 +181,7 @@ struct RouteRecEnabledComparator
|
|||
return true;
|
||||
} else {
|
||||
/* neither rec-enabled, use signal order */
|
||||
return r1->order_key (MixerSort) < r2->order_key (MixerSort);
|
||||
return r1->order_key () < r2->order_key ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1699,7 +1699,7 @@ Session::resort_routes_using (boost::shared_ptr<RouteList> r)
|
|||
DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
|
||||
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
|
||||
DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
|
||||
(*i)->name(), (*i)->order_key (MixerSort)));
|
||||
(*i)->name(), (*i)->order_key ()));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
@ -2396,15 +2396,13 @@ Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool
|
|||
ID in most situations.
|
||||
*/
|
||||
|
||||
if (!r->has_order_key (EditorSort)) {
|
||||
if (!r->has_order_key ()) {
|
||||
if (r->is_auditioner()) {
|
||||
/* use an arbitrarily high value */
|
||||
r->set_order_key (EditorSort, UINT_MAX);
|
||||
r->set_order_key (MixerSort, UINT_MAX);
|
||||
r->set_order_key (UINT_MAX);
|
||||
} else {
|
||||
DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
|
||||
r->set_order_key (EditorSort, order);
|
||||
r->set_order_key (MixerSort, order);
|
||||
r->set_order_key (order);
|
||||
order++;
|
||||
}
|
||||
}
|
||||
|
|
@ -3715,7 +3713,7 @@ Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::
|
|||
if (b->is_monitor()) {
|
||||
return false;
|
||||
}
|
||||
return a->order_key (MixerSort) < b->order_key (MixerSort);
|
||||
return a->order_key () < b->order_key ();
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
@ -4952,8 +4950,7 @@ Session::notify_remote_id_change ()
|
|||
}
|
||||
|
||||
switch (Config->get_remote_model()) {
|
||||
case MixerSort:
|
||||
case EditorSort:
|
||||
case MixerOrdered:
|
||||
Route::RemoteControlIDChange (); /* EMIT SIGNAL */
|
||||
break;
|
||||
default:
|
||||
|
|
@ -4962,7 +4959,7 @@ Session::notify_remote_id_change ()
|
|||
}
|
||||
|
||||
void
|
||||
Session::sync_order_keys (RouteSortOrderKey sort_key_changed)
|
||||
Session::sync_order_keys ()
|
||||
{
|
||||
if (deletion_in_progress()) {
|
||||
return;
|
||||
|
|
@ -4974,9 +4971,9 @@ Session::sync_order_keys (RouteSortOrderKey sort_key_changed)
|
|||
opportunity to keep them in sync if they wish to.
|
||||
*/
|
||||
|
||||
DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("Sync Order Keys, based on %1\n", enum_2_string (sort_key_changed)));
|
||||
DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
|
||||
|
||||
Route::SyncOrderKeys (sort_key_changed); /* EMIT SIGNAL */
|
||||
Route::SyncOrderKeys (); /* EMIT SIGNAL */
|
||||
|
||||
DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3444,22 +3444,6 @@ Session::config_changed (std::string p, bool ours)
|
|||
/* XXX DO SOMETHING HERE TO TELL THE GUI THAT WE NEED
|
||||
TO SET REMOTE ID'S
|
||||
*/
|
||||
} else if (p == "sync-all-route-ordering") {
|
||||
|
||||
/* sync to editor order unless mixer is used for remote IDs
|
||||
*/
|
||||
|
||||
switch (Config->get_remote_model()) {
|
||||
case UserOrdered:
|
||||
sync_order_keys (EditorSort);
|
||||
break;
|
||||
case EditorOrdered:
|
||||
sync_order_keys (EditorSort);
|
||||
break;
|
||||
case MixerOrdered:
|
||||
sync_order_keys (MixerSort);
|
||||
}
|
||||
|
||||
} else if (p == "initial-program-change") {
|
||||
|
||||
if (_mmc->output_port() && Config->get_initial_program_change() >= 0) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue