diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 2a28d0fe1b..2528f2054b 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -1172,7 +1172,7 @@ class Editor : public PublicEditor void quantize_region (); void do_insert_time (); - void insert_time (nframes64_t pos, nframes64_t distance, Editing::InsertTimeOption opt, bool ignore_music_glue, bool markers_too); + void insert_time (nframes64_t, nframes64_t, Editing::InsertTimeOption, bool, bool, bool); void tab_to_transient (bool forward); diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index 4244567304..5dac7820fb 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -6218,6 +6218,8 @@ Editor::do_insert_time () d.get_vbox()->pack_start (move_glued); CheckButton move_markers (_("Move markers")); d.get_vbox()->pack_start (move_markers); + CheckButton move_tempos (_("Move tempo and meter changes")); + d.get_vbox()->pack_start (move_tempos); d.add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); d.add_button (_("Insert time"), Gtk::RESPONSE_OK); @@ -6249,12 +6251,12 @@ Editor::do_insert_time () break; } - insert_time (pos, distance, opt, move_glued.get_active(), move_markers.get_active()); + insert_time (pos, distance, opt, move_glued.get_active(), move_markers.get_active(), move_tempos.get_active()); } void Editor::insert_time (nframes64_t pos, nframes64_t frames, InsertTimeOption opt, - bool ignore_music_glue, bool markers_too) + bool ignore_music_glue, bool markers_too, bool tempo_too) { bool commit = false; @@ -6317,6 +6319,10 @@ Editor::insert_time (nframes64_t pos, nframes64_t frames, InsertTimeOption opt, } } + if (tempo_too) { + session->tempo_map().insert_time (pos, frames); + } + if (commit) { commit_reversible_command (); } diff --git a/libs/ardour/ardour/tempo.h b/libs/ardour/ardour/tempo.h index d88c5366d2..fcda463fe1 100644 --- a/libs/ardour/ardour/tempo.h +++ b/libs/ardour/ardour/tempo.h @@ -246,6 +246,8 @@ class TempoMap : public PBD::StatefulDestructible void change_existing_tempo_at (nframes_t, double bpm, double note_type); void change_initial_tempo (double bpm, double note_type); + void insert_time (nframes_t, nframes_t); + int n_tempos () const; int n_meters () const; diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc index 00c187a5bd..3056016752 100644 --- a/libs/ardour/tempo.cc +++ b/libs/ardour/tempo.cc @@ -1536,3 +1536,17 @@ TempoMap::n_meters() const return cnt; } + +void +TempoMap::insert_time (nframes_t where, nframes_t amount) +{ + for (Metrics::iterator i = metrics->begin(); i != metrics->end(); ++i) { + if ((*i)->frame() >= where) { + (*i)->set_frame ((*i)->frame() + amount); + } + } + + timestamp_metrics (false); + + StateChanged (Change (0)); +}