implement and adopt new conventions for AudioClock use

The class now has two separate methods for setting a duration or a point
value. They MUST be used appropriately, because their behavior is different.

When ::set_duration() is used in timecode mode, an extent (inclusive-end
length) is shown rather than a length.

Some objects, such as the TimeInfoBox, now deliberately shown an inclusive end
for their "end" clock, but this not universally followed, pending more feedback
from users and investigating of conventions in other DAWs.
This commit is contained in:
Paul Davis 2022-10-07 16:12:27 -06:00
parent 1ce17c1903
commit 45e21de209
22 changed files with 189 additions and 199 deletions

View File

@ -366,8 +366,8 @@ ARDOUR_UI::setup_transport ()
set_size_request_to_display_given_text (io_latency_value, "1000 spl", 0, 0); set_size_request_to_display_given_text (io_latency_value, "1000 spl", 0, 0);
/* connect signals */ /* connect signals */
ARDOUR_UI::Clock.connect (sigc::bind (sigc::mem_fun (primary_clock, &MainClock::set), false, timecnt_t::zero (Temporal::AudioTime))); ARDOUR_UI::Clock.connect (sigc::bind (sigc::mem_fun (primary_clock, &MainClock::set), false));
ARDOUR_UI::Clock.connect (sigc::bind (sigc::mem_fun (secondary_clock, &MainClock::set), false, timecnt_t::zero (Temporal::AudioTime))); ARDOUR_UI::Clock.connect (sigc::bind (sigc::mem_fun (secondary_clock, &MainClock::set), false));
primary_clock->ValueChanged.connect (sigc::mem_fun(*this, &ARDOUR_UI::primary_clock_value_changed)); primary_clock->ValueChanged.connect (sigc::mem_fun(*this, &ARDOUR_UI::primary_clock_value_changed));
secondary_clock->ValueChanged.connect (sigc::mem_fun(*this, &ARDOUR_UI::secondary_clock_value_changed)); secondary_clock->ValueChanged.connect (sigc::mem_fun(*this, &ARDOUR_UI::secondary_clock_value_changed));

View File

@ -185,12 +185,12 @@ ARDOUR_UI::update_transport_clocks (samplepos_t p)
primary_clock->set (pos); primary_clock->set (pos);
break; break;
case DeltaEditPoint: case DeltaEditPoint:
primary_clock->set (pos, false, timecnt_t (editor->get_preferred_edit_position (EDIT_IGNORE_PHEAD))); primary_clock->set_duration (pos.distance (editor->get_preferred_edit_position (EDIT_IGNORE_PHEAD)), false);
break; break;
case DeltaOriginMarker: case DeltaOriginMarker:
{ {
Location* loc = _session->locations()->clock_origin_location (); Location* loc = _session->locations()->clock_origin_location ();
primary_clock->set (pos, false, timecnt_t (loc ? loc->start_sample() : 0)); primary_clock->set_duration (pos.distance (loc->start()));
} }
break; break;
} }
@ -200,12 +200,12 @@ ARDOUR_UI::update_transport_clocks (samplepos_t p)
secondary_clock->set (pos); secondary_clock->set (pos);
break; break;
case DeltaEditPoint: case DeltaEditPoint:
secondary_clock->set (pos, false, timecnt_t (editor->get_preferred_edit_position (EDIT_IGNORE_PHEAD))); secondary_clock->set_duration (pos.distance (editor->get_preferred_edit_position (EDIT_IGNORE_PHEAD)), false);
break; break;
case DeltaOriginMarker: case DeltaOriginMarker:
{ {
Location* loc = _session->locations()->clock_origin_location (); Location* loc = _session->locations()->clock_origin_location ();
secondary_clock->set (pos, false, timecnt_t (loc ? loc->start_sample() : 0)); secondary_clock->set_duration (pos.distance (loc->start()));
} }
break; break;
} }

View File

