From 625b8297ea59232a1d91f9bf2efeb65ca70b9791 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 6 Nov 2019 22:12:40 -0700 Subject: fix unconditional note resolution during DiskReader::realtime_locate() When looping, we do not want to resolve notes at the end of the loop via ::realtime_locate() - ::get_midi_playback() has already taken care of this. But when not looping, we need this. So, add an argument to tell all interested parties whether the locate is for a loop end or not --- libs/ardour/disk_reader.cc | 3 +++ libs/ardour/midi_state_tracker.cc | 2 ++ libs/ardour/plugin.cc | 8 ++++++-- libs/ardour/rt_midibuffer.cc | 3 ++- libs/ardour/transport_fsm.cc | 2 +- 5 files changed, 14 insertions(+), 4 deletions(-) (limited to 'libs') diff --git a/libs/ardour/disk_reader.cc b/libs/ardour/disk_reader.cc index 919fdd8669..7c1f7231c1 100644 --- a/libs/ardour/disk_reader.cc +++ b/libs/ardour/disk_reader.cc @@ -169,8 +169,11 @@ void DiskReader::realtime_locate (bool for_loop_end) { if (!for_loop_end) { + std::cerr << name() << "DO note resolve on locate for loop\n"; boost::shared_ptr mt = boost::dynamic_pointer_cast(_track); _tracker.resolve_notes (mt->immediate_events(), 0); + } else { + std::cerr << name() << "skip note resolve on locate for loop\n"; } } diff --git a/libs/ardour/midi_state_tracker.cc b/libs/ardour/midi_state_tracker.cc index ecc860fa92..c4a892316e 100644 --- a/libs/ardour/midi_state_tracker.cc +++ b/libs/ardour/midi_state_tracker.cc @@ -119,6 +119,8 @@ MidiStateTracker::resolve_notes (MidiBuffer &dst, samplepos_t time) return; } + PBD::stacktrace (std::cerr, 20); + for (int channel = 0; channel < 16; ++channel) { for (int note = 0; note < 128; ++note) { while (_active_notes[note + 128 * channel]) { diff --git a/libs/ardour/plugin.cc b/libs/ardour/plugin.cc index 5d77b375bc..0539d5a8cf 100644 --- a/libs/ardour/plugin.cc +++ b/libs/ardour/plugin.cc @@ -391,9 +391,13 @@ Plugin::realtime_handle_transport_stopped () } void -Plugin::realtime_locate (bool) +Plugin::realtime_locate (bool for_loop_end) { - resolve_midi (); + std::cerr << name() << " RL fle = " << for_loop_end << std::endl; + + //if (!for_loop_end) { + resolve_midi (); +//} } void diff --git a/libs/ardour/rt_midibuffer.cc b/libs/ardour/rt_midibuffer.cc index 3a60c9e93f..c67e81c1ae 100644 --- a/libs/ardour/rt_midibuffer.cc +++ b/libs/ardour/rt_midibuffer.cc @@ -180,9 +180,10 @@ RTMidiBuffer::read (MidiBuffer& dst, samplepos_t start, samplepos_t end, MidiSta #ifndef NDEBUG TimeType unadjusted_time; + Item* last = iend; --last; #endif - DEBUG_TRACE (DEBUG::MidiRingBuffer, string_compose ("read from %1 .. %2 .. initial index = %3 (time = %4) (range in list of %7 %5..%6)\n", start, end, item - _data, item->timestamp, _data->timestamp, iend->timestamp, _size)); + DEBUG_TRACE (DEBUG::MidiRingBuffer, string_compose ("read from %1 .. %2 .. initial index = %3 (time = %4) (range in list of %7 %5..%6)\n", start, end, item - _data, item->timestamp, _data->timestamp, last->timestamp, _size)); while ((item < iend) && (item->timestamp < end)) { diff --git a/libs/ardour/transport_fsm.cc b/libs/ardour/transport_fsm.cc index 1bba909622..8ec572854c 100644 --- a/libs/ardour/transport_fsm.cc +++ b/libs/ardour/transport_fsm.cc @@ -419,7 +419,7 @@ void TransportFSM::locate_for_loop (Event const & l) { assert (l.type == Locate); - DEBUG_TRACE (DEBUG::TFSMEvents, "locate_for_loop\n"); + DEBUG_TRACE (DEBUG::TFSMEvents, string_compose ("locate_for_loop, wl = %1\n", l.with_loop)); current_roll_after_locate_status = l.with_roll; api->locate (l.target, l.with_roll, l.with_flush, l.with_loop, l.force); } -- cgit v1.2.3