diff options
-rw-r--r-- | gtk2_ardour/ardour.menus | 24 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui_options.cc | 2 | ||||
-rw-r--r-- | gtk2_ardour/editor.cc | 100 | ||||
-rw-r--r-- | gtk2_ardour/editor.h | 10 | ||||
-rw-r--r-- | gtk2_ardour/editor_actions.cc | 171 | ||||
-rw-r--r-- | gtk2_ardour/option_editor.cc | 57 | ||||
-rw-r--r-- | gtk2_ardour/option_editor.h | 2 |
7 files changed, 301 insertions, 65 deletions
diff --git a/gtk2_ardour/ardour.menus b/gtk2_ardour/ardour.menus index 3aa9507d69..aa6424b8b9 100644 --- a/gtk2_ardour/ardour.menus +++ b/gtk2_ardour/ardour.menus @@ -214,6 +214,30 @@ <menuitem action='FileHeaderFormatCAF'/> </menu> </menu> + <menu action='SMPTE'> + <menuitem action='Smpte23976'/> + <menuitem action='Smpte24'/> + <menuitem action='Smpte24976'/> + <menuitem action='Smpte25'/> + <menuitem action='Smpte2997drop'/> + <menuitem action='Smpte2997'/> + <menuitem action='Smpte30drop'/> + <menuitem action='Smpte30'/> + <menuitem action='Smpte5994'/> + <menuitem action='Smpte60'/> + </menu> + <menu action='Pullup'> + <menuitem action='PullupPlus4Plus1'/> + <menuitem action='PullupPlus4'/> + <menuitem action='PullupPlus4Minus1'/> + <menuitem action='PullupPlus1'/> + <menuitem action='PullupNone'/> + <menuitem action='PullupMinus1'/> + <menuitem action='PullupMinus4Plus1'/> + <menuitem action='PullupMinus4'/> + <menuitem action='PullupMinus4Minus1'/> + </menu> + <separator/> <menu action='Autoconnect'> <menuitem action='AutoConnectNewTrackInputsToHardware'/> <separator/> diff --git a/gtk2_ardour/ardour_ui_options.cc b/gtk2_ardour/ardour_ui_options.cc index 205180a344..21afbcde21 100644 --- a/gtk2_ardour/ardour_ui_options.cc +++ b/gtk2_ardour/ardour_ui_options.cc @@ -463,6 +463,7 @@ ARDOUR_UI::setup_session_options () session_control_changed (Session::AutoReturn); session_control_changed (Session::AutoInput); session_control_changed (Session::Clicking); + session_control_changed (Session::SmpteMode); session->ControlChanged.connect (mem_fun (*this, &ARDOUR_UI::queue_session_control_changed)); } @@ -555,7 +556,6 @@ ARDOUR_UI::session_control_changed (Session::ControlType t) case Session::CrossfadingModel: break; - case Session::AutoPlay: map_some_session_state ("Transport", "ToggleAutoPlay", &Session::get_auto_play); break; diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 6b8fc782dc..0729533f76 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -700,6 +700,7 @@ Editor::Editor (AudioEngine& eng) ControlProtocol::ZoomIn.connect (bind (mem_fun (*this, &Editor::temporal_zoom_step), false)); ControlProtocol::ZoomOut.connect (bind (mem_fun (*this, &Editor::temporal_zoom_step), true)); ControlProtocol::ScrollTimeline.connect (mem_fun (*this, &Editor::control_scroll)); + constructed = true; instant_save (); @@ -1025,6 +1026,10 @@ Editor::session_control_changed (Session::ControlType t) update_layering_model (); break; + case Session::SmpteMode: + update_smpte_mode (); + break; + default: break; } @@ -1171,6 +1176,9 @@ Editor::connect_to_session (Session *t) session_connections.push_back (session->SMPTEOffsetChanged.connect (mem_fun(*this, &Editor::update_just_smpte))); session_connections.push_back (session->SMPTETypeChanged.connect (mem_fun(*this, &Editor::update_just_smpte))); + session_connections.push_back (session->SMPTETypeChanged.connect (mem_fun(*this, &Editor::update_smpte_mode))); + session_connections.push_back (session->PullupChanged.connect (mem_fun(*this, &Editor::update_video_pullup))); + session_connections.push_back (session->tempo_map().StateChanged.connect (mem_fun(*this, &Editor::tempo_map_changed))); edit_groups_changed (); @@ -1258,9 +1266,12 @@ Editor::connect_to_session (Session *t) } /* xfade visibility state set from editor::set_state() */ - - update_crossfade_model (); - update_layering_model (); + + update_crossfade_model(); + update_layering_model(); + + update_smpte_mode(); + update_video_pullup(); handle_new_duration (); @@ -4084,6 +4095,7 @@ Editor::restore_editing_space () { mouse_mode_tearoff->set_visible (true); tools_tearoff->set_visible (true); + edit_pane.set_position (pre_maximal_pane_position); unfullscreen(); @@ -4138,6 +4150,87 @@ Editor::on_key_press_event (GdkEventKey* ev) } void +Editor::update_smpte_mode () +{ + ENSURE_GUI_THREAD(mem_fun(*this, &Editor::update_smpte_mode)); + + RefPtr<Action> act; + + float frames = session->smpte_frames_per_second; + bool drop = session->smpte_drop_frames; + + if ((frames < 23.976 * 1.0005) && !drop) + act = ActionManager::get_action (X_("Editor"), X_("Smpte23976")); + else if ((frames < 24 * 1.0005) && !drop) + act = ActionManager::get_action (X_("Editor"), X_("Smpte24")); + else if ((frames < 24.976 * 1.0005) && !drop) + act = ActionManager::get_action (X_("Editor"), X_("Smpte24976")); + else if ((frames < 25 * 1.0005) && !drop) + act = ActionManager::get_action (X_("Editor"), X_("Smpte25")); + else if ((frames < 29.97 * 1.0005) && !drop) + act = ActionManager::get_action (X_("Editor"), X_("Smpte2997")); + else if ((frames < 29.97 * 1.0005) && drop) + act = ActionManager::get_action (X_("Editor"), X_("Smpte2997drop")); + else if ((frames < 30 * 1.0005) && !drop) + act = ActionManager::get_action (X_("Editor"), X_("Smpte30")); + else if ((frames < 30 * 1.0005) && drop) + act = ActionManager::get_action (X_("Editor"), X_("Smpte30drop")); + else if ((frames < 59.94 * 1.0005) && !drop) + act = ActionManager::get_action (X_("Editor"), X_("Smpte5994")); + else if ((frames < 60 * 1.0005) && !drop) + act = ActionManager::get_action (X_("Editor"), X_("Smpte60")); + else + cerr << "Unexpected SMPTE value (" << frames << (drop ? "drop" : "") << ") in update_smpte_mode. Menu is probably wrong\n" << endl; + + + if (act) { + RefPtr<RadioAction> ract = RefPtr<RadioAction>::cast_dynamic(act); + if (ract && !ract->get_active()) { + ract->set_active (true); + } + } +} + +void +Editor::update_video_pullup () +{ + ENSURE_GUI_THREAD (mem_fun(*this, &Editor::update_video_pullup)); + + RefPtr<Action> act; + + float pullup = session->video_pullup; + + if ( pullup < (-4.1667 - 0.1) * 0.99) { + act = ActionManager::get_action (X_("Editor"), X_("PullupMinus4Minus1")); + } else if ( pullup < (-4.1667) * 0.99 ) { + act = ActionManager::get_action (X_("Editor"), X_("PullupMinus4")); + } else if ( pullup < (-4.1667 + 0.1) * 0.99 ) { + act = ActionManager::get_action (X_("Editor"), X_("PullupMinus4Plus1")); + } else if ( pullup < (-0.1) * 0.99 ) { + act = ActionManager::get_action (X_("Editor"), X_("PullupMinus1")); + } else if (pullup > (4.1667 + 0.1) * 0.99 ) { + act = ActionManager::get_action (X_("Editor"), X_("PullupPlus4Plus1")); + } else if ( pullup > (4.1667) * 0.99 ) { + act = ActionManager::get_action (X_("Editor"), X_("PullupPlus4")); + } else if ( pullup > (4.1667 - 0.1) * 0.99) { + act = ActionManager::get_action (X_("Editor"), X_("PullupPlus4Minus1")); + } else if ( pullup > (0.1) * 0.99 ) { + act = ActionManager::get_action (X_("Editor"), X_("PullupPlus1")); + } else + act = ActionManager::get_action (X_("Editor"), X_("PullupNone")); + + + if (act) { + RefPtr<RadioAction> ract = RefPtr<RadioAction>::cast_dynamic(act); + if (ract && !ract->get_active()) { + ract->set_active (true); + } + } + +} + + +void Editor::update_layering_model () { RefPtr<Action> act; @@ -4162,7 +4255,6 @@ Editor::update_layering_model () } } - void Editor::update_crossfade_model () { diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 226cdfb532..dacfde8327 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -301,6 +301,14 @@ class Editor : public PublicEditor void set_meter_falloff (int); void set_meter_hold (int32_t); + /* SMPTE timecode & video sync */ + + void smpte_fps_chosen (ARDOUR::Session::SmpteFormat format); + void video_pullup_chosen (ARDOUR::Session::PullupFormat pullup); + + void update_smpte_mode(); + void update_video_pullup(); + /* xfades */ void toggle_auto_xfade (); @@ -310,8 +318,8 @@ class Editor : public PublicEditor void update_crossfade_model (); void set_crossfade_model (ARDOUR::CrossfadeModel); - /* layers */ + /* layers */ void set_layer_model (ARDOUR::Session::LayerModel); void update_layering_model (); diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index 65195ca822..f1b9ef4b83 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -39,6 +39,8 @@ Editor::register_actions () ActionManager::register_action (editor_actions, X_("Monitoring"), _("Monitoring")); ActionManager::register_action (editor_actions, X_("Autoconnect"), _("Autoconnect")); ActionManager::register_action (editor_actions, X_("Layering"), _("Layering")); + ActionManager::register_action (editor_actions, X_("SMPTE"), _("SMPTE fps")); + ActionManager::register_action (editor_actions, X_("Pullup"), _("Pullup / Pulldown")); ActionManager::register_action (editor_actions, X_("Metering"), _("Metering")); ActionManager::register_action (editor_actions, X_("MeteringFallOffRate"), _("Fall off rate")); ActionManager::register_action (editor_actions, X_("MeteringHoldTime"), _("Hold Time")); @@ -393,6 +395,31 @@ Editor::register_actions () ActionManager::register_radio_action (editor_actions, layer_model_group, X_("LayerMoveAddHigher"), _("Most Recently Moved/Added is Higher"), bind (mem_fun (*this, &Editor::set_layer_model), Session::MoveAddHigher)); ActionManager::register_radio_action (editor_actions, layer_model_group, X_("LayerAddHigher"), _("Most Recently Added is Higher"), bind (mem_fun (*this, &Editor::set_layer_model), Session::AddHigher)); + RadioAction::Group smpte_group; + + ActionManager::register_radio_action (editor_actions, smpte_group, X_("Smpte23976"), _("23.976"), bind (mem_fun (*this, &Editor::smpte_fps_chosen), Session::smpte_23976)); + ActionManager::register_radio_action (editor_actions, smpte_group, X_("Smpte24"), _("24"), bind (mem_fun (*this, &Editor::smpte_fps_chosen), Session::smpte_24)); + ActionManager::register_radio_action (editor_actions, smpte_group, X_("Smpte24976"), _("24.976"), bind (mem_fun (*this, &Editor::smpte_fps_chosen), Session::smpte_24976)); + ActionManager::register_radio_action (editor_actions, smpte_group, X_("Smpte25"), _("25"), bind (mem_fun (*this, &Editor::smpte_fps_chosen), Session::smpte_25)); + ActionManager::register_radio_action (editor_actions, smpte_group, X_("Smpte2997"), _("29.97"), bind (mem_fun (*this, &Editor::smpte_fps_chosen), Session::smpte_2997)); + ActionManager::register_radio_action (editor_actions, smpte_group, X_("Smpte2997drop"), _("29.97 drop"), bind (mem_fun (*this, &Editor::smpte_fps_chosen), Session::smpte_2997drop)); + ActionManager::register_radio_action (editor_actions, smpte_group, X_("Smpte30"), _("30"), bind (mem_fun (*this, &Editor::smpte_fps_chosen), Session::smpte_30)); + ActionManager::register_radio_action (editor_actions, smpte_group, X_("Smpte30drop"), _("30 drop"), bind (mem_fun (*this, &Editor::smpte_fps_chosen), Session::smpte_30drop)); + ActionManager::register_radio_action (editor_actions, smpte_group, X_("Smpte5994"), _("59.94"), bind (mem_fun (*this, &Editor::smpte_fps_chosen), Session::smpte_5994)); + ActionManager::register_radio_action (editor_actions, smpte_group, X_("Smpte60"), _("60"), bind (mem_fun (*this, &Editor::smpte_fps_chosen), Session::smpte_60)); + + RadioAction::Group pullup_group; + + ActionManager::register_radio_action (editor_actions, pullup_group, X_("PullupPlus4Plus1"), _("+4.1667% + 0.1%"), bind (mem_fun (*this, &Editor::video_pullup_chosen), Session::pullup_Plus4Plus1)); + ActionManager::register_radio_action (editor_actions, pullup_group, X_("PullupPlus4"), _("+4.1667%"), bind (mem_fun (*this, &Editor::video_pullup_chosen), Session::pullup_Plus4)); + ActionManager::register_radio_action (editor_actions, pullup_group, X_("PullupPlus4Minus1"), _("+4.1667% - 0.1%"), bind (mem_fun (*this, &Editor::video_pullup_chosen), Session::pullup_Plus4Minus1)); + ActionManager::register_radio_action (editor_actions, pullup_group, X_("PullupPlus1"), _("+ 0.1%"), bind (mem_fun (*this, &Editor::video_pullup_chosen), Session::pullup_Plus1)); + ActionManager::register_radio_action (editor_actions, pullup_group, X_("PullupNone"), _("None"), bind (mem_fun (*this, &Editor::video_pullup_chosen), Session::pullup_None)); + ActionManager::register_radio_action (editor_actions, pullup_group, X_("PullupMinus1"), _("- 0.1%"), bind (mem_fun (*this, &Editor::video_pullup_chosen), Session::pullup_Minus1)); + ActionManager::register_radio_action (editor_actions, pullup_group, X_("PullupMinus4Plus1"), _("-4.1667% + 0.1%"), bind (mem_fun (*this, &Editor::video_pullup_chosen), Session::pullup_Minus4Plus1)); + ActionManager::register_radio_action (editor_actions, pullup_group, X_("PullupMinus4"), _("-4.1667%"), bind (mem_fun (*this, &Editor::video_pullup_chosen), Session::pullup_Minus4)); + ActionManager::register_radio_action (editor_actions, pullup_group, X_("PullupMinus4Minus1"), _("-4.1667% - 0.1%"), bind (mem_fun (*this, &Editor::video_pullup_chosen), Session::pullup_Minus4Minus1)); + ActionManager::add_action_group (rl_actions); ActionManager::add_action_group (zoom_actions); ActionManager::add_action_group (mouse_mode_actions); @@ -493,6 +520,150 @@ Editor::set_layer_model (Session::LayerModel model) } void +Editor::smpte_fps_chosen (Session::SmpteFormat format) +{ + /* this is driven by a toggle on a radio group, and so is invoked twice, + once for the item that became inactive and once for the one that became + active. + */ + + if (session) { + + float fps = 10; + bool drop = false; + + RefPtr<Action> act; + + switch (format) { + case Session::smpte_23976: { + fps=23.976; + drop = false; + act = ActionManager::get_action (X_("Editor"), X_("Smpte23976")); + } break; + case Session::smpte_24: { + fps=24; + drop = false; + act = ActionManager::get_action (X_("Editor"), X_("Smpte24")); + } break; + case Session::smpte_24976: { + fps=24.976; + drop = false; + act = ActionManager::get_action (X_("Editor"), X_("Smpte24976")); + } break; + case Session::smpte_25: { + fps=25; + drop = false; + act = ActionManager::get_action (X_("Editor"), X_("Smpte25")); + } break; + case Session::smpte_2997: { + fps=29.97; + drop = false; + act = ActionManager::get_action (X_("Editor"), X_("Smpte2997")); + } break; + case Session::smpte_2997drop: { + fps=29.97; + drop = true; + act = ActionManager::get_action (X_("Editor"), X_("Smpte2997drop")); + } break; + case Session::smpte_30: { + fps=30; + drop = false; + act = ActionManager::get_action (X_("Editor"), X_("Smpte30")); + } break; + case Session::smpte_30drop: { + fps=30; + drop = true; + act = ActionManager::get_action (X_("Editor"), X_("Smpte30drop")); + } break; + case Session::smpte_5994: { + fps=59.94; + drop = false; + act = ActionManager::get_action (X_("Editor"), X_("Smpte5994")); + } break; + case Session::smpte_60: { + fps=60; + drop = false; + act = ActionManager::get_action (X_("Editor"), X_("Smpte60")); + } break; + default: + cerr << "Editor received unexpected smpte type" << endl; + } + + if (act) { + RefPtr<RadioAction> ract = RefPtr<RadioAction>::cast_dynamic(act); + if (ract && ract->get_active()) { + session->set_smpte_type (fps, drop); + } + } + } +} + +void +Editor::video_pullup_chosen (Session::PullupFormat pullup) +{ + /* this is driven by a toggle on a radio group, and so is invoked twice, + once for the item that became inactive and once for the one that became + active. + */ + + if (session) { + + RefPtr<Action> act; + + float pull = 0.0; + + switch (pullup) { + case Session::pullup_Plus4Plus1:{ + pull = 4.1667 + 0.1; + act = ActionManager::get_action (X_("Editor"), X_("PullupPlus4Plus1")); + } break; + case Session::pullup_Plus4:{ + pull = 4.1667; + act = ActionManager::get_action (X_("Editor"), X_("PullupPlus4")); + } break; + case Session::pullup_Plus4Minus1:{ + pull = 4.1667 - 0.1; + act = ActionManager::get_action (X_("Editor"), X_("PullupPlus4Minus1")); + } break; + case Session::pullup_Plus1:{ + pull = 0.1; + act = ActionManager::get_action (X_("Editor"), X_("PullupPlus1")); + } break; + case Session::pullup_None:{ + pull = 0.0; + act = ActionManager::get_action (X_("Editor"), X_("PullupNone")); + } break; + case Session::pullup_Minus1:{ + pull = -0.1; + act = ActionManager::get_action (X_("Editor"), X_("PullupMinus1")); + } break; + case Session::pullup_Minus4Plus1:{ + pull = -4.1667 + 0.1; + act = ActionManager::get_action (X_("Editor"), X_("PullupMinus4Plus1")); + } break; + case Session::pullup_Minus4:{ + pull = -4.1667; + act = ActionManager::get_action (X_("Editor"), X_("PullupMinus4")); + } break; + case Session::pullup_Minus4Minus1:{ + pull = -4.1667 - 0.1; + act = ActionManager::get_action (X_("Editor"), X_("PullupMinus4Minus1")); + } break; + default: + cerr << "Session received unexpected pullup type" << endl; + } + + if (act) { + RefPtr<RadioAction> ract = RefPtr<RadioAction>::cast_dynamic(act); + if (ract && ract->get_active()) { + session->set_video_pullup ( pull ); + } + } else cerr << "Editor::video_pullup_chosen could not find action to match pullup." << endl; + } +} + + +void Editor::set_crossfade_model (CrossfadeModel model) { RefPtr<Action> act; diff --git a/gtk2_ardour/option_editor.cc b/gtk2_ardour/option_editor.cc index b7fc7e746e..013761a86a 100644 --- a/gtk2_ardour/option_editor.cc +++ b/gtk2_ardour/option_editor.cc @@ -152,7 +152,6 @@ OptionEditor::set_session (Session *s) click_emphasis_path_entry.set_sensitive (false); session_raid_entry.set_sensitive (false); - smpte_fps_combo.set_sensitive (false); short_xfade_slider.set_sensitive (false); smpte_offset_negative_button.set_sensitive (false); @@ -165,28 +164,9 @@ OptionEditor::set_session (Session *s) click_path_entry.set_sensitive (true); click_emphasis_path_entry.set_sensitive (true); session_raid_entry.set_sensitive (true); - smpte_fps_combo.set_sensitive (true); short_xfade_slider.set_sensitive (true); smpte_offset_negative_button.set_sensitive (true); - if (!s->smpte_drop_frames) { - // non-drop frames - if (s->smpte_frames_per_second == 24.0) - smpte_fps_combo.set_active_text (_("24 FPS")); - else if (s->smpte_frames_per_second == 25.0) - smpte_fps_combo.set_active_text (_("25 FPS")); - else if (s->smpte_frames_per_second == 30.0) - smpte_fps_combo.set_active_text (_("30 FPS")); - else - smpte_fps_combo.set_active_text (_("???")); - } else { - // drop frames - if (floor(s->smpte_frames_per_second) == 29.0) - smpte_fps_combo.set_active_text (_("30 FPS drop")); - else - smpte_fps_combo.set_active_text (_("???")); - } - smpte_offset_clock.set_session (s); smpte_offset_clock.set (s->smpte_offset (), true); @@ -352,15 +332,6 @@ OptionEditor::setup_sync_options () HBox* hbox; vector<string> dumb; - dumb.clear (); - dumb.push_back (X_("24 FPS")); - dumb.push_back (X_("25 FPS")); - dumb.push_back (X_("30 FPS drop")); - dumb.push_back (X_("30 FPS non-drop")); - - set_popdown_strings (smpte_fps_combo, dumb); - smpte_fps_combo.signal_changed().connect (mem_fun(*this, &OptionEditor::smpte_fps_chosen)); - smpte_offset_clock.set_mode (AudioClock::SMPTE); smpte_offset_clock.ValueChanged.connect (mem_fun(*this, &OptionEditor::smpte_offset_chosen)); @@ -368,22 +339,12 @@ OptionEditor::setup_sync_options () smpte_offset_negative_button.unset_flags (Gtk::CAN_FOCUS); - Label *smpte_fps_label = manage (new Label (_("SMPTE Frames/second"))); Label *smpte_offset_label = manage (new Label (_("SMPTE Offset"))); - smpte_fps_label->set_name("OptionsLabel"); smpte_offset_label->set_name("OptionsLabel"); hbox = manage (new HBox); hbox->set_border_width (5); hbox->set_spacing (10); - hbox->pack_start (*smpte_fps_label, false, false); - hbox->pack_start (smpte_fps_combo, false, false); - - sync_packer.pack_start (*hbox, false, false); - - hbox = manage (new HBox); - hbox->set_border_width (5); - hbox->set_spacing (10); hbox->pack_start (*smpte_offset_label, false, false); hbox->pack_start (smpte_offset_clock, false, false); hbox->pack_start (smpte_offset_negative_button, false, false); @@ -402,24 +363,6 @@ OptionEditor::smpte_offset_negative_clicked () } void -OptionEditor::smpte_fps_chosen () -{ - if (session) { - string str = smpte_fps_combo.get_active_text(); - - if (str == X_("24 FPS")) { - session->set_smpte_type (24.0, false); - } else if (str == X_("25 FPS")) { - session->set_smpte_type (25.0, false); - } else if (str == X_("30 FPS drop")) { - session->set_smpte_type (29.97, true); - } else if (str == X_("30 FPS non-drop")) { - session->set_smpte_type (30.0, false); - } - } -} - -void OptionEditor::smpte_offset_chosen() { if (session) { diff --git a/gtk2_ardour/option_editor.h b/gtk2_ardour/option_editor.h index 1331d3126e..d3235164a6 100644 --- a/gtk2_ardour/option_editor.h +++ b/gtk2_ardour/option_editor.h @@ -100,13 +100,11 @@ class OptionEditor : public Gtk::Dialog Gtk::VBox sync_packer; Gtk::ComboBoxText slave_type_combo; - Gtk::ComboBoxText smpte_fps_combo; AudioClock smpte_offset_clock; Gtk::CheckButton smpte_offset_negative_button; void setup_sync_options (); - void smpte_fps_chosen (); void smpte_offset_chosen (); void smpte_offset_negative_clicked (); |