From 9694986a85da8e7d18e9003e3706939bf4e34097 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 1 Aug 2017 17:48:42 +0200 Subject: Fix LTC encoder removal Fixed a crash if an x-run or graph-reorder happens after the LTC encoder has been destroyed (possible at session-close or after disabling the encoder). This also fixes duplicate callbacks in case the encoder was re-enabled times in an active session. --- libs/ardour/ardour/session.h | 2 ++ libs/ardour/session_ltc.cc | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 96adcf0981..1123abd02e 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -1677,6 +1677,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop void ltc_tx_recalculate_position(); void ltc_tx_parse_offset(); void ltc_tx_send_time_code_for_cycle (framepos_t, framepos_t, double, double, pframes_t nframes); + PBD::ScopedConnectionList ltc_tx_connections; + void reset_record_status (); diff --git a/libs/ardour/session_ltc.cc b/libs/ardour/session_ltc.cc index 51a39d0677..87fd47e70e 100644 --- a/libs/ardour/session_ltc.cc +++ b/libs/ardour/session_ltc.cc @@ -84,8 +84,8 @@ Session::ltc_tx_initialize() ltc_prev_cycle = -1; ltc_tx_reset(); ltc_tx_resync_latency(); - Xrun.connect_same_thread (*this, boost::bind (&Session::ltc_tx_reset, this)); - engine().GraphReordered.connect_same_thread (*this, boost::bind (&Session::ltc_tx_resync_latency, this)); + Xrun.connect_same_thread (ltc_tx_connections, boost::bind (&Session::ltc_tx_reset, this)); + engine().GraphReordered.connect_same_thread (ltc_tx_connections, boost::bind (&Session::ltc_tx_resync_latency, this)); restarting = false; } @@ -97,6 +97,7 @@ Session::ltc_tx_cleanup() ltc_enc_buf = NULL; ltc_encoder_free(ltc_encoder); ltc_encoder = NULL; + ltc_tx_connections.drop_connections (); } void @@ -115,6 +116,7 @@ void Session::ltc_tx_reset() { DEBUG_TRACE (DEBUG::LTC, "LTC TX reset\n"); + assert (ltc_encoder); ltc_enc_pos = -9999; // force re-start ltc_buf_len = 0; ltc_buf_off = 0; -- cgit v1.2.3