Add progress bar to strip silence dialogue. Fixes #3103.
authorCarl Hetherington <carl@carlh.net>
Mon, 20 Sep 2010 00:58:25 +0000 (00:58 +0000)
committerCarl Hetherington <carl@carlh.net>
Mon, 20 Sep 2010 00:58:25 +0000 (00:58 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@7809 d708f5d6-7413-0410-9779-e7cbd77b26cf

17 files changed:
gtk2_ardour/editor.h
gtk2_ardour/editor_ops.cc
gtk2_ardour/strip_silence_dialog.cc
gtk2_ardour/strip_silence_dialog.h
gtk2_ardour/wscript
libs/ardour/ardour/filter.h
libs/ardour/ardour/midi_stretch.h
libs/ardour/ardour/rb_effect.h
libs/ardour/ardour/region.h
libs/ardour/ardour/reverse.h
libs/ardour/ardour/strip_silence.h
libs/ardour/midi_stretch.cc
libs/ardour/rb_effect.cc
libs/ardour/region.cc
libs/ardour/reverse.cc
libs/ardour/strip_silence.cc
libs/ardour/wscript

index 9063599e236f293f059078a6c4c8656c1f685a3b..9e5e065ecd9be491d31760e9262f2d6e730b3f3b 100644 (file)
@@ -127,6 +127,7 @@ class EditorLocations;
 class EditorSnapshots;
 class EditorSummary;
 class RegionLayeringOrderEditor;
+class ProgressReporter;
 
 /* <CMT Additions> */
 class ImageFrameView;
@@ -1910,7 +1911,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        /* audio filters */
 
-       void apply_filter (ARDOUR::Filter&, std::string cmd);
+       void apply_filter (ARDOUR::Filter&, std::string cmd, ProgressReporter* progress = 0);
 
        Command* apply_midi_note_edit_op_to_region (ARDOUR::MidiOperator& op, MidiRegionView& mrv);
        void apply_midi_note_edit_op (ARDOUR::MidiOperator& op);
index 10d8410dad5bf9722eb68f987af71ca747052a48..426e42ced2522143c484d37041a5a9cf3d615c7a 100644 (file)
@@ -4740,7 +4740,7 @@ Editor::strip_region_silence ()
 
        if (r == Gtk::RESPONSE_OK) {
                StripSilence s (*_session, d.threshold (), d.minimum_length (), d.fade_length ());
-               apply_filter (s, _("strip silence"));
+               apply_filter (s, _("strip silence"), &d);
        }
 }
 
@@ -4855,7 +4855,7 @@ Editor::quantize_region ()
 }
 
 void
