From 8305ea57626c6999782dc09d4da5dc87a67f6730 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 10 Oct 2024 10:12:14 -0600 Subject: [PATCH] during MIDI clip recording, convert audio->beat time at capture time This distributes whatever cost there is associated with the domain conversion across multiple process() calls, rather than doing it all in the process() call where capture finishes. --- libs/ardour/ardour/triggerbox.h | 3 +-- libs/ardour/triggerbox.cc | 23 +++++++++-------------- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/libs/ardour/ardour/triggerbox.h b/libs/ardour/ardour/triggerbox.h index 938026d51b..fe4fd69793 100644 --- a/libs/ardour/ardour/triggerbox.h +++ b/libs/ardour/ardour/triggerbox.h @@ -779,8 +779,7 @@ struct SlotArmInfo { Trigger& slot; Temporal::timepos_t start; Temporal::timepos_t end; - RTMidiBuffer* midi_buf; /* assumed large enough */ - RTMidiBufferBeats* beats; /* will take over data allocated for midi_but */ + RTMidiBufferBeats* midi_buf; AudioTrigger::AudioData audio_buf; RubberBand::RubberBandStretcher* stretcher; }; diff --git a/libs/ardour/triggerbox.cc b/libs/ardour/triggerbox.cc index a5b8d8632d..184e34b07a 100644 --- a/libs/ardour/triggerbox.cc +++ b/libs/ardour/triggerbox.cc @@ -2416,27 +2416,24 @@ MIDITrigger::captured (SlotArmInfo& ai, BufferSet& bufs) return; } - ai.midi_buf->shift (-ai.start.samples()); - ai.midi_buf->convert (*ai.beats); - /* Note: the original MIDI buffer in ai is now invalid, all data has * been moved to rtmb. */ - old_rt_midibuffer = rt_midibuffer.exchange (ai.beats); + old_rt_midibuffer = rt_midibuffer.exchange (ai.midi_buf); loop_start = Temporal::Beats(); - loop_end = (*ai.beats)[ai.beats->size()-1].timestamp; + loop_end = (*ai.midi_buf)[ai.midi_buf->size()-1].timestamp; data_length = loop_end; _follow_length = Temporal::BBT_Offset (0, data_length.get_beats(), 0); set_length (timecnt_t (data_length)); iter = 0; first_event_index = 0; - last_event_index = ai.beats->size(); + last_event_index = ai.midi_buf->size(); _follow_action0 = FollowAction::Again; - /* Mark ai.beats as null so that it is not deleted */ - ai.beats = nullptr; + /* Mark ai.midi_buf as null so that it is not deleted */ + ai.midi_buf = nullptr; delete &ai; /* start playing */ @@ -3412,7 +3409,6 @@ SlotArmInfo::SlotArmInfo (Trigger& s) , start (0) , end (0) , midi_buf (nullptr) - , beats (nullptr) , stretcher (nullptr) { } @@ -3420,7 +3416,6 @@ SlotArmInfo::SlotArmInfo (Trigger& s) SlotArmInfo::~SlotArmInfo() { delete midi_buf; - delete beats; delete stretcher; } @@ -3523,9 +3518,8 @@ TriggerBox::arm_from_another_thread (Trigger& slot, samplepos_t now, uint32_t ch SlotArmInfo* ai = new SlotArmInfo (slot); if (_data_type == DataType::MIDI) { - ai->midi_buf = new RTMidiBuffer; + ai->midi_buf = new RTMidiBufferBeats; ai->midi_buf->resize (1024); // XXX Config->max_slot_midi_event_size - ai->beats = new RTMidiBufferBeats; } else { ai->audio_buf.alloc (_session.sample_rate() * 30, chans); // XXX Config->max_slot_audio_duration AudioTrigger* at = dynamic_cast (&slot); @@ -3647,6 +3641,7 @@ TriggerBox::maybe_capture (BufferSet& bufs, samplepos_t start_sample, samplepos_ Track* trk = static_cast (_owner); MidiTrack* mt = dynamic_cast(trk); MidiChannelFilter* filter = mt ? &mt->capture_filter() : 0; + TempoMap::SharedPtr tmap (TempoMap::use()); for (MidiBuffer::iterator i = buf.begin(); i != buf.end(); ++i) { Evoral::Event ev (*i, false); @@ -3667,9 +3662,9 @@ TriggerBox::maybe_capture (BufferSet& bufs, samplepos_t start_sample, samplepos_ } if (!skip_event && (!filter || !filter->filter(ev.buffer(), ev.size()))) { - const samplepos_t event_time = start_sample + ev.time(); + const samplepos_t event_time (start_sample + ev.time() - ai->start.samples()); if (!ai->end || (event_time < ai->end.samples())) { - ai->midi_buf->write (event_time, ev.event_type(), ev.size(), ev.buffer()); + ai->midi_buf->write (tmap->quarters_at_sample (event_time), ev.event_type(), ev.size(), ev.buffer()); } } }