From 3d64972ca29f54ba556191dfaaa314efb20e63f7 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 21 Jul 2023 21:14:32 -0600 Subject: [PATCH] libardour support for propagating track time domain changes into playlists and thence regions --- libs/ardour/ardour/track.h | 2 ++ libs/ardour/playlist.cc | 3 +++ libs/ardour/region.cc | 1 + libs/ardour/track.cc | 34 ++++++++++++++++++++++++++++++++-- 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/libs/ardour/ardour/track.h b/libs/ardour/ardour/track.h index fe6e3d243e..316f6fbb6a 100644 --- a/libs/ardour/ardour/track.h +++ b/libs/ardour/ardour/track.h @@ -178,6 +178,8 @@ public: void adjust_playback_buffering (); void adjust_capture_buffering (); + void time_domain_changed (); + PBD::Signal0 FreezeChange; PBD::Signal0 PlaylistChanged; PBD::Signal0 PlaylistAdded; diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index 066bf72dbe..dd18f629a8 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -3516,6 +3516,7 @@ Playlist::globally_change_time_domain (Temporal::TimeDomain from, Temporal::Time void Playlist::time_domain_changed () { + std::cerr << this << " playlist gets td change\n"; using namespace Temporal; TimeDomainProvider::time_domain_changed (); @@ -3523,6 +3524,8 @@ Playlist::time_domain_changed () Temporal::TimeDomain to = time_domain(); Temporal::TimeDomain from = (to == AudioTime ? BeatTime : AudioTime); + std::cerr << "playlist new domain " << to << " old domain " << from << " have domain " << has_own_time_domain() << std::endl; + for (auto & region : regions) { region->change_time_domain (from, to); } diff --git a/libs/ardour/region.cc b/libs/ardour/region.cc index 1b341293ab..85c1f8b197 100644 --- a/libs/ardour/region.cc +++ b/libs/ardour/region.cc @@ -2209,6 +2209,7 @@ Region::globally_change_time_domain (Temporal::TimeDomain from, Temporal::TimeDo void Region::change_time_domain (Temporal::TimeDomain from, Temporal::TimeDomain to) { + std::cerr << name() << " change td to " << to << std::endl; if (_length.val().time_domain() == from) { timecnt_t& l (_length.non_const_val()); l.set_time_domain (to); diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index 37b42ac807..61d254cd7c 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -717,7 +717,7 @@ Track::use_playlist (DataType dt, std::shared_ptr p, bool set_orig) * has an actual parent, revert to using its parent's domain */ if (old->time_domain_parent()) { - old->clear_time_domain (); + old->clear_time_domain_parent (); } } @@ -733,7 +733,10 @@ Track::use_playlist (DataType dt, std::shared_ptr p, bool set_orig) */ if (!p->time_domain_parent() || p->time_domain_parent() == &_session) { - p->set_time_domain (time_domain()); + /* XXX DANGER : track could go away leaving playlist + * with dead parent time domain provider + */ + p->set_time_domain_parent (*this); } } @@ -1183,3 +1186,30 @@ Track::use_captured_audio_sources (SourceList& srcs, CaptureInfos const & captur pl->set_capture_insertion_in_progress (false); _session.add_command (new StatefulDiffCommand (pl)); } + +void +Track::time_domain_changed () +{ + Route::time_domain_changed (); + + std::cerr << this << " td changed to " << time_domain() << std::endl; + + std::shared_ptr pl = _playlists[DataType::AUDIO]; + if (pl) { + std::cerr << "Call for audio\n"; + if (pl->time_domain_parent() == this) { + pl->time_domain_changed (); + } else { + std::cerr << "skip that pl\n"; + } + } + pl = _playlists[DataType::MIDI]; + if (pl) { + std::cerr << "Call for MIDI\n"; + if (pl->time_domain_parent() == this) { + pl->time_domain_changed (); + } else { + std::cerr << "skip that pl\n"; + } + } +}