X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Faudio_clock.cc;h=8c24f429984e87ee89a637d9518fccb4cb2f8d70;hb=1315ee3dff1e4966ab28bd47e81b5f003cac6e40;hp=87a6257fee1f59abe99a93b770ade76b79a0b527;hpb=9f2164b4f3b030177a229ddc3e87eb431af1bd54;p=ardour.git diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc index 87a6257fee..8c24f42998 100644 --- a/gtk2_ardour/audio_clock.cc +++ b/gtk2_ardour/audio_clock.cc @@ -15,13 +15,13 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #include // for sprintf #include #include +#include #include @@ -40,10 +40,14 @@ using namespace ARDOUR; using namespace PBD; using namespace sigc; using namespace Gtk; +using namespace std; using PBD::atoi; using PBD::atof; +sigc::signal AudioClock::ModeChanged; +vector AudioClock::clocks; + const uint32_t AudioClock::field_length[(int) AudioClock::AudioFrames+1] = { 2, /* SMPTE_Hours */ 2, /* SMPTE_Minutes */ @@ -58,8 +62,10 @@ const uint32_t AudioClock::field_length[(int) AudioClock::AudioFrames+1] = { 10 /* Audio Frame */ }; -AudioClock::AudioClock (std::string name, bool allow_edit, bool duration, bool with_info) - : is_duration (duration), +AudioClock::AudioClock (std::string clock_name, bool transient, std::string widget_name, bool allow_edit, bool duration, bool with_info) + : _name (clock_name), + is_transient (transient), + is_duration (duration), editable (allow_edit), colon1 (":"), colon2 (":"), @@ -71,6 +77,8 @@ AudioClock::AudioClock (std::string name, bool allow_edit, bool duration, bool w { session = 0; last_when = 0; + last_pdelta = 0; + last_sdelta = 0; key_entry_state = 0; ops_menu = 0; dragging = false; @@ -90,6 +98,9 @@ AudioClock::AudioClock (std::string name, bool allow_edit, bool duration, bool w bbt_upper_info_label->set_name ("AudioClockBBTUpperInfo"); bbt_lower_info_label->set_name ("AudioClockBBTLowerInfo"); + 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); + 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); @@ -174,7 +185,7 @@ AudioClock::AudioClock (std::string name, bool allow_edit, bool duration, bool w clock_frame.add (clock_base); - set_name (name); + set_widget_name (widget_name); _mode = BBT; /* lie to force mode switch */ set_mode (SMPTE); @@ -202,10 +213,14 @@ AudioClock::AudioClock (std::string name, bool allow_edit, bool duration, bool w } set (last_when, true); + + if (!is_transient) { + clocks.push_back (this); + } } void -AudioClock::set_name (string name) +AudioClock::set_widget_name (string name) { Widget::set_name (name); @@ -370,17 +385,40 @@ AudioClock::on_realize () } void -AudioClock::set (nframes_t when, bool force) +AudioClock::set (nframes_t when, bool force, nframes_t offset, char which) { if ((!force && !is_visible()) || session == 0) { return; } - if (when == last_when && !force) { + if (when == last_when && !offset && !force) { return; } + bool pdelta = Config->get_primary_clock_delta_edit_cursor(); + bool sdelta = Config->get_secondary_clock_delta_edit_cursor(); + + if (offset && which == 'p' && pdelta) { + when = (when > offset) ? when - offset : offset - when; + } else if (offset && which == 's' && sdelta) { + when = (when > offset) ? when - offset : offset - when; + } + + if (which == 'p' && pdelta && !last_pdelta) { + set_widget_name("TransportClockDisplayDelta"); + last_pdelta = true; + } else if (which == 'p' && !pdelta && last_pdelta) { + set_widget_name("TransportClockDisplay"); + last_pdelta = false; + } else if (which == 's' && sdelta && !last_sdelta) { + set_widget_name("SecondaryClockDisplayDelta"); + last_sdelta = true; + } else if (which == 's' && !sdelta && last_sdelta) { + set_widget_name("SecondaryClockDisplay"); + last_sdelta = false; + } + switch (_mode) { case SMPTE: set_smpte (when, force); @@ -530,17 +568,17 @@ AudioClock::set_smpte (nframes_t when, bool force) } if (smpte_upper_info_label) { - float smpte_frames = Config->get_smpte_frames_per_second(); + double smpte_frames = session->smpte_frames_per_second(); if ( fmod(smpte_frames, 1.0) == 0.0) { - sprintf (buf, "%u", int (smpte_frames)); + sprintf (buf, "%u", int (smpte_frames)); } else { sprintf (buf, "%.2f", smpte_frames); } smpte_upper_info_label->set_text (buf); - if (Config->get_smpte_drop_frames()) { + if (session->smpte_drop_frames()) { sprintf (buf, "DF"); } else { sprintf (buf, "NDF"); @@ -579,6 +617,18 @@ AudioClock::set_session (Session *s) session = s; if (s) { + + XMLProperty* prop; + XMLNode* node = session->extra_xml (X_("ClockModes")); + AudioClock::Mode amode; + + if (node) { + if ((prop = node->property (_name)) != 0) { + amode = AudioClock::Mode (string_2_enum (prop->value(), amode)); + set_mode (amode); + } + } + set (last_when, true); } } @@ -742,6 +792,17 @@ AudioClock::field_key_release_event (GdkEventKey *ev, Field field) // Check SMPTE fields for sanity (may also adjust fields) smpte_sanitize_display(); break; + case Bars: + case Beats: + case Ticks: + // Bars or beats should never be 0 + if (atoi(bars_label.get_text()) == 0) { + bars_label.set_text("001"); + } + if (atoi(beats_label.get_text()) == 0) { + beats_label.set_text("01"); + } + break; default: break; } @@ -1037,39 +1098,6 @@ AudioClock::field_button_press_event (GdkEventButton *ev, Field field) return FALSE; break; - case 4: - if (Keyboard::modifier_state_equals (ev->state, Keyboard::Shift)) { - frames = get_frames (field); - if (frames != 0) { - if (Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) { - frames *= 10; - } - set (current_time() + frames, true); - ValueChanged (); /* EMIT_SIGNAL */ - } - } - break; - - case 5: - if (Keyboard::modifier_state_equals (ev->state, Keyboard::Shift)) { - frames = get_frames (field); - if (frames != 0) { - if (Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) { - frames *= 10; - } - - if ((double)current_time() - (double)frames < 0.0) { - set (0, true); - } - else { - set (current_time() - frames, true); - } - - ValueChanged (); /* EMIT_SIGNAL */ - } - } - break; - default: return FALSE; break; @@ -1194,7 +1222,7 @@ AudioClock::get_frames (Field field,nframes_t pos,int dir) frames = session->frame_rate(); break; case SMPTE_Frames: - frames = (nframes_t) floor (session->frame_rate() / Config->get_smpte_frames_per_second()); + frames = (nframes_t) floor (session->frame_rate() / session->smpte_frames_per_second()); break; case AudioFrames: @@ -1302,7 +1330,7 @@ AudioClock::smpte_sanitize_display() seconds_label.set_text("59"); } - switch ((long)rint(Config->get_smpte_frames_per_second())) { + switch ((long)rint(session->smpte_frames_per_second())) { case 24: if (atoi(frames_label.get_text()) > 23) { frames_label.set_text("23"); @@ -1322,7 +1350,7 @@ AudioClock::smpte_sanitize_display() break; } - if (Config->get_smpte_drop_frames()) { + if (session->smpte_drop_frames()) { if ((atoi(minutes_label.get_text()) % 10) && (atoi(seconds_label.get_text()) == 0) && (atoi(frames_label.get_text()) < 2)) { frames_label.set_text("02"); } @@ -1343,6 +1371,8 @@ AudioClock::smpte_frame_from_display () const smpte.minutes = atoi (minutes_label.get_text()); smpte.seconds = atoi (seconds_label.get_text()); smpte.frames = atoi (frames_label.get_text()); + smpte.rate = session->smpte_frames_per_second(); + smpte.drop= session->smpte_drop_frames(); session->smpte_to_sample( smpte, sample, false /* use_offset */, false /* use_subframes */ ); @@ -1856,6 +1886,10 @@ AudioClock::set_mode (Mode m) set (last_when, true); clock_base.show_all (); key_entry_state = 0; + + if (!is_transient) { + ModeChanged (); /* EMIT SIGNAL */ + } } void