@ -380,21 +380,17 @@ ARDOUR_UI::parameter_changed (std::string p)
if (editor) editor->toggle_meter_updating(); if (editor) editor->toggle_meter_updating();
} else if (p == "primary-clock-delta-mode") { } else if (p == "primary-clock-delta-mode") {
if (UIConfiguration::instance().get_primary_clock_delta_mode() != NoDelta) { if (UIConfiguration::instance().get_primary_clock_delta_mode() != NoDelta) {
primary_clock->set_is_duration (true, timepos_t());
primary_clock->set_editable (false); primary_clock->set_editable (false);
primary_clock->set_widget_name ("transport delta"); primary_clock->set_widget_name ("transport delta");
} else { } else {
primary_clock->set_is_duration (false, timepos_t());
primary_clock->set_editable (true); primary_clock->set_editable (true);
primary_clock->set_widget_name ("transport"); primary_clock->set_widget_name ("transport");
} }
} else if (p == "secondary-clock-delta-mode") { } else if (p == "secondary-clock-delta-mode") {
if (UIConfiguration::instance().get_secondary_clock_delta_mode() != NoDelta) { if (UIConfiguration::instance().get_secondary_clock_delta_mode() != NoDelta) {
secondary_clock->set_is_duration (true, timepos_t());
secondary_clock->set_editable (false); secondary_clock->set_editable (false);
secondary_clock->set_widget_name ("secondary delta"); secondary_clock->set_widget_name ("secondary delta");
} else { } else {
secondary_clock->set_is_duration (false, timepos_t());
secondary_clock->set_editable (true); secondary_clock->set_editable (true);
secondary_clock->set_widget_name ("secondary"); secondary_clock->set_widget_name ("secondary");
} }

View File

@ -101,7 +101,6 @@ AudioClock::AudioClock (const string& clock_name, bool transient, const string&
, corner_radius (4) , corner_radius (4)
, font_size (10240) , font_size (10240)
, editing (false) , editing (false)
, bbt_reference_time (timepos_t::from_superclock (-1)) /* needs to be some negative value but SR may not be available at init */
, last_pdelta (0) , last_pdelta (0)
, last_sdelta (0) , last_sdelta (0)
, dragging (false) , dragging (false)
@ -120,7 +119,7 @@ AudioClock::AudioClock (const string& clock_name, bool transient, const string&
_mode = BBT; /* lie to force mode switch */ _mode = BBT; /* lie to force mode switch */
set_mode (Timecode); set_mode (Timecode);
AudioClock::set (last_when, true); AudioClock::set (last_when(), true);
if (!is_transient) { if (!is_transient) {
clocks.push_back (this); clocks.push_back (this);
@ -523,7 +522,7 @@ AudioClock::end_edit (bool modify)
case BBT: case BBT:
if (is_duration) { if (is_duration) {
pos = sample_duration_from_bbt_string (bbt_reference_time, edit_string); pos = sample_duration_from_bbt_string (last_when(), edit_string);
} else { } else {
pos = samples_from_bbt_string (timepos_t(), edit_string); pos = samples_from_bbt_string (timepos_t(), edit_string);
} }
@ -807,7 +806,7 @@ AudioClock::end_edit_relative (bool add)
void void
AudioClock::tempo_map_changed () AudioClock::tempo_map_changed ()
{ {
AudioClock::set (last_when, true); AudioClock::set (last_when(), true);
} }
void void
@ -819,69 +818,71 @@ AudioClock::session_configuration_changed (std::string p)
} }
if (p == "sync-source" || p == "external-sync") { if (p == "sync-source" || p == "external-sync") {
AudioClock::set (current_time(), true);
return;
}
if (p != "timecode-offset" && p != "timecode-offset-negative") {
return;
}
timepos_t current;
switch (_mode) {
case Timecode:
if (is_duration) { if (is_duration) {
current = timepos_t (current_duration ()); AudioClock::set_duration (current_duration(), true);
} else { } else {
current = current_time (); AudioClock::set (current_time(), true);
}
return;
}
if (p == "timecode-offset" && p == "timecode-offset-negative") {
switch (_mode) {
case Timecode:
if (is_duration) {
AudioClock::set_duration (current_duration(), true);
} else {
AudioClock::set (current_time(), true);
}
break;
default:
break;
} }
AudioClock::set (current, true);
break;
default:
break;
} }
} }
void void
AudioClock::set (timepos_t const & w, bool force, timecnt_t const & offset) AudioClock::set_duration (Temporal::timecnt_t const & dur, bool force)
{ {
timepos_t when (w); is_duration = true;
if ((!force && !get_visible()) || !_session) { if ((!force && !get_visible()) || !_session) {
return; return;
} }
_offset = offset; timepos_t when;
if (is_duration) {
when = when.earlier (offset); /* extent semantics, not length */
timecnt_t d;
/* durations for timecode display should use extent, not length
*
* reminder: length = end - start ; extent = end - start - 1
*
* start + length = end
* start + extent = last_point_inside duration
*/
switch (_mode) {
case Timecode:
d = dur.is_zero() ? dur : dur.decrement_by_domain ();
break;
default:
d = dur;
break;
} }
if (when > _limit_pos) { /* Converting a negative duration to a position throws */
when = _limit_pos;
} else if (when < -_limit_pos) { if (d.is_negative()) {
when = -_limit_pos; when = timepos_t (d);
} else {
when = -timepos_t (-d);
} }
if (when == last_when && !force) { if (when == last_when() && !force) {
#if 0 // XXX return if no change and no change forced. verify Aug/2014
if (_mode != Timecode && _mode != MinSec) {
/* may need to force display of TC source
* time, so don't return early.
*/
/* ^^ Why was that?, delta times?
* Timecode FPS, pull-up/down, etc changes
* trigger a 'session_property_changed' which
* eventually calls set(last_when, true)
*
* re-rendering the clock every 40ms or so just
* because we can is not ideal.
*/
return;
}
#else
return; return;
#endif
} }
bool btn_en = false; bool btn_en = false;
@ -894,7 +895,7 @@ AudioClock::set (timepos_t const & w, bool force, timecnt_t const & offset)
break; break;
case BBT: case BBT:
set_bbt (when, offset, force); set_bbt (dur, force);
btn_en = true; btn_en = true;
break; break;
@ -913,12 +914,61 @@ AudioClock::set (timepos_t const & w, bool force, timecnt_t const & offset)
} }
finish_set (when, btn_en); finish_set (when, btn_en);
last_time = dur;
} }
void void
AudioClock::set_duration (Temporal::timecnt_t const & d, bool force, Temporal::timecnt_t const & offset) AudioClock::set (timepos_t const & w, bool force)
{ {
set (timepos_t (d), force, offset); is_duration = false;
timepos_t when (w);
if ((!force && !get_visible()) || !_session) {
return;
}
if (when > _limit_pos) {
when = _limit_pos;
} else if (when < -_limit_pos) {
when = -_limit_pos;
}
if (when == last_when() && !force) {
return;
}
bool btn_en = false;
if (!editing) {
switch (_mode) {
case Timecode:
set_timecode (when, force);
break;
case BBT:
set_bbt (timecnt_t (when), force);
btn_en = true;
break;
case MinSec:
set_minsec (when, force);
break;
case Seconds:
set_seconds (when, force);
break;
case Samples:
set_samples (when, force);
break;
}
}
finish_set (when, btn_en);
last_time = timecnt_t (last_time.distance(), when);
} }
void void
@ -947,7 +997,6 @@ AudioClock::finish_set (Temporal::timepos_t const & when, bool btn_en)
} }
queue_draw (); queue_draw ();
last_when = when;
} }
void void
@ -1209,49 +1258,44 @@ AudioClock::set_timecode (timepos_t const & w, bool /*force*/)
} }
void void
AudioClock::set_bbt (timepos_t const & w, timecnt_t const & o, bool /*force*/) AudioClock::set_bbt (timecnt_t const & w, bool /*force*/)
{ {
timepos_t when (w); timepos_t pos (w);
timecnt_t offset (o);
char buf[64]; char buf[64];
Temporal::BBT_Time BBT; Temporal::BBT_Time BBT;
bool negative = false; bool negative = false;
if (_off || when >= _limit_pos || when < -_limit_pos) { if (_off || pos >= _limit_pos || pos < -_limit_pos) {
_layout->set_text (" ---|--|----"); _layout->set_text (" ---|--|----");
_left_btn.set_text ("", false); _left_btn.set_text ("", false);
_right_btn.set_text ("", false); _right_btn.set_text ("", false);
return; return;
} }
if (when.is_negative ()) { if (pos.is_negative ()) {
when = -when; pos = -pos;
negative = true; negative = true;
} }
/* handle a common case */ /* handle a common case */
if (is_duration) { if (is_duration) {
if (when.is_zero ()) { if (pos.is_zero ()) {
BBT.bars = 0; BBT.bars = 0;
BBT.beats = 0; BBT.beats = 0;
BBT.ticks = 0; BBT.ticks = 0;
} else { } else {
TempoMap::SharedPtr tmap (TempoMap::use()); TempoMap::SharedPtr tmap (TempoMap::use());
if (offset.is_zero ()) { const int divisions = tmap->meter_at (w.position()).divisions_per_bar();
offset = timecnt_t (bbt_reference_time);
}
const int divisions = tmap->meter_at (timepos_t (offset)).divisions_per_bar();
Temporal::BBT_Time sub_bbt; Temporal::BBT_Time sub_bbt;
if (negative) { if (negative) {
BBT = tmap->bbt_at (timepos_t (tmap->quarters_at (timepos_t (offset)))); BBT = tmap->bbt_at (timepos_t (tmap->quarters_at (w.position())));
sub_bbt = tmap->bbt_at (timepos_t (offset - when)); sub_bbt = tmap->bbt_at (last_when().earlier (w.position()));
} else { } else {
BBT = tmap->bbt_at (timepos_t (tmap->quarters_at (when + offset))); BBT = tmap->bbt_at (timepos_t (tmap->quarters_at (w.end())));
sub_bbt = tmap->bbt_at (timepos_t (offset)); sub_bbt = tmap->bbt_at (w.position());
} }
BBT.bars -= sub_bbt.bars; BBT.bars -= sub_bbt.bars;
@ -1276,7 +1320,7 @@ AudioClock::set_bbt (timepos_t const & w, timecnt_t const & o, bool /*force*/)
} }
} }
} else { } else {
BBT = TempoMap::use()->bbt_at (when); BBT = TempoMap::use()->bbt_at (pos);
} }
if (negative) { if (negative) {
@ -1290,13 +1334,6 @@ AudioClock::set_bbt (timepos_t const & w, timecnt_t const & o, bool /*force*/)
_layout->set_text (buf); _layout->set_text (buf);
if (_with_info) { if (_with_info) {
timepos_t pos;
if (bbt_reference_time.is_negative ()) {
pos = when;
} else {
pos = bbt_reference_time;
}
TempoMetric m (TempoMap::use()->metric_at (pos)); TempoMetric m (TempoMap::use()->metric_at (pos));
@ -1356,7 +1393,7 @@ AudioClock::set_session (Session *s)
} }
} }
AudioClock::set (last_when, true); AudioClock::set (last_when(), true);
} }
} }
@ -1927,7 +1964,7 @@ AudioClock::get_incremental_step (Field field, timepos_t const & pos)
timepos_t timepos_t
AudioClock::current_time () const AudioClock::current_time () const
{ {
return last_when; return last_when();
} }
timecnt_t timecnt_t
@ -1944,7 +1981,7 @@ AudioClock::current_duration (timepos_t pos) const
case MinSec: case MinSec:
case Seconds: case Seconds:
case Samples: case Samples:
ret = timecnt_t (last_when, pos); ret = timecnt_t (last_when(), pos);
break; break;
} }
@ -1954,28 +1991,28 @@ AudioClock::current_duration (timepos_t pos) const
bool bool
AudioClock::bbt_validate_edit (string & str) AudioClock::bbt_validate_edit (string & str)
{ {
AnyTime any; BBT_Time bbt;
if (sscanf (str.c_str(), BBT_SCANF_FORMAT, &any.bbt.bars, &any.bbt.beats, &any.bbt.ticks) != 3) { if (sscanf (str.c_str(), BBT_SCANF_FORMAT, &bbt.bars, &bbt.beats, &bbt.ticks) != 3) {
return false; return false;
} }
if (any.bbt.ticks > Temporal::ticks_per_beat) { if (bbt.ticks > Temporal::ticks_per_beat) {
return false; return false;
} }
if (!is_duration && any.bbt.bars == 0) { if (!is_duration && bbt.bars == 0) {
return false; return false;
} }
if (!is_duration && any.bbt.beats == 0) { if (!is_duration && bbt.beats == 0) {
/* user could not have mean zero beats because for a /* user could not have mean zero beats because for a
* non-duration clock that's impossible. Assume that they * non-duration clock that's impossible. Assume that they
* mis-entered things and meant Bar|1|ticks * mis-entered things and meant Bar|1|ticks
*/ */
char buf[128]; char buf[128];
snprintf (buf, sizeof (buf), "%" PRIu32 "|%" PRIu32 "|%" PRIu32, any.bbt.bars, 1, any.bbt.ticks); snprintf (buf, sizeof (buf), "%" PRIu32 "|%" PRIu32 "|%" PRIu32, bbt.bars, 1, bbt.ticks);
str = buf; str = buf;
} }
@ -2278,7 +2315,7 @@ AudioClock::set_mode (Mode m, bool noemit)
break; break;
} }
AudioClock::set (last_when, true); AudioClock::set (last_when(), true);
if (!is_transient && !noemit) { if (!is_transient && !noemit) {
ModeChanged (); /* EMIT SIGNAL (the static one)*/ ModeChanged (); /* EMIT SIGNAL (the static one)*/
@ -2287,12 +2324,6 @@ AudioClock::set_mode (Mode m, bool noemit)
mode_changed (); /* EMIT SIGNAL (the member one) */ mode_changed (); /* EMIT SIGNAL (the member one) */
} }
void
AudioClock::set_bbt_reference (timepos_t const & pos)
{
bbt_reference_time = pos;
}
void void
AudioClock::on_style_changed (const Glib::RefPtr<Gtk::Style>& old_style) AudioClock::on_style_changed (const Glib::RefPtr<Gtk::Style>& old_style)
{ {
@ -2319,28 +2350,6 @@ AudioClock::set_editable (bool yn)
editable = yn; editable = yn;
} }
void
AudioClock::set_is_duration (bool yn, timepos_t const & p)
{
if (yn == is_duration) {
if (yn) {
/* just reset position */
duration_position = p;
}
return;
}
is_duration = yn;
if (yn) {
duration_position = p;
} else {
duration_position = timepos_t ();
}
set (last_when, true);
}
void void
AudioClock::set_off (bool yn) AudioClock::set_off (bool yn)
{ {
@ -2350,11 +2359,15 @@ AudioClock::set_off (bool yn)
_off = yn; _off = yn;
/* force a redraw. last_when will be preserved, but the clock text will /* force a redraw. last_time will be preserved, but the clock text will
* change * change
*/ */
AudioClock::set (last_when, true); if (is_duration) {
AudioClock::set_duration (last_time, true);
} else {
AudioClock::set (last_when(), true);
}
} }
void void

