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.
This commit is contained in:
Robin Gareus 2017-08-01 17:48:42 +02:00
parent 79dc3882ea
commit 9694986a85
2 changed files with 6 additions and 2 deletions

View file

@ -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 ();

View file

@ -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;