diff options
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/ardour3_ui_default.conf | 2 | ||||
-rw-r--r-- | gtk2_ardour/canvas_vars.h | 2 | ||||
-rw-r--r-- | gtk2_ardour/editor_ops.cc | 6 | ||||
-rw-r--r-- | gtk2_ardour/region_view.cc | 105 | ||||
-rw-r--r-- | gtk2_ardour/region_view.h | 18 | ||||
-rw-r--r-- | gtk2_ardour/strip_silence_dialog.cc | 231 | ||||
-rw-r--r-- | gtk2_ardour/strip_silence_dialog.h | 33 |
7 files changed, 207 insertions, 190 deletions
diff --git a/gtk2_ardour/ardour3_ui_default.conf b/gtk2_ardour/ardour3_ui_default.conf index 78adf6e5cb..438aad3c69 100644 --- a/gtk2_ardour/ardour3_ui_default.conf +++ b/gtk2_ardour/ardour3_ui_default.conf @@ -93,6 +93,8 @@ <Option name="recorded waveform fill" value="ffffffff"/> <Option name="recorded waveform outline" value="0f0f1fff"/> <Option name="rubber band rect" value="c6c6c659"/> + <Option name="silence" value="9efffd7a"/> + <Option name="silence text" value="0e066cff"/> <Option name="selected crossfade editor line" value="00dbdbff"/> <Option name="selected crossfade editor wave" value="f9ea14a0"/> <Option name="selected region base" value="51518aa0"/> diff --git a/gtk2_ardour/canvas_vars.h b/gtk2_ardour/canvas_vars.h index 79f7404391..a8d7b9cfa3 100644 --- a/gtk2_ardour/canvas_vars.h +++ b/gtk2_ardour/canvas_vars.h @@ -94,6 +94,8 @@ CANVAS_VARIABLE(canvasvar_SelectedWaveFormFill, "selected waveform fill") CANVAS_VARIABLE(canvasvar_SelectedWaveForm, "selected waveform outline") CANVAS_VARIABLE(canvasvar_SelectionRect, "selection rect") CANVAS_VARIABLE(canvasvar_Selection, "selection") +CANVAS_VARIABLE(canvasvar_Silence, "silence") +CANVAS_VARIABLE(canvasvar_SilenceText, "silence text") CANVAS_VARIABLE(canvasvar_StereoPannerOutline, "stereo panner outline") CANVAS_VARIABLE(canvasvar_StereoPannerFill, "stereo panner fill") CANVAS_VARIABLE(canvasvar_StereoPannerText, "stereo panner text") diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index e29bcb130c..4ad205c425 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -4544,16 +4544,16 @@ Editor::strip_region_silence () return; } - std::list<boost::shared_ptr<AudioRegion> > ar; + std::list<RegionView*> audio_only; for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { AudioRegionView* const arv = dynamic_cast<AudioRegionView*> (*i); if (arv) { - ar.push_back (arv->audio_region ()); + audio_only.push_back (arv); } } - StripSilenceDialog d (_session, ar); + StripSilenceDialog d (_session, audio_only); int const r = d.run (); if (r == Gtk::RESPONSE_OK) { diff --git a/gtk2_ardour/region_view.cc b/gtk2_ardour/region_view.cc index a758b5d9bc..76fa158f9d 100644 --- a/gtk2_ardour/region_view.cc +++ b/gtk2_ardour/region_view.cc @@ -34,6 +34,7 @@ #include "ardour_ui.h" #include "global_signals.h" +#include "canvas-noevent-text.h" #include "streamview.h" #include "region_view.h" #include "automation_region_view.h" @@ -45,6 +46,7 @@ #include "region_editor.h" #include "ghostregion.h" #include "route_time_axis.h" +#include "ui_config.h" #include "utils.h" #include "rgb_macros.h" #include "gui_thread.h" @@ -55,6 +57,7 @@ using namespace std; using namespace ARDOUR; using namespace PBD; using namespace Editing; +using namespace Gtk; using namespace ArdourCanvas; static const int32_t sync_mark_width = 9; @@ -80,6 +83,7 @@ RegionView::RegionView (ArdourCanvas::Group* parent, , _pixel_width(1.0) , in_destructor(false) , wait_for_data(false) + , _silence_text (0) , _time_converter(r->session().tempo_map(), r->position()) { GhostRegion::CatchDeletion.connect (*this, invalidator (*this), ui_bind (&RegionView::remove_ghost, this, _1), gui_context()); @@ -88,6 +92,7 @@ RegionView::RegionView (ArdourCanvas::Group* parent, RegionView::RegionView (const RegionView& other) : sigc::trackable(other) , TimeAxisViewItem (other) + , _silence_text (0) , _time_converter(other._time_converter) { /* derived concrete type will call init () */ @@ -103,6 +108,7 @@ RegionView::RegionView (const RegionView& other) RegionView::RegionView (const RegionView& other, boost::shared_ptr<Region> other_region) : sigc::trackable(other) , TimeAxisViewItem (other) + , _silence_text (0) , _time_converter(other._time_converter) { /* this is a pseudo-copy constructor used when dragging regions @@ -137,6 +143,7 @@ RegionView::RegionView (ArdourCanvas::Group* parent, , _pixel_width(1.0) , in_destructor(false) , wait_for_data(false) + , _silence_text (0) , _time_converter(r->session().tempo_map(), r->position()) { } @@ -208,9 +215,102 @@ RegionView::~RegionView () delete *i; } + drop_silent_frames (); + delete editor; } +void +RegionView::set_silent_frames (const AudioIntervalResult& silences) +{ + framecnt_t shortest = max_framecnt; + + /* remove old silent frames */ + drop_silent_frames (); + + if (!silences.empty()) { + uint32_t const color = ARDOUR_UI::config()->canvasvar_Silence.get(); + + for (AudioIntervalResult::const_iterator i = silences.begin(); i != silences.end(); ++i) { + + + ArdourCanvas::SimpleRect* cr = new ArdourCanvas::SimpleRect (*group); + _silent_frames.push_back (cr); + cr->property_x1() = trackview.editor().frame_to_pixel ((*i).first); + cr->property_y1() = 1; + cr->property_y2() = _height - 2; + cr->property_outline_pixels() = 0; + cr->property_fill_color_rgba () = color; + cr->property_x2() = trackview.editor().frame_to_pixel ((*i).first + (*i).second); + + if ((*i).second < shortest) { + shortest= (*i).second; + } + } + + _silence_text = new ArdourCanvas::NoEventText (*group); + _silence_text->property_font_desc() = *(get_font_for_style (N_("VerboseCanvasCusor"))); + _silence_text->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_SilenceText.get(); + _silence_text->property_anchor() = ANCHOR_NW; + + /* both positions are relative to the RV start */ + + _silence_text->property_x() = trackview.editor().frame_to_pixel (silences.front().first) + 10.0; + _silence_text->property_y() = 20.0; + + double ms; + char const * sunits; + + ms = (float) shortest/_region->session().frame_rate(); + + /* ms are now in seconds */ + + if (ms >= 60.0) { + sunits = _("minutes"); + ms /= 60.0; + } else if (ms < 1.0) { + sunits = _("msecs"); + ms *= 1000.0; + } else { + sunits = _("secs"); + } + + + + _silence_text->property_text() = string_compose (_("%1 silent segments, shortest = %2 %3"), + silences.size(), ms, sunits).c_str(); + } +} + +void +RegionView::hide_silent_frames () +{ + for (list<ArdourCanvas::SimpleRect*>::iterator i = _silent_frames.begin (); i != _silent_frames.end (); ++i) { + (*i)->hide (); + } + _silence_text->hide(); +} + +void +RegionView::drop_silent_frames () +{ + for (list<ArdourCanvas::SimpleRect*>::iterator i = _silent_frames.begin (); i != _silent_frames.end (); ++i) { + delete *i; + } + _silent_frames.clear (); + delete _silence_text; + _silence_text = 0; +} + +void +RegionView::show_silent_frames () +{ + for (list<ArdourCanvas::SimpleRect*>::iterator i = _silent_frames.begin (); i != _silent_frames.end (); ++i) { + (*i)->show (); + } + _silence_text->show (); +} + gint RegionView::_lock_toggle (ArdourCanvas::Item*, GdkEvent* ev, void* arg) { @@ -607,6 +707,11 @@ RegionView::set_height (double h) for (list<ArdourCanvas::SimpleRect*>::iterator i = _coverage_frames.begin(); i != _coverage_frames.end(); ++i) { (*i)->property_y2() = h + 1; } + + for (list<ArdourCanvas::SimpleRect*>::iterator i = _silent_frames.begin(); i != _silent_frames.end(); ++i) { + (*i)->property_y2() = h + 1; + } + } /** Remove old coverage frames and make new ones, if we're in a LayerDisplay mode diff --git a/gtk2_ardour/region_view.h b/gtk2_ardour/region_view.h index d9e6f1292b..c291d60cf6 100644 --- a/gtk2_ardour/region_view.h +++ b/gtk2_ardour/region_view.h @@ -38,6 +38,10 @@ class GhostRegion; class AutomationTimeAxisView; class AutomationRegionView; +namespace Gnome { namespace Canvas { + class NoEventText; +} } + class RegionView : public TimeAxisViewItem { public: @@ -108,6 +112,11 @@ class RegionView : public TimeAxisViewItem void trim_contents (framepos_t, bool, bool); virtual void thaw_after_trim (); + void set_silent_frames (const ARDOUR::AudioIntervalResult&); + void drop_silent_frames (); + void hide_silent_frames (); + void show_silent_frames (); + protected: /** Allows derived types to specify their visibility requirements @@ -164,6 +173,15 @@ class RegionView : public TimeAxisViewItem */ std::list<ArdourCanvas::SimpleRect*> _coverage_frames; + /** a list of rectangles which are used in stacked display mode to colour + different bits of regions according to whether or not they are the one + that will be played at any given time. + */ + std::list<ArdourCanvas::SimpleRect*> _silent_frames; + /** a text item to display strip silence statistics + */ + ArdourCanvas::NoEventText* _silence_text; + ARDOUR::BeatsFramesConverter _time_converter; }; diff --git a/gtk2_ardour/strip_silence_dialog.cc b/gtk2_ardour/strip_silence_dialog.cc index 9103f72cba..da01387ffd 100644 --- a/gtk2_ardour/strip_silence_dialog.cc +++ b/gtk2_ardour/strip_silence_dialog.cc @@ -32,6 +32,7 @@ #include "gui_thread.h" #include "strip_silence_dialog.h" #include "canvas_impl.h" +#include "region_view.h" #include "simpleline.h" #include "waveview.h" #include "simplerect.h" @@ -44,18 +45,20 @@ using namespace std; using namespace ArdourCanvas; /** Construct Strip silence dialog box */ -StripSilenceDialog::StripSilenceDialog (Session* s, list<boost::shared_ptr<ARDOUR::AudioRegion> > const & regions) +StripSilenceDialog::StripSilenceDialog (Session* s, list<RegionView*> const & v) : 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) - , _wave_height (64) , _peaks_ready_connection (0) , _destroying (false) { set_session (s); + for (list<RegionView*>::const_iterator r = v.begin(); r != v.end(); ++r) { + views.push_back (ViewInterval (*r)); + } + Gtk::HBox* hbox = Gtk::manage (new Gtk::HBox); Gtk::Table* table = Gtk::manage (new Gtk::Table (3, 3)); @@ -121,17 +124,6 @@ StripSilenceDialog::StripSilenceDialog (Session* s, list<boost::shared_ptr<ARDOU add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); add_button (Gtk::Stock::APPLY, Gtk::RESPONSE_OK); - _canvas = new CanvasAA (); - _canvas->signal_size_allocate().connect (sigc::mem_fun (*this, &StripSilenceDialog::canvas_allocation)); - _canvas->set_size_request (_wave_width, _wave_height * regions.size()); - - for (list<boost::shared_ptr<ARDOUR::AudioRegion> >::const_iterator i = regions.begin(); i != regions.end(); ++i) { - Wave* w = new Wave (_canvas->root(), *i); - _waves.push_back (w); - } - - get_vbox()->pack_start (*_canvas, true, true); - get_vbox()->pack_start (_progress_bar, true, true); show_all (); @@ -139,7 +131,6 @@ StripSilenceDialog::StripSilenceDialog (Session* s, list<boost::shared_ptr<ARDOU _threshold.get_adjustment()->signal_value_changed().connect (sigc::mem_fun (*this, &StripSilenceDialog::threshold_changed)); _minimum_length.ValueChanged.connect (sigc::mem_fun (*this, &StripSilenceDialog::restart_thread)); - create_waves (); update_silence_rects (); update_threshold_line (); @@ -164,110 +155,17 @@ StripSilenceDialog::~StripSilenceDialog () _run_cond.signal (); pthread_join (_thread, 0); - for (list<Wave*>::iterator i = _waves.begin(); i != _waves.end(); ++i) { - delete *i; - } - - _waves.clear (); + for (list<ViewInterval>::iterator v = views.begin(); v != views.end(); ++v) { + (*v).view->drop_silent_frames (); + } delete _peaks_ready_connection; - delete _canvas; -} - -void -StripSilenceDialog::create_waves () -{ - int n = 0; - - delete _peaks_ready_connection; - _peaks_ready_connection = 0; - - for (list<Wave*>::iterator i = _waves.begin(); i != _waves.end(); ++i) { - if ((*i)->region->audio_source(0)->peaks_ready (boost::bind (&StripSilenceDialog::peaks_ready, this), &_peaks_ready_connection, gui_context())) { - (*i)->view = new WaveView (*(_canvas->root())); - (*i)->view->property_data_src() = static_cast<gpointer>((*i)->region.get()); - (*i)->view->property_cache() = WaveView::create_cache (); - (*i)->view->property_cache_updater() = true; - (*i)->view->property_channel() = 0; - (*i)->view->property_length_function() = (void *) region_length_from_c; - (*i)->view->property_sourcefile_length_function() = (void *) sourcefile_length_from_c; - (*i)->view->property_peak_function() = (void *) region_read_peaks_from_c; - (*i)->view->property_x() = 0; - (*i)->view->property_y() = n * _wave_height; - (*i)->view->property_height() = _wave_height; - (*i)->view->property_samples_per_unit() = (*i)->samples_per_unit; - (*i)->view->property_region_start() = (*i)->region->start(); - (*i)->view->property_wave_color() = ARDOUR_UI::config()->canvasvar_WaveForm.get(); - (*i)->view->property_fill_color() = ARDOUR_UI::config()->canvasvar_WaveFormFill.get(); - (*i)->view->property_logscaled() = true; - (*i)->view->property_rectified() = true; - } - - ++n; - } -} - -void -StripSilenceDialog::peaks_ready () -{ - delete _peaks_ready_connection; - _peaks_ready_connection = 0; - create_waves (); -} - -void -StripSilenceDialog::canvas_allocation (Gtk::Allocation& alloc) -{ - int n = 0; - - _canvas->set_scroll_region (0.0, 0.0, alloc.get_width(), alloc.get_height()); - _wave_width = alloc.get_width (); - _wave_height = alloc.get_height (); - - for (list<Wave*>::iterator i = _waves.begin(); i != _waves.end(); ++i, ++n) { - (*i)->samples_per_unit = ((double) (*i)->region->length() / _wave_width); - - if ((*i)->view) { - (*i)->view->property_y() = n * _wave_height; - (*i)->view->property_samples_per_unit() = (*i)->samples_per_unit; - (*i)->view->property_height() = _wave_height; - } - } - - resize_silence_rects (); - update_threshold_line (); -} - -void -StripSilenceDialog::resize_silence_rects () -{ - int n = 0; - - /* Lock so that we don't contend with the detection thread for access to the silence regions */ - Glib::Mutex::Lock lm (_lock); - - for (list<Wave*>::iterator i = _waves.begin(); i != _waves.end(); ++i) { - - list<pair<frameoffset_t, framecnt_t> >::const_iterator j; - list<SimpleRect*>::iterator r; - - for (j = (*i)->silence.begin(), r = (*i)->silence_rects.begin(); - j != (*i)->silence.end() && r != (*i)->silence_rects.end(); ++j, ++r) { - (*r)->property_x1() = j->first / (*i)->samples_per_unit; - (*r)->property_x2() = j->second / (*i)->samples_per_unit; - (*r)->property_y1() = n * _wave_height; - (*r)->property_y2() = (n + 1) * _wave_height; - (*r)->property_outline_pixels() = 0; - (*r)->property_fill_color_rgba() = RGBA_TO_UINT (128, 128, 128, 128); - } - - ++n; - } } void StripSilenceDialog::update_threshold_line () { +#if 0 int n = 0; /* Don't need to lock here as we're not reading the _waves silence details */ @@ -283,52 +181,37 @@ StripSilenceDialog::update_threshold_line () } ++n; +#endif } void StripSilenceDialog::update () { - update_silence_rects (); + cerr << "UPDATE!\n"; update_threshold_line (); /* XXX: first one only?! */ - update_stats (_waves.front()->silence); + // update_stats (_waves.front()->silence); + + update_silence_rects (); + cerr << "UPDATE done\n"; } void StripSilenceDialog::update_silence_rects () { - int n = 0; uint32_t max_segments = 0; - uint32_t sc; /* Lock so that we don't contend with the detection thread for access to the silence regions */ Glib::Mutex::Lock lm (_lock); - - for (list<Wave*>::iterator i = _waves.begin(); i != _waves.end(); ++i) { - for (list<SimpleRect*>::iterator j = (*i)->silence_rects.begin(); j != (*i)->silence_rects.end(); ++j) { - delete *j; - } - - (*i)->silence_rects.clear (); - sc = 0; - - for (list<pair<frameoffset_t, framecnt_t> >::const_iterator j = (*i)->silence.begin(); j != (*i)->silence.end(); ++j) { - - SimpleRect* r = new SimpleRect (*(_canvas->root())); - r->property_x1() = j->first / (*i)->samples_per_unit; - r->property_x2() = j->second / (*i)->samples_per_unit; - r->property_y1() = n * _wave_height; - r->property_y2() = (n + 1) * _wave_height; - r->property_outline_pixels() = 0; - r->property_fill_color_rgba() = RGBA_TO_UINT (128, 128, 128, 128); - (*i)->silence_rects.push_back (r); - sc++; - } - - max_segments = max (max_segments, sc); - ++n; + + for (list<ViewInterval>::iterator v = views.begin(); v != views.end(); ++v) { + (*v).view->set_silent_frames ((*v).intervals); + max_segments = max (max_segments, (uint32_t) (*v).intervals.size()); } +#if 0 + cerr << "minaudible in update " << min_audible << " minsilence = " << min_silence << endl; + if (min_audible > 0) { float ms, ma; char const * aunits; @@ -337,14 +220,22 @@ StripSilenceDialog::update_silence_rects () ma = (float) min_audible/_session->frame_rate(); ms = (float) min_silence/_session->frame_rate(); - if (min_audible < _session->frame_rate()) { - aunits = _("ms"); + /* ma and ms are now in seconds */ + + if (ma >= 60.0) { + aunits = _("minutes"); + //ma /= 60.0; + } else if (min_audible < _session->frame_rate()) { + aunits = _("msecs"); ma *= 1000.0; } else { - aunits = _("s"); + aunits = _("seconds"); } - if (min_silence < _session->frame_rate()) { + if (ms >= 60.0) { + sunits = _("minutes"); + //ms /= 60.0; + } else if (min_silence < _session->frame_rate()) { sunits = _("ms"); ms *= 1000.0; } else { @@ -364,6 +255,7 @@ StripSilenceDialog::update_silence_rects () _shortest_silence_label.set_text (""); _shortest_audible_label.set_text (""); } +#endif } void * @@ -383,8 +275,13 @@ StripSilenceDialog::detection_thread_work () _lock.lock (); while (1) { - for (list<Wave*>::iterator i = _waves.begin(); i != _waves.end(); ++i) { - (*i)->silence = (*i)->region->find_silence (dB_to_coefficient (threshold ()), minimum_length (), _interthread_info); + for (list<ViewInterval>::iterator i = views.begin(); i != views.end(); ++i) { + boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> ((*i).view->region()); + + if (ar) { + (*i).intervals = ar->find_silence (dB_to_coefficient (threshold ()), minimum_length (), _interthread_info); + } + if (_interthread_info.cancel) { break; } @@ -441,7 +338,7 @@ StripSilenceDialog::threshold_changed () } void -StripSilenceDialog::update_stats (const SilenceResult& res) +StripSilenceDialog::update_stats (const AudioIntervalResult& res) { if (res.empty()) { return; @@ -452,7 +349,9 @@ StripSilenceDialog::update_stats (const SilenceResult& res) max_audible = 0; min_audible = max_framepos; - SilenceResult::const_iterator cur; + AudioIntervalResult::const_iterator cur; + bool saw_silence = false; + bool saw_audible = false; cur = res.begin(); @@ -477,10 +376,14 @@ StripSilenceDialog::update_stats (const SilenceResult& res) interval_duration = end - start; if (in_silence) { + saw_silence = true; + cerr << "Silent duration: " << interval_duration << endl; max_silence = max (max_silence, interval_duration); min_silence = min (min_silence, interval_duration); } else { + saw_audible = true; + cerr << "Audible duration: " << interval_duration << endl; max_audible = max (max_audible, interval_duration); min_audible = min (min_audible, interval_duration); @@ -491,36 +394,32 @@ StripSilenceDialog::update_stats (const SilenceResult& res) end = cur->first; in_silence = !in_silence; } + + if (!saw_silence) { + min_silence = 0; + max_silence = 0; + } + + if (!saw_audible) { + min_audible = 0; + max_audible = 0; + } + + cerr << "max aud: " << max_audible << " min aud: " << min_audible << " max sil: " << max_silence << " min sil: " << min_silence << endl; } framecnt_t StripSilenceDialog::minimum_length () const { - return _minimum_length.current_duration (_waves.front()->region->position()); + return _minimum_length.current_duration (views.front().view->region()->position()); } framecnt_t StripSilenceDialog::fade_length () const { - return _minimum_length.current_duration (_waves.front()->region->position()); + return _minimum_length.current_duration (views.front().view->region()->position()); } -StripSilenceDialog::Wave::Wave (Group* g, boost::shared_ptr<AudioRegion> r) - : region (r), view (0), samples_per_unit (1) -{ - threshold_line = new ArdourCanvas::SimpleLine (*g); - threshold_line->property_color_rgba() = RGBA_TO_UINT (0, 0, 0, 128); -} - -StripSilenceDialog::Wave::~Wave () -{ - delete view; - delete threshold_line; - for (list<SimpleRect*>::iterator i = silence_rects.begin(); i != silence_rects.end(); ++i) { - delete *i; - } -} - void StripSilenceDialog::update_progress_gui (float p) { diff --git a/gtk2_ardour/strip_silence_dialog.h b/gtk2_ardour/strip_silence_dialog.h index 625e9b65fd..62e58e7db5 100644 --- a/gtk2_ardour/strip_silence_dialog.h +++ b/gtk2_ardour/strip_silence_dialog.h @@ -26,15 +26,16 @@ #include "progress_reporter.h" namespace ARDOUR { - class AudioRegion; class Session; } +class RegionView; + /// Dialog box to set options for the `strip silence' filter class StripSilenceDialog : public ArdourDialog, public ProgressReporter { public: - StripSilenceDialog (ARDOUR::Session*, std::list<boost::shared_ptr<ARDOUR::AudioRegion> > const &); + StripSilenceDialog (ARDOUR::Session*, std::list<RegionView*> const &); ~StripSilenceDialog (); double threshold () const { @@ -45,8 +46,6 @@ public: ARDOUR::framecnt_t fade_length () const; private: - typedef std::list<std::pair<ARDOUR::frameoffset_t,ARDOUR::framecnt_t> > SilenceResult; - void create_waves (); void peaks_ready (); void canvas_allocation (Gtk::Allocation &); @@ -54,7 +53,7 @@ private: void resize_silence_rects (); void update (); void update_threshold_line (); - void update_stats (SilenceResult const &); + void update_stats (ARDOUR::AudioIntervalResult const &); void threshold_changed (); void update_progress_gui (float); void restart_thread (); @@ -67,22 +66,14 @@ private: Gtk::Label _shortest_audible_label; Gtk::ProgressBar _progress_bar; - struct Wave { - boost::shared_ptr<ARDOUR::AudioRegion> region; - ArdourCanvas::WaveView* view; - std::list<ArdourCanvas::SimpleRect*> silence_rects; - ArdourCanvas::SimpleLine* threshold_line; - double samples_per_unit; - SilenceResult silence; - - Wave (ArdourCanvas::Group *, boost::shared_ptr<ARDOUR::AudioRegion>); - ~Wave (); - }; - - ArdourCanvas::Canvas* _canvas; - std::list<Wave*> _waves; - int _wave_width; - int _wave_height; + struct ViewInterval { + RegionView* view; + ARDOUR::AudioIntervalResult intervals; + + ViewInterval (RegionView* rv) : view (rv) {} + }; + + std::list<ViewInterval> views; ARDOUR::framecnt_t max_audible; ARDOUR::framecnt_t min_audible; |