diff options
author | Robin Gareus <robin@gareus.org> | 2018-11-29 02:05:26 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2018-11-29 02:05:26 +0100 |
commit | 6fc2804414739d079e6c8798906887ecea152956 (patch) | |
tree | 83644feacd7b7690c1d3be2da0be0779cb729512 /libs/ardour/disk_writer.cc | |
parent | dfbda9e0f6d5003ba2ba05b21c6045f4ad1109fa (diff) |
Disk I/O: only allocate midi-buffer if needed
This fixes a memory-leak (_midi_buf was allocated in DiskIOProc
but only delete in DiskReader). Also skip midi-refill early on
Diffstat (limited to 'libs/ardour/disk_writer.cc')
-rw-r--r-- | libs/ardour/disk_writer.cc | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/libs/ardour/disk_writer.cc b/libs/ardour/disk_writer.cc index ed59da9231..39859cfdb5 100644 --- a/libs/ardour/disk_writer.cc +++ b/libs/ardour/disk_writer.cc @@ -517,6 +517,8 @@ DiskWriter::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack>(_route); MidiChannelFilter* filter = mt ? &mt->capture_filter() : 0; + assert (buf.size() == 0 || _midi_buf); + for (MidiBuffer::iterator i = buf.begin(); i != buf.end(); ++i) { Evoral::Event<MidiBuffer::TimeType> ev (*i, false); if (ev.time() + rec_offset > rec_nframes) { @@ -571,6 +573,7 @@ DiskWriter::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp _midi_buf->write (event_time, ev.event_type(), ev.size(), ev.buffer()); } } + g_atomic_int_add (const_cast<gint*>(&_samples_pending_write), nframes); if (buf.size() != 0) { @@ -815,7 +818,9 @@ DiskWriter::seek (samplepos_t sample, bool complete_refill) (*chan)->wbuf->reset (); } - _midi_buf->reset (); + if (_midi_buf) { + _midi_buf->reset (); + } g_atomic_int_set(&_samples_read_from_ringbuffer, 0); g_atomic_int_set(&_samples_written_to_ringbuffer, 0); @@ -953,7 +958,7 @@ DiskWriter::do_flush (RunContext ctxt, bool force_flush) /* MIDI*/ - if (_midi_write_source) { + if (_midi_write_source && _midi_buf) { const samplecnt_t total = g_atomic_int_get(const_cast<gint*> (&_samples_pending_write)); |