, playback_sample (0)
, _need_butler (false)
, channels (new ChannelList)
- , _midi_buf (new MidiRingBuffer<samplepos_t> (s.butler()->midi_diskstream_buffer_size()))
+ , _midi_buf (0)
, _samples_written_to_ringbuffer (0)
, _samples_read_from_ringbuffer (0)
{
}
channels.flush ();
+ delete _midi_buf;
}
_playlists[n]->release ();
}
}
- delete _midi_buf;
}
void
/* 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) {
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);
void
DiskReader::reset_tracker ()
{
- _midi_buf->reset_tracker ();
+ if (_midi_buf) {
+ _midi_buf->reset_tracker ();
+ }
boost::shared_ptr<MidiPlaylist> mp (midi_playlist());
void
DiskReader::resolve_tracker (Evoral::EventSink<samplepos_t>& buffer, samplepos_t time)
{
- _midi_buf->resolve_tracker(buffer, time);
+ if (_midi_buf) {
+ _midi_buf->resolve_tracker(buffer, time);
+ }
boost::shared_ptr<MidiPlaylist> mp (midi_playlist());
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;
samplepos_t effective_start = start;
Evoral::Range<samplepos_t>* loop_range (0);
+ assert(_midi_buf);
+
DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("MDS::midi_read @ %1 cnt %2\n", start, dur));
boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack>(_route);
int
DiskReader::refill_midi ()
{
- if (!_playlists[DataType::MIDI]) {
+ if (!_playlists[DataType::MIDI] || !_midi_buf) {
return 0;
}
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) {
_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) {
(*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);
/* 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));