summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-11-22 20:36:28 +0100
committerRobin Gareus <robin@gareus.org>2017-11-22 20:36:28 +0100
commit867460cd30d59934d8d04a59dbbc6ecd78643acf (patch)
treece0b4952b421546feda182b32b1dc656cf8768dd /gtk2_ardour
parent318e7efb9e207fbf8145b4c363f14323eaec746f (diff)
Add seconds as clock-unit
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/ardour_ui_ed.cc4
-rw-r--r--gtk2_ardour/audio_clock.cc108
-rw-r--r--gtk2_ardour/audio_clock.h8
-rw-r--r--gtk2_ardour/editor_regions.cc8
-rw-r--r--gtk2_ardour/enums.cc1
-rw-r--r--gtk2_ardour/export_format_dialog.cc1
-rw-r--r--gtk2_ardour/mini_timeline.cc8
-rw-r--r--gtk2_ardour/verbose_cursor.cc8
8 files changed, 137 insertions, 9 deletions
diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc
index 39a92aee86..4ace0b5f28 100644
--- a/gtk2_ardour/ardour_ui_ed.cc
+++ b/gtk2_ardour/ardour_ui_ed.cc
@@ -568,6 +568,8 @@ ARDOUR_UI::install_actions ()
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));
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));
ActionManager::session_sensitive_actions.push_back (act);
@@ -577,6 +579,8 @@ ARDOUR_UI::install_actions ()
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));
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));
ActionManager::session_sensitive_actions.push_back (act);
diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc
index ea61979311..e9aa0076bb 100644
--- a/gtk2_ardour/audio_clock.cc
+++ b/gtk2_ardour/audio_clock.cc
@@ -477,6 +477,10 @@ AudioClock::get_field (Field f)
case Ticks:
return edit_string.substr (8, 4);
break;
+ case SS_Seconds:
+ return edit_string.substr (0, 8);
+ case SS_Deciseconds:
+ return edit_string.substr (9, 1);
case S_Samples:
return edit_string;
break;
@@ -504,6 +508,8 @@ AudioClock::end_edit (bool modify)
ok = minsec_validate_edit (edit_string);
break;
+ case Seconds:
+ // no break
case Samples:
if (edit_string.length() < 1) {
edit_string = pre_edit_string;
@@ -539,8 +545,12 @@ AudioClock::end_edit (bool modify)
pos = samples_from_minsec_string (edit_string);
break;
+ case Seconds:
+ pos = samples_from_seconds_string (edit_string);
+ break;
+
case Samples:
- pos = samples_from_audioframes_string (edit_string);
+ pos = samples_from_audiosamples_string (edit_string);
break;
}
@@ -576,6 +586,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
AudioClock::parse_as_samples_distance (const std::string& str)
{
samplecnt_t f;
@@ -708,6 +730,9 @@ AudioClock::parse_as_distance (const std::string& instr)
case MinSec:
return parse_as_minsec_distance (instr);
break;
+ case Seconds:
+ return parse_as_seconds_distance (instr);
+ break;
}
return 0;
}
@@ -730,6 +755,9 @@ AudioClock::end_edit_relative (bool add)
ok = minsec_validate_edit (edit_string);
break;
+ case Seconds:
+ break;
+
case Samples:
break;
}
@@ -866,6 +894,10 @@ AudioClock::set (samplepos_t when, bool force, samplecnt_t offset)
set_minsec (when, force);
break;
+ case Seconds:
+ set_seconds (when, force);
+ break;
+
case Samples:
set_samples (when, force);
break;
@@ -1020,6 +1052,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
AudioClock::print_minsec (samplepos_t when, char* buf, size_t bufsize, float sample_rate)
{
samplecnt_t left;
@@ -1510,6 +1568,13 @@ AudioClock::index_to_field (int index) const
return MS_Milliseconds;
}
break;
+ case Seconds:
+ if (index < 10) {
+ return SS_Seconds;
+ } else {
+ return SS_Deciseconds;
+ }
+ break;
case Samples:
return S_Samples;
break;
@@ -1604,6 +1669,7 @@ AudioClock::on_button_release_event (GdkEventButton *ev)
case Timecode_frames:
case MS_Milliseconds:
case Ticks:
+ case SS_Deciseconds:
f = Field (0);
break;
default:
@@ -1778,6 +1844,13 @@ AudioClock::get_sample_step (Field field, samplepos_t pos, int dir)
f = 1;
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:
f = (samplecnt_t) floor (3600.0 * _session->sample_rate());
break;
@@ -1830,19 +1903,16 @@ AudioClock::current_duration (samplepos_t pos) const
samplepos_t ret = 0;
switch (_mode) {
- case Timecode:
- ret = last_when;
- break;
case BBT:
ret = sample_duration_from_bbt_string (pos, _layout->get_text());
break;
+ case Timecode:
case MinSec:
- ret = last_when;
- break;
-
+ case Seconds:
case Samples:
ret = last_when;
+ ret = last_when;
break;
}
@@ -2021,7 +2091,15 @@ AudioClock::sample_duration_from_bbt_string (samplepos_t pos, const string& str)
}
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;
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 (_("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 (_("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)));
if (editable && !_off && !is_duration && !_follows_playhead) {
@@ -2141,6 +2220,19 @@ AudioClock::set_mode (Mode m, bool noemit)
insert_map.push_back (1);
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:
break;
}
diff --git a/gtk2_ardour/audio_clock.h b/gtk2_ardour/audio_clock.h
index e48dec0dc5..6701410c99 100644
--- a/gtk2_ardour/audio_clock.h
+++ b/gtk2_ardour/audio_clock.h
@@ -47,6 +47,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
Timecode,
BBT,
MinSec,
+ Seconds,
Samples
};
@@ -166,6 +167,8 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
Bars,
Beats,
Ticks,
+ SS_Seconds,
+ SS_Deciseconds,
S_Samples,
};
@@ -208,6 +211,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
void set_timecode (samplepos_t, bool);
void set_bbt (samplepos_t, ARDOUR::samplecnt_t, bool);
void set_minsec (samplepos_t, bool);
+ void set_seconds (samplepos_t, bool);
void set_samples (samplepos_t, bool);
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 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_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_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_minsec_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&);
void set_font (Pango::FontDescription);
diff --git a/gtk2_ardour/editor_regions.cc b/gtk2_ardour/editor_regions.cc
index c74dc6b6e3..f331b8ca4e 100644
--- a/gtk2_ardour/editor_regions.cc
+++ b/gtk2_ardour/editor_regions.cc
@@ -767,6 +767,14 @@ EditorRegions::format_position (samplepos_t pos, char* buf, size_t bufsize, bool
}
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:
if (onoff) {
snprintf (buf, bufsize, "%" PRId64, pos);
diff --git a/gtk2_ardour/enums.cc b/gtk2_ardour/enums.cc
index 728a523384..542f69dfa9 100644
--- a/gtk2_ardour/enums.cc
+++ b/gtk2_ardour/enums.cc
@@ -59,6 +59,7 @@ setup_gtk_ardour_enums ()
REGISTER_CLASS_ENUM (AudioClock, Timecode);
REGISTER_CLASS_ENUM (AudioClock, BBT);
REGISTER_CLASS_ENUM (AudioClock, MinSec);
+ REGISTER_CLASS_ENUM (AudioClock, Seconds);
REGISTER_CLASS_ENUM (AudioClock, Samples);
REGISTER (clock_mode);
diff --git a/gtk2_ardour/export_format_dialog.cc b/gtk2_ardour/export_format_dialog.cc
index 184bcdc3bb..bc9a553574 100644
--- a/gtk2_ardour/export_format_dialog.cc
+++ b/gtk2_ardour/export_format_dialog.cc
@@ -917,6 +917,7 @@ ExportFormatDialog::update_time (AnyTime & time, AudioClock const & clock)
time.type = AnyTime::BBT;
_session->bbt_time (samples, time.bbt);
break;
+ case AudioClock::Seconds:
case AudioClock::MinSec:
time.type = AnyTime::Seconds;
time.seconds = (double) samples / _session->sample_rate();
diff --git a/gtk2_ardour/mini_timeline.cc b/gtk2_ardour/mini_timeline.cc
index 43cf76491a..9d7dc61d73 100644
--- a/gtk2_ardour/mini_timeline.cc
+++ b/gtk2_ardour/mini_timeline.cc
@@ -242,6 +242,7 @@ MiniTimeline::calculate_time_width ()
case AudioClock::MinSec:
_layout->set_text ("88:88:88,88");
break;
+ case AudioClock::Seconds:
case AudioClock::Samples:
_layout->set_text ("8888888888");
break;
@@ -293,6 +294,13 @@ MiniTimeline::format_time (samplepos_t when)
_layout->set_text (std::string(buf).substr(1));
}
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:
{
char buf[32];
diff --git a/gtk2_ardour/verbose_cursor.cc b/gtk2_ardour/verbose_cursor.cc
index 3ad9ae92c6..d316a15984 100644
--- a/gtk2_ardour/verbose_cursor.cc
+++ b/gtk2_ardour/verbose_cursor.cc
@@ -122,6 +122,10 @@ VerboseCursor::set_time (samplepos_t sample)
AudioClock::print_minsec (sample, buf, sizeof (buf), _editor->_session->sample_rate());
break;
+ case AudioClock::Seconds:
+ snprintf (buf, sizeof(buf), "%.1f", sample / (float)_editor->_session->sample_rate());
+ break;
+
default:
snprintf (buf, sizeof(buf), "%" PRIi64, sample);
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());
break;
+ case AudioClock::Seconds:
+ snprintf (buf, sizeof(buf), "%.1f", (end - start) / (float)_editor->_session->sample_rate());
+ break;
+
default:
snprintf (buf, sizeof(buf), "%" PRIi64, end - start);
break;