From 5e1f2d21f8acb44928d0e39c05602756d160e5da Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sat, 7 Aug 2021 23:36:59 +0200 Subject: [PATCH] Fix issues when using MIDI sends with small buffersizes MIDI data buffers are fixed size, independent of the engine's buffersize (compare to ThreadBuffers::ensure_buffers) --- libs/ardour/ardour/internal_send.h | 1 + libs/ardour/internal_send.cc | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/libs/ardour/ardour/internal_send.h b/libs/ardour/ardour/internal_send.h index c952b1378f..2ba66ab39a 100644 --- a/libs/ardour/ardour/internal_send.h +++ b/libs/ardour/ardour/internal_send.h @@ -83,6 +83,7 @@ private: void init_gain (); int use_target (boost::shared_ptr, bool update_name = true); void target_io_changed (); + void ensure_mixbufs (); void propagate_solo (); }; diff --git a/libs/ardour/internal_send.cc b/libs/ardour/internal_send.cc index 56970eca14..2f2731b714 100644 --- a/libs/ardour/internal_send.cc +++ b/libs/ardour/internal_send.cc @@ -159,7 +159,7 @@ InternalSend::use_target (boost::shared_ptr sendto, bool update_name) _send_to->add_send_to_internal_return (this); - mixbufs.ensure_buffers (_send_to->internal_return ()->input_streams (), _session.get_block_size ()); + ensure_mixbufs (); mixbufs.set_count (_send_to->internal_return ()->input_streams ()); _meter->configure_io (ChanCount (DataType::AUDIO, pan_outs ()), ChanCount (DataType::AUDIO, pan_outs ())); @@ -186,7 +186,7 @@ void InternalSend::target_io_changed () { assert (_send_to); - mixbufs.ensure_buffers (_send_to->internal_return ()->input_streams (), _session.get_block_size ()); + ensure_mixbufs (); mixbufs.set_count (_send_to->internal_return ()->input_streams ()); reset_panner (); } @@ -344,11 +344,20 @@ out: _active = _pending_active; } +void +InternalSend::ensure_mixbufs () +{ + for (DataType::iterator t = DataType::begin (); t != DataType::end (); ++t) { + size_t size = (*t == DataType::MIDI) ? _session.engine ().raw_buffer_size (*t) : _session.get_block_size (); + mixbufs.ensure_buffers (*t, _send_to->internal_return ()->input_streams ().get (*t), size); + } +} + int -InternalSend::set_block_size (pframes_t nframes) +InternalSend::set_block_size (pframes_t) { if (_send_to) { - mixbufs.ensure_buffers (_send_to->internal_return ()->input_streams (), nframes); + ensure_mixbufs (); } return 0;