From 2c7cb9065f6303c64baf4eb5dbb64db56a587d40 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 8 May 2017 12:37:17 +0200 Subject: Limit clock displays to 30days (720hours) by default. This prevents various edge-cases of selection-clocks (eg. unbound range selection after start-range; and makes it near impossible to roll-over 2^63 using GUI operations) --- gtk2_ardour/audio_clock.cc | 53 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 6 deletions(-) (limited to 'gtk2_ardour/audio_clock.cc') diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc index 3053dd9a87..4027890133 100644 --- a/gtk2_ardour/audio_clock.cc +++ b/gtk2_ardour/audio_clock.cc @@ -77,6 +77,7 @@ AudioClock::AudioClock (const string& clock_name, bool transient, const string& , _edit_by_click_field (false) , _negative_allowed (false) , edit_is_negative (false) + , _limit_pos (INT64_MAX - 1) , _with_info (with_info) , editing_attr (0) , foreground_attr (0) @@ -819,6 +820,12 @@ AudioClock::set (framepos_t when, bool force, framecnt_t offset) when = when - offset; } + if (when > _limit_pos) { + when = _limit_pos; + } else if (when < -_limit_pos) { + when = -_limit_pos; + } + if (when == last_when && !force) { #if 0 // XXX return if no change and no change forced. verify Aug/2014 if (_mode != Timecode && _mode != MinSec) { @@ -943,6 +950,24 @@ AudioClock::set_slave_info () } } +void +AudioClock::set_out_of_bounds (bool negative) +{ + if (is_duration) { + if (negative) { + _layout->set_text (" >>> -- <<< "); + } else { + _layout->set_text (" >>> ++ <<< "); + } + } else { + if (negative) { + _layout->set_text (" <<<<<<<<<< "); + } else { + _layout->set_text (" >>>>>>>>>> "); + } + } +} + void AudioClock::set_frames (framepos_t when, bool /*force*/) { @@ -961,14 +986,16 @@ AudioClock::set_frames (framepos_t when, bool /*force*/) negative = true; } - if (negative) { + if (when >= _limit_pos) { + set_out_of_bounds (negative); + } else if (negative) { snprintf (buf, sizeof (buf), "-%10" PRId64, when); + _layout->set_text (buf); } else { snprintf (buf, sizeof (buf), " %10" PRId64, when); + _layout->set_text (buf); } - _layout->set_text (buf); - if (_with_info) { framecnt_t rate = _session->frame_rate(); @@ -1038,9 +1065,13 @@ AudioClock::set_minsec (framepos_t when, bool /*force*/) return; } - print_minsec (when, buf, sizeof (buf), _session->frame_rate()); + if (when >= _limit_pos || when <= -_limit_pos) { + set_out_of_bounds (when < 0); + } else { + print_minsec (when, buf, sizeof (buf), _session->frame_rate()); + _layout->set_text (buf); + } - _layout->set_text (buf); set_slave_info(); } @@ -1061,6 +1092,11 @@ AudioClock::set_timecode (framepos_t when, bool /*force*/) when = -when; negative = true; } + if (when >= _limit_pos) { + set_out_of_bounds (negative); + set_slave_info(); + return; + } if (is_duration) { _session->timecode_duration (when, TC); @@ -1082,7 +1118,7 @@ AudioClock::set_bbt (framepos_t when, framecnt_t offset, bool /*force*/) Timecode::BBT_Time BBT; bool negative = false; - if (_off) { + if (_off || when >= _limit_pos || when < -_limit_pos) { _layout->set_text (" ---|--|----"); _left_btn.set_text ("", true); _right_btn.set_text ("", true); @@ -1187,6 +1223,11 @@ AudioClock::set_session (Session *s) if (_session) { + int64_t limit_sec = UIConfiguration::instance().get_clock_display_limit (); + if (limit_sec > 0) { + _limit_pos = (framecnt_t) floor (limit_sec * _session->frame_rate()); + } + Config->ParameterChanged.connect (_session_connections, invalidator (*this), boost::bind (&AudioClock::session_configuration_changed, this, _1), gui_context()); _session->config.ParameterChanged.connect (_session_connections, invalidator (*this), boost::bind (&AudioClock::session_configuration_changed, this, _1), gui_context()); _session->tempo_map().PropertyChanged.connect (_session_connections, invalidator (*this), boost::bind (&AudioClock::session_property_changed, this, _1), gui_context()); -- cgit v1.2.3