Add seconds as clock-unit

This commit is contained in:
Robin Gareus 2017-11-22 20:36:28 +01:00
parent 318e7efb9e
commit 867460cd30
8 changed files with 137 additions and 9 deletions

View file

@ -568,6 +568,8 @@ ARDOUR_UI::install_actions ()
ActionManager::session_sensitive_actions.push_back (act); ActionManager::session_sensitive_actions.push_back (act);
act = global_actions.register_action (transport_actions, X_("primary-clock-minsec"), _("Minutes & Seconds"), sigc::bind (sigc::mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::MinSec, false)); act = global_actions.register_action (transport_actions, X_("primary-clock-minsec"), _("Minutes & Seconds"), sigc::bind (sigc::mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::MinSec, false));
ActionManager::session_sensitive_actions.push_back (act); ActionManager::session_sensitive_actions.push_back (act);
act = global_actions.register_action (transport_actions, X_("primary-clock-seconds"), _("Seconds"), sigc::bind (sigc::mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::Seconds, false));
ActionManager::session_sensitive_actions.push_back (act);
act = global_actions.register_action (transport_actions, X_("primary-clock-samples"), _("Samples"), sigc::bind (sigc::mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::Samples, false)); act = global_actions.register_action (transport_actions, X_("primary-clock-samples"), _("Samples"), sigc::bind (sigc::mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::Samples, false));
ActionManager::session_sensitive_actions.push_back (act); ActionManager::session_sensitive_actions.push_back (act);
@ -577,6 +579,8 @@ ARDOUR_UI::install_actions ()
ActionManager::session_sensitive_actions.push_back (act); ActionManager::session_sensitive_actions.push_back (act);
act = global_actions.register_action (transport_actions, X_("secondary-clock-minsec"), _("Minutes & Seconds"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::MinSec, false)); act = global_actions.register_action (transport_actions, X_("secondary-clock-minsec"), _("Minutes & Seconds"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::MinSec, false));
ActionManager::session_sensitive_actions.push_back (act); ActionManager::session_sensitive_actions.push_back (act);
act = global_actions.register_action (transport_actions, X_("secondary-clock-seconds"), _("Seconds"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::Seconds, false));
ActionManager::session_sensitive_actions.push_back (act);
act = global_actions.register_action (transport_actions, X_("secondary-clock-samples"), _("Samples"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::Samples, false)); act = global_actions.register_action (transport_actions, X_("secondary-clock-samples"), _("Samples"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::Samples, false));
ActionManager::session_sensitive_actions.push_back (act); ActionManager::session_sensitive_actions.push_back (act);

View file

