summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2020-05-09 03:53:30 +0200
committerRobin Gareus <robin@gareus.org>2020-05-09 05:10:04 +0200
commit3ca33c07dcf0d593c73f15eb62123dc59fc73fe4 (patch)
treee4598866e8e27576b80debae33a7ea2b1daeacf2 /libs
parenta46091b86a897d8d2886205ed0c277ddaf6f17cd (diff)
Update LTC reader port latency on connection change
This mechanism adds infrastructure that can later also be used for MTC and MIDIClock. PS. The LTC Generator port's latency is queried after the port is created, and later kept in sync via LatencyUpdated signal.
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/transport_master.h5
-rw-r--r--libs/ardour/ltc_slave.cc17
-rw-r--r--libs/ardour/session_ltc.cc2
-rw-r--r--libs/ardour/transport_master.cc8
4 files changed, 20 insertions, 12 deletions
diff --git a/libs/ardour/ardour/transport_master.h b/libs/ardour/ardour/transport_master.h
index 9e745cbef5..c7c0c65175 100644
--- a/libs/ardour/ardour/transport_master.h
+++ b/libs/ardour/ardour/transport_master.h
@@ -443,9 +443,9 @@ protected:
XMLNode port_node;
- PBD::ScopedConnection port_connection;
- bool connection_handler (boost::weak_ptr<ARDOUR::Port>, std::string name1, boost::weak_ptr<ARDOUR::Port>, std::string name2, bool yn);
+ virtual void connection_handler (boost::weak_ptr<ARDOUR::Port>, std::string name1, boost::weak_ptr<ARDOUR::Port>, std::string name2, bool yn);
+ PBD::ScopedConnection port_connection;
PBD::ScopedConnection backend_connection;
virtual void register_properties ();
@@ -613,6 +613,7 @@ private:
void resync_latency (bool);
void parse_timecode_offset ();
void parameter_changed (std::string const& p);
+ void connection_handler (boost::weak_ptr<ARDOUR::Port>, std::string, boost::weak_ptr<ARDOUR::Port>, std::string, bool);
bool did_reset_tc_format;
Timecode::TimecodeFormat saved_tc_format;
diff --git a/libs/ardour/ltc_slave.cc b/libs/ardour/ltc_slave.cc
index bc0a8fb724..1fa3c741c3 100644
--- a/libs/ardour/ltc_slave.cc
+++ b/libs/ardour/ltc_slave.cc
@@ -66,9 +66,8 @@ LTC_TransportMaster::LTC_TransportMaster (std::string const & name)
{
memset (&prev_frame, 0, sizeof(LTCFrameExt));
- resync_latency (false);
-
AudioEngine::instance()->Xrun.connect_same_thread (port_connection, boost::bind (&LTC_TransportMaster::resync_xrun, this));
+
}
void
@@ -126,6 +125,18 @@ LTC_TransportMaster::~LTC_TransportMaster()
}
void
+LTC_TransportMaster::connection_handler (boost::weak_ptr<ARDOUR::Port> w0, std::string n0, boost::weak_ptr<ARDOUR::Port> w1, std::string n1, bool con)
+{
+ TransportMaster::connection_handler(w0, n0, w1, n1, con);
+
+ boost::shared_ptr<Port> p0 = w0.lock ();
+ boost::shared_ptr<Port> p1 = w1.lock ();
+ if (p0 == _port || p1 == _port) {
+ resync_latency (false);
+ }
+}
+
+void
LTC_TransportMaster::parse_timecode_offset()
{
if (_session) {
@@ -190,11 +201,11 @@ LTC_TransportMaster::resync_latency (bool playback)
if (playback) {
return;
}
- DEBUG_TRACE (DEBUG::LTC, "LTC resync_latency()\n");
uint32_t old = ltc_slave_latency.max;
if (_port) {
_port->get_connected_latency_range (ltc_slave_latency, false);
+ DEBUG_TRACE (DEBUG::LTC, string_compose ("LTC resync_latency: %1\n", ltc_slave_latency.max));
}
if (old != ltc_slave_latency.max) {
sync_lock_broken = false;
diff --git a/libs/ardour/session_ltc.cc b/libs/ardour/session_ltc.cc
index 5c3da63f17..79f1264303 100644
--- a/libs/ardour/session_ltc.cc
+++ b/libs/ardour/session_ltc.cc
@@ -107,10 +107,10 @@ Session::ltc_tx_resync_latency (bool playback)
if (deletion_in_progress() || !playback) {
return;
}
- DEBUG_TRACE (DEBUG::TXLTC, "resync latency\n");
boost::shared_ptr<Port> ltcport = ltc_output_port();
if (ltcport) {
ltcport->get_connected_latency_range(ltc_out_latency, true);
+ DEBUG_TRACE (DEBUG::TXLTC, string_compose ("resync latency: %1\n", ltc_out_latency.max));
}
}
diff --git a/libs/ardour/transport_master.cc b/libs/ardour/transport_master.cc
index c0a9e4e02c..1794fca354 100644
--- a/libs/ardour/transport_master.cc
+++ b/libs/ardour/transport_master.cc
@@ -163,11 +163,11 @@ TransportMaster::set_name (std::string const & str)
}
}
-bool
+void
TransportMaster::connection_handler (boost::weak_ptr<ARDOUR::Port>, std::string name1, boost::weak_ptr<ARDOUR::Port>, std::string name2, bool yn)
{
if (!_port) {
- return false;
+ return;
}
const std::string fqn = ARDOUR::AudioEngine::instance()->make_port_name_non_relative (_port->name());
@@ -188,11 +188,7 @@ TransportMaster::connection_handler (boost::weak_ptr<ARDOUR::Port>, std::string
}
PropertyChanged (Properties::connected);
-
- return true;
}
-
- return false;
}
bool