diff --git a/libs/ardour/disk_io.cc b/libs/ardour/disk_io.cc index 427f364404..097794bb3d 100644 --- a/libs/ardour/disk_io.cc +++ b/libs/ardour/disk_io.cc @@ -55,7 +55,7 @@ DiskIOProcessor::DiskIOProcessor (Session& s, string const & str, Flag f) , playback_sample (0) , _need_butler (false) , channels (new ChannelList) - , _midi_buf (new MidiRingBuffer (s.butler()->midi_diskstream_buffer_size())) + , _midi_buf (0) , _samples_written_to_ringbuffer (0) , _samples_read_from_ringbuffer (0) { @@ -76,6 +76,7 @@ DiskIOProcessor::~DiskIOProcessor () } channels.flush (); + delete _midi_buf; } diff --git a/libs/ardour/disk_reader.cc b/libs/ardour/disk_reader.cc index 4c62b03de2..ed3e612cf2 100644 --- a/libs/ardour/disk_reader.cc +++ b/libs/ardour/disk_reader.cc @@ -71,7 +71,6 @@ DiskReader::~DiskReader () _playlists[n]->release (); } } - delete _midi_buf; } void @@ -408,7 +407,7 @@ DiskReader::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp /* MIDI data handling */ midi: - if (/*!_session.declick_out_pending() && */ bufs.count().n_midi()) { + if (/*!_session.declick_out_pending() && */ bufs.count().n_midi() && _midi_buf) { MidiBuffer* dst; if (_no_disk_output) { @@ -642,7 +641,9 @@ DiskReader::seek (samplepos_t sample, bool complete_refill) reset_tracker (); } - _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); @@ -1209,7 +1210,9 @@ DiskReader::move_processor_automation (boost::weak_ptr p, list< Evora void DiskReader::reset_tracker () { - _midi_buf->reset_tracker (); + if (_midi_buf) { + _midi_buf->reset_tracker (); + } boost::shared_ptr mp (midi_playlist()); @@ -1221,7 +1224,9 @@ DiskReader::reset_tracker () void DiskReader::resolve_tracker (Evoral::EventSink& buffer, samplepos_t time) { - _midi_buf->resolve_tracker(buffer, time); + if (_midi_buf) { + _midi_buf->resolve_tracker(buffer, time); + } boost::shared_ptr mp (midi_playlist()); @@ -1239,6 +1244,8 @@ DiskReader::get_midi_playback (MidiBuffer& dst, samplepos_t start_sample, sample MidiBuffer* target; samplepos_t nframes = end_sample - start_sample; + assert (_midi_buf); + if ((ms & MonitoringInput) == 0) { /* Route::process_output_buffers() clears the buffer as-needed */ target = &dst; @@ -1378,6 +1385,8 @@ DiskReader::midi_read (samplepos_t& start, samplecnt_t dur, bool reversed) samplepos_t effective_start = start; Evoral::Range* loop_range (0); + assert(_midi_buf); + DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("MDS::midi_read @ %1 cnt %2\n", start, dur)); boost::shared_ptr mt = boost::dynamic_pointer_cast(_route); @@ -1463,7 +1472,7 @@ DiskReader::midi_read (samplepos_t& start, samplecnt_t dur, bool reversed) int DiskReader::refill_midi () { - if (!_playlists[DataType::MIDI]) { + if (!_playlists[DataType::MIDI] || !_midi_buf) { return 0; } 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 mt = boost::dynamic_pointer_cast(_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 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(&_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 (&_samples_pending_write));