From bbcdd959bf0fa80495de8399ffcc2d586d94ce53 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 28 May 2021 13:27:55 -0600 Subject: [PATCH] dialog for remove gaps operation --- gtk2_ardour/editor.h | 3 +- gtk2_ardour/editor_actions.cc | 2 +- gtk2_ardour/editor_ops.cc | 81 ++++++++++++++++++++++++++++++++++- 3 files changed, 82 insertions(+), 4 deletions(-) diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 57f03094f1..ab28a6eca5 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -579,7 +579,8 @@ public: void split_regions_at (ARDOUR::MusicSample, RegionSelection&); void split_region_at_points (boost::shared_ptr, ARDOUR::AnalysisFeatureList&, bool can_ferret, bool select_new = false); RegionSelection get_regions_from_selection_and_mouse (samplepos_t); - void remove_gaps (); + void do_remove_gaps (); + void remove_gaps (samplecnt_t threshold, samplecnt_t leave); void mouse_add_new_tempo_event (samplepos_t where); void mouse_add_new_meter_event (samplepos_t where); diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index 26f66d0ba3..4b6f3f05c0 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -455,7 +455,7 @@ Editor::register_actions () ActionManager::session_sensitive_actions.push_back (act); ActionManager::track_selection_sensitive_actions.push_back (act); - act = reg_sens (editor_actions, "remove-gaps", _("Remove Gaps"), (sigc::mem_fun(*this, &Editor::remove_gaps))); + act = reg_sens (editor_actions, "remove-gaps", _("Remove Gaps"), (sigc::mem_fun(*this, &Editor::do_remove_gaps))); ActionManager::track_selection_sensitive_actions.push_back (act); ActionManager::session_sensitive_actions.push_back (act); diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index c3b6106ef9..30f5a01079 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -8924,7 +8924,84 @@ Editor::make_region_markers_global (bool as_cd_marker) } void -Editor::remove_gaps () +Editor::do_remove_gaps () +{ + ArdourDialog d (_("Remove Gaps"), true, false); + + Gtk::HBox hpacker1; + Gtk::Label label1 (_("Smallest gap size to remove (seconds):")); + Gtk::Entry e1; + + hpacker1.set_spacing (12); + hpacker1.set_border_width (12); + hpacker1.pack_start (label1, true, false); + hpacker1.pack_start (e1, false, false); + + Gtk::HBox hpacker2; + Gtk::Label label2 (_("Leave a gap of(seconds):")); + Gtk::Entry e2; + + hpacker2.set_spacing (12); + hpacker2.set_border_width (12); + hpacker2.pack_start (label2, true, false); + hpacker2.pack_start (e2, false, false); + + d.get_vbox()->pack_start (hpacker1); + d.get_vbox()->pack_start (hpacker2); + d.get_vbox()->show_all (); + + e2.set_activates_default (); + + d.add_button (Stock::CANCEL, RESPONSE_CANCEL); + d.add_button (Stock::OK, RESPONSE_OK); + d.set_default_response (RESPONSE_OK); + + again: + int result = d.run (); + + if (result != RESPONSE_OK) { + return; + } + + float threshold_secs; + + if (sscanf (e1.get_text().c_str(), "%f", &threshold_secs) != 1) { + ArdourMessageDialog msg (_("The threshold value you entered is not a number")); + msg.run(); + goto again; + } + + if (threshold_secs <= 0) { + ArdourMessageDialog msg (_("The threshold value must be larger than zero")); + msg.run(); + goto again; + } + + samplecnt_t threshold_samples = (samplecnt_t) floor (threshold_secs * _session->sample_rate()); + + float leave_secs; + + if (sscanf (e2.get_text().c_str(), "%f", &leave_secs) != 1) { + ArdourMessageDialog msg (_("The leave-gap value you entered is not a number")); + msg.run(); + goto again; + } + + if (leave_secs < 0) { + ArdourMessageDialog msg (_("The threshold value must be larger than or equal to zero")); + msg.run (); + goto again; + } + + samplecnt_t leave_samples = (samplecnt_t) floor (leave_secs * _session->sample_rate()); + + d.hide (); + + remove_gaps (threshold_samples, leave_samples); +} + +void +Editor::remove_gaps (samplecnt_t gap_threshold, samplecnt_t leave_gap) { bool in_command = false; TrackViewList ts = selection->tracks.filter_to_unique_playlists (); @@ -8963,7 +9040,7 @@ Editor::remove_gaps () in_command = true; } - (*i)->remove_gaps (24000, 4410); + (*i)->remove_gaps (gap_threshold, leave_gap); vector cmds; (*i)->rdiff (cmds);