first attempt at adding new SMPTE formats, moving SMPTE options to menu, adding video pullup selections, fixing SMPTE save/recall

git-svn-id: svn://localhost/ardour2/trunk@920 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Ben Loftis
2006-09-18 16:50:42 +00:00
parent ea6de825fa
commit da293df0dd
7 changed files with 301 additions and 65 deletions

View File

@@ -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/>

View File

@@ -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;

View File

@@ -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();
@@ -4137,6 +4149,87 @@ Editor::on_key_press_event (GdkEventKey* ev)
return key_press_focus_accelerator_handler (*this, 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 ()
{
@@ -4162,7 +4255,6 @@ Editor::update_layering_model ()
}
}
void
Editor::update_crossfade_model ()
{

View File

@@ -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 ();

View File

@@ -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);
@@ -492,6 +519,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)
{

View File

@@ -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,19 +339,9 @@ 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);
@@ -401,24 +362,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()
{

View File

@@ -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 ();