summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2019-11-06 22:12:40 -0700
committerPaul Davis <paul@linuxaudiosystems.com>2019-11-06 22:12:40 -0700
commit625b8297ea59232a1d91f9bf2efeb65ca70b9791 (patch)
tree1a7c06502d85374fa0aa578f857dea21d8a49d5b /libs
parenteda27cc3de7dda78aaf24edf0ba7e75e7a9df8b9 (diff)
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
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/disk_reader.cc3
-rw-r--r--libs/ardour/midi_state_tracker.cc2
-rw-r--r--libs/ardour/plugin.cc8
-rw-r--r--libs/ardour/rt_midibuffer.cc3
-rw-r--r--libs/ardour/transport_fsm.cc2
5 files changed, 14 insertions, 4 deletions
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<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack>(_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);
}