: DiskIOProcessor (s, str, f)
, overwrite_sample (0)
, overwrite_queued (false)
+ , run_must_resolve (false)
, _declick_amp (s.nominal_sample_rate ())
, _declick_offs (0)
{
}
}
-void
-DiskReader::playlist_changed (const PropertyChange&)
-{
- playlist_modified ();
-}
-
void
DiskReader::playlist_modified ()
{
if (!overwrite_queued) {
- _session.request_overwrite_buffer (_route);
+ _session.request_overwrite_buffer (_track);
overwrite_queued = true;
}
}
take care of the buffer refill.
*/
+ cerr << "DR " << _track->name() << " using playlist, loading ? " << _session.loading() << endl;
+
if (!overwrite_queued && (prior_playlist || _session.loading())) {
- _session.request_overwrite_buffer (_route);
+ _session.request_overwrite_buffer (_track);
overwrite_queued = true;
}
boost::shared_ptr<ChannelList> c = channels.reader();
ChannelList::iterator chan;
sampleoffset_t disk_samples_to_consume;
- MonitorState ms = _route->monitoring_state ();
+ MonitorState ms = _track->monitoring_state ();
+
+ if (run_must_resolve) {
+ boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (_track);
+ if (mt) {
+ resolve_tracker (mt->immediate_events(), start_sample);
+ }
+ run_must_resolve = false;
+ }
if (_active) {
if (!_pending_active) {
return g_atomic_int_get (&_pending_overwrite) != 0;
}
-PBD::Timing minsert;
-
void
DiskReader::set_pending_overwrite ()
{
for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
(*chan)->rbuf->read_flush ();
}
+
g_atomic_int_set (&_pending_overwrite, 1);
+ run_must_resolve = true;
}
bool
midi:
- if (_playlists[DataType::MIDI]) {
+ RTMidiBuffer* mbuf = rt_midibuffer ();
- minsert.reset(); minsert.start();
- _mbuf.clear(); midi_playlist()->dump (_mbuf, 0);
- minsert.update(); cerr << "Reading " << name() << " took " << minsert.elapsed() << " microseconds, final size = " << _mbuf.size() << endl;
- _mbuf.dump (40);
+ if (mbuf) {
+ PBD::Timing minsert;
+ minsert.start();
+ midi_playlist()->render (0);
+ minsert.update();
+ assert (midi_playlist()->rendered());
+ // cerr << "Reading " << name() << " took " << minsert.elapsed() << " microseconds, final size = " << midi_playlist()->rendered()->size() << endl;
}
g_atomic_int_set (&_pending_overwrite, 0);
return;
}
- if (!_route || Config->get_automation_follows_regions () == false) {
+ if (!_track || Config->get_automation_follows_regions () == false) {
return;
}
}
/* move panner automation */
- boost::shared_ptr<Pannable> pannable = _route->pannable();
+ boost::shared_ptr<Pannable> pannable = _track->pannable();
Evoral::ControlSet::Controls& c (pannable->controls());
for (Evoral::ControlSet::Controls::iterator ci = c.begin(); ci != c.end(); ++ci) {
}
}
/* move processor automation */
- _route->foreach_processor (boost::bind (&DiskReader::move_processor_automation, this, _1, movements_samples));
+ _track->foreach_processor (boost::bind (&DiskReader::move_processor_automation, this, _1, movements_samples));
}
void
MidiBuffer* target;
samplepos_t nframes = ::llabs (end_sample - start_sample);
- if (_mbuf.size() == 0) {
+ RTMidiBuffer* rtmb = rt_midibuffer();
+
+ if (!rtmb || (rtmb->size() == 0)) {
+ /* no data to read, so do nothing */
return;
}
target = &scratch_bufs.get_midi (0);
}
- if (ms & MonitoringDisk) {
+ size_t events_read = 0;
+
+ if (!pending_overwrite() && (ms & MonitoringDisk)) {
+
/* disk data needed */
Location* loc = _loop_location;
- size_t events_read = 0;
-
if (loc) {
samplepos_t effective_start;
if (first) {
DEBUG_TRACE (DEBUG::MidiDiskIO, string_compose ("loop read #1, from %1 for %2\n",
effective_start, first));
- events_read = _mbuf.read (*target, effective_start, effective_start + first, _tracker);
+ events_read = rtmb->read (*target, effective_start, effective_start + first, _tracker);
}
if (second) {
DEBUG_TRACE (DEBUG::MidiDiskIO, string_compose ("loop read #2, from %1 for %2\n",
loc->start(), second));
- events_read += _mbuf.read (*target, loc->start(), loc->start() + second, _tracker);
+ events_read += rtmb->read (*target, loc->start(), loc->start() + second, _tracker);
}
} else {
DEBUG_TRACE (DEBUG::MidiDiskIO, string_compose ("loop read #3, adjusted start as %1 for %2\n",
effective_start, nframes));
- events_read = _mbuf.read (*target, effective_start, effective_start + nframes, _tracker);
+ events_read = rtmb->read (*target, effective_start, effective_start + nframes, _tracker);
}
} else {
DEBUG_TRACE (DEBUG::MidiDiskIO, string_compose ("playback buffer read, from %1 to %2 (%3)", start_sample, end_sample, nframes));
- events_read = _mbuf.read (*target, start_sample, end_sample, _tracker, Port::port_offset ());
+ events_read = rtmb->read (*target, start_sample, end_sample, _tracker, Port::port_offset ());
}
DEBUG_TRACE (DEBUG::MidiDiskIO, string_compose ("%1 MDS events read %2 range %3 .. %4\n", _name, events_read, playback_sample, playback_sample + nframes));
}
- if (!_no_disk_output && (ms & MonitoringInput)) {
+ if (!pending_overwrite() && !_no_disk_output && (ms & MonitoringInput)) {
dst.merge_from (*target, nframes);
}
#endif
}
-/** @a start is set to the new sample position (TIME) read up to */
-int
-DiskReader::midi_read (samplepos_t& start, samplecnt_t dur, bool reversed)
-{
- return 0;
-}
-
int
DiskReader::refill_midi ()
{
_g = g;
}
}
+
+RTMidiBuffer*
+DiskReader::rt_midibuffer ()
+{
+ boost::shared_ptr<Playlist> pl = _playlists[DataType::MIDI];
+
+ if (!pl) {
+ return 0;
+ }
+
+ boost::shared_ptr<MidiPlaylist> mpl = boost::dynamic_pointer_cast<MidiPlaylist> (pl);
+
+ if (!mpl) {
+ /* error, but whatever ... */
+ return 0;
+ }
+
+ return mpl->rendered();
+}