@ -477,6 +477,10 @@ AudioClock::get_field (Field f)
case Ticks: case Ticks:
return edit_string.substr (8, 4); return edit_string.substr (8, 4);
break; break;
case SS_Seconds:
return edit_string.substr (0, 8);
case SS_Deciseconds:
return edit_string.substr (9, 1);
case S_Samples: case S_Samples:
return edit_string; return edit_string;
break; break;
@ -504,6 +508,8 @@ AudioClock::end_edit (bool modify)
ok = minsec_validate_edit (edit_string); ok = minsec_validate_edit (edit_string);
break; break;
case Seconds:
// no break
case Samples: case Samples:
if (edit_string.length() < 1) { if (edit_string.length() < 1) {
edit_string = pre_edit_string; edit_string = pre_edit_string;
@ -539,8 +545,12 @@ AudioClock::end_edit (bool modify)
pos = samples_from_minsec_string (edit_string); pos = samples_from_minsec_string (edit_string);
break; break;
case Seconds:
pos = samples_from_seconds_string (edit_string);
break;
case Samples: case Samples:
pos = samples_from_audioframes_string (edit_string); pos = samples_from_audiosamples_string (edit_string);
break; break;
} }
@ -575,6 +585,18 @@ AudioClock::drop_focus ()
} }
} }
samplecnt_t
AudioClock::parse_as_seconds_distance (const std::string& str)
{
float f;
if (sscanf (str.c_str(), "%f", &f) == 1) {
return f * _session->sample_rate();
}
return 0;
}
samplecnt_t samplecnt_t
AudioClock::parse_as_samples_distance (const std::string& str) AudioClock::parse_as_samples_distance (const std::string& str)
{ {
@ -708,6 +730,9 @@ AudioClock::parse_as_distance (const std::string& instr)
case MinSec: case MinSec:
return parse_as_minsec_distance (instr); return parse_as_minsec_distance (instr);
break; break;
case Seconds:
return parse_as_seconds_distance (instr);
break;
} }
return 0; return 0;
} }
@ -730,6 +755,9 @@ AudioClock::end_edit_relative (bool add)
ok = minsec_validate_edit (edit_string); ok = minsec_validate_edit (edit_string);
break; break;
case Seconds:
break;
case Samples: case Samples:
break; break;
} }
@ -866,6 +894,10 @@ AudioClock::set (samplepos_t when, bool force, samplecnt_t offset)
set_minsec (when, force); set_minsec (when, force);
break; break;
case Seconds:
set_seconds (when, force);
break;
case Samples: case Samples:
set_samples (when, force); set_samples (when, force);
break; break;
@ -1019,6 +1051,32 @@ AudioClock::set_samples (samplepos_t when, bool /*force*/)
} }
} }
void
AudioClock::set_seconds (samplepos_t when, bool /*force*/)
{
char buf[32];
if (_off) {
_layout->set_text (" ----------");
_left_btn.set_text ("", true);
_right_btn.set_text ("", true);
return;
}
if (when >= _limit_pos || when <= -_limit_pos) {
set_out_of_bounds (when < 0);
} else {
if (when < 0) {
snprintf (buf, sizeof (buf), "%12.1f", when / (float)_session->sample_rate());
} else {
snprintf (buf, sizeof (buf), " %11.1f", when / (float)_session->sample_rate());
}
_layout->set_text (buf);
}
set_slave_info();
}
void void
AudioClock::print_minsec (samplepos_t when, char* buf, size_t bufsize, float sample_rate) AudioClock::print_minsec (samplepos_t when, char* buf, size_t bufsize, float sample_rate)
{ {
@ -1510,6 +1568,13 @@ AudioClock::index_to_field (int index) const
return MS_Milliseconds; return MS_Milliseconds;
} }
break; break;
case Seconds:
if (index < 10) {
return SS_Seconds;
} else {
return SS_Deciseconds;
}
break;
case Samples: case Samples:
return S_Samples; return S_Samples;
break; break;
@ -1604,6 +1669,7 @@ AudioClock::on_button_release_event (GdkEventButton *ev)
case Timecode_frames: case Timecode_frames:
case MS_Milliseconds: case MS_Milliseconds:
case Ticks: case Ticks:
case SS_Deciseconds:
f = Field (0); f = Field (0);
break; break;
default: default:
@ -1778,6 +1844,13 @@ AudioClock::get_sample_step (Field field, samplepos_t pos, int dir)
f = 1; f = 1;
break; break;
case SS_Seconds:
f = (samplecnt_t) _session->sample_rate();
break;
case SS_Deciseconds:
f = (samplecnt_t) _session->sample_rate() / 10.f;
break;
case MS_Hours: case MS_Hours:
f = (samplecnt_t) floor (3600.0 * _session->sample_rate()); f = (samplecnt_t) floor (3600.0 * _session->sample_rate());
break; break;
@ -1830,18 +1903,15 @@ AudioClock::current_duration (samplepos_t pos) const
samplepos_t ret = 0; samplepos_t ret = 0;
switch (_mode) { switch (_mode) {
case Timecode:
ret = last_when;
break;
case BBT: case BBT:
ret = sample_duration_from_bbt_string (pos, _layout->get_text()); ret = sample_duration_from_bbt_string (pos, _layout->get_text());
break; break;
case Timecode:
case MinSec: case MinSec:
ret = last_when; case Seconds:
break;
case Samples: case Samples:
ret = last_when;
ret = last_when; ret = last_when;
break; break;
} }
@ -2021,7 +2091,15 @@ AudioClock::sample_duration_from_bbt_string (samplepos_t pos, const string& str)
} }
samplepos_t samplepos_t
AudioClock::samples_from_audioframes_string (const string& str) const AudioClock::samples_from_seconds_string (const string& str) const
{
float f;
sscanf (str.c_str(), "%f", &f);
return f * _session->sample_rate();
}
samplepos_t
AudioClock::samples_from_audiosamples_string (const string& str) const
{ {
samplepos_t f; samplepos_t f;
sscanf (str.c_str(), "%" PRId64, &f); sscanf (str.c_str(), "%" PRId64, &f);
@ -2057,6 +2135,7 @@ AudioClock::build_ops_menu ()
ops_items.push_back (MenuElem (_("Timecode"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), Timecode, false))); ops_items.push_back (MenuElem (_("Timecode"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), Timecode, false)));
ops_items.push_back (MenuElem (_("Bars:Beats"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), BBT, false))); ops_items.push_back (MenuElem (_("Bars:Beats"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), BBT, false)));
ops_items.push_back (MenuElem (_("Minutes:Seconds"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), MinSec, false))); ops_items.push_back (MenuElem (_("Minutes:Seconds"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), MinSec, false)));
ops_items.push_back (MenuElem (_("Seconds"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), Seconds, false)));
ops_items.push_back (MenuElem (_("Samples"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), Samples, false))); ops_items.push_back (MenuElem (_("Samples"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), Samples, false)));
if (editable && !_off && !is_duration && !_follows_playhead) { if (editable && !_off && !is_duration && !_follows_playhead) {
@ -2141,6 +2220,19 @@ AudioClock::set_mode (Mode m, bool noemit)
insert_map.push_back (1); insert_map.push_back (1);
break; break;
case Seconds:
insert_map.push_back (11);
insert_map.push_back (9);
insert_map.push_back (8);
insert_map.push_back (7);
insert_map.push_back (6);
insert_map.push_back (5);
insert_map.push_back (4);
insert_map.push_back (3);
insert_map.push_back (2);
insert_map.push_back (1);
break;
case Samples: case Samples:
break; break;
} }