View File

@ -73,14 +73,14 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
void focus (); void focus ();
virtual void set (Temporal::timepos_t const &, bool force = false, Temporal::timecnt_t const & offset = Temporal::timecnt_t()); /* overriden by MainClock */
void set_duration (Temporal::timecnt_t const &, bool force = false, Temporal::timecnt_t const & offset = Temporal::timecnt_t()); virtual void set (Temporal::timepos_t const &, bool force = false);
void set_duration (Temporal::timecnt_t const &, bool force = false);
void set_from_playhead (); void set_from_playhead ();
void locate (); void locate ();
void set_mode (Mode, bool noemit = false); void set_mode (Mode, bool noemit = false);
void set_bbt_reference (Temporal::timepos_t const &); void set_bbt_reference (Temporal::timepos_t const &);
void set_is_duration (bool, Temporal::timepos_t const &);
void copy_text_to_clipboard () const; void copy_text_to_clipboard () const;
@ -199,8 +199,9 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
std::string pre_edit_string; std::string pre_edit_string;
std::string input_string; std::string input_string;
Temporal::timepos_t bbt_reference_time; Temporal::timecnt_t last_time;
Temporal::timepos_t last_when; Temporal::timepos_t last_when() const { return last_time.position(); }
bool last_pdelta; bool last_pdelta;
bool last_sdelta; bool last_sdelta;
@ -221,7 +222,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
void set_slave_info (); void set_slave_info ();
void set_timecode (Temporal::timepos_t const &, bool); void set_timecode (Temporal::timepos_t const &, bool);
void set_bbt (Temporal::timepos_t const &, Temporal::timecnt_t const &, bool); void set_bbt (Temporal::timecnt_t const &, bool);
void set_minsec (Temporal::timepos_t const &, bool); void set_minsec (Temporal::timepos_t const &, bool);
void set_seconds (Temporal::timepos_t const &, bool); void set_seconds (Temporal::timepos_t const &, bool);
void set_samples (Temporal::timepos_t const &, bool); void set_samples (Temporal::timepos_t const &, bool);

