Optimize delaylines and implement multiple-MIDI buffers

This commit is contained in:
Robin Gareus 2023-05-26 18:01:45 +02:00
parent 28785e4fc0
commit 4c4138ff37
No known key found for this signature in database
GPG key ID: A090BCE02CF57F04
2 changed files with 20 additions and 19 deletions

View file

@ -69,10 +69,10 @@ private:
bool _pending_flush; bool _pending_flush;
typedef std::vector<boost::shared_array<Sample> > AudioDlyBuf; typedef std::vector<boost::shared_array<Sample> > AudioDlyBuf;
typedef std::vector<boost::shared_array<MidiBuffer> > MidiDlyBuf; typedef std::vector<std::shared_ptr<MidiBuffer> > MidiDlyBuf;
AudioDlyBuf _buf; AudioDlyBuf _buf;
std::shared_ptr<MidiBuffer> _midi_buf; MidiDlyBuf _midi_buf;
#ifndef NDEBUG #ifndef NDEBUG
Glib::Threads::Mutex _set_delay_mutex; Glib::Threads::Mutex _set_delay_mutex;

View file

@ -77,8 +77,6 @@ DelayLine::run (BufferSet& bufs, samplepos_t /* start_sample */, samplepos_t /*
_pending_flush = false; _pending_flush = false;
// TODO handle pending_flush.
/* Audio buffers */ /* Audio buffers */
if (_buf.size () == bufs.count ().n_audio () && _buf.size () > 0) { if (_buf.size () == bufs.count ().n_audio () && _buf.size () > 0) {
@ -116,10 +114,14 @@ DelayLine::run (BufferSet& bufs, samplepos_t /* start_sample */, samplepos_t /*
rb[off] *= s / (float) fade_out_len; rb[off] *= s / (float) fade_out_len;
} }
/* clear data in rb */ /* clear data in rb */
// TODO optimize this using memset if (delay_diff >= 0) {
for (uint32_t s = 0; s < -delay_diff; ++s) { /* do nothing */
sampleoffset_t off = (_woff + _bsiz + s) & _bsiz_mask; } else if (_woff - delay_diff <= _bsiz) {
rb[off] = 0.f; memset (&rb[_woff], 0, sizeof (Sample) * -delay_diff);
} else {
size_t remain = -delay_diff - (_bsiz - _woff);
memset (&rb[_woff], 0, sizeof (Sample) * (_bsiz - _woff));
memset (rb, 0, sizeof (Sample) * remain);
} }
} }
@ -143,8 +145,6 @@ DelayLine::run (BufferSet& bufs, samplepos_t /* start_sample */, samplepos_t /*
Sample* rb = (*bi).get (); Sample* rb = (*bi).get ();
Sample* src = i->data (); Sample* src = i->data ();
// TODO consider handling fade_out & fade_in separately
// if fade_out_len < fade_in_len.
for (uint32_t s = 0; s < xfade_len; ++s) { for (uint32_t s = 0; s < xfade_len; ++s) {
sampleoffset_t off = (_roff + s) & _bsiz_mask; sampleoffset_t off = (_roff + s) & _bsiz_mask;
const gain_t g = s / (float) xfade_len; const gain_t g = s / (float) xfade_len;
@ -182,7 +182,6 @@ DelayLine::run (BufferSet& bufs, samplepos_t /* start_sample */, samplepos_t /*
} }
assert (_woff == ((_roff + s) & _bsiz_mask)); assert (_woff == ((_roff + s) & _bsiz_mask));
} }
// TODO consider adding a fade-in to bufs
} }
/* delay audio buffers */ /* delay audio buffers */
@ -221,11 +220,10 @@ DelayLine::run (BufferSet& bufs, samplepos_t /* start_sample */, samplepos_t /*
_roff = 0; _roff = 0;
} }
if (_midi_buf.get ()) { if (_midi_buf.size () >= bufs.count ().n_midi () /* && (_delay !=0 || delay_diff != 0) */) {
for (BufferSet::midi_iterator i = bufs.midi_begin (); i != bufs.midi_end (); ++i) { MidiDlyBuf::iterator bi = _midi_buf.begin ();
if (i != bufs.midi_begin ()) { break; } // XXX only one buffer for now for (BufferSet::midi_iterator i = bufs.midi_begin (); i != bufs.midi_end (); ++i, ++bi) {
std::shared_ptr<ARDOUR::MidiBuffer> dly = *bi;
MidiBuffer* dly = _midi_buf.get ();
MidiBuffer& mb (*i); MidiBuffer& mb (*i);
if (pending_flush) { if (pending_flush) {
dly->silence (n_samples); dly->silence (n_samples);
@ -421,10 +419,13 @@ DelayLine::configure_io (ChanCount in, ChanCount out)
string_compose ("configure IO: %1 Ain: %2 Aout: %3 Min: %4 Mout: %5\n", string_compose ("configure IO: %1 Ain: %2 Aout: %3 Min: %4 Mout: %5\n",
name (), in.n_audio (), out.n_audio (), in.n_midi (), out.n_midi ())); name (), in.n_audio (), out.n_audio (), in.n_midi (), out.n_midi ()));
// TODO support multiple midi buffers while (in.n_midi () > _midi_buf.size ()) {
if (in.n_midi () > 0 && !_midi_buf) { _midi_buf.push_back (std::shared_ptr<MidiBuffer> (new MidiBuffer (16384)));
_midi_buf.reset (new MidiBuffer (16384));
} }
while (in.n_midi () < _midi_buf.size ()) {
_midi_buf.pop_back ();
}
#ifndef NDEBUG #ifndef NDEBUG
lm.release (); lm.release ();
#endif #endif