From 0964672cd9c561e2154c308df3c29bacd260e4ed Mon Sep 17 00:00:00 2001 From: YPozdnyakov Date: Fri, 8 May 2015 18:01:59 +0300 Subject: [PATCH] Merge branch 'LTC' Conflicts: gtk2_ardour/macosx/tracks.xcodeproj/project.pbxproj libs/ardour/ardour/engine_state_controller.h libs/ardour/ardour/session.h libs/ardour/ardour/slave.h libs/ardour/ltc_slave.cc libs/ardour/sse_avx_functions_64bit_win.s tools/windows_packaging/TracksLiveSetup/TracksLiveSetup/TracksLiveSetup.isl --- gtk2_ardour/ardour_ui.h | 5 + gtk2_ardour/ardour_ui_dialogs.cc | 4 +- gtk2_ardour/ardour_ui_ed.cc | 113 ++-- gtk2_ardour/ardour_ui_options.cc | 18 +- gtk2_ardour/icons/ltc_idle.png | Bin 0 -> 4080 bytes gtk2_ardour/icons/ltc_sync.png | Bin 0 -> 4422 bytes .../macosx/tracks.xcodeproj/project.pbxproj | 6 + gtk2_ardour/rc_option_editor.cc | 8 +- gtk2_ardour/rc_option_editor.h | 3 +- gtk2_ardour/tracks_control_panel.cc | 21 +- gtk2_ardour/tracks_control_panel.h | 20 +- gtk2_ardour/tracks_control_panel.logic.cc | 523 +++++++++++++++--- gtk2_ardour/tracks_control_panel.logic.h | 35 +- gtk2_ardour/ui/editor_window.xml | 12 + gtk2_ardour/ui/tracks_preferences.xml | 268 +++++++-- libs/ardour/ardour/engine_state_controller.h | 54 +- libs/ardour/ardour/session.h | 20 +- libs/ardour/ardour/slave.h | 2 + libs/ardour/engine_state_controller.cc | 149 ++++- libs/ardour/ltc_slave.cc | 11 + libs/ardour/session.cc | 27 +- libs/ardour/session_state.cc | 2 +- libs/ardour/session_transport.cc | 21 +- libs/ardour/utils.cc | 8 +- 24 files changed, 1118 insertions(+), 212 deletions(-) create mode 100644 gtk2_ardour/icons/ltc_idle.png create mode 100644 gtk2_ardour/icons/ltc_sync.png diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 9fabb6b413..bf8022f395 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -274,6 +274,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr void update_timecode_source_dropdown_items (); void set_mtc_indicator_active (bool set_active); void hide_mtc_indicator (); + void set_ltc_indicator_active (bool set_active); + void hide_ltc_indicator (); void update_bit_depth_button (); void update_sample_rate_dropdown (); @@ -809,6 +811,9 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr Gtk::Image* _mtc_idle_icon; Gtk::Image* _mtc_sync_icon; + + Gtk::Image* _ltc_idle_icon; + Gtk::Image* _ltc_sync_icon; /** A ProcessThread so that we have some thread-local buffers for use by * PluginEqGui::impulse_analysis (). diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc index 21369c9622..f318ee61e1 100644 --- a/gtk2_ardour/ardour_ui_dialogs.cc +++ b/gtk2_ardour/ardour_ui_dialogs.cc @@ -158,6 +158,8 @@ ARDOUR_UI::set_session (Session *s) _session->MTCSyncStateChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::set_mtc_indicator_active, this, _1), gui_context()); + _session->LTCSyncStateChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::set_ltc_indicator_active, this, _1), gui_context()); + _session->Xrun.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::xrun_handler, this, _1), gui_context()); _session->SoloActive.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::soloing_changed, this, _1), gui_context()); _session->AuditionActive.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::auditioning_changed, this, _1), gui_context()); @@ -165,7 +167,7 @@ ARDOUR_UI::set_session (Session *s) _session->locations()->removed.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::handle_locations_change, this, _1), gui_context()); _session->config.ParameterChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::session_parameter_changed, this, _1), gui_context ()); - _session->MTCInputPortChanged.connect(_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::update_timecode_source_dropdown_items, this), gui_context ()); + _session->MtcOrLtcInputPortChanged.connect(_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::update_timecode_source_dropdown_items, this), gui_context ()); /* Clocks are on by default after we are connected to a session, so show that here. */ diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index 6f51319688..c7a2c8bbc8 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -77,6 +77,7 @@ using namespace Glib; //recent session menuitem id static const std::string recent_session_menuitem_id="recent-session-"; + int ARDOUR_UI::create_editor () { @@ -96,6 +97,8 @@ ARDOUR_UI::create_editor () _timecode_source_dropdown = &editor->get_waves_dropdown("timecode_selector_dropdown"); _mtc_idle_icon = &editor->get_image("mtc_idle_icon"); _mtc_sync_icon = &editor->get_image("mtc_sync_icon"); + _ltc_idle_icon = &editor->get_image("ltc_idle_icon"); + _ltc_sync_icon = &editor->get_image("ltc_sync_icon"); _tracks_button = &editor->get_waves_button("tracks_button"); } @@ -149,6 +152,7 @@ ARDOUR_UI::populate_display_format_dropdown () _display_format_dropdown->set_text( format ); } + void ARDOUR_UI::populate_timecode_source_dropdown () { @@ -158,61 +162,80 @@ ARDOUR_UI::populate_timecode_source_dropdown () timecode_source.clear(); timecode_source.push_back("Internal"); timecode_source.push_back("MTC"); - - // GZ: Is Not available in current Waves TracksLive version - //timecode_source.push_back("LTC"); + timecode_source.push_back("LTC"); for(int i = 0; i < timecode_source.size(); ++i) { _timecode_source_dropdown->add_menu_item (timecode_source[i], &timecode_source[i]); } - if( !_session ) - return; - - bool use_external_timecode_source = _session->config.get_external_sync (); - - if (use_external_timecode_source) - { - if ( Config->get_sync_source() == MTC ) - _timecode_source_dropdown->set_text (timecode_source[1]);//"MTC" - - // GZ: LTC is not available in current version of Waves TracksLive - /* - else - _timecode_source_dropdown->set_text (timecode_source[2]);//"LTC" - */ - - } else { - _timecode_source_dropdown->set_text (timecode_source[0]);//Internal - } - - update_timecode_source_dropdown_items(); + update_timecode_source_dropdown_items (); } + void -ARDOUR_UI::update_timecode_source_dropdown_items() +ARDOUR_UI::update_timecode_source_dropdown_items () { + if (!_session) { return; } + // update visibility of dropdowm items Gtk::MenuItem* mtc_item = _timecode_source_dropdown->get_item ("MTC"); - if (mtc_item) { - if (_session->mtc_input_port()->connected() ) { - mtc_item->set_sensitive(true); + if (_session->mtc_input_port ()->connected () && Config->get_sync_source () == MTC ) { + mtc_item->set_visible (true); } else { - mtc_item->set_sensitive(false); + mtc_item->set_visible (false); } } + + Gtk::MenuItem* ltc_item = _timecode_source_dropdown->get_item ("LTC"); + if (ltc_item) { + if (_session->ltc_input_port ()->connected () && Config->get_sync_source () == LTC ) { + ltc_item->set_visible (true); + } else { + ltc_item->set_visible (false); + } + } + + // set appropriate dropdown item + bool use_external_timecode_source = _session->config.get_external_sync (); + + if (use_external_timecode_source) + { + // set appropriate indicator + switch (Config->get_sync_source()) { + case (MTC): + set_mtc_indicator_active (_session->synced_to_mtc() ); + _timecode_source_dropdown->set_current_item (1); + break; + case (LTC): + set_ltc_indicator_active (_session->synced_to_ltc() ); + _timecode_source_dropdown->set_current_item (2); + break; + default: + fatal << "ARDOUR_UI::update_timecode_source_dropdown_items - unsupported sync tool was used " << endmsg; + } + + } else { + // Internal timecode source is used - hide MTC and LTC indicator + hide_mtc_indicator (); + hide_ltc_indicator (); + _timecode_source_dropdown->set_current_item (0); //Internal + } } + void ARDOUR_UI::set_mtc_indicator_active (bool set_active) { - _mtc_sync_icon->set_visible (set_active); - _mtc_idle_icon->set_visible (!set_active); + // we should show just if MTC sync tool was chosen + if (_session->config.get_external_sync () && Config->get_sync_source() == MTC) { + _mtc_sync_icon->set_visible (set_active); + _mtc_idle_icon->set_visible (!set_active); + } } void @@ -222,6 +245,24 @@ ARDOUR_UI::hide_mtc_indicator () _mtc_idle_icon->set_visible (false); } +void +ARDOUR_UI::set_ltc_indicator_active (bool set_active) +{ + // we should show just if LTC sync tool was chosen + if (_session->config.get_external_sync () && Config->get_sync_source() == LTC) { + _ltc_sync_icon->set_visible (set_active); + _ltc_idle_icon->set_visible (!set_active); + } +} + +void +ARDOUR_UI::hide_ltc_indicator () +{ + _ltc_sync_icon->set_visible (false); + _ltc_idle_icon->set_visible (false); +} + + void ARDOUR_UI::on_time_info_box_mode_changed () { @@ -296,15 +337,11 @@ ARDOUR_UI::on_timecode_source_dropdown_item_clicked (WavesDropdown* dropdown, in _session->config.set_external_sync (false); } else if ( timecode_source == "MTC" ) { - Config->set_sync_source (MTC); + _session->config.set_external_sync (true); + } else if ( timecode_source == "LTC" ) + { _session->config.set_external_sync (true); } - // GZ: LTC is not available in current version of Waves TracksLive - /* else if ( timecode_source == "LTC" ) - { - Config->set_sync_source (LTC); - _session->config.set_external_sync (true); - } */ } void diff --git a/gtk2_ardour/ardour_ui_options.cc b/gtk2_ardour/ardour_ui_options.cc index dba3d6dc47..2fc2187dbd 100644 --- a/gtk2_ardour/ardour_ui_options.cc +++ b/gtk2_ardour/ardour_ui_options.cc @@ -313,8 +313,6 @@ ARDOUR_UI::parameter_changed (std::string p) ActionManager::get_action ("Transport", "ToggleAutoReturn")->set_sensitive (true); ActionManager::get_action ("Transport", "ToggleFollowEdits")->set_sensitive (true); - // Internal timecode source is used - hide MTC indicator - hide_mtc_indicator(); } else { // NO NEED TO HAVE IT: sync_button.set_text (sync_source_to_string (Config->get_sync_source(), true)); @@ -322,17 +320,11 @@ ARDOUR_UI::parameter_changed (std::string p) ActionManager::get_action ("Transport", "ToggleAutoPlay")->set_sensitive (false); ActionManager::get_action ("Transport", "ToggleAutoReturn")->set_sensitive (false); ActionManager::get_action ("Transport", "ToggleFollowEdits")->set_sensitive (false); - - if (MTC == Config->get_sync_source() ) { - // show MTC indicator, but in non lit mode - if (_session) { - set_mtc_indicator_active(_session->synced_to_mtc() ); - } - } - } - - populate_timecode_source_dropdown (); - } else if (p == "always-play-range") { + } + + update_timecode_source_dropdown_items (); + + } else if (p == "always-play-range") { ActionManager::map_some_state ("Transport", "ToggleFollowEdits", &RCConfiguration::get_follow_edits); diff --git a/gtk2_ardour/icons/ltc_idle.png b/gtk2_ardour/icons/ltc_idle.png new file mode 100644 index 0000000000000000000000000000000000000000..8b2167c91439f31a8d604e3cfa07640b98c12391 GIT binary patch literal 4080 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 literal 0 HcmV?d00001 diff --git a/gtk2_ardour/icons/ltc_sync.png b/gtk2_ardour/icons/ltc_sync.png new file mode 100644 index 0000000000000000000000000000000000000000..e4e93e926a47cebec9cb5b70a402ae5d6f06f544 GIT binary patch literal 4422 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 physical_inputs; physical_inputs.push_back (_("None")); AudioEngine::instance()->get_physical_inputs (DataType::AUDIO, physical_inputs); - _ltc_port->set_popdown_strings (physical_inputs); + _ltc_source_port->set_popdown_strings (physical_inputs); - add_option (_("Transport"), _ltc_port); + add_option (_("Transport"), _ltc_source_port); // TODO; rather disable this button than not compile it.. add_option (_("Transport"), new OptionEditorHeading (S_("LTC Generator"))); diff --git a/gtk2_ardour/rc_option_editor.h b/gtk2_ardour/rc_option_editor.h index 879a9c4464..0ff4c204c6 100644 --- a/gtk2_ardour/rc_option_editor.h +++ b/gtk2_ardour/rc_option_editor.h @@ -50,7 +50,8 @@ private: BoolOption* _sync_framerate; BoolOption* _sync_genlock; BoolOption* _sync_source_2997; - ComboStringOption* _ltc_port; + ComboStringOption* _mtc_source_port; + ComboStringOption* _ltc_source_port; HSliderOption* _ltc_volume_slider; Gtk::Adjustment* _ltc_volume_adjustment; BoolOption* _ltc_send_continuously; diff --git a/gtk2_ardour/tracks_control_panel.cc b/gtk2_ardour/tracks_control_panel.cc index 83c84d8cf4..af0a7fe88f 100644 --- a/gtk2_ardour/tracks_control_panel.cc +++ b/gtk2_ardour/tracks_control_panel.cc @@ -30,6 +30,10 @@ TracksControlPanel::TracksControlPanel () , _device_capture_list (get_v_box("device_capture_list")) , _device_playback_list (get_v_box("device_playback_list")) , _midi_device_list (get_v_box("midi_device_list")) + , _enable_ltc_generator_vbox (get_v_box("enable_ltc_generator_vbox")) + , _ltc_output_port_vbox (get_v_box("ltc_output_port_vbox")) + , _ltc_generator_level_vbox (get_v_box("ltc_generator_level_vbox")) + , _ltc_send_continuously_hbox (get_h_box("ltc_send_continuously_hbox")) , _all_inputs_on_button (get_waves_button("all_inputs_on_button")) , _all_inputs_off_button (get_waves_button("all_inputs_off_button")) , _all_outputs_on_button (get_waves_button("all_outputs_on_button")) @@ -38,27 +42,32 @@ TracksControlPanel::TracksControlPanel () , _midi_settings_tab (get_container ("midi_settings_tab")) , _session_settings_tab (get_container ("session_settings_tab")) , _general_settings_tab (get_container ("general_settings_tab")) + , _sync_settings_tab (get_container ("sync_settings_tab")) , _audio_settings_tab_button (get_waves_button ("audio_settings_tab_button")) , _midi_settings_tab_button (get_waves_button ("midi_settings_tab_button")) , _session_settings_tab_button (get_waves_button ("session_settings_tab_button")) , _general_settings_tab_button (get_waves_button ("general_settings_tab_button")) + , _sync_settings_tab_button (get_waves_button ("sync_settings_tab_button")) , _ok_button (get_waves_button ("ok_button")) , _cancel_button (get_waves_button ("cancel_button")) , _control_panel_button (get_waves_button ("control_panel_button")) , _no_button (get_waves_button ("no_button")) , _yes_button (get_waves_button ("yes_button")) + , _enable_ltc_generator_button (get_waves_button ("enable_ltc_generator_button")) + , _ltc_send_continuously_button (get_waves_button ("ltc_send_continuously_button")) , _engine_dropdown (get_waves_dropdown ("engine_dropdown")) , _device_dropdown (get_waves_dropdown ("device_dropdown")) , _sample_rate_dropdown (get_waves_dropdown ("sample_rate_dropdown")) , _buffer_size_dropdown (get_waves_dropdown ("buffer_size_dropdown")) - , _mtc_in_dropdown (get_waves_dropdown ("mtc_in")) - , _latency_label (get_label("latency_label")) + , _latency_label (get_label("latency_label")) , _default_open_path (get_label("default_open_path")) + , _ltc_generator_level_label (get_label("ltc_generator_level_label")) , _multi_out_button(get_waves_button ("multi_out_button")) , _stereo_out_button(get_waves_button ("stereo_out_button")) , _name_tracks_after_driver(get_waves_button ("name_tracks_after_driver_button")) , _reset_tracks_name_to_default(get_waves_button ("reset_tracks_name_to_default_button")) - , _color_adjustment(get_adjustment ("color_adjustment")) + , _color_adjustment (get_adjustment ("color_adjustment")) + , _ltc_generator_level_adjustment (get_adjustment ("ltc_generator_level_adjustment")) , _color_box(get_container ("color_box")) , _obey_mmc_commands_button (get_waves_button ("obey_mmc_commands_button")) , _send_mmc_commands_button (get_waves_button ("send_mmc_commands_button")) @@ -79,7 +88,11 @@ TracksControlPanel::TracksControlPanel () , _peak_hold_time_dropdown (get_waves_dropdown ("peak_hold_time_dropdown")) , _dpm_fall_off_dropdown (get_waves_dropdown ("dpm_fall_off_dropdown")) , _hard_disk_buffering_dropdown (get_waves_dropdown ("hard_disk_buffering_dropdown")) - + , _sync_tool_dropdown (get_waves_dropdown ("sync_tool_dropdown")) + , _mtc_in_dropdown (get_waves_dropdown ("mtc_in")) + , _ltc_in_dropdown (get_waves_dropdown ("ltc_in")) + , _ltc_out_dropdown (get_waves_dropdown ("ltc_out")) + , _sync_input_port_layout (get_layout ("sync_input_port_layout")) , _have_control (false) , _ignore_changes (0) { diff --git a/gtk2_ardour/tracks_control_panel.h b/gtk2_ardour/tracks_control_panel.h index 40c8dc5bcc..018be25295 100644 --- a/gtk2_ardour/tracks_control_panel.h +++ b/gtk2_ardour/tracks_control_panel.h @@ -48,6 +48,10 @@ class TracksControlPanel : public WavesDialog, public PBD::ScopedConnectionList Gtk::VBox& _device_capture_list; Gtk::VBox& _device_playback_list; Gtk::VBox& _midi_device_list; + Gtk::VBox& _enable_ltc_generator_vbox; + Gtk::VBox& _ltc_output_port_vbox; + Gtk::VBox& _ltc_generator_level_vbox; + Gtk::HBox& _ltc_send_continuously_hbox; WavesButton& _all_inputs_on_button; WavesButton& _all_inputs_off_button; WavesButton& _all_outputs_on_button; @@ -56,10 +60,12 @@ class TracksControlPanel : public WavesDialog, public PBD::ScopedConnectionList Gtk::Container& _midi_settings_tab; Gtk::Container& _session_settings_tab; Gtk::Container& _general_settings_tab; + Gtk::Container& _sync_settings_tab; WavesButton& _audio_settings_tab_button; WavesButton& _midi_settings_tab_button; WavesButton& _session_settings_tab_button; WavesButton& _general_settings_tab_button; + WavesButton& _sync_settings_tab_button; WavesButton& _multi_out_button; WavesButton& _stereo_out_button; WavesButton& _ok_button; @@ -71,11 +77,14 @@ class TracksControlPanel : public WavesDialog, public PBD::ScopedConnectionList WavesButton& _name_tracks_after_driver; WavesButton& _reset_tracks_name_to_default; Gtk::Adjustment& _color_adjustment; + Gtk::Adjustment& _ltc_generator_level_adjustment; Gtk::Container& _color_box; WavesButton& _obey_mmc_commands_button; WavesButton& _send_mmc_commands_button; WavesButton& _dc_bias_against_denormals_button; WavesButton& _copy_imported_files_button; + WavesButton& _enable_ltc_generator_button; + WavesButton& _ltc_send_continuously_button; Gtk::SpinButton& _inbound_mmc_device_spinbutton; Gtk::SpinButton& _outbound_mmc_device_spinbutton; Gtk::SpinButton& _limit_undo_history_spinbutton; @@ -84,7 +93,6 @@ class TracksControlPanel : public WavesDialog, public PBD::ScopedConnectionList WavesDropdown& _device_dropdown; WavesDropdown& _sample_rate_dropdown; WavesDropdown& _buffer_size_dropdown; - WavesDropdown& _mtc_in_dropdown; WavesDropdown& _file_type_dropdown; WavesDropdown& _bit_depth_dropdown; WavesDropdown& _frame_rate_dropdown; @@ -95,10 +103,16 @@ class TracksControlPanel : public WavesDialog, public PBD::ScopedConnectionList WavesDropdown& _peak_hold_time_dropdown; WavesDropdown& _dpm_fall_off_dropdown; WavesDropdown& _hard_disk_buffering_dropdown; - + WavesDropdown& _sync_tool_dropdown; + WavesDropdown& _mtc_in_dropdown; + WavesDropdown& _ltc_in_dropdown; + WavesDropdown& _ltc_out_dropdown; + Gtk::Label& _latency_label; Gtk::Label& _default_open_path; - + Gtk::Label& _ltc_generator_level_label; + + Gtk::Layout& _sync_input_port_layout; #include "tracks_control_panel.logic.h" }; diff --git a/gtk2_ardour/tracks_control_panel.logic.cc b/gtk2_ardour/tracks_control_panel.logic.cc index 490a496d2f..85c81c6464 100644 --- a/gtk2_ardour/tracks_control_panel.logic.cc +++ b/gtk2_ardour/tracks_control_panel.logic.cc @@ -82,6 +82,50 @@ namespace { }; typedef std::vector MidiDeviceDescriptorVec; + + void dropdown_element_data_cleaner (void* data) + { + free (data); + } + + // These functions are used for ltc generator + // transform db to ltc-output-volume + double db_to_volume (double db) + { + return pow (10, db / 20); + } + // ltc-output-volume to db + double volume_to_db (double volume) + { + return 20 * log10 (volume); + } + + + ARDOUR::SyncSource + SyncSourceTracks_to_SyncSource (int el_number) + { + switch (el_number) { + case TracksControlPanel::MTC: + return ARDOUR::MTC; + case TracksControlPanel::LTC: + return ARDOUR::LTC; + default: + fatal << "Wrong argument in converting from SyncSourceTracks to ARDOUR::SyncSource" << endmsg; + } + } + + TracksControlPanel::SyncSourceTracks + SyncSource_to_SyncSourceTracks (ARDOUR::SyncSource sync_source) + { + switch (sync_source) { + case ARDOUR::MTC: + return TracksControlPanel::MTC; + case ARDOUR::LTC: + return TracksControlPanel::LTC; + default: + fatal << "Wrong argument in converting from ARDOUR::SyncSource to TracksControlPanel::SyncSourceTracks" << endmsg; + } + } } void @@ -94,6 +138,7 @@ TracksControlPanel::init () _midi_settings_tab_button.signal_clicked.connect (sigc::mem_fun (*this, &TracksControlPanel::on_a_settings_tab_button_clicked)); _session_settings_tab_button.signal_clicked.connect (sigc::mem_fun (*this, &TracksControlPanel::on_a_settings_tab_button_clicked)); _general_settings_tab_button.signal_clicked.connect (sigc::mem_fun (*this, &TracksControlPanel::on_a_settings_tab_button_clicked)); + _sync_settings_tab_button.signal_clicked.connect (sigc::mem_fun (*this, &TracksControlPanel::on_a_settings_tab_button_clicked)); _all_inputs_on_button.signal_clicked.connect (sigc::mem_fun (*this, &TracksControlPanel::on_all_inputs_on_button)); _all_inputs_off_button.signal_clicked.connect (sigc::mem_fun (*this, &TracksControlPanel::on_all_inputs_off_button)); @@ -105,6 +150,9 @@ TracksControlPanel::init () _browse_button.signal_clicked.connect(sigc::mem_fun (*this, &TracksControlPanel::on_browse_button)); + _enable_ltc_generator_button.signal_clicked.connect (sigc::mem_fun (*this, &TracksControlPanel::on_enable_ltc_generator_button)); + _ltc_send_continuously_button.signal_clicked.connect (sigc::mem_fun (*this, &TracksControlPanel::on_ltc_send_continuously_button)); + EngineStateController::instance ()->EngineRunning.connect (running_connection, MISSING_INVALIDATOR, boost::bind (&TracksControlPanel::engine_running, this), gui_context()); EngineStateController::instance ()->EngineStopped.connect (stopped_connection, MISSING_INVALIDATOR, boost::bind (&TracksControlPanel::engine_stopped, this), gui_context()); EngineStateController::instance ()->EngineHalted.connect (stopped_connection, MISSING_INVALIDATOR, boost::bind (&TracksControlPanel::engine_stopped, this), gui_context()); @@ -118,7 +166,7 @@ TracksControlPanel::init () EngineStateController::instance()->MIDIInputConfigChanged.connect (update_connections, MISSING_INVALIDATOR, boost::bind (&TracksControlPanel::on_midi_input_configuration_changed, this), gui_context()); EngineStateController::instance()->MIDIOutputConfigChanged.connect (update_connections, MISSING_INVALIDATOR, boost::bind (&TracksControlPanel::on_midi_output_configuration_changed, this), gui_context()); EngineStateController::instance()->MTCInputChanged.connect (update_connections, MISSING_INVALIDATOR, boost::bind (&TracksControlPanel::on_mtc_input_changed, this, _1), gui_context()); - EngineStateController::instance()->DeviceError.connect (update_connections, MISSING_INVALIDATOR, boost::bind (&TracksControlPanel::on_device_error, this), gui_context()); + EngineStateController::instance()->DeviceError.connect (update_connections, MISSING_INVALIDATOR, boost::bind (&TracksControlPanel::on_device_error, this), gui_context ()); /* Global configuration parameters update */ Config->ParameterChanged.connect (update_connections, MISSING_INVALIDATOR, boost::bind (&TracksControlPanel::on_parameter_changed, this, _1), gui_context()); @@ -127,23 +175,28 @@ TracksControlPanel::init () _device_dropdown.selected_item_changed.connect (sigc::mem_fun(*this, &TracksControlPanel::on_device_dropdown_item_clicked)); _sample_rate_dropdown.selected_item_changed.connect (sigc::mem_fun(*this, &TracksControlPanel::on_sample_rate_dropdown_item_clicked)); _buffer_size_dropdown.selected_item_changed.connect (sigc::mem_fun(*this, &TracksControlPanel::on_buffer_size_dropdown_item_clicked)); - _mtc_in_dropdown.selected_item_changed.connect (sigc::mem_fun(*this, &TracksControlPanel::on_mtc_input_chosen)); + _mtc_in_dropdown.selected_item_changed.connect (sigc::mem_fun(*this, &TracksControlPanel::on_mtc_in_dropdown_changed)); + _ltc_in_dropdown.selected_item_changed.connect (sigc::mem_fun(*this, &TracksControlPanel::on_ltc_in_dropdown_changed)); + _sync_tool_dropdown.selected_item_changed.connect (sigc::mem_fun(*this, &TracksControlPanel::on_sync_tool_dropdown_changed)); + _ltc_out_dropdown.selected_item_changed.connect (sigc::mem_fun(*this, &TracksControlPanel::on_ltc_out_dropdown_changed)); + /* Session configuration parameters update */ _file_type_dropdown.selected_item_changed.connect (sigc::mem_fun(*this, &TracksControlPanel::on_file_type_dropdown_item_clicked)); _bit_depth_dropdown.selected_item_changed.connect (sigc::mem_fun(*this, &TracksControlPanel::on_bit_depth_dropdown_item_clicked)); _frame_rate_dropdown.selected_item_changed.connect (sigc::mem_fun (*this, &TracksControlPanel::on_frame_rate_item_clicked)); - _name_tracks_after_driver.signal_clicked.connect(sigc::mem_fun (*this, &TracksControlPanel::on_name_tracks_after_driver)); - _reset_tracks_name_to_default.signal_clicked.connect(sigc::mem_fun (*this, &TracksControlPanel::on_reset_tracks_name_to_default)); + _name_tracks_after_driver.signal_clicked.connect (sigc::mem_fun (*this, &TracksControlPanel::on_name_tracks_after_driver)); + _reset_tracks_name_to_default.signal_clicked.connect (sigc::mem_fun (*this, &TracksControlPanel::on_reset_tracks_name_to_default)); - _control_panel_button.signal_clicked.connect(sigc::mem_fun (*this, &TracksControlPanel::on_control_panel_button)); - _color_adjustment.signal_value_changed().connect (mem_fun (*this, &TracksControlPanel::color_adjustment_changed)); + _control_panel_button.signal_clicked.connect (sigc::mem_fun (*this, &TracksControlPanel::on_control_panel_button)); + _color_adjustment.signal_value_changed ().connect (mem_fun (*this, &TracksControlPanel::color_adjustment_changed)); + _ltc_generator_level_adjustment.signal_value_changed ().connect (mem_fun (*this, &TracksControlPanel::ltc_generator_level_adjustment_changed)); - _yes_button.signal_clicked.connect(sigc::mem_fun (*this, &TracksControlPanel::on_yes_button)); - _no_button.signal_clicked.connect(sigc::mem_fun (*this, &TracksControlPanel::on_no_button)); - _yes_button.set_visible(false); - _no_button.set_visible(false); + _yes_button.signal_clicked.connect (sigc::mem_fun (*this, &TracksControlPanel::on_yes_button)); + _no_button.signal_clicked.connect (sigc::mem_fun (*this, &TracksControlPanel::on_no_button)); + _yes_button.set_visible (false); + _no_button.set_visible (false); populate_engine_dropdown (); populate_device_dropdown (); @@ -160,19 +213,19 @@ TracksControlPanel::init () display_waveform_color_fader (); // Init session Settings - populate_bit_depth_dropdown(); - populate_frame_rate_dropdown(); - populate_auto_lock_timer_dropdown(); - populate_auto_save_timer_dropdown(); - populate_pre_record_buffer_dropdown(); + populate_bit_depth_dropdown (); + populate_frame_rate_dropdown (); + populate_auto_lock_timer_dropdown (); + populate_auto_save_timer_dropdown (); + populate_pre_record_buffer_dropdown (); show_buffer_duration (); - _audio_settings_tab_button.set_active(true); + _audio_settings_tab_button.set_active (true); display_general_preferences (); } -DeviceConnectionControl& TracksControlPanel::add_device_capture_control(std::string port_name, bool active, uint16_t capture_number, std::string track_name) +DeviceConnectionControl& TracksControlPanel::add_device_capture_control (std::string port_name, bool active, uint16_t capture_number, std::string track_name) { std::string device_capture_name(""); std::string pattern(audio_capture_name_prefix); @@ -206,7 +259,7 @@ DeviceConnectionControl& TracksControlPanel::add_device_playback_control(std::st return playback_control; } -MidiDeviceConnectionControl& TracksControlPanel::add_midi_device_control(const std::string& midi_device_name, +MidiDeviceConnectionControl& TracksControlPanel::add_midi_device_control (const std::string& midi_device_name, const std::string& capture_name, bool capture_active, const std::string& playback_name, bool playback_active) { @@ -644,7 +697,7 @@ TracksControlPanel::populate_engine_dropdown() } void -TracksControlPanel::populate_device_dropdown() +TracksControlPanel::populate_device_dropdown () { std::vector all_devices; EngineStateController::instance()->enumerate_devices (all_devices); @@ -729,41 +782,31 @@ TracksControlPanel::populate_buffer_size_dropdown() } void -TracksControlPanel::populate_mtc_in_dropdown() +TracksControlPanel::populate_mtc_in_dropdown () { std::vector midi_states; static const char* midi_port_name_prefix = "system_midi:"; const char* midi_type_suffix; - bool have_first = false; - EngineStateController::instance()->get_physical_midi_input_states(midi_states); - midi_type_suffix = X_(" capture"); + EngineStateController::instance ()->get_physical_midi_input_states (midi_states); + midi_type_suffix = X_ (" capture"); _mtc_in_dropdown.clear_items (); - Gtk::MenuItem& off_item = _mtc_in_dropdown.add_menu_item ("Off", 0); + _mtc_in_dropdown.add_menu_item ("Off", strdup (""), dropdown_element_data_cleaner); std::vector::const_iterator state_iter; - for (state_iter = midi_states.begin(); state_iter != midi_states.end(); ++state_iter) { + for (state_iter = midi_states.begin (); state_iter != midi_states.end (); ++state_iter) { // strip the device name from input port name std::string device_name; - ARDOUR::remove_pattern_from_string(state_iter->name, midi_port_name_prefix, device_name); - ARDOUR::remove_pattern_from_string(device_name, midi_type_suffix, device_name); + ARDOUR::remove_pattern_from_string (state_iter->name, midi_port_name_prefix, device_name); + ARDOUR::remove_pattern_from_string (device_name, midi_type_suffix, device_name); - if (state_iter->active) { - Gtk::MenuItem& new_item = _mtc_in_dropdown.add_menu_item (device_name, strdup(state_iter->name.c_str()) ); - - if (!have_first && state_iter->mtc_in) { - _mtc_in_dropdown.set_text (new_item.get_label() ); - have_first = true; - } - } + _mtc_in_dropdown.add_menu_item (device_name, strdup (state_iter->name.c_str()),dropdown_element_data_cleaner); } - if (!have_first) { - _mtc_in_dropdown.set_text (off_item.get_label() ); - } + display_mtc_in_source (); } void @@ -778,7 +821,7 @@ TracksControlPanel::populate_output_mode() void -TracksControlPanel::populate_input_channels() +TracksControlPanel::populate_input_channels () { cleanup_input_channels_list(); @@ -795,16 +838,15 @@ TracksControlPanel::populate_input_channels() std::string track_name; if (input_iter->active) { - - std::string port_name(""); - std::string pattern(audio_capture_name_prefix); - ARDOUR::remove_pattern_from_string(input_iter->name, pattern, port_name); + std::string port_name (""); + std::string pattern (audio_capture_name_prefix); + ARDOUR::remove_pattern_from_string (input_iter->name, pattern, port_name); number = number_count++; - if (Config->get_tracks_auto_naming() & UseDefaultNames) { + if (Config->get_tracks_auto_naming () & UseDefaultNames) { track_name = string_compose ("%1 %2", Session::default_trx_track_name_pattern, number); - } else if (Config->get_tracks_auto_naming() & NameAfterDriver) { + } else if (Config->get_tracks_auto_naming () & NameAfterDriver) { track_name = port_name; } } @@ -812,8 +854,31 @@ TracksControlPanel::populate_input_channels() add_device_capture_control (input_iter->name, input_iter->active, number, track_name); } - _all_inputs_on_button.set_sensitive(!input_states.empty() ); - _all_inputs_off_button.set_sensitive(!input_states.empty() ); + _all_inputs_on_button.set_sensitive (!input_states.empty () ); + _all_inputs_off_button.set_sensitive (!input_states.empty () ); + + // if list of audio-in ports was changed, list of ltc-in ports must be also changed + populate_ltc_in_dropdown (); +} + + +void +TracksControlPanel::populate_ltc_in_dropdown () +{ + _ltc_in_dropdown.clear_items (); + std::vector input_states; + EngineStateController::instance ()->get_physical_audio_input_states (input_states); + + std::vector::const_iterator input_iter; + + for (input_iter = input_states.begin(); input_iter != input_states.end (); ++input_iter ) { + std::string port_name (""); + std::string pattern (audio_capture_name_prefix); + ARDOUR::remove_pattern_from_string (input_iter->name, pattern, port_name); + _ltc_in_dropdown.add_menu_item (port_name, strdup (input_iter->name.c_str ()), dropdown_element_data_cleaner ); + } + + display_ltc_in_source (); } @@ -824,12 +889,12 @@ TracksControlPanel::populate_output_channels() // process captures (outputs) std::vector output_states; - EngineStateController::instance()->get_physical_audio_output_states(output_states); + EngineStateController::instance ()->get_physical_audio_output_states (output_states); std::vector::const_iterator output_iter; uint16_t number_count = 1; - for (output_iter = output_states.begin(); output_iter != output_states.end(); ++output_iter ) { + for (output_iter = output_states.begin (); output_iter != output_states.end(); ++output_iter ) { uint16_t number = DeviceConnectionControl::NoNumber; @@ -840,14 +905,37 @@ TracksControlPanel::populate_output_channels() add_device_playback_control (output_iter->name, output_iter->active, number); } - bool stereo_out_disabled = (Config->get_output_auto_connect() & AutoConnectPhysical); - _all_outputs_on_button.set_sensitive(!output_states.empty() && stereo_out_disabled ); - _all_outputs_off_button.set_sensitive(!output_states.empty() && stereo_out_disabled ); + bool stereo_out_disabled = (Config->get_output_auto_connect () & AutoConnectPhysical); + _all_outputs_on_button.set_sensitive(!output_states.empty () && stereo_out_disabled ); + _all_outputs_off_button.set_sensitive(!output_states.empty () && stereo_out_disabled ); + + // if the list of audio-out ports was changed, the list of ltc-out ports must be also changed + populate_ltc_out_dropdown (); } void -TracksControlPanel::populate_midi_ports() +TracksControlPanel::populate_ltc_out_dropdown () +{ + _ltc_out_dropdown.clear_items (); + std::vector output_states; + EngineStateController::instance ()->get_physical_audio_output_states (output_states); + + std::vector::const_iterator output_iter; + + for (output_iter = output_states.begin(); output_iter != output_states.end (); ++output_iter ) { + std::string port_name (""); + std::string pattern (audio_playback_name_prefix); + ARDOUR::remove_pattern_from_string (output_iter->name, pattern, port_name); + _ltc_out_dropdown.add_menu_item (port_name, strdup (output_iter->name.c_str ()), dropdown_element_data_cleaner); + } + + display_ltc_output_port (); +} + + +void +TracksControlPanel::populate_midi_ports () { cleanup_midi_device_list(); @@ -897,7 +985,7 @@ TracksControlPanel::populate_midi_ports() // now add midi device controls MidiDeviceDescriptorVec::iterator iter; for (iter = midi_device_descriptors.begin(); iter != midi_device_descriptors.end(); ++iter ) { - add_midi_device_control(iter->name, iter->capture_name, iter->capture_active, + add_midi_device_control (iter->name, iter->capture_name, iter->capture_active, iter->playback_name, iter->playback_active); } } @@ -1098,6 +1186,130 @@ TracksControlPanel::display_denormal_protection () _dc_bias_against_denormals_button.set_active_state (Config->get_denormal_protection () ? Gtkmm2ext::ExplicitActive : Gtkmm2ext::Off); } +void +TracksControlPanel::display_current_sync_tool () +{ + ARDOUR::SyncSource sync_tool_type = Config->get_sync_source (); + + _mtc_in_dropdown.set_visible (sync_tool_type == ARDOUR::MTC); + _ltc_in_dropdown.set_visible (sync_tool_type == ARDOUR::LTC + && !EngineStateController::instance ()->get_ltc_source_port ().empty ()); + _sync_input_port_layout.set_visible (_mtc_in_dropdown.get_visible () || _ltc_in_dropdown.get_visible ()); + + _sync_tool_dropdown.set_current_item (SyncSource_to_SyncSourceTracks (sync_tool_type)); +} + +void +TracksControlPanel::display_mtc_in_source () +{ + std::string mtc_in_source = EngineStateController::instance ()->get_mtc_source_port (); + + int size = _mtc_in_dropdown.get_menu ().items ().size (); + for (int i = 0; i < size; ++i) { + char* full_name_of_mtc_input_port = (char*) _mtc_in_dropdown.get_item_data_pv (i); + if (full_name_of_mtc_input_port && full_name_of_mtc_input_port == mtc_in_source ) { + _mtc_in_dropdown.set_current_item (i); + return ; + } + } +} + +void +TracksControlPanel::display_ltc_in_source () +{ + std::string ltc_in_source = EngineStateController::instance ()->get_ltc_source_port (); + + if (Config->get_sync_source () == ARDOUR::LTC) { + if (ltc_in_source.empty ()) { + _ltc_in_dropdown.set_visible (false); + _sync_input_port_layout.set_visible (false); + return ; + } else { + _ltc_in_dropdown.set_visible (true); + _sync_input_port_layout.set_visible (true); + } + } + + int size = _ltc_in_dropdown.get_menu ().items ().size (); + for (int i = 0; i < size; ++i) { + char* full_name_of_ltc_input_port = (char*) _ltc_in_dropdown.get_item_data_pv (i); + if (full_name_of_ltc_input_port && full_name_of_ltc_input_port == ltc_in_source ) { + _ltc_in_dropdown.set_current_item (i); + return ; + } + } +} + +void +TracksControlPanel::display_ltc_output_port () +{ + // get the list of audio output + std::vector output_states; + EngineStateController::instance ()->get_physical_audio_output_states (output_states); + + if (output_states.empty ()) { + // no output audio port + ltc_output_settings_set_visible (false); + return ; + } else { + ltc_output_settings_set_visible (true); + } + + std::string ltc_output_port = EngineStateController::instance ()->get_ltc_output_port (); + + int size = _ltc_out_dropdown.get_menu ().items ().size (); + for (int i = 0; i < size; ++i) { + char* full_name_of_ltc_output_port = (char*) _ltc_out_dropdown.get_item_data_pv (i); + if (full_name_of_ltc_output_port && full_name_of_ltc_output_port == ltc_output_port ) { + _ltc_out_dropdown.set_current_item (i); + return ; + } + } +} + +void +TracksControlPanel::display_enable_ltc_generator () +{ + _enable_ltc_generator_button.set_active_state (Config->get_send_ltc () ? Gtkmm2ext::ExplicitActive : Gtkmm2ext::Off); + + // if generator is enabled - show its settings + ltc_generator_settings_set_visible (Config->get_send_ltc ()); +} + +void +TracksControlPanel::display_ltc_send_continuously () +{ + _ltc_send_continuously_button.set_active_state (Config->get_ltc_send_continuously () ? Gtkmm2ext::ExplicitActive : Gtkmm2ext::Off); +} + +void +TracksControlPanel::display_ltc_generator_level_fader () +{ + double generator_level_in_db = volume_to_db (Config->get_ltc_output_volume ()); + _ltc_generator_level_adjustment.set_value (generator_level_in_db); + + std::ostringstream ss; + ss << std::fixed << std::setprecision (1) << generator_level_in_db; + _ltc_generator_level_label.set_text (ss.str ()); +} + + +void +TracksControlPanel::ltc_output_settings_set_visible (bool visible) +{ + _enable_ltc_generator_vbox.set_visible (visible); + _ltc_output_port_vbox.set_visible (visible); + // show generator settings only if it's enabled + ltc_generator_settings_set_visible (visible && Config->get_send_ltc ()); +} + +void +TracksControlPanel::ltc_generator_settings_set_visible (bool visible) +{ + _ltc_send_continuously_hbox.set_visible (visible); + _ltc_generator_level_vbox.set_visible (visible); +} + void TracksControlPanel::display_general_preferences () @@ -1115,6 +1327,10 @@ TracksControlPanel::display_general_preferences () display_history_depth (); display_saved_history_depth (); display_denormal_protection (); + display_current_sync_tool (); + display_enable_ltc_generator (); + display_ltc_send_continuously (); + display_ltc_generator_level_fader (); } #define RGB_TO_UINT(r,g,b) ((((guint)(r))<<16)|(((guint)(g))<<8)|((guint)(b))) @@ -1202,7 +1418,7 @@ TracksControlPanel::save_general_preferences () dbg_msg ("TracksControlPanel::general_preferences ():\nUnexpected meter fall off time!"); break; } - + Config->set_mmc_control (_obey_mmc_commands_button.active_state () == Gtkmm2ext::ExplicitActive); Config->set_send_mmc (_send_mmc_commands_button.active_state () == Gtkmm2ext::ExplicitActive); Config->set_only_copy_imported_files (_copy_imported_files_button.active_state () == Gtkmm2ext::ExplicitActive); @@ -1232,8 +1448,8 @@ void TracksControlPanel::on_engine_dropdown_item_clicked (WavesDropdown*, int) if ( EngineStateController::instance()->set_new_backend_as_current (backend_name) ) { - _have_control = EngineStateController::instance()->is_setup_required (); - populate_device_dropdown(); + _have_control = EngineStateController::instance ()->is_setup_required (); + populate_device_dropdown (); return; } @@ -1274,15 +1490,17 @@ void TracksControlPanel::device_changed () { if (_ignore_changes) { - return; + return ; } std::string device_name = _device_dropdown.get_text (); - if (EngineStateController::instance()->set_new_device_as_current(device_name) ) + if (EngineStateController::instance()->set_new_device_as_current (device_name) ) { - populate_buffer_size_dropdown(); - populate_sample_rate_dropdown(); - return; + populate_buffer_size_dropdown (); + populate_sample_rate_dropdown (); + // disable LTC generator in case of device change + set_ltc_generator_status (false); + return ; } { @@ -1296,6 +1514,7 @@ TracksControlPanel::device_changed () set_keep_above (true); } + void TracksControlPanel::on_all_inputs_on_button(WavesButton*) { @@ -1398,6 +1617,13 @@ TracksControlPanel::on_frame_rate_item_clicked (WavesDropdown*, int) std::string s = _frame_rate_dropdown.get_text(); Timecode::TimecodeFormat timecode_format = string_to_TimecodeFormat(s); + // HOT FIX + // in case of fps change + // set Internal mode + if (_session) { + _session->config.set_external_sync (false); + } + ARDOUR_UI* ardour_ui = ARDOUR_UI::instance(); ardour_ui->set_timecode_format(timecode_format); } @@ -1435,7 +1661,7 @@ TracksControlPanel::on_sample_rate_dropdown_item_clicked (WavesDropdown*, int) } framecnt_t new_sample_rate = get_sample_rate (); - if ( EngineStateController::instance()->set_new_sample_rate_in_controller(new_sample_rate) ) { + if ( EngineStateController::instance()->set_new_sample_rate_in_controller (new_sample_rate) ) { EngineStateController::instance()->push_current_state_to_backend (false); } else { @@ -1446,25 +1672,131 @@ TracksControlPanel::on_sample_rate_dropdown_item_clicked (WavesDropdown*, int) std::string sample_rate_str = ARDOUR_UI_UTILS::rate_as_string (EngineStateController::instance()->get_current_sample_rate() ); WavesMessageDialog msg("", _("Sample rate set to the value which is not supported")); msg.run(); - _sample_rate_dropdown.set_text(sample_rate_str); + _sample_rate_dropdown.set_text (sample_rate_str); } - show_buffer_duration(); + show_buffer_duration (); } void -TracksControlPanel::on_mtc_input_chosen (WavesDropdown* dropdown, int el_number) +TracksControlPanel::on_mtc_in_dropdown_changed (WavesDropdown* dropdown, int el_number) { - char* full_name_of_chosen_port = (char*)dropdown->get_item_data_pv(el_number); + mtc_in_dropdown_change (el_number); +} + +void +TracksControlPanel::mtc_in_dropdown_change (int el_number) +{ + char* full_name_of_chosen_port = (char*)_mtc_in_dropdown.get_item_data_pv (el_number); + + if (full_name_of_chosen_port) { + if (full_name_of_chosen_port == EngineStateController::instance ()->get_mtc_source_port ()) { + return ; + } + + EngineStateController::instance ()->set_mtc_source_port (full_name_of_chosen_port); + } else { + EngineStateController::instance ()->set_mtc_source_port (""); + } +} + +void +TracksControlPanel::on_ltc_in_dropdown_changed (WavesDropdown* dropdown, int el_number) +{ + ltc_in_dropdown_change (el_number); +} + +void +TracksControlPanel::ltc_in_dropdown_change (int el_number) +{ + char* full_name_of_chosen_port = (char*)_ltc_in_dropdown.get_item_data_pv (el_number); + + if (full_name_of_chosen_port) { + if (full_name_of_chosen_port == EngineStateController::instance ()->get_ltc_source_port ()) { + return ; + } + + EngineStateController::instance ()->set_ltc_source_port (full_name_of_chosen_port); + } else { + EngineStateController::instance ()->set_ltc_source_port (""); + } +} + +void +TracksControlPanel::on_ltc_out_dropdown_changed (WavesDropdown* dropdown, int el_number) +{ + char* full_name_of_chosen_port = (char*)_ltc_out_dropdown.get_item_data_pv (el_number); if (full_name_of_chosen_port) { - EngineStateController::instance()->set_mtc_input((char*) full_name_of_chosen_port); + if (full_name_of_chosen_port == EngineStateController::instance ()->get_ltc_output_port ()) { + return ; + } + EngineStateController::instance ()->set_ltc_output_port (full_name_of_chosen_port); } else { - EngineStateController::instance()->set_mtc_input(""); + EngineStateController::instance ()->set_ltc_output_port (""); } - } +void +TracksControlPanel::on_sync_tool_dropdown_changed (WavesDropdown* dropdown, int el_number) +{ + ARDOUR::SyncSource sync_tool = SyncSourceTracks_to_SyncSource (el_number); + if (sync_tool != Config->get_sync_source ()) { + + if (_session) { + // set Internal mode in case of sync tool change + _session->config.set_external_sync (false); + } + + Config->set_sync_source (sync_tool); + + switch (el_number) { + + case (TracksControlPanel::MTC): + EngineStateController::instance()-> set_ltc_source_port (""); + mtc_in_dropdown_change (0); + break; + + case (TracksControlPanel::LTC): + EngineStateController::instance()-> set_mtc_source_port (""); + ltc_in_dropdown_change (0); + break; + + default: + return ; + } + } +} + + +void +TracksControlPanel::on_enable_ltc_generator_button (WavesButton*) +{ + set_ltc_generator_status (_enable_ltc_generator_button.active_state () == Gtkmm2ext::ExplicitActive); +} + +void +TracksControlPanel::set_ltc_generator_status (bool status) +{ + Config->set_send_ltc (status); +} + + +void +TracksControlPanel::on_ltc_send_continuously_button (WavesButton*) +{ + Config->set_ltc_send_continuously (_ltc_send_continuously_button.active_state () == Gtkmm2ext::ExplicitActive); +} + + +void +TracksControlPanel::ltc_generator_level_adjustment_changed () +{ + double generator_level_in_db = _ltc_generator_level_adjustment.get_value (); // -50..0 + Config->set_ltc_output_volume (db_to_volume (generator_level_in_db)); +} + + void TracksControlPanel::engine_running () { @@ -1496,6 +1828,10 @@ TracksControlPanel::on_a_settings_tab_button_clicked (WavesButton* clicked_butto visible = (&_general_settings_tab_button == clicked_button); _general_settings_tab.set_visible (visible); _general_settings_tab_button.set_active(visible); + + visible = (&_sync_settings_tab_button == clicked_button); + _sync_settings_tab.set_visible (visible); + _sync_settings_tab_button.set_active(visible); } void @@ -1518,6 +1854,11 @@ TracksControlPanel::show_and_open_tab (int tab_id) visible = (tab_id == PreferencesTab); _general_settings_tab.set_visible (visible); _general_settings_tab_button.set_active(visible); + + visible = (tab_id == SyncTab); + _sync_settings_tab.set_visible (visible); + _sync_settings_tab_button.set_active(visible); + } void @@ -1595,7 +1936,8 @@ TracksControlPanel::save_pre_record_buffer() ARDOUR_UI::config()->set_pre_record_buffer(time); } -void TracksControlPanel::update_session_config () +void +TracksControlPanel::update_session_config () { ARDOUR_UI* ardour_ui = ARDOUR_UI::instance(); @@ -1689,37 +2031,42 @@ TracksControlPanel::on_key_press_event (GdkEventKey* ev) return WavesDialog::on_key_press_event (ev); } -void TracksControlPanel::on_capture_active_changed(DeviceConnectionControl* capture_control, bool active) +void +TracksControlPanel::on_capture_active_changed(DeviceConnectionControl* capture_control, bool active) { const char * id_name = (char*)capture_control->get_data(DeviceConnectionControl::id_name); EngineStateController::instance()->set_physical_audio_input_state(id_name, active); } -void TracksControlPanel::on_playback_active_changed(DeviceConnectionControl* playback_control, bool active) +void +TracksControlPanel::on_playback_active_changed(DeviceConnectionControl* playback_control, bool active) { const char * id_name = (char*)playback_control->get_data(DeviceConnectionControl::id_name); EngineStateController::instance()->set_physical_audio_output_state(id_name, active); } -void TracksControlPanel::on_midi_capture_active_changed(MidiDeviceConnectionControl* control, bool active) +void +TracksControlPanel::on_midi_capture_active_changed(MidiDeviceConnectionControl* control, bool active) { const char * id_name = (char*)control->get_data(MidiDeviceConnectionControl::capture_id_name); EngineStateController::instance()->set_physical_midi_input_state(id_name, active); } -void TracksControlPanel::on_midi_playback_active_changed(MidiDeviceConnectionControl* control, bool active) +void +TracksControlPanel::on_midi_playback_active_changed(MidiDeviceConnectionControl* control, bool active) { const char * id_name = (char*)control->get_data(MidiDeviceConnectionControl::playback_id_name); EngineStateController::instance()->set_physical_midi_output_state(id_name, active); } -void TracksControlPanel::on_port_registration_update() +void +TracksControlPanel::on_port_registration_update () { - populate_input_channels(); - populate_output_channels(); - populate_midi_ports(); - populate_mtc_in_dropdown(); + populate_input_channels (); + populate_output_channels (); + populate_midi_ports (); + populate_mtc_in_dropdown (); } void @@ -1782,6 +2129,18 @@ TracksControlPanel::on_parameter_changed (const std::string& parameter_name) display_saved_history_depth (); } else if (parameter_name == "waveform fill") { display_waveform_color_fader (); + } else if (parameter_name == "ltc-source-port") { + display_ltc_in_source (); + } else if (parameter_name == "sync-source") { + display_current_sync_tool (); + } else if (parameter_name == "ltc-output-port") { + display_ltc_output_port (); + } else if (parameter_name == "send-ltc") { + display_enable_ltc_generator (); + } else if (parameter_name == "ltc-send-continuously") { + display_ltc_send_continuously (); + } else if (parameter_name == "ltc-output-volume") { + display_ltc_generator_level_fader (); } } @@ -1879,7 +2238,7 @@ TracksControlPanel::on_midi_input_configuration_changed () } } - populate_mtc_in_dropdown(); + populate_mtc_in_dropdown (); } void @@ -1908,7 +2267,7 @@ TracksControlPanel::on_midi_output_configuration_changed () void TracksControlPanel::on_mtc_input_changed (const std::string&) { - // add actions here + display_mtc_in_source (); } std::string diff --git a/gtk2_ardour/tracks_control_panel.logic.h b/gtk2_ardour/tracks_control_panel.logic.h index b0904b5350..7e3cf584a8 100644 --- a/gtk2_ardour/tracks_control_panel.logic.h +++ b/gtk2_ardour/tracks_control_panel.logic.h @@ -24,10 +24,16 @@ AudioSystemSettingsTab, MIDISystemSettingsTab, SessionSettingsTab, - PreferencesTab + PreferencesTab, + SyncTab }; void show_and_open_tab (int); + enum SyncSourceTracks { // as we use these values in XML let's define them explicitely for easy reading. + MTC = 0, + LTC = 1 + }; + private: // attributes @@ -84,18 +90,30 @@ void buffer_size_changed (); void on_buffer_size_dropdown_item_clicked (WavesDropdown*, int); void on_sample_rate_dropdown_item_clicked (WavesDropdown*, int); - void on_mtc_input_chosen (WavesDropdown*, int); void engine_running (); void engine_stopped (); void on_file_type_dropdown_item_clicked (WavesDropdown*, int); void on_bit_depth_dropdown_item_clicked (WavesDropdown*, int); void on_frame_rate_item_clicked (WavesDropdown*, int); - void populate_engine_dropdown (); + void on_mtc_in_dropdown_changed (WavesDropdown*, int); + void mtc_in_dropdown_change (int); + void on_ltc_in_dropdown_changed (WavesDropdown*, int); + void ltc_in_dropdown_change (int); + void on_sync_tool_dropdown_changed (WavesDropdown*, int); + void on_ltc_out_dropdown_changed (WavesDropdown*, int); + void on_ltc_send_continuously_button (WavesButton*); + void set_ltc_generator_status (bool); + void on_enable_ltc_generator_button (WavesButton*); + void ltc_generator_level_adjustment_changed (); + + void populate_engine_dropdown (); void populate_device_dropdown (); void populate_sample_rate_dropdown (); void populate_buffer_size_dropdown (); void populate_mtc_in_dropdown (); + void populate_ltc_in_dropdown (); + void populate_ltc_out_dropdown (); void populate_output_mode (); void populate_input_channels(); void populate_output_channels(); @@ -129,6 +147,14 @@ void reject (); // Merged ARDOUR's preferences + void display_current_sync_tool (); + void display_ltc_in_source (); + void display_mtc_in_source (); + void display_ltc_output_port (); + void display_enable_ltc_generator (); + void display_ltc_send_continuously (); + void display_ltc_generator_level_fader (); + void display_waveform_shape (); void display_meter_hold (); void display_meter_falloff (); @@ -144,6 +170,9 @@ void display_general_preferences (); void save_general_preferences (); + void ltc_output_settings_set_visible (bool); + void ltc_generator_settings_set_visible (bool); + void cleanup_input_channels_list(); void cleanup_output_channels_list(); void cleanup_midi_device_list(); diff --git a/gtk2_ardour/ui/editor_window.xml b/gtk2_ardour/ui/editor_window.xml index cd6080944b..4e0d43b4fe 100644 --- a/gtk2_ardour/ui/editor_window.xml +++ b/gtk2_ardour/ui/editor_window.xml @@ -178,6 +178,18 @@ y="4" visible="false" noshowall="true"/> + + + +