diff --git a/libs/ardour/ardour/midi_port.h b/libs/ardour/ardour/midi_port.h index d3e3e88f3b..16a8d1ae81 100644 --- a/libs/ardour/ardour/midi_port.h +++ b/libs/ardour/ardour/midi_port.h @@ -59,7 +59,7 @@ class LIBARDOUR_API MidiPort : public Port { MidiBuffer& get_midi_buffer (pframes_t nframes); - void set_trace (MIDI::Parser* trace_parser); + void set_trace (std::weak_ptr trace_parser); typedef boost::function MidiFilter; void set_inbound_filter (MidiFilter); @@ -80,7 +80,7 @@ private: MidiFilter _inbound_midi_filter; std::shared_ptr _shadow_port; MidiFilter _shadow_midi_filter; - MIDI::Parser* _trace_parser; + std::weak_ptr _trace_parser; bool _data_fetched_for_cycle; void resolve_notes (void* buffer, samplepos_t when); diff --git a/libs/ardour/ardour/triggerbox.h b/libs/ardour/ardour/triggerbox.h index 89f4ca0c23..afcb333bbe 100644 --- a/libs/ardour/ardour/triggerbox.h +++ b/libs/ardour/ardour/triggerbox.h @@ -934,7 +934,7 @@ class LIBARDOUR_API TriggerBox : public Processor static CustomMidiMap _custom_midi_map; static void midi_input_handler (MIDI::Parser&, MIDI::byte*, size_t, samplecnt_t); - static MIDI::Parser* input_parser; + static std::shared_ptr input_parser; static PBD::ScopedConnection midi_input_connection; static void input_port_check (); static PBD::ScopedConnectionList static_connections; diff --git a/libs/ardour/midi_port.cc b/libs/ardour/midi_port.cc index d0fce0300e..c9ee413b93 100644 --- a/libs/ardour/midi_port.cc +++ b/libs/ardour/midi_port.cc @@ -43,7 +43,6 @@ MidiPort::MidiPort (const std::string& name, PortFlags flags) : Port (name, DataType::MIDI, flags) , _resolve_required (false) , _input_active (true) - , _trace_parser (0) , _data_fetched_for_cycle (false) { _buffer = new MidiBuffer (AudioEngine::instance()->raw_buffer_size (DataType::MIDI)); @@ -75,8 +74,11 @@ MidiPort::cycle_start (pframes_t nframes) port_engine.midi_clear (port_engine.get_buffer (_port_handle, nframes)); } - if (receives_input() && _trace_parser) { - read_and_parse_entire_midi_buffer_with_no_speed_adjustment (nframes, *_trace_parser, AudioEngine::instance()->sample_time_at_cycle_start()); + if (receives_input()) { + std::shared_ptr trace_parser = _trace_parser.lock (); + if (trace_parser) { + read_and_parse_entire_midi_buffer_with_no_speed_adjustment (nframes, *trace_parser.get(), AudioEngine::instance()->sample_time_at_cycle_start()); + } } if (_inbound_midi_filter) { @@ -293,16 +295,19 @@ MidiPort::flush_buffers (pframes_t nframes) const samplepos_t adjusted_time = ev.time() + _global_port_buffer_offset; - if (sends_output() && _trace_parser) { - uint8_t const * const buf = ev.buffer(); - const samplepos_t now = AudioEngine::instance()->sample_time_at_cycle_start(); + if (sends_output()) { + std::shared_ptr trace_parser = _trace_parser.lock (); + if (trace_parser) { + uint8_t const * const buf = ev.buffer(); + const samplepos_t now = AudioEngine::instance()->sample_time_at_cycle_start(); - _trace_parser->set_timestamp (now + adjusted_time / speed_ratio); + trace_parser->set_timestamp (now + adjusted_time / speed_ratio); - uint32_t limit = ev.size(); + uint32_t limit = ev.size(); - for (size_t n = 0; n < limit; ++n) { - _trace_parser->scanner (buf[n]); + for (size_t n = 0; n < limit; ++n) { + trace_parser->scanner (buf[n]); + } } } @@ -386,7 +391,7 @@ MidiPort::reset () } void -MidiPort::set_trace (MIDI::Parser * p) +MidiPort::set_trace (std::weak_ptr p) { _trace_parser = p; } diff --git a/libs/ardour/triggerbox.cc b/libs/ardour/triggerbox.cc index b247eb0f72..c161c59ff4 100644 --- a/libs/ardour/triggerbox.cc +++ b/libs/ardour/triggerbox.cc @@ -3049,7 +3049,7 @@ TriggerBox::CustomMidiMap TriggerBox::_custom_midi_map; std::pair TriggerBox::learning_for; PBD::Signal0 TriggerBox::TriggerMIDILearned; -MIDI::Parser* TriggerBox::input_parser (new MIDI::Parser); /* leak */ +std::shared_ptr TriggerBox::input_parser; PBD::ScopedConnectionList TriggerBox::static_connections; PBD::ScopedConnection TriggerBox::midi_input_connection; std::shared_ptr TriggerBox::current_input; @@ -3068,6 +3068,7 @@ TriggerBox::init () void TriggerBox::static_init (Session & s) { + input_parser = std::shared_ptr(new MIDI::Parser); /* leak */ Config->ParameterChanged.connect_same_thread (static_connections, boost::bind (&TriggerBox::static_parameter_changed, _1)); input_parser->any.connect_same_thread (midi_input_connection, boost::bind (&TriggerBox::midi_input_handler, _1, _2, _3, _4)); std::dynamic_pointer_cast (s.trigger_input_port())->set_trace (input_parser);