X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Faudio_clock.cc;h=c27015801f9bffb2f9aec6d8cf433c3808ccc225;hb=f93ca1349ce3d56ecd9b90c1b6e88971d46d9952;hp=43862c9d0b4bcb72ca5941004a00bfa112bccf98;hpb=bb457bb960c5bd7ed538f9d31477293415739f68;p=ardour.git diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc index 43862c9d0b..c27015801f 100644 --- a/gtk2_ardour/audio_clock.cc +++ b/gtk2_ardour/audio_clock.cc @@ -28,6 +28,7 @@ #include #include #include +#include #include #include "ardour_ui.h" @@ -73,7 +74,8 @@ AudioClock::AudioClock (std::string clock_name, bool transient, std::string widg colon4 (":"), colon5 (":"), b1 ("|"), - b2 ("|") + b2 ("|"), + last_when(0) { session = 0; last_when = 0; @@ -82,7 +84,8 @@ AudioClock::AudioClock (std::string clock_name, bool transient, std::string widg key_entry_state = 0; ops_menu = 0; dragging = false; - + bbt_reference_time = -1; + if (with_info) { frames_upper_info_label = manage (new Label); frames_lower_info_label = manage (new Label); @@ -101,6 +104,9 @@ AudioClock::AudioClock (std::string clock_name, bool transient, std::string widg Gtkmm2ext::set_size_request_to_display_given_text(*smpte_upper_info_label, "23.98",0,0); Gtkmm2ext::set_size_request_to_display_given_text(*smpte_lower_info_label, "NDF",0,0); + Gtkmm2ext::set_size_request_to_display_given_text(*bbt_upper_info_label, "88|88",0,0); + Gtkmm2ext::set_size_request_to_display_given_text(*bbt_lower_info_label, "888.88",0,0); + frames_info_box.pack_start (*frames_upper_info_label, true, true); frames_info_box.pack_start (*frames_lower_info_label, true, true); smpte_info_box.pack_start (*smpte_upper_info_label, true, true); @@ -499,15 +505,21 @@ AudioClock::set_frames (nframes_t when, bool force) sprintf (buf, "%.3fK", rate/1000.0f); } - frames_upper_info_label->set_text (buf); + if (frames_upper_info_label->get_text() != buf) { + frames_upper_info_label->set_text (buf); + } float vid_pullup = Config->get_video_pullup(); if (vid_pullup == 0.0) { - frames_lower_info_label->set_text(_("none")); + if (frames_lower_info_label->get_text () != _("none")) { + frames_lower_info_label->set_text(_("none")); + } } else { sprintf (buf, "%-6.4f", vid_pullup); - frames_lower_info_label->set_text (buf); + if (frames_lower_info_label->get_text() != buf) { + frames_lower_info_label->set_text (buf); + } } } } @@ -597,7 +609,9 @@ AudioClock::set_smpte (nframes_t when, bool force) sprintf (buf, "%.2f", smpte_frames); } - smpte_upper_info_label->set_text (buf); + if (smpte_upper_info_label->get_text() != buf) { + smpte_upper_info_label->set_text (buf); + } if ((fabs(smpte_frames - 29.97) < 0.0001) || smpte_frames == 30) { if (session->smpte_drop_frames()) { @@ -610,7 +624,9 @@ AudioClock::set_smpte (nframes_t when, bool force) buf[0] = '\0'; } - smpte_lower_info_label->set_text (buf); + if (smpte_lower_info_label->get_text() != buf) { + smpte_lower_info_label->set_text (buf); + } } } @@ -620,20 +636,53 @@ AudioClock::set_bbt (nframes_t when, bool force) char buf[16]; BBT_Time bbt; - session->tempo_map().bbt_time (when, bbt); + /* handle a common case */ + if (is_duration) { + if (when == 0) { + bbt.bars = 0; + bbt.beats = 0; + bbt.ticks = 0; + } else { + session->tempo_map().bbt_time (when, bbt); + bbt.bars--; + bbt.beats--; + } + } else { + session->tempo_map().bbt_time (when, bbt); + } + sprintf (buf, "%03" PRIu32, bbt.bars); - bars_label.set_text (buf); + if (force || bars_label.get_text () != buf) { + bars_label.set_text (buf); + } sprintf (buf, "%02" PRIu32, bbt.beats); - beats_label.set_text (buf); + if (force || beats_label.get_text () != buf) { + beats_label.set_text (buf); + } sprintf (buf, "%04" PRIu32, bbt.ticks); - ticks_label.set_text (buf); + if (force || ticks_label.get_text () != buf) { + ticks_label.set_text (buf); + } if (bbt_upper_info_label) { - TempoMap::Metric m (session->tempo_map().metric_at (when)); + nframes64_t pos; + + if (bbt_reference_time < 0) { + pos = when; + } else { + pos = bbt_reference_time; + } + + TempoMap::Metric m (session->tempo_map().metric_at (pos)); + sprintf (buf, "%-5.2f", m.tempo().beats_per_minute()); - bbt_lower_info_label->set_text (buf); + if (bbt_lower_info_label->get_text() != buf) { + bbt_lower_info_label->set_text (buf); + } sprintf (buf, "%g|%g", m.meter().beats_per_bar(), m.meter().note_divisor()); - bbt_upper_info_label->set_text (buf); + if (bbt_upper_info_label->get_text() != buf) { + bbt_upper_info_label->set_text (buf); + } } } @@ -793,13 +842,15 @@ AudioClock::field_key_release_event (GdkEventKey *ev, Field field) break; case GDK_Tab: + case GDK_Return: + case GDK_KP_Enter: move_on = true; break; case GDK_Escape: - case GDK_Return: - case GDK_KP_Enter: + key_entry_state = 0; clock_base.grab_focus (); + ChangeAborted(); /* EMIT SIGNAL */ return true; default: @@ -854,11 +905,12 @@ AudioClock::field_key_release_event (GdkEventKey *ev, Field field) case Bars: case Beats: case Ticks: - // Bars or beats should never be 0 - if (atoi(bars_label.get_text()) == 0) { + // Bars should never be, unless this clock is for a duration + if (atoi(bars_label.get_text()) == 0 && !is_duration) { bars_label.set_text("001"); } - if (atoi(beats_label.get_text()) == 0) { + // beats should never be 0, unless this clock is for a duration + if (atoi(beats_label.get_text()) == 0 && !is_duration) { beats_label.set_text("01"); } break; @@ -924,6 +976,13 @@ AudioClock::field_key_release_event (GdkEventKey *ev, Field field) } + //if user hit Enter, lose focus + switch (ev->keyval) { + case GDK_Return: + case GDK_KP_Enter: + clock_base.grab_focus (); + } + return true; } @@ -1843,6 +1902,11 @@ AudioClock::bbt_frame_from_display (nframes_t pos) const any.bbt.beats = atoi (beats_label.get_text()); any.bbt.ticks = atoi (ticks_label.get_text()); + if (is_duration) { + any.bbt.bars++; + any.bbt.beats++; + } + nframes_t ret = session->convert_to_frames_at (pos, any); return ret; @@ -1881,7 +1945,9 @@ AudioClock::build_ops_menu () MenuList& ops_items = ops_menu->items(); ops_menu->set_name ("ArdourContextMenu"); - ops_items.push_back (MenuElem (_("Timecode"), bind (mem_fun(*this, &AudioClock::set_mode), SMPTE))); + if (!Profile->get_sae()) { + ops_items.push_back (MenuElem (_("Timecode"), bind (mem_fun(*this, &AudioClock::set_mode), SMPTE))); + } ops_items.push_back (MenuElem (_("Bars:Beats"), bind (mem_fun(*this, &AudioClock::set_mode), BBT))); ops_items.push_back (MenuElem (_("Minutes:Seconds"), bind (mem_fun(*this, &AudioClock::set_mode), MinSec))); ops_items.push_back (MenuElem (_("Samples"), bind (mem_fun(*this, &AudioClock::set_mode), Frames))); @@ -1938,6 +2004,7 @@ AudioClock::set_mode (Mode m) if (!is_transient) { ModeChanged (); /* EMIT SIGNAL */ + mode_changed (); /* EMIT SIGNAL */ } } @@ -1976,3 +2043,9 @@ AudioClock::set_size_requests () } } + +void +AudioClock::set_bbt_reference (nframes64_t pos) +{ + bbt_reference_time = pos; +}