diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2019-10-17 17:32:56 -0600 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2019-11-02 16:32:18 -0600 |
commit | 0573e7cdf088f194b082e5546796161fe37109a8 (patch) | |
tree | cefa474b50c3c5111edad0bef131b4f256963403 | |
parent | 2cf9ad8f8c21cc445c8eabc6856fd9956926203f (diff) |
alter where note resolution happens when a re-rendering is scheduled for a MIDI track
-rw-r--r-- | gtk2_ardour/midi_region_view.cc | 5 | ||||
-rw-r--r-- | libs/ardour/ardour/disk_reader.h | 1 | ||||
-rw-r--r-- | libs/ardour/ardour/midi_playlist.h | 9 | ||||
-rw-r--r-- | libs/ardour/ardour/midi_track.h | 1 | ||||
-rw-r--r-- | libs/ardour/disk_reader.cc | 26 | ||||
-rw-r--r-- | libs/ardour/midi_playlist.cc | 25 | ||||
-rw-r--r-- | libs/ardour/midi_track.cc | 8 |
7 files changed, 28 insertions, 47 deletions
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 040bbbeecc..c74b91596a 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -1084,8 +1084,6 @@ MidiRegionView::apply_diff (bool as_subcommand, bool was_copy) } } - midi_view()->midi_track()->midi_playlist()->region_edited (_region, _note_diff_command); - if (as_subcommand) { _model->apply_command_as_subcommand (*trackview.session(), _note_diff_command); } else { @@ -1100,8 +1098,11 @@ MidiRegionView::apply_diff (bool as_subcommand, bool was_copy) } _marked_for_velocity.clear(); + if (commit) { trackview.editor().commit_reversible_command (); + /* XXX the GUI should NOT be responsible for causing this call tree */ + midi_view()->midi_track()->region_edited (_region); } } diff --git a/libs/ardour/ardour/disk_reader.h b/libs/ardour/ardour/disk_reader.h index 384bbbc2ce..3c22b80e87 100644 --- a/libs/ardour/ardour/disk_reader.h +++ b/libs/ardour/ardour/disk_reader.h @@ -157,6 +157,7 @@ private: samplepos_t overwrite_sample; mutable gint _pending_overwrite; bool overwrite_queued; + bool run_must_resolve; IOChange input_change_pending; samplepos_t file_sample[DataType::num_types]; diff --git a/libs/ardour/ardour/midi_playlist.h b/libs/ardour/ardour/midi_playlist.h index 1b01bbdc2d..82f7cb690f 100644 --- a/libs/ardour/ardour/midi_playlist.h +++ b/libs/ardour/ardour/midi_playlist.h @@ -100,15 +100,6 @@ public: std::set<Evoral::Parameter> contained_automation(); - /** Handle a region edit during read. - * - * This must be called before the command is applied to the model. Events - * are injected into the playlist output to compensate for edits to active - * notes and maintain coherent output and tracker state. - */ - void region_edited(boost::shared_ptr<Region> region, - const MidiModel::NoteDiffCommand* cmd); - /** Clear all note trackers. */ void reset_note_trackers (); diff --git a/libs/ardour/ardour/midi_track.h b/libs/ardour/ardour/midi_track.h index e32b1c5b32..ebe4e9bd56 100644 --- a/libs/ardour/ardour/midi_track.h +++ b/libs/ardour/ardour/midi_track.h @@ -137,6 +137,7 @@ public: PBD::Signal0<void> InputActiveChanged; void realtime_handle_transport_stopped (); + void region_edited (boost::shared_ptr<Region>); protected: diff --git a/libs/ardour/disk_reader.cc b/libs/ardour/disk_reader.cc index cd276ca918..426453a47b 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) { @@ -254,6 +255,14 @@ DiskReader::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp sampleoffset_t disk_samples_to_consume; MonitorState ms = _track->monitoring_state (); + if (run_must_resolve) { + boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (_track); + assert (mt); + cerr << _track->name() << " resolving " << _tracker.on() << " notes @ " << start_sample << endl; + resolve_tracker (mt->immediate_events(), start_sample); + run_must_resolve = false; + } + if (_active) { if (!_pending_active) { _active = false; @@ -453,8 +462,6 @@ DiskReader::pending_overwrite () const { return g_atomic_int_get (&_pending_overwrite) != 0; } -PBD::Timing minsert; - void DiskReader::set_pending_overwrite () { @@ -468,12 +475,8 @@ DiskReader::set_pending_overwrite () (*chan)->rbuf->read_flush (); } - boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (_track); - if (mt) { - resolve_tracker (mt->immediate_events(), _session.audible_sample()); - } - g_atomic_int_set (&_pending_overwrite, 1); + run_must_resolve = true; } bool @@ -522,12 +525,11 @@ DiskReader::overwrite_existing_buffers () if (_playlists[DataType::MIDI]) { - minsert.reset(); + PBD::Timing minsert; minsert.start(); midi_playlist()->render (_mbuf, 0); minsert.update(); - cerr << "Reading " << name() << " took " << minsert.elapsed() << " microseconds, final size = " << _mbuf.size() << endl; - _mbuf.dump (40); + //cerr << "Reading " << name() << " took " << minsert.elapsed() << " microseconds, final size = " << _mbuf.size() << endl; } g_atomic_int_set (&_pending_overwrite, 0); @@ -1073,6 +1075,7 @@ DiskReader::get_midi_playback (MidiBuffer& dst, samplepos_t start_sample, sample samplepos_t nframes = ::llabs (end_sample - start_sample); if (_mbuf.size() == 0) { + /* no data to read, so do nothing */ return; } @@ -1083,7 +1086,8 @@ DiskReader::get_midi_playback (MidiBuffer& dst, samplepos_t start_sample, sample target = &scratch_bufs.get_midi (0); } - if (ms & MonitoringDisk) { + if (!pending_overwrite() && (ms & MonitoringDisk)) { + /* disk data needed */ Location* loc = _loop_location; diff --git a/libs/ardour/midi_playlist.cc b/libs/ardour/midi_playlist.cc index 881641d32a..ae9c0bbf13 100644 --- a/libs/ardour/midi_playlist.cc +++ b/libs/ardour/midi_playlist.cc @@ -252,31 +252,6 @@ MidiPlaylist::read (Evoral::EventSink<samplepos_t>& dst, } void -MidiPlaylist::region_edited(boost::shared_ptr<Region> region, - const MidiModel::NoteDiffCommand* cmd) -{ - typedef MidiModel::NoteDiffCommand Command; - - boost::shared_ptr<MidiRegion> mr = boost::dynamic_pointer_cast<MidiRegion>(region); - if (!mr || !_session.transport_rolling()) { - return; - } - - /* Take write lock to prevent concurrency with read(). */ - Playlist::RegionWriteLock lock(this); - - NoteTrackers::iterator t = _note_trackers.find(mr.get()); - if (t == _note_trackers.end()) { - return; /* Region is not currently active, nothing to do. */ - } - - /* Queue any necessary edit compensation events. */ - t->second->fixer.prepare( - _session.tempo_map(), cmd, mr->position() - mr->start(), - _read_end, t->second->cursor.active_notes); -} - -void MidiPlaylist::reset_note_trackers () { Playlist::RegionWriteLock rl (this, false); diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc index cca757934c..16d97a984c 100644 --- a/libs/ardour/midi_track.cc +++ b/libs/ardour/midi_track.cc @@ -871,3 +871,11 @@ MidiTrack::realtime_handle_transport_stopped () Route::realtime_handle_transport_stopped (); _disk_reader->resolve_tracker (_immediate_events, Port::port_offset()); } + +void +MidiTrack::region_edited(boost::shared_ptr<Region> region) + +{ + cerr << "MIDI region " << region->name() << " edited, queue reload\n"; + _session.request_overwrite_buffer (boost::dynamic_pointer_cast<Track> (shared_from_this())); +} |