From 1a288ddd952752e9fdf528eb5d135f0af7dd6f73 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 1 Aug 2017 23:27:34 +0200 Subject: Fix some more crashes at session-close PortDrop unregisters backend ports, the backend will return a NULL buffer-pointer, but the I/O object still exists (Metronome, LTC) AudioBuffer::_data == 0 #0 msvcrt!memset () from C:\Windows\System32\msvcrt.dll #1 ARDOUR::AudioBuffer::silence (this=0x2c410710, len=256, offset=0) at ../libs/ardour/audio_buffer.cc:88 #2 ARDOUR::AudioPort::cycle_end (this=0x34918730, nframes=256) at ../libs/ardour/audio_port.cc:66 #3 ARDOUR::PortManager::cycle_end (this=this@entry=0x23342770, nframes=nframes@entry=256) [process callback w/o session] --- libs/ardour/session.cc | 8 +++++++- libs/ardour/session_ltc.cc | 6 ++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 2b4fe2b7f1..62514f6d36 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -644,6 +644,11 @@ Session::destroy () _slave = 0; } + /* remove I/O objects before unsetting the engine session */ + _click_io.reset (); + _ltc_input.reset (); + _ltc_output.reset (); + /* disconnect from any and all signals that we are connected to */ Port::PortSignalDrop (); /* EMIT SIGNAL */ @@ -7071,13 +7076,14 @@ Session::operation_in_progress (GQuark op) const boost::shared_ptr Session::ltc_input_port () const { + assert (_ltc_input); return _ltc_input->nth (0); } boost::shared_ptr Session::ltc_output_port () const { - return _ltc_output->nth (0); + return _ltc_output ? _ltc_output->nth (0) : boost::shared_ptr (); } void diff --git a/libs/ardour/session_ltc.cc b/libs/ardour/session_ltc.cc index 87fd47e70e..91e11c8a4c 100644 --- a/libs/ardour/session_ltc.cc +++ b/libs/ardour/session_ltc.cc @@ -170,6 +170,12 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end pframes_t txf = 0; boost::shared_ptr ltcport = ltc_output_port(); + if (!ltcport) { + assert (deletion_in_progress ()); + return; + } + + /* marks buffer as not written */ Buffer& buf (ltcport->get_buffer (nframes)); if (!ltc_encoder || !ltc_enc_buf) { -- cgit v1.2.3