X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fdisk_reader.cc;h=0df940a13b97dcbd099ff44f12f0392988ad49c5;hb=3ec845b1ef1184719de2160bf572b667c9aa4bda;hp=27831aba934f66f78ee9a2164890872da567b111;hpb=08ab8fc58ac6c57b9ba0a03d599ba1b8c08b4dff;p=ardour.git diff --git a/libs/ardour/disk_reader.cc b/libs/ardour/disk_reader.cc index 27831aba93..0df940a13b 100644 --- a/libs/ardour/disk_reader.cc +++ b/libs/ardour/disk_reader.cc @@ -57,6 +57,7 @@ DiskReader::DiskReader (Session& s, string const & str, DiskIOProcessor::Flag f) : DiskIOProcessor (s, str, f) , overwrite_sample (0) , overwrite_queued (false) + , run_must_resolve (false) , _declick_amp (s.nominal_sample_rate ()) , _declick_offs (0) { @@ -203,17 +204,11 @@ DiskReader::adjust_buffering () } } -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; } } @@ -236,8 +231,10 @@ DiskReader::use_playlist (DataType dt, boost::shared_ptr playlist) 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; } @@ -252,7 +249,15 @@ DiskReader::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp boost::shared_ptr 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 mt = boost::dynamic_pointer_cast (_track); + if (mt) { + resolve_tracker (mt->immediate_events(), start_sample); + } + run_must_resolve = false; + } if (_active) { if (!_pending_active) { @@ -453,8 +458,6 @@ DiskReader::pending_overwrite () const { return g_atomic_int_get (&_pending_overwrite) != 0; } -PBD::Timing minsert; - void DiskReader::set_pending_overwrite () { @@ -467,7 +470,9 @@ 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 @@ -514,12 +519,15 @@ DiskReader::overwrite_existing_buffers () 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); @@ -974,7 +982,7 @@ DiskReader::playlist_ranges_moved (list< Evoral::RangeMove > const return; } - if (!_route || Config->get_automation_follows_regions () == false) { + if (!_track || Config->get_automation_follows_regions () == false) { return; } @@ -988,7 +996,7 @@ DiskReader::playlist_ranges_moved (list< Evoral::RangeMove > const } /* move panner automation */ - boost::shared_ptr pannable = _route->pannable(); + boost::shared_ptr pannable = _track->pannable(); Evoral::ControlSet::Controls& c (pannable->controls()); for (Evoral::ControlSet::Controls::iterator ci = c.begin(); ci != c.end(); ++ci) { @@ -1008,7 +1016,7 @@ DiskReader::playlist_ranges_moved (list< Evoral::RangeMove > const } } /* 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 @@ -1064,7 +1072,10 @@ DiskReader::get_midi_playback (MidiBuffer& dst, samplepos_t start_sample, sample 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; } @@ -1075,13 +1086,14 @@ DiskReader::get_midi_playback (MidiBuffer& dst, samplepos_t start_sample, sample 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; @@ -1118,30 +1130,30 @@ DiskReader::get_midi_playback (MidiBuffer& dst, samplepos_t start_sample, sample 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); } @@ -1161,13 +1173,6 @@ DiskReader::get_midi_playback (MidiBuffer& dst, samplepos_t start_sample, sample #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 () { @@ -1246,3 +1251,22 @@ DiskReader::DeclickAmp::apply_gain (AudioBuffer& buf, samplecnt_t n_samples, con _g = g; } } + +RTMidiBuffer* +DiskReader::rt_midibuffer () +{ + boost::shared_ptr pl = _playlists[DataType::MIDI]; + + if (!pl) { + return 0; + } + + boost::shared_ptr mpl = boost::dynamic_pointer_cast (pl); + + if (!mpl) { + /* error, but whatever ... */ + return 0; + } + + return mpl->rendered(); +}