View File

@ -39,7 +39,7 @@ BigClockWindow::BigClockWindow (AudioClock& c)
: ArdourWindow (_("Big Clock")) : ArdourWindow (_("Big Clock"))
, clock (c) , clock (c)
{ {
ARDOUR_UI::Clock.connect (sigc::bind (sigc::mem_fun (clock, &AudioClock::set), false, Temporal::timecnt_t())); ARDOUR_UI::Clock.connect (sigc::bind (sigc::mem_fun (clock, &AudioClock::set), false));
clock.set_corner_radius (0.0); clock.set_corner_radius (0.0);

View File

@ -97,9 +97,7 @@ EditNoteDialog::EditNoteDialog (MidiRegionView* rv, set<NoteBase*> n)
_time_clock.set_session (_region_view->get_time_axis_view().session ()); _time_clock.set_session (_region_view->get_time_axis_view().session ());
_time_clock.set_mode (AudioClock::BBT); _time_clock.set_mode (AudioClock::BBT);
timecnt_t dur = _region_view->source_relative_distance (timecnt_t ((*_events.begin())->note()->time(), timepos_t()), BeatTime); const timepos_t pos (_region_view->region_relative_distance (timecnt_t ((*_events.begin())->note()->time (), timepos_t()), BeatTime));
timepos_t pos = _region_view->region()->source_position() + dur;
_time_clock.set (pos, true); _time_clock.set (pos, true);
l = manage (left_aligned_label (_("Length"))); l = manage (left_aligned_label (_("Length")));
@ -110,15 +108,7 @@ EditNoteDialog::EditNoteDialog (MidiRegionView* rv, set<NoteBase*> n)
_length_clock.set_session (_region_view->get_time_axis_view().session ()); _length_clock.set_session (_region_view->get_time_axis_view().session ());
_length_clock.set_mode (AudioClock::BBT); _length_clock.set_mode (AudioClock::BBT);
_length_clock.set_duration (timecnt_t ((*_events.begin())->note()->length()), true);
dur = _region_view->region_relative_distance (timecnt_t ((*_events.begin())->note()->end_time (), timepos_t()), BeatTime);
pos = _region_view->region()->position() + dur;
timecnt_t offset;
dur = _region_view->region_relative_distance (timecnt_t ((*_events.begin())->note()->time (), timepos_t()), BeatTime);
offset = timecnt_t (_region_view->region()->position(), timepos_t()) + dur;
_length_clock.set_is_duration (true, pos);
_length_clock.set (pos, true, offset);
/* Set up `set all notes...' buttons' sensitivity */ /* Set up `set all notes...' buttons' sensitivity */

View File

@ -4333,7 +4333,7 @@ MarkerDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor)
s = min (s, e); s = min (s, e);
e = max (s, e); e = max (s, e);
if (e < timepos_t::max (e.time_domain())) { if (e < timepos_t::max (e.time_domain())) {
e.increment(); e.increment_by_domain();
} }
_editor->session()->locations()->find_all_between (s, e, ll, Location::Flags (0)); _editor->session()->locations()->find_all_between (s, e, ll, Location::Flags (0));
for (Locations::LocationList::iterator i = ll.begin(); i != ll.end(); ++i) { for (Locations::LocationList::iterator i = ll.begin(); i != ll.end(); ++i) {
@ -6632,7 +6632,7 @@ EditorRubberbandSelectDrag::select_things (int button_state, timepos_t const & x
_editor->begin_reversible_selection_op (X_("rubberband selection")); _editor->begin_reversible_selection_op (X_("rubberband selection"));
_editor->select_all_within (x1, x2.decrement(), y1, y2, _editor->track_views, op, false); _editor->select_all_within (x1, x2.decrement_by_domain(), y1, y2, _editor->track_views, op, false);
_editor->commit_reversible_selection_op (); _editor->commit_reversible_selection_op ();
} }

View File

@ -1310,7 +1310,7 @@ Editor::marker_menu_select_all_selectables_using_range ()
bool is_start; bool is_start;
if (((l = find_location_from_marker (marker, is_start)) != 0) && (l->end() > l->start())) { if (((l = find_location_from_marker (marker, is_start)) != 0) && (l->end() > l->start())) {
select_all_within (l->start(), l->end().decrement(), 0, DBL_MAX, track_views, Selection::Set, false); select_all_within (l->start(), l->end(), 0, DBL_MAX, track_views, Selection::Set, false);
} }
} }

View File

@ -350,7 +350,7 @@ Editor::move_range_selection_start_or_end_to_region_boundary (bool move_end, boo
/* so we don't find the current region again */ /* so we don't find the current region again */
if (dir > 0 || pos.is_positive()) { if (dir > 0 || pos.is_positive()) {
pos = pos.increment (); pos = pos.increment_by_domain ();
} }
timepos_t const target = get_region_boundary (pos, dir, true, false); timepos_t const target = get_region_boundary (pos, dir, true, false);
@ -835,7 +835,7 @@ Editor::build_region_boundary_cache ()
} }
} }
pos = lpos.increment(); pos = lpos.increment_by_domain();
} }
/* finally sort to be sure that the order is correct */ /* finally sort to be sure that the order is correct */
@ -976,7 +976,7 @@ Editor::cursor_to_region_boundary (bool with_selection, int32_t dir)
// so we don't find the current region again.. // so we don't find the current region again..
if (dir > 0 || pos > 0) { if (dir > 0 || pos > 0) {
pos = pos.increment(); pos = pos.increment_by_domain();
} }
if ((target = get_region_boundary (pos, dir, with_selection, false)) < 0) { if ((target = get_region_boundary (pos, dir, with_selection, false)) < 0) {
@ -1012,7 +1012,7 @@ Editor::cursor_to_region_point (EditorCursor* cursor, RegionPoint point, int32_t
// so we don't find the current region again.. // so we don't find the current region again..
if (dir > 0 || pos.is_positive()) if (dir > 0 || pos.is_positive())
pos = pos.increment(); pos = pos.increment_by_domain();
if (!selection->tracks.empty()) { if (!selection->tracks.empty()) {
@ -1155,7 +1155,7 @@ Editor::selected_marker_to_region_boundary (bool with_selection, int32_t dir)
// so we don't find the current region again.. // so we don't find the current region again..
if (dir > 0 || pos.is_positive()) { if (dir > 0 || pos.is_positive()) {
pos = pos.increment(); pos = pos.increment_by_domain();
} }
if ((target = get_region_boundary (pos, dir, with_selection, false)) < 0) { if ((target = get_region_boundary (pos, dir, with_selection, false)) < 0) {
@ -1199,7 +1199,7 @@ Editor::selected_marker_to_region_point (RegionPoint point, int32_t dir)
// so we don't find the current region again.. // so we don't find the current region again..
if (dir > 0 || pos > 0) { if (dir > 0 || pos > 0) {
pos = pos.increment(); pos = pos.increment_by_domain();
} }
if (!selection->tracks.empty()) { if (!selection->tracks.empty()) {
@ -3428,7 +3428,7 @@ Editor::separate_under_selected_regions ()
} }
//Partition on the region bounds //Partition on the region bounds
playlist->partition ((*rl)->position().decrement(), (*rl)->end(), true); playlist->partition ((*rl)->position().decrement_by_domain(), (*rl)->end(), true);
//Re-add region that was just removed due to the partition operation //Re-add region that was just removed due to the partition operation
playlist->add_region ((*rl), (*rl)->position()); playlist->add_region ((*rl), (*rl)->position());
@ -3553,7 +3553,7 @@ Editor::region_fill_track ()
timepos_t const end (_session->current_end_sample ()); timepos_t const end (_session->current_end_sample ());
if (regions.empty () || regions.end_time().increment() >= end) { if (regions.empty () || regions.end_time().increment_by_domain() >= end) {
return; return;
} }
@ -3972,7 +3972,8 @@ Editor::trim_to_region(bool forward)
continue; continue;
} }
region->trim_end (next_region->position().decrement()); /* new end is 1 domain unit before the next region */
region->trim_end (next_region->position().decrement_by_domain());
arv->region_changed (PropertyChange (ARDOUR::Properties::length)); arv->region_changed (PropertyChange (ARDOUR::Properties::length));
} }
else { else {
@ -9634,7 +9635,7 @@ Editor::effective_ripple_mark_start (boost::shared_ptr<Playlist> target_playlist
} }
if (last_region_end_before_at < pos) { if (last_region_end_before_at < pos) {
pos = last_region_end_before_at.increment(); pos = last_region_end_before_at.increment_by_domain();
} }
#endif #endif

View File

@ -2186,7 +2186,7 @@ Editor::select_all_selectables_using_edit (bool after, bool from_context_menu)
} else { } else {
if ((end = get_preferred_edit_position(EDIT_IGNORE_NONE, from_context_menu)) > 1) { if ((end = get_preferred_edit_position(EDIT_IGNORE_NONE, from_context_menu)) > 1) {
start = timepos_t (); start = timepos_t ();
end = end.decrement(); end = end.decrement_by_domain();
} else { } else {
return; return;
} }

View File

@ -74,14 +74,10 @@ InsertRemoveTimeDialog::InsertRemoveTimeDialog (PublicEditor& e, bool remove)
//if a Range is selected, assume the user wants to insert/remove the length of the range //if a Range is selected, assume the user wants to insert/remove the length of the range
if ( _editor.get_selection().time.length() != 0 ) { if ( _editor.get_selection().time.length() != 0 ) {
position_clock.set (_editor.get_selection().time.start_time(), true); duration_clock.set_duration (_editor.get_selection().time.start_time().distance (_editor.get_selection().time.start_time()), true);
duration_clock.set (_editor.get_selection().time.end_time(), true, timecnt_t (_editor.get_selection().time.start_time()));
duration_clock.set_bbt_reference (_editor.get_selection().time.start_time());
} else { } else {
timepos_t const pos = _editor.get_preferred_edit_position (EDIT_IGNORE_MOUSE); timepos_t const pos = _editor.get_preferred_edit_position (EDIT_IGNORE_MOUSE);
position_clock.set (pos, true); duration_clock.set_duration (timecnt_t (pos));
duration_clock.set_bbt_reference (pos);
duration_clock.set (timepos_t());
} }
if (!remove) { if (!remove) {

View File

@ -108,7 +108,7 @@ MainClock::absolute_time () const
} }
void void
MainClock::set (timepos_t const & when, bool force, timecnt_t const & /*offset*/) MainClock::set (timepos_t const & when, bool force)
{ {
ClockDeltaMode mode; ClockDeltaMode mode;
if (_primary) { if (_primary) {
@ -126,12 +126,12 @@ MainClock::set (timepos_t const & when, bool force, timecnt_t const & /*offset*/
AudioClock::set (when, force); AudioClock::set (when, force);
break; break;
case DeltaEditPoint: case DeltaEditPoint:
AudioClock::set (when, force, timecnt_t (PublicEditor::instance().get_preferred_edit_position (Editing::EDIT_IGNORE_PHEAD))); AudioClock::set_duration (when.distance (PublicEditor::instance().get_preferred_edit_position (Editing::EDIT_IGNORE_PHEAD)), force);
break; break;
case DeltaOriginMarker: case DeltaOriginMarker:
{ {
Location* loc = AudioEngine::instance()->session()->locations()->clock_origin_location (); Location* loc = AudioEngine::instance()->session()->locations()->clock_origin_location ();
AudioClock::set (when, force, loc ? timecnt_t (loc->start()) : timecnt_t()); AudioClock::set_duration (when.distance (loc ? loc->start() : timepos_t (when.time_domain())), force);
} }
break; break;
} }

View File

@ -31,7 +31,7 @@ public:
MainClock (const std::string& clock_name, const std::string& widget_name, bool primary); MainClock (const std::string& clock_name, const std::string& widget_name, bool primary);
Temporal::timepos_t absolute_time () const; Temporal::timepos_t absolute_time () const;
void set_session (ARDOUR::Session *s); void set_session (ARDOUR::Session *s);
void set (Temporal::timepos_t const &, bool force = false, Temporal::timecnt_t const & offset = Temporal::timecnt_t ()); void set (Temporal::timepos_t const &, bool force = false);
private: private:

View File

@ -334,7 +334,11 @@ RegionEditor::length_clock_changed ()
in_command = true; in_command = true;
_region->clear_changes (); _region->clear_changes ();
_region->trim_end (_region->position() + len.decrement()); /* new end is actually 1 domain unit before the clock duration
* would otherwise indicate
*/
const timepos_t new_end = (_region->position() + len).decrement_by_domain ();
_region->trim_end (new_end);
_session->add_command(new StatefulDiffCommand (_region)); _session->add_command(new StatefulDiffCommand (_region));
} }

View File

@ -316,7 +316,7 @@ RegionSelection::end_time () const
timepos_t e (timepos_t::zero (front()->region()->position().time_domain())); timepos_t e (timepos_t::zero (front()->region()->position().time_domain()));
for (RegionSelection::const_iterator i = begin(); i != end(); ++i) { for (RegionSelection::const_iterator i = begin(); i != end(); ++i) {
e = max (e, (*i)->region()->end ()); e = max (e, (*i)->region()->nt_last ());
} }
return e; return e;

View File

@ -1008,7 +1008,7 @@ RegionView::update_coverage_frame (LayerDisplay d)
while (t < end) { while (t < end) {
t = t.increment (); t = t.increment_by_domain ();
/* is this region is on top at time t? */ /* is this region is on top at time t? */
bool const new_me = pl->region_is_audible_at (_region, t); bool const new_me = pl->region_is_audible_at (_region, t);
@ -1086,7 +1086,7 @@ RegionView::trim_front (timepos_t const & new_bound, bool no_overlap)
/* Only trim region on the left if the first sample has gone beyond the left region's last sample. */ /* Only trim region on the left if the first sample has gone beyond the left region's last sample. */
if (region_left && (region_left->nt_last() > _region->position() || regions_touching)) { if (region_left && (region_left->nt_last() > _region->position() || regions_touching)) {
region_left->trim_end (_region->position().decrement()); region_left->trim_end (_region->position().decrement_by_domain());
} }
} }
@ -1113,7 +1113,7 @@ RegionView::trim_end (timepos_t const & new_bound, bool no_overlap)
bool regions_touching = false; bool regions_touching = false;
if (region_right && (last == region_right->position().decrement())) { if (region_right && (last == region_right->position().decrement_by_domain())) {
regions_touching = true; regions_touching = true;
} }

View File

@ -218,7 +218,6 @@ SoundFileBox::SoundFileBox (bool /*persistent*/)
table.attach (timecode_clock, 1, 2, row, row+1, FILL, FILL); row+=1; table.attach (timecode_clock, 1, 2, row, row+1, FILL, FILL); row+=1;
table.attach (tempomap_value, 1, 2, row, row+1, FILL, FILL); row+=1; table.attach (tempomap_value, 1, 2, row, row+1, FILL, FILL); row+=1;
length_clock.set_is_duration (true, timepos_t());
length_clock.set_mode (ARDOUR_UI::instance()->primary_clock->mode()); length_clock.set_mode (ARDOUR_UI::instance()->primary_clock->mode());
timecode_clock.set_mode (AudioClock::Timecode); timecode_clock.set_mode (AudioClock::Timecode);
@ -380,7 +379,7 @@ SoundFileBox::setup_labels (const string& filename)
} }
} else { } else {
channels_value.set_text (""); channels_value.set_text ("");
length_clock.set (timepos_t()); length_clock.set_duration (timecnt_t());
tempomap_value.set_text (_("No tempo data")); tempomap_value.set_text (_("No tempo data"));
} }
@ -401,7 +400,7 @@ SoundFileBox::setup_labels (const string& filename)
samplerate_value.set_text (""); samplerate_value.set_text ("");
tags_entry.get_buffer()->set_text (""); tags_entry.get_buffer()->set_text ("");
length_clock.set (timepos_t()); length_clock.set_duration (timecnt_t());
timecode_clock.set (timepos_t()); timecode_clock.set (timepos_t());
tags_entry.set_sensitive (false); tags_entry.set_sensitive (false);
@ -433,7 +432,6 @@ SoundFileBox::setup_labels (const string& filename)
samplecnt_t const nfr = _session ? _session->nominal_sample_rate() : 25; samplecnt_t const nfr = _session ? _session->nominal_sample_rate() : 25;
double src_coef = (double) nfr / sf_info.samplerate; double src_coef = (double) nfr / sf_info.samplerate;
length_clock.set_is_duration (true, timepos_t());
length_clock.set_duration (timecnt_t (samplecnt_t (llrint (sf_info.length * src_coef + 0.5))), true); length_clock.set_duration (timecnt_t (samplecnt_t (llrint (sf_info.length * src_coef + 0.5))), true);
timecode_clock.set (timepos_t (samplepos_t (llrint (sf_info.timecode * src_coef + 0.5))), true); timecode_clock.set (timepos_t (samplepos_t (llrint (sf_info.timecode * src_coef + 0.5))), true);

View File

@ -63,9 +63,6 @@ StripSilenceDialog::StripSilenceDialog (Session* s, list<RegionView*> const & v)
views.push_back (ViewInterval (*r)); views.push_back (ViewInterval (*r));
} }
_minimum_length->set_is_duration (true, views.front().view->region()->position());
_fade_length->set_is_duration (true, views.front().view->region()->position());
Gtk::HBox* hbox = Gtk::manage (new Gtk::HBox); Gtk::HBox* hbox = Gtk::manage (new Gtk::HBox);
Gtk::Table* table = Gtk::manage (new Gtk::Table (3, 3)); Gtk::Table* table = Gtk::manage (new Gtk::Table (3, 3));
@ -106,7 +103,6 @@ StripSilenceDialog::StripSilenceDialog (Session* s, list<RegionView*> const & v)
_fade_length->set_session (s); _fade_length->set_session (s);
_fade_length->set_mode (AudioClock::Samples); _fade_length->set_mode (AudioClock::Samples);
_fade_length->set_is_duration (true, timepos_t());
_fade_length->set_duration (timecnt_t (_fade_length_value), true); _fade_length->set_duration (timecnt_t (_fade_length_value), true);
hbox->pack_start (*table); hbox->pack_start (*table);

View File

@ -895,7 +895,7 @@ TimeAxisView::show_selection (TimeSelection& ts)
rect = get_selection_rect ((*i).id); rect = get_selection_rect ((*i).id);
x1 = _editor.time_to_pixel (start); x1 = _editor.time_to_pixel (start);
x2 = _editor.time_to_pixel (end.decrement()); x2 = _editor.time_to_pixel (end.decrement_by_domain());
y2 = current_height() - 1; y2 = current_height() - 1;
if (dynamic_cast<AudioTimeAxisView*>(this)) { if (dynamic_cast<AudioTimeAxisView*>(this)) {

View File

@ -148,9 +148,8 @@ TimeFXDialog::TimeFXDialog (Editor& e, bool pitch, timecnt_t const & oldlen, tim
vector<string> strings; vector<string> strings;
duration_clock = manage (new AudioClock (X_("stretch"), true, X_("stretch"), true, false, true, false, true)); duration_clock = manage (new AudioClock (X_("stretch"), true, X_("stretch"), true, false, true, false, true));
duration_clock->set_session (e.session()); duration_clock->set_session (e.session());
duration_clock->set (timepos_t (new_length), true);
duration_clock->set_mode (AudioClock::BBT); duration_clock->set_mode (AudioClock::BBT);
duration_clock->set_bbt_reference (position); duration_clock->set_duration (timecnt_t (new_length, position));
Gtk::Alignment* clock_align = manage (new Gtk::Alignment); Gtk::Alignment* clock_align = manage (new Gtk::Alignment);
clock_align->add (*duration_clock); clock_align->add (*duration_clock);

View File

@ -242,8 +242,8 @@ TimeInfoBox::region_selection_changed ()
selection_end->set_off (false); selection_end->set_off (false);
selection_length->set_off (false); selection_length->set_off (false);
selection_start->set (s); selection_start->set (s);
selection_end->set (e); selection_end->set (e.decrement_by_domain());
selection_length->set_duration (timecnt_t (e), false, timecnt_t (s)); selection_length->set_duration (s.distance (e), true);
} }
void void
@ -273,8 +273,7 @@ TimeInfoBox::selection_changed ()
selection_end->set_off (false); selection_end->set_off (false);
selection_length->set_off (false); selection_length->set_off (false);
selection_start->set (selection.time.start_time()); selection_start->set (selection.time.start_time());
selection_end->set (selection.time.end_time()); selection_end->set (selection.time.end_time().decrement_by_domain());
selection_length->set_is_duration (true, selection.time.start_time());
selection_length->set_duration (selection.time.start_time().distance (selection.time.end_time())); selection_length->set_duration (selection.time.start_time().distance (selection.time.end_time()));
} else { } else {
selection_start->set_off (true); selection_start->set_off (true);
@ -293,9 +292,8 @@ TimeInfoBox::selection_changed ()
selection_end->set_off (false); selection_end->set_off (false);
selection_length->set_off (false); selection_length->set_off (false);
selection_start->set (s); selection_start->set (s);
selection_end->set (e); selection_end->set (e.decrement_by_domain());
selection_length->set_is_duration (true, s); selection_length->set_duration (s.distance (e), false);
selection_length->set (e, false, timecnt_t (s));
} }
} else { } else {
/* this is more efficient than tracking changes per region in large selections */ /* this is more efficient than tracking changes per region in large selections */
@ -326,9 +324,8 @@ TimeInfoBox::selection_changed ()
selection_end->set_off (false); selection_end->set_off (false);
selection_length->set_off (false); selection_length->set_off (false);
selection_start->set (s); selection_start->set (s);
selection_end->set (e); selection_end->set (e.decrement_by_domain());
selection_length->set_is_duration (true, s); selection_length->set_duration(s.distance (e));
selection_length->set (e, false, timecnt_t (s));
} else { } else {
selection_start->set_off (true); selection_start->set_off (true);
selection_end->set_off (true); selection_end->set_off (true);
@ -339,9 +336,8 @@ TimeInfoBox::selection_changed ()
selection_end->set_off (false); selection_end->set_off (false);
selection_length->set_off (false); selection_length->set_off (false);
selection_start->set (selection.time.start_time()); selection_start->set (selection.time.start_time());
selection_end->set (selection.time.end_time()); selection_end->set (selection.time.end_time().decrement_by_domain());
selection_length->set_is_duration (true, selection.time.start_time()); selection_length->set_duration (selection.time.length());
selection_length->set_duration (selection.time.start_time().distance (selection.time.end_time()));
} }
break; break;