From f4f9d76e533b277ab7d84edbdee8096698ac711d Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sun, 14 Feb 2021 00:53:28 +0100 Subject: [PATCH] Option to how x-run markers in regions --- gtk2_ardour/audio_region_view.cc | 5 +-- gtk2_ardour/midi_region_view.cc | 3 +- gtk2_ardour/rc_option_editor.cc | 8 ++++ gtk2_ardour/region_view.cc | 75 +++++++++++++++++++++++++++++++- gtk2_ardour/region_view.h | 6 +++ gtk2_ardour/ui_config_vars.h | 1 + 6 files changed, 90 insertions(+), 8 deletions(-) diff --git a/gtk2_ardour/audio_region_view.cc b/gtk2_ardour/audio_region_view.cc index 31e7a9bcb5..271e28d280 100644 --- a/gtk2_ardour/audio_region_view.cc +++ b/gtk2_ardour/audio_region_view.cc @@ -131,7 +131,6 @@ AudioRegionView::AudioRegionView (ArdourCanvas::Container *parent, RouteTimeAxis , trim_fade_in_drag_active(false) , trim_fade_out_drag_active(false) { - UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &AudioRegionView::parameter_changed)); } AudioRegionView::AudioRegionView (ArdourCanvas::Container *parent, RouteTimeAxisView &tv, boost::shared_ptr r, double spu, @@ -153,7 +152,6 @@ AudioRegionView::AudioRegionView (ArdourCanvas::Container *parent, RouteTimeAxis , trim_fade_in_drag_active(false) , trim_fade_out_drag_active(false) { - UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &AudioRegionView::parameter_changed)); } AudioRegionView::AudioRegionView (const AudioRegionView& other, boost::shared_ptr other_region) @@ -174,8 +172,6 @@ AudioRegionView::AudioRegionView (const AudioRegionView& other, boost::shared_pt , trim_fade_out_drag_active(false) { init (true); - - UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &AudioRegionView::parameter_changed)); } void @@ -1826,6 +1822,7 @@ AudioRegionView::drag_end () void AudioRegionView::parameter_changed (string const & p) { + RegionView::parameter_changed (p); if (p == "show-waveforms") { setup_waveform_visibility (); } diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 022885d0e5..73abdbaa64 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -142,7 +142,6 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Container* parent, PublicEditor::DropDownKeys.connect (sigc::mem_fun (*this, &MidiRegionView::drop_down_keys)); Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&MidiRegionView::parameter_changed, this, _1), gui_context()); - UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &MidiRegionView::parameter_changed)); connect_to_diskstream (); } @@ -195,6 +194,7 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Container* parent, void MidiRegionView::parameter_changed (std::string const & p) { + RegionView::parameter_changed (p); if (p == "display-first-midi-bank-as-zero") { if (_enable_display) { redisplay_model(); @@ -319,7 +319,6 @@ MidiRegionView::init (bool wfd) gui_context ()); Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&MidiRegionView::parameter_changed, this, _1), gui_context()); - UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &MidiRegionView::parameter_changed)); connect_to_diskstream (); } diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index eda7b7d6ee..0bb5714d5d 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -2573,6 +2573,14 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_region_gain) )); + add_option (_("Editor"), + new BoolOption ( + "show-region-xrun-markers", + _("Show xrun markers in regions"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_region_xrun_markers), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_region_xrun_markers) + )); + add_option (_("Editor"), new OptionEditorHeading (_("Editor Behavior"))); add_option (_("Editor"), diff --git a/gtk2_ardour/region_view.cc b/gtk2_ardour/region_view.cc index 351ce43b64..10752a0650 100644 --- a/gtk2_ardour/region_view.cc +++ b/gtk2_ardour/region_view.cc @@ -36,6 +36,7 @@ #include "gtkmm2ext/colors.h" +#include "canvas/arrow.h" #include "canvas/polygon.h" #include "canvas/debug.h" #include "canvas/pixbuf.h" @@ -90,14 +91,18 @@ RegionView::RegionView (ArdourCanvas::Container* parent, , in_destructor(false) , wait_for_data(false) , _silence_text (0) + , _xrun_markers_visible (false) { + UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &RegionView::parameter_changed)); } RegionView::RegionView (const RegionView& other) : sigc::trackable(other) , TimeAxisViewItem (other) , _silence_text (0) + , _xrun_markers_visible (false) { + UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &RegionView::parameter_changed)); /* derived concrete type will call init () */ _region = other._region; @@ -110,7 +115,10 @@ RegionView::RegionView (const RegionView& other, boost::shared_ptr other : sigc::trackable(other) , TimeAxisViewItem (other) , _silence_text (0) + , _xrun_markers_visible (false) { + UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &RegionView::parameter_changed)); + /* derived concrete type will call init () */ /* this is a pseudo-copy constructor used when dragging regions around on the canvas. */ @@ -143,6 +151,7 @@ RegionView::RegionView (ArdourCanvas::Container* parent, , wait_for_data(false) , _silence_text (0) { + UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &RegionView::parameter_changed)); } void @@ -181,6 +190,26 @@ RegionView::init (bool wfd) name_text->Event.connect (sigc::bind (sigc::mem_fun (PublicEditor::instance(), &PublicEditor::canvas_region_view_name_event), name_text, this)); } + XrunPositions xrp; + _region->captured_xruns (xrp, true); + int arrow_size = (int)(7.0 * UIConfiguration::instance ().get_ui_scale ()) & ~1; + for (XrunPositions::const_iterator x = xrp.begin (); x != xrp.end (); ++x) { + ArdourCanvas::Arrow* canvas_item = new ArdourCanvas::Arrow(group); + canvas_item->set_color (UIConfiguration::instance().color ("neutral:background")); + canvas_item->set_show_head (1, true); + canvas_item->set_show_head (0, false); + canvas_item->set_head_width (1, arrow_size); + canvas_item->set_head_height (1, arrow_size); + canvas_item->set_y0 (arrow_size); + canvas_item->set_y1 (arrow_size); + canvas_item->raise_to_top (); + canvas_item->hide (); + _xrun_markers.push_back (make_pair(*x, canvas_item)); + } + + _xrun_markers_visible = false; + update_xrun_markers (); + if (wfd) { _enable_display = true; } @@ -209,6 +238,10 @@ RegionView::~RegionView () delete *i; } + for (list >::iterator i = _xrun_markers.begin(); i != _xrun_markers.end(); ++i) { + delete ((*i).second); + } + drop_silent_frames (); delete editor; @@ -421,10 +454,10 @@ RegionView::region_resized (const PropertyChange& what_changed) unit_length = _region->length() / samples_per_pixel; for (vector::iterator i = ghosts.begin(); i != ghosts.end(); ++i) { - (*i)->set_duration (unit_length); - } + + update_xrun_markers (); } } @@ -433,6 +466,36 @@ RegionView::reset_width_dependent_items (double pixel_width) { TimeAxisViewItem::reset_width_dependent_items (pixel_width); _pixel_width = pixel_width; + + if (_xrun_markers_visible) { + const samplepos_t start = _region->start(); + for (list >::iterator i = _xrun_markers.begin(); i != _xrun_markers.end(); ++i) { + float x_pos = trackview.editor().sample_to_pixel (i->first - start); + i->second->set_x (x_pos); + } + } +} + +void +RegionView::update_xrun_markers () +{ + const bool show_xruns_markers = UIConfiguration::instance().get_show_region_xrun_markers(); + if (_xrun_markers_visible == show_xruns_markers && !_xrun_markers_visible) { + return; + } + + const samplepos_t start = _region->start(); + const samplepos_t length = _region->length(); + for (list >::iterator i = _xrun_markers.begin(); i != _xrun_markers.end(); ++i) { + float x_pos = trackview.editor().sample_to_pixel (i->first - start); + i->second->set_x (x_pos); + if (show_xruns_markers && (i->first >= start && i->first < start + length)) { + i->second->show (); + } else { + i->second->hide (); + } + } + _xrun_markers_visible = show_xruns_markers; } void @@ -517,6 +580,14 @@ RegionView::set_colors () set_sync_mark_color (); } +void +RegionView::parameter_changed (std::string const& p) +{ + if (p == "show-region-xrun-markers") { + update_xrun_markers (); + } +} + void RegionView::set_sync_mark_color () { diff --git a/gtk2_ardour/region_view.h b/gtk2_ardour/region_view.h index 0a034be23d..bc5f5eb270 100644 --- a/gtk2_ardour/region_view.h +++ b/gtk2_ardour/region_view.h @@ -164,6 +164,7 @@ protected: virtual void reset_width_dependent_items (double pixel_width); virtual void color_handler () {} + virtual void parameter_changed (std::string const&); boost::shared_ptr _region; @@ -198,6 +199,11 @@ protected: std::list _silent_threshold_samples; /** a text item to display strip silence statistics */ ArdourCanvas::Text* _silence_text; + +private: + void update_xrun_markers (); + std::list > _xrun_markers; + bool _xrun_markers_visible; }; #endif /* __gtk_ardour_region_view_h__ */ diff --git a/gtk2_ardour/ui_config_vars.h b/gtk2_ardour/ui_config_vars.h index 94a1e67c9b..da3a42c8fc 100644 --- a/gtk2_ardour/ui_config_vars.h +++ b/gtk2_ardour/ui_config_vars.h @@ -70,6 +70,7 @@ UI_CONFIG_VARIABLE (bool, use_tooltips, "use-tooltips", true) UI_CONFIG_VARIABLE (std::string, mixer_strip_visibility, "mixer-element-visibility", "Input,PhaseInvert,RecMon,SoloIsoLock,Output,Comments") UI_CONFIG_VARIABLE (bool, allow_non_quarter_pulse, "allow-non-quarter-pulse", false) UI_CONFIG_VARIABLE (bool, show_region_gain, "show-region-gain", false) +UI_CONFIG_VARIABLE (bool, show_region_xrun_markers, "show-region-xrun-markers", false) UI_CONFIG_VARIABLE (bool, show_name_highlight, "show-name-highlight", false) UI_CONFIG_VARIABLE (ARDOUR::ClockDeltaMode, primary_clock_delta_mode, "primary-clock-delta-mode", NoDelta) UI_CONFIG_VARIABLE (ARDOUR::ClockDeltaMode, secondary_clock_delta_mode, "secondary-clock-delta-mode", NoDelta)