-Editor::apply_filter (Filter& filter, string command)
+Editor::apply_filter (Filter& filter, string command, ProgressReporter* progress)
 {
        RegionSelection rs;
 
@@ -4870,6 +4870,9 @@ Editor::apply_filter (Filter& filter, string command)
        track_canvas->get_window()->set_cursor (*wait_cursor);
        gdk_flush ();
 
+       int n = 0;
+       int const N = rs.size ();
+       
        for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ) {
                RegionSelection::iterator tmp = r;
                ++tmp;
@@ -4878,10 +4881,14 @@ Editor::apply_filter (Filter& filter, string command)
                if (arv) {
                        boost::shared_ptr<Playlist> playlist = arv->region()->playlist();
 
-                       if (arv->audio_region()->apply (filter) == 0) {
+                       if (progress) {
+                               progress->descend (1.0 / N);
+                       }
+
+                       if (arv->audio_region()->apply (filter, progress) == 0) {
 
                                playlist->clear_changes ();
-                                
+
                                if (filter.results.empty ()) {
 
                                        /* no regions returned; remove the old one */
@@ -4907,9 +4914,15 @@ Editor::apply_filter (Filter& filter, string command)
                        } else {
                                goto out;
                        }
+
+                       if (progress) {
+                               progress->ascend ();
+                               progress->set_progress (float (n + 1) / N);
+                       }
                }
 
                r = tmp;
+               ++n;
        }
 
        commit_reversible_command ();
index 936c0712902ae55b14de710c21b90ad51b4c9ffa..d0f806e71a32b0b6fab13fa3d40d08e0185916cb 100644 (file)
@@ -53,6 +53,7 @@ StripSilenceDialog* StripSilenceDialog::current = 0;
 /** Construct Strip silence dialog box */
 StripSilenceDialog::StripSilenceDialog (Session* s, list<boost::shared_ptr<ARDOUR::AudioRegion> > const & regions)
        : ArdourDialog (_("Strip Silence"))
+       , ProgressReporter ()
         , _minimum_length (X_("silence duration"), true, "SilenceDurationClock", true, false, true, false)
         , _fade_length (X_("silence duration"), true, "SilenceDurationClock", true, false, true, false)
         , _wave_width (640)
@@ -143,6 +144,8 @@ StripSilenceDialog::StripSilenceDialog (Session* s, list<boost::shared_ptr<ARDOU
 
        get_vbox()->pack_start (*_canvas, true, true);
 
+       get_vbox()->pack_start (_progress_bar, true, true);
+
        show_all ();
 
         _threshold.get_adjustment()->signal_value_changed().connect (sigc::mem_fun (*this, &StripSilenceDialog::threshold_changed));
@@ -560,3 +563,9 @@ StripSilenceDialog::Wave::~Wave ()
                delete *i;
        }
 }
+
+void
+StripSilenceDialog::update_progress_gui (float p)
+{
+       _progress_bar.set_fraction (p);
+}
index 1e8b140358b97ae87347493643d46f2f6ca4ad0b..3b800eb1155ffb03cb0ef6955b0230efd1fe0eeb 100644 (file)
@@ -23,6 +23,7 @@
 #include "ardour/types.h"
 #include "ardour_dialog.h"
 #include "canvas.h"
+#include "progress_reporter.h"
 
 namespace ARDOUR {
        class AudioRegion;
@@ -30,7 +31,7 @@ namespace ARDOUR {
 }
 
 /// Dialog box to set options for the `strip silence' filter
-class StripSilenceDialog : public ArdourDialog
+class StripSilenceDialog : public ArdourDialog, public ProgressReporter
 {
 public:
         StripSilenceDialog (ARDOUR::Session*, std::list<boost::shared_ptr<ARDOUR::AudioRegion> > const &);
@@ -52,6 +53,7 @@ private:
         void resize_silence_rects ();
        void update_threshold_line ();
        void threshold_changed ();
+       void update_progress_gui (float);
 
        Gtk::SpinButton _threshold;
        AudioClock      _minimum_length;
@@ -59,6 +61,7 @@ private:
         Gtk::Label      _segment_count_label;
        Gtk::Label      _shortest_silence_label;
        Gtk::Label      _shortest_audible_label;
+       Gtk::ProgressBar _progress_bar;
         typedef std::list<std::pair<ARDOUR::frameoffset_t,ARDOUR::framecnt_t> > SilenceResult;
 
        struct Wave {
index bd5ef5669028046881837196c793d278a28c57d9..2f003a615cac4e70df5c9a28f0f997aab088f843 100644 (file)
@@ -167,6 +167,7 @@ gtk2_ardour_sources = [
        'port_matrix_labels.cc',
        'port_matrix_row_labels.cc',
        'processor_box.cc',
+       'progress_reporter.cc',
        'prompter.cc',
        'public_editor.cc',
        'quantize_dialog.cc',
index 697e19539e757e87c8061a6fa71587cb5ba3fd1b..9d69a513accfc310050903613521a04106dbf0ca 100644 (file)
@@ -28,13 +28,14 @@ namespace ARDOUR {
 
 class Region;
 class Session;
+class Progress;        
 
 class Filter {
 
   public:
        virtual ~Filter() {}
 
-       virtual int run (boost::shared_ptr<ARDOUR::Region>) = 0;
+       virtual int run (boost::shared_ptr<ARDOUR::Region>, Progress* progress = 0) = 0;
        std::vector<boost::shared_ptr<ARDOUR::Region> > results;
 
   protected:
index 9dbfbca2bd1c4bf95b9cdcbce88aad2782eca139..90c75bbc18116b943e34f242a5072ef749f72944 100644 (file)
@@ -29,7 +29,7 @@ class MidiStretch : public Filter {
        MidiStretch (ARDOUR::Session&, TimeFXRequest&);
        ~MidiStretch ();
 
-       int run (boost::shared_ptr<ARDOUR::Region>);
+       int run (boost::shared_ptr<ARDOUR::Region>, Progress* progress = 0);
 
   private:
        TimeFXRequest& _request;
index e4b1c0003419f060e53de6fc7e8a84476bb6ab0b..84c9bce53ce651bddb35facc64f7b5fb471833f4 100644 (file)
@@ -31,7 +31,7 @@ class RBEffect : public Filter {
        RBEffect (ARDOUR::Session&, TimeFXRequest&);
        ~RBEffect ();
 
-       int run (boost::shared_ptr<ARDOUR::Region>);
+       int run (boost::shared_ptr<ARDOUR::Region>, Progress* progress = 0);
 
   private:
        TimeFXRequest& tsr;
index b78699d906451c9281d961245b16f79319b030de..0ae325d124809ae418634c38bcea9bac36a311ab 100644 (file)
@@ -68,6 +68,7 @@ namespace Properties {
 class Playlist;
 class Filter;
 class ExportSpecification;
+class Progress;        
 
 enum RegionEditState {
        EditChangesNothing = 0,
@@ -205,7 +206,7 @@ class Region
        void set_locked (bool yn);
        void set_position_locked (bool yn);
 
-       int apply (Filter&);
+       int apply (Filter &, Progress* progress = 0);
 
        virtual uint64_t read_data_count() const { return _read_data_count; }
 
index 0831e8184ba83687eb3ea6b7c514f4ad3ff5ec46..edc72ce707f53828ac1e863c188e5c9b0c3e4295 100644 (file)
@@ -29,7 +29,7 @@ class Reverse : public Filter {
        Reverse (ARDOUR::Session&);
        ~Reverse ();
 
-       int run (boost::shared_ptr<ARDOUR::Region>);
+       int run (boost::shared_ptr<ARDOUR::Region>, Progress *);
 };
 
 } /* namespace */
index 217f6b3d8a8bdafa5b9f1d8cc03c4ca5be69a366..e77aa7111ce206cd38b2c557c0f0d6153d848aef 100644 (file)
@@ -27,7 +27,7 @@ class StripSilence : public Filter {
 public:
        StripSilence (Session &, double, nframes_t, nframes_t);
 
-       int run (boost::shared_ptr<ARDOUR::Region>);
+       int run (boost::shared_ptr<ARDOUR::Region>, Progress* progress = 0);
 
 private:
        double _threshold; ///< silence threshold, in dBFS
index dedae6acb1c2e16fa81358c3f04824bcbd4b9199..ee1ccc31ae283c8138415c9cd5fb1a3f34ff24dd 100644 (file)
@@ -42,7 +42,7 @@ MidiStretch::~MidiStretch ()
 }
 
 int
-MidiStretch::run (boost::shared_ptr<Region> r)
+MidiStretch::run (boost::shared_ptr<Region> r, Progress* progress)
 {
        SourceList nsrcs;
        char suffix[32];
index 60764c12201901d78f96fda416ff1c8cf70b195b..32a2d056d671d4786a96ee1aa8e26cba64dcff3a 100644 (file)
@@ -60,7 +60,7 @@ RBEffect::~RBEffect ()
 }
 
 int
-RBEffect::run (boost::shared_ptr<Region> r)
+RBEffect::run (boost::shared_ptr<Region> r, Progress* progress)
 {
        boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (r);
 
index 07d27faee95f65578f3ec671b89ebaf737deb719..98f48ab80a5b8144b4121b236ec37d103e5396de 100644 (file)
@@ -1535,9 +1535,9 @@ Region::get_parent() const
 }
 
 int
-Region::apply (Filter& filter)
+Region::apply (Filter& filter, Progress* progress)
 {
-       return filter.run (shared_from_this());
+       return filter.run (shared_from_this(), progress);
 }
 
 
index 10fce584423b22f8b3edc7ef252cd9a49c1e5d7f..675ccb4c522b4c3fbbfcbbe6d4514e175c8c5678 100644 (file)
@@ -42,7 +42,7 @@ Reverse::~Reverse ()
 }
 
 int
-Reverse::run (boost::shared_ptr<Region> r)
+Reverse::run (boost::shared_ptr<Region> r, Progress* progress)
 {
        SourceList nsrcs;
        SourceList::iterator si;
index a7d7ab073f5d2ad75a2d7b9447ae74e7d4b1e8b0..a7308b06abf3f3d09e7de8d3f8b8b16a6fd03b9a 100644 (file)
@@ -24,6 +24,7 @@
 #include "ardour/region_factory.h"
 #include "ardour/session.h"
 #include "ardour/dB.h"
+#include "ardour/progress.h"
 
 using namespace ARDOUR;
 
@@ -41,7 +42,7 @@ StripSilence::StripSilence (Session & s, double threshold, nframes_t minimum_len
 }
 
 int
-StripSilence::run (boost::shared_ptr<Region> r)
+StripSilence::run (boost::shared_ptr<Region> r, Progress* progress)
 {
        results.clear ();
 
@@ -88,6 +89,9 @@ StripSilence::run (boost::shared_ptr<Region> r)
                 in_silence = false;
         }
 
+       int n = 0;
+       int const N = silence.size ();
+
         while (s != silence.end()) {
 
                 framecnt_t interval_duration;
@@ -119,6 +123,11 @@ StripSilence::run (boost::shared_ptr<Region> r)
                 ++s;
                 end = s->first;
                 in_silence = !in_silence;
+
+               if (progress) {
+                       progress->set_progress (float (n) / N);
+               }
+               ++n;
         }
 
        return 0;
index a7bc8119990323af4eb538305346021b0c9c6c6f..a2c4898053cb996d5a121ca5c8ea597dab114e8a 100644 (file)
@@ -148,6 +148,7 @@ libardour_sources = [
        'port_set.cc',
        'process_thread.cc',
        'processor.cc',
+       'progress.cc',
        'quantize.cc',
        'rc_configuration.cc',
        'recent_sessions.cc',