From 25f5b275f4a10c52bb4be9030a9dd9f37264cae2 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 26 Jun 2023 21:45:28 +0200 Subject: [PATCH] Auto-connect metronome when using a device the first time --- libs/ardour/ardour/session.h | 5 ++-- libs/ardour/port_manager.cc | 4 +++ libs/ardour/session.cc | 54 +++++++++++++++++++----------------- 3 files changed, 36 insertions(+), 27 deletions(-) diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index e0a3a0f0d8..90c43c6df5 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -2143,8 +2143,8 @@ private: Clicks clicks; bool _clicking; bool _click_rec_only; - std::shared_ptr _click_io; - std::shared_ptr _click_gain; + std::shared_ptr _click_io; + std::shared_ptr _click_gain; Sample* click_data; Sample* click_emphasis_data; samplecnt_t click_length; @@ -2196,6 +2196,7 @@ private: friend class PortManager; void auto_connect_master_bus (); void auto_connect_monitor_bus (); + void auto_connect_io (std::shared_ptr); void setup_route_monitor_sends (bool enable, bool need_process_lock); diff --git a/libs/ardour/port_manager.cc b/libs/ardour/port_manager.cc index 83a80c64e5..df6387ff5d 100644 --- a/libs/ardour/port_manager.cc +++ b/libs/ardour/port_manager.cc @@ -925,6 +925,10 @@ PortManager::reconnect_ports () if (s && s->monitor_out() && !s->monitor_out ()->output()->has_ext_connection()) { s->auto_connect_monitor_bus (); } + if (s && s->click_io() && !s->click_io ()->has_ext_connection()) { + s->auto_connect_io (s->click_io()); + } + for (auto const& i : *p) { if (i.second->reconnect ()) { diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index b90213306e..a0320a4014 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -995,6 +995,33 @@ Session::get_physical_ports (vector& inputs, vector& outputs, Da _engine.get_physical_outputs (type, outputs, include, exclude); } +void +Session::auto_connect_io (std::shared_ptr io) +{ + vector outputs[DataType::num_types]; + + for (uint32_t i = 0; i < DataType::num_types; ++i) { + _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]); + } + + uint32_t limit = io->n_ports ().n_total (); + + for (uint32_t n = 0; n < limit; ++n) { + std::shared_ptr p = io->nth (n); + string connect_to; + if (outputs[p->type()].size() > n) { + connect_to = outputs[p->type()][n]; + } + if (connect_to.empty() || p->connected_to (connect_to)) { + continue; + } + + if (io->connect (p, connect_to, this)) { + error << string_compose (_("cannot connect %1 output %2 to %3"), io->name(), n, connect_to) << endmsg; + break; + } + } +} void Session::auto_connect_master_bus () @@ -1003,31 +1030,8 @@ Session::auto_connect_master_bus () return; } - /* if requested auto-connect the outputs to the first N physical ports. - */ - - uint32_t limit = _master_out->n_outputs().n_total(); - vector outputs[DataType::num_types]; - - for (uint32_t i = 0; i < DataType::num_types; ++i) { - _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]); - } - - for (uint32_t n = 0; n < limit; ++n) { - std::shared_ptr p = _master_out->output()->nth (n); - string connect_to; - if (outputs[p->type()].size() > n) { - connect_to = outputs[p->type()][n]; - } - - if (!connect_to.empty() && p->connected_to (connect_to) == false) { - if (_master_out->output()->connect (p, connect_to, this)) { - error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to) - << endmsg; - break; - } - } - } + /* if requested auto-connect the outputs to the first N physical ports. */ + auto_connect_io (_master_out->output()); } std::shared_ptr