View file

@ -47,6 +47,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
Timecode, Timecode,
BBT, BBT,
MinSec, MinSec,
Seconds,
Samples Samples
}; };
@ -166,6 +167,8 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
Bars, Bars,
Beats, Beats,
Ticks, Ticks,
SS_Seconds,
SS_Deciseconds,
S_Samples, S_Samples,
}; };
@ -208,6 +211,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
void set_timecode (samplepos_t, bool); void set_timecode (samplepos_t, bool);
void set_bbt (samplepos_t, ARDOUR::samplecnt_t, bool); void set_bbt (samplepos_t, ARDOUR::samplecnt_t, bool);
void set_minsec (samplepos_t, bool); void set_minsec (samplepos_t, bool);
void set_seconds (samplepos_t, bool);
void set_samples (samplepos_t, bool); void set_samples (samplepos_t, bool);
void set_out_of_bounds (bool negative); void set_out_of_bounds (bool negative);
@ -223,7 +227,8 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
samplepos_t samples_from_bbt_string (samplepos_t, const std::string&) const; samplepos_t samples_from_bbt_string (samplepos_t, const std::string&) const;
samplepos_t sample_duration_from_bbt_string (samplepos_t, const std::string&) const; samplepos_t sample_duration_from_bbt_string (samplepos_t, const std::string&) const;
samplepos_t samples_from_minsec_string (const std::string&) const; samplepos_t samples_from_minsec_string (const std::string&) const;
samplepos_t samples_from_audioframes_string (const std::string&) const; samplepos_t samples_from_seconds_string (const std::string&) const;
samplepos_t samples_from_audiosamples_string (const std::string&) const;
void session_configuration_changed (std::string); void session_configuration_changed (std::string);
void session_property_changed (const PBD::PropertyChange&); void session_property_changed (const PBD::PropertyChange&);
@ -239,6 +244,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
ARDOUR::samplecnt_t parse_as_timecode_distance (const std::string&); ARDOUR::samplecnt_t parse_as_timecode_distance (const std::string&);
ARDOUR::samplecnt_t parse_as_minsec_distance (const std::string&); ARDOUR::samplecnt_t parse_as_minsec_distance (const std::string&);
ARDOUR::samplecnt_t parse_as_bbt_distance (const std::string&); ARDOUR::samplecnt_t parse_as_bbt_distance (const std::string&);
ARDOUR::samplecnt_t parse_as_seconds_distance (const std::string&);
ARDOUR::samplecnt_t parse_as_samples_distance (const std::string&); ARDOUR::samplecnt_t parse_as_samples_distance (const std::string&);
void set_font (Pango::FontDescription); void set_font (Pango::FontDescription);

View file

@ -767,6 +767,14 @@ EditorRegions::format_position (samplepos_t pos, char* buf, size_t bufsize, bool
} }
break; break;
case AudioClock::Seconds:
if (onoff) {
snprintf (buf, bufsize, "%.1f", pos / (float)_session->sample_rate());
} else {
snprintf (buf, bufsize, "(%.1f)", pos / (float)_session->sample_rate());
}
break;
case AudioClock::Samples: case AudioClock::Samples:
if (onoff) { if (onoff) {
snprintf (buf, bufsize, "%" PRId64, pos); snprintf (buf, bufsize, "%" PRId64, pos);

View file

@ -59,6 +59,7 @@ setup_gtk_ardour_enums ()
REGISTER_CLASS_ENUM (AudioClock, Timecode); REGISTER_CLASS_ENUM (AudioClock, Timecode);
REGISTER_CLASS_ENUM (AudioClock, BBT); REGISTER_CLASS_ENUM (AudioClock, BBT);
REGISTER_CLASS_ENUM (AudioClock, MinSec); REGISTER_CLASS_ENUM (AudioClock, MinSec);
REGISTER_CLASS_ENUM (AudioClock, Seconds);
REGISTER_CLASS_ENUM (AudioClock, Samples); REGISTER_CLASS_ENUM (AudioClock, Samples);
REGISTER (clock_mode); REGISTER (clock_mode);

View file

@ -917,6 +917,7 @@ ExportFormatDialog::update_time (AnyTime & time, AudioClock const & clock)
time.type = AnyTime::BBT; time.type = AnyTime::BBT;
_session->bbt_time (samples, time.bbt); _session->bbt_time (samples, time.bbt);
break; break;
case AudioClock::Seconds:
case AudioClock::MinSec: case AudioClock::MinSec:
time.type = AnyTime::Seconds; time.type = AnyTime::Seconds;
time.seconds = (double) samples / _session->sample_rate(); time.seconds = (double) samples / _session->sample_rate();

View file

@ -242,6 +242,7 @@ MiniTimeline::calculate_time_width ()
case AudioClock::MinSec: case AudioClock::MinSec:
_layout->set_text ("88:88:88,88"); _layout->set_text ("88:88:88,88");
break; break;
case AudioClock::Seconds:
case AudioClock::Samples: case AudioClock::Samples:
_layout->set_text ("8888888888"); _layout->set_text ("8888888888");
break; break;
@ -293,6 +294,13 @@ MiniTimeline::format_time (samplepos_t when)
_layout->set_text (std::string(buf).substr(1)); _layout->set_text (std::string(buf).substr(1));
} }
break; break;
case AudioClock::Seconds:
{
char buf[32];
snprintf (buf, sizeof (buf), "%.1f", when / (float)_session->sample_rate());
_layout->set_text (buf);
}
break;
case AudioClock::Samples: case AudioClock::Samples:
{ {
char buf[32]; char buf[32];

View file

@ -122,6 +122,10 @@ VerboseCursor::set_time (samplepos_t sample)
AudioClock::print_minsec (sample, buf, sizeof (buf), _editor->_session->sample_rate()); AudioClock::print_minsec (sample, buf, sizeof (buf), _editor->_session->sample_rate());
break; break;
case AudioClock::Seconds:
snprintf (buf, sizeof(buf), "%.1f", sample / (float)_editor->_session->sample_rate());
break;
default: default:
snprintf (buf, sizeof(buf), "%" PRIi64, sample); snprintf (buf, sizeof(buf), "%" PRIi64, sample);
break; break;
@ -191,6 +195,10 @@ VerboseCursor::set_duration (samplepos_t start, samplepos_t end)
AudioClock::print_minsec (end - start, buf, sizeof (buf), _editor->_session->sample_rate()); AudioClock::print_minsec (end - start, buf, sizeof (buf), _editor->_session->sample_rate());
break; break;
case AudioClock::Seconds:
snprintf (buf, sizeof(buf), "%.1f", (end - start) / (float)_editor->_session->sample_rate());
break;
default: default:
snprintf (buf, sizeof(buf), "%" PRIi64, end - start); snprintf (buf, sizeof(buf), "%" PRIi64, end - start);
break; break;