2 Copyright (C) 2001-2011 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include "gtk2ardour-config.h"
24 #include <boost/algorithm/string.hpp>
26 #include <gtkmm/liststore.h>
27 #include <gtkmm/stock.h>
28 #include <gtkmm/scale.h>
30 #include <gtkmm2ext/utils.h>
31 #include <gtkmm2ext/slider_controller.h>
32 #include <gtkmm2ext/gtk_ui.h>
33 #include <gtkmm2ext/paths_dialog.h>
38 #include "ardour/audioengine.h"
39 #include "ardour/dB.h"
40 #include "ardour/rc_configuration.h"
41 #include "ardour/control_protocol_manager.h"
42 #include "ardour/plugin_manager.h"
43 #include "control_protocol/control_protocol.h"
45 #include "canvas/wave_view.h"
47 #include "ardour_window.h"
48 #include "ardour_dialog.h"
49 #include "gui_thread.h"
50 #include "midi_tracer.h"
51 #include "rc_option_editor.h"
53 #include "midi_port_dialog.h"
60 using namespace Gtkmm2ext;
62 using namespace ARDOUR;
64 class ClickOptions : public OptionEditorBox
67 ClickOptions (RCConfiguration* c, Gtk::Window* p)
71 Table* t = manage (new Table (2, 3));
74 Label* l = manage (left_aligned_label (_("Click audio file:")));
75 t->attach (*l, 0, 1, 0, 1, FILL);
76 t->attach (_click_path_entry, 1, 2, 0, 1, FILL);
77 Button* b = manage (new Button (_("Browse...")));
78 b->signal_clicked().connect (sigc::mem_fun (*this, &ClickOptions::click_browse_clicked));
79 t->attach (*b, 2, 3, 0, 1, FILL);
81 l = manage (left_aligned_label (_("Click emphasis audio file:")));
82 t->attach (*l, 0, 1, 1, 2, FILL);
83 t->attach (_click_emphasis_path_entry, 1, 2, 1, 2, FILL);
84 b = manage (new Button (_("Browse...")));
85 b->signal_clicked().connect (sigc::mem_fun (*this, &ClickOptions::click_emphasis_browse_clicked));
86 t->attach (*b, 2, 3, 1, 2, FILL);
88 _box->pack_start (*t, false, false);
90 _click_path_entry.signal_activate().connect (sigc::mem_fun (*this, &ClickOptions::click_changed));
91 _click_emphasis_path_entry.signal_activate().connect (sigc::mem_fun (*this, &ClickOptions::click_emphasis_changed));
94 void parameter_changed (string const & p)
96 if (p == "click-sound") {
97 _click_path_entry.set_text (_rc_config->get_click_sound());
98 } else if (p == "click-emphasis-sound") {
99 _click_emphasis_path_entry.set_text (_rc_config->get_click_emphasis_sound());
103 void set_state_from_config ()
105 parameter_changed ("click-sound");
106 parameter_changed ("click-emphasis-sound");
111 void click_browse_clicked ()
113 SoundFileChooser sfdb (_("Choose Click"));
115 if (sfdb.run () == RESPONSE_OK) {
116 click_chosen (sfdb.get_filename());
120 void click_chosen (string const & path)
122 _click_path_entry.set_text (path);
123 _rc_config->set_click_sound (path);
126 void click_changed ()
128 click_chosen (_click_path_entry.get_text ());
131 void click_emphasis_browse_clicked ()
133 SoundFileChooser sfdb (_("Choose Click Emphasis"));
138 if (sfdb.run () == RESPONSE_OK) {
139 click_emphasis_chosen (sfdb.get_filename());
143 void click_emphasis_chosen (string const & path)
145 _click_emphasis_path_entry.set_text (path);
146 _rc_config->set_click_emphasis_sound (path);
149 void click_emphasis_changed ()
151 click_emphasis_chosen (_click_emphasis_path_entry.get_text ());
154 RCConfiguration* _rc_config;
155 Gtk::Window* _parent;
156 Entry _click_path_entry;
157 Entry _click_emphasis_path_entry;
160 class UndoOptions : public OptionEditorBox
163 UndoOptions (RCConfiguration* c) :
165 _limit_undo_button (_("Limit undo history to")),
166 _save_undo_button (_("Save undo history of"))
168 Table* t = new Table (2, 3);
171 t->attach (_limit_undo_button, 0, 1, 0, 1, FILL);
172 _limit_undo_spin.set_range (0, 512);
173 _limit_undo_spin.set_increments (1, 10);
174 t->attach (_limit_undo_spin, 1, 2, 0, 1, FILL | EXPAND);
175 Label* l = manage (left_aligned_label (_("commands")));
176 t->attach (*l, 2, 3, 0, 1);
178 t->attach (_save_undo_button, 0, 1, 1, 2, FILL);
179 _save_undo_spin.set_range (0, 512);
180 _save_undo_spin.set_increments (1, 10);
181 t->attach (_save_undo_spin, 1, 2, 1, 2, FILL | EXPAND);
182 l = manage (left_aligned_label (_("commands")));
183 t->attach (*l, 2, 3, 1, 2);
185 _box->pack_start (*t);
187 _limit_undo_button.signal_toggled().connect (sigc::mem_fun (*this, &UndoOptions::limit_undo_toggled));
188 _limit_undo_spin.signal_value_changed().connect (sigc::mem_fun (*this, &UndoOptions::limit_undo_changed));
189 _save_undo_button.signal_toggled().connect (sigc::mem_fun (*this, &UndoOptions::save_undo_toggled));
190 _save_undo_spin.signal_value_changed().connect (sigc::mem_fun (*this, &UndoOptions::save_undo_changed));
193 void parameter_changed (string const & p)
195 if (p == "history-depth") {
196 int32_t const d = _rc_config->get_history_depth();
197 _limit_undo_button.set_active (d != 0);
198 _limit_undo_spin.set_sensitive (d != 0);
199 _limit_undo_spin.set_value (d);
200 } else if (p == "save-history") {
201 bool const x = _rc_config->get_save_history ();
202 _save_undo_button.set_active (x);
203 _save_undo_spin.set_sensitive (x);
204 } else if (p == "save-history-depth") {
205 _save_undo_spin.set_value (_rc_config->get_saved_history_depth());
209 void set_state_from_config ()
211 parameter_changed ("save-history");
212 parameter_changed ("history-depth");
213 parameter_changed ("save-history-depth");
216 void limit_undo_toggled ()
218 bool const x = _limit_undo_button.get_active ();
219 _limit_undo_spin.set_sensitive (x);
220 int32_t const n = x ? 16 : 0;
221 _limit_undo_spin.set_value (n);
222 _rc_config->set_history_depth (n);
225 void limit_undo_changed ()
227 _rc_config->set_history_depth (_limit_undo_spin.get_value_as_int ());
230 void save_undo_toggled ()
232 bool const x = _save_undo_button.get_active ();
233 _rc_config->set_save_history (x);
236 void save_undo_changed ()
238 _rc_config->set_saved_history_depth (_save_undo_spin.get_value_as_int ());
242 RCConfiguration* _rc_config;
243 CheckButton _limit_undo_button;
244 SpinButton _limit_undo_spin;
245 CheckButton _save_undo_button;
246 SpinButton _save_undo_spin;
251 static const struct {
263 { "Key|Shift", GDK_SHIFT_MASK },
264 { "Command", GDK_META_MASK },
265 { "Control", GDK_CONTROL_MASK },
266 { "Option", GDK_MOD1_MASK },
267 { "Command-Shift", GDK_META_MASK|GDK_SHIFT_MASK },
268 { "Command-Option", GDK_MOD1_MASK|GDK_META_MASK },
269 { "Shift-Option", GDK_SHIFT_MASK|GDK_MOD1_MASK },
270 { "Shift-Command-Option", GDK_MOD5_MASK|GDK_SHIFT_MASK|GDK_META_MASK },
273 { "Key|Shift", GDK_SHIFT_MASK },
274 { "Control", GDK_CONTROL_MASK },
275 { "Alt (Mod1)", GDK_MOD1_MASK },
276 { "Control-Shift", GDK_CONTROL_MASK|GDK_SHIFT_MASK },
277 { "Control-Alt", GDK_CONTROL_MASK|GDK_MOD1_MASK },
278 { "Shift-Alt", GDK_SHIFT_MASK|GDK_MOD1_MASK },
279 { "Control-Shift-Alt", GDK_CONTROL_MASK|GDK_SHIFT_MASK|GDK_MOD1_MASK },
280 { "Mod2", GDK_MOD2_MASK },
281 { "Mod3", GDK_MOD3_MASK },
282 { "Mod4", GDK_MOD4_MASK },
283 { "Mod5", GDK_MOD5_MASK },
289 class KeyboardOptions : public OptionEditorBox
293 _delete_button_adjustment (3, 1, 12),
294 _delete_button_spin (_delete_button_adjustment),
295 _edit_button_adjustment (3, 1, 5),
296 _edit_button_spin (_edit_button_adjustment),
297 _insert_note_button_adjustment (3, 1, 5),
298 _insert_note_button_spin (_insert_note_button_adjustment)
300 /* internationalize and prepare for use with combos */
303 for (int i = 0; modifiers[i].name; ++i) {
304 dumb.push_back (S_(modifiers[i].name));
307 set_popdown_strings (_edit_modifier_combo, dumb);
308 _edit_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::edit_modifier_chosen));
310 for (int x = 0; modifiers[x].name; ++x) {
311 if (modifiers[x].modifier == Keyboard::edit_modifier ()) {
312 _edit_modifier_combo.set_active_text (S_(modifiers[x].name));
317 Table* t = manage (new Table (4, 4));
320 Label* l = manage (left_aligned_label (_("Edit using:")));
321 l->set_name ("OptionsLabel");
323 t->attach (*l, 0, 1, 0, 1, FILL | EXPAND, FILL);
324 t->attach (_edit_modifier_combo, 1, 2, 0, 1, FILL | EXPAND, FILL);
326 l = manage (new Label (_("+ button")));
327 l->set_name ("OptionsLabel");
329 t->attach (*l, 3, 4, 0, 1, FILL | EXPAND, FILL);
330 t->attach (_edit_button_spin, 4, 5, 0, 1, FILL | EXPAND, FILL);
332 _edit_button_spin.set_name ("OptionsEntry");
333 _edit_button_adjustment.set_value (Keyboard::edit_button());
334 _edit_button_adjustment.signal_value_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::edit_button_changed));
336 set_popdown_strings (_delete_modifier_combo, dumb);
337 _delete_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::delete_modifier_chosen));
339 for (int x = 0; modifiers[x].name; ++x) {
340 if (modifiers[x].modifier == Keyboard::delete_modifier ()) {
341 _delete_modifier_combo.set_active_text (S_(modifiers[x].name));
346 l = manage (left_aligned_label (_("Delete using:")));
347 l->set_name ("OptionsLabel");
349 t->attach (*l, 0, 1, 1, 2, FILL | EXPAND, FILL);
350 t->attach (_delete_modifier_combo, 1, 2, 1, 2, FILL | EXPAND, FILL);
352 l = manage (new Label (_("+ button")));
353 l->set_name ("OptionsLabel");
355 t->attach (*l, 3, 4, 1, 2, FILL | EXPAND, FILL);
356 t->attach (_delete_button_spin, 4, 5, 1, 2, FILL | EXPAND, FILL);
358 _delete_button_spin.set_name ("OptionsEntry");
359 _delete_button_adjustment.set_value (Keyboard::delete_button());
360 _delete_button_adjustment.signal_value_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::delete_button_changed));
363 set_popdown_strings (_insert_note_modifier_combo, dumb);
364 _insert_note_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::insert_note_modifier_chosen));
366 for (int x = 0; modifiers[x].name; ++x) {
367 if (modifiers[x].modifier == Keyboard::insert_note_modifier ()) {
368 _insert_note_modifier_combo.set_active_text (S_(modifiers[x].name));
373 l = manage (left_aligned_label (_("Insert note using:")));
374 l->set_name ("OptionsLabel");
376 t->attach (*l, 0, 1, 2, 3, FILL | EXPAND, FILL);
377 t->attach (_insert_note_modifier_combo, 1, 2, 2, 3, FILL | EXPAND, FILL);
379 l = manage (new Label (_("+ button")));
380 l->set_name ("OptionsLabel");
382 t->attach (*l, 3, 4, 2, 3, FILL | EXPAND, FILL);
383 t->attach (_insert_note_button_spin, 4, 5, 2, 3, FILL | EXPAND, FILL);
385 _insert_note_button_spin.set_name ("OptionsEntry");
386 _insert_note_button_adjustment.set_value (Keyboard::insert_note_button());
387 _insert_note_button_adjustment.signal_value_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::insert_note_button_changed));
390 set_popdown_strings (_snap_modifier_combo, dumb);
391 _snap_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::snap_modifier_chosen));
393 for (int x = 0; modifiers[x].name; ++x) {
394 if (modifiers[x].modifier == (guint) Keyboard::snap_modifier ()) {
395 _snap_modifier_combo.set_active_text (S_(modifiers[x].name));
400 l = manage (left_aligned_label (_("Ignore snap using:")));
401 l->set_name ("OptionsLabel");
403 t->attach (*l, 0, 1, 3, 4, FILL | EXPAND, FILL);
404 t->attach (_snap_modifier_combo, 1, 2, 3, 4, FILL | EXPAND, FILL);
408 for (map<string,string>::iterator bf = Keyboard::binding_files.begin(); bf != Keyboard::binding_files.end(); ++bf) {
409 strs.push_back (bf->first);
412 set_popdown_strings (_keyboard_layout_selector, strs);
413 _keyboard_layout_selector.set_active_text (Keyboard::current_binding_name());
414 _keyboard_layout_selector.signal_changed().connect (sigc::mem_fun (*this, &KeyboardOptions::bindings_changed));
416 l = manage (left_aligned_label (_("Keyboard layout:")));
417 l->set_name ("OptionsLabel");
419 t->attach (*l, 0, 1, 4, 5, FILL | EXPAND, FILL);
420 t->attach (_keyboard_layout_selector, 1, 2, 4, 5, FILL | EXPAND, FILL);
422 _box->pack_start (*t, false, false);
425 void parameter_changed (string const &)
427 /* XXX: these aren't really config options... */
430 void set_state_from_config ()
432 /* XXX: these aren't really config options... */
437 void bindings_changed ()
439 string const txt = _keyboard_layout_selector.get_active_text();
441 /* XXX: config...? for all this keyboard stuff */
443 for (map<string,string>::iterator i = Keyboard::binding_files.begin(); i != Keyboard::binding_files.end(); ++i) {
444 if (txt == i->first) {
445 if (Keyboard::load_keybindings (i->second)) {
446 Keyboard::save_keybindings ();
452 void edit_modifier_chosen ()
454 string const txt = _edit_modifier_combo.get_active_text();
456 for (int i = 0; modifiers[i].name; ++i) {
457 if (txt == _(modifiers[i].name)) {
458 Keyboard::set_edit_modifier (modifiers[i].modifier);
464 void delete_modifier_chosen ()
466 string const txt = _delete_modifier_combo.get_active_text();
468 for (int i = 0; modifiers[i].name; ++i) {
469 if (txt == _(modifiers[i].name)) {
470 Keyboard::set_delete_modifier (modifiers[i].modifier);
476 void insert_note_modifier_chosen ()
478 string const txt = _insert_note_modifier_combo.get_active_text();
480 for (int i = 0; modifiers[i].name; ++i) {
481 if (txt == _(modifiers[i].name)) {
482 Keyboard::set_insert_note_modifier (modifiers[i].modifier);
488 void snap_modifier_chosen ()
490 string const txt = _snap_modifier_combo.get_active_text();
492 for (int i = 0; modifiers[i].name; ++i) {
493 if (txt == _(modifiers[i].name)) {
494 Keyboard::set_snap_modifier (modifiers[i].modifier);
500 void delete_button_changed ()
502 Keyboard::set_delete_button (_delete_button_spin.get_value_as_int());
505 void edit_button_changed ()
507 Keyboard::set_edit_button (_edit_button_spin.get_value_as_int());
510 void insert_note_button_changed ()
512 Keyboard::set_insert_note_button (_insert_note_button_spin.get_value_as_int());
515 ComboBoxText _keyboard_layout_selector;
516 ComboBoxText _edit_modifier_combo;
517 ComboBoxText _delete_modifier_combo;
518 ComboBoxText _insert_note_modifier_combo;
519 ComboBoxText _snap_modifier_combo;
520 Adjustment _delete_button_adjustment;
521 SpinButton _delete_button_spin;
522 Adjustment _edit_button_adjustment;
523 SpinButton _edit_button_spin;
524 Adjustment _insert_note_button_adjustment;
525 SpinButton _insert_note_button_spin;
529 class FontScalingOptions : public OptionEditorBox
532 FontScalingOptions (RCConfiguration* c) :
534 _dpi_adjustment (50, 50, 250, 1, 10),
535 _dpi_slider (_dpi_adjustment)
537 _dpi_adjustment.set_value (floor ((double)(_rc_config->get_font_scale () / 1024)));
539 Label* l = manage (new Label (_("Font scaling:")));
540 l->set_name ("OptionsLabel");
542 _dpi_slider.set_update_policy (UPDATE_DISCONTINUOUS);
543 HBox* h = manage (new HBox);
545 h->pack_start (*l, false, false);
546 h->pack_start (_dpi_slider, true, true);
548 _box->pack_start (*h, false, false);
550 _dpi_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &FontScalingOptions::dpi_changed));
553 void parameter_changed (string const & p)
555 if (p == "font-scale") {
556 _dpi_adjustment.set_value (floor ((double)(_rc_config->get_font_scale() / 1024)));
560 void set_state_from_config ()
562 parameter_changed ("font-scale");
569 _rc_config->set_font_scale ((long) floor (_dpi_adjustment.get_value() * 1024));
570 /* XXX: should be triggered from the parameter changed signal */
574 RCConfiguration* _rc_config;
575 Adjustment _dpi_adjustment;
579 class ClipLevelOptions : public OptionEditorBox
582 ClipLevelOptions (RCConfiguration* c)
584 , _clip_level_adjustment (0, -128.0, 2.0, 0.1, 1.0) /* units of dB */
585 , _clip_level_slider (_clip_level_adjustment)
587 _clip_level_adjustment.set_value (_rc_config->get_waveform_clip_level ());
589 Label* l = manage (new Label (_("Waveform Clip Level (dBFS):")));
590 l->set_name ("OptionsLabel");
592 _clip_level_slider.set_update_policy (UPDATE_DISCONTINUOUS);
593 HBox* h = manage (new HBox);
595 h->pack_start (*l, false, false);
596 h->pack_start (_clip_level_slider, true, true);
598 _box->pack_start (*h, false, false);
600 _clip_level_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &ClipLevelOptions::clip_level_changed));
603 void parameter_changed (string const & p)
605 if (p == "waveform-clip-level") {
606 _clip_level_adjustment.set_value (_rc_config->get_waveform_clip_level());
610 void set_state_from_config ()
612 parameter_changed ("waveform-clip-level");
617 void clip_level_changed ()
619 _rc_config->set_waveform_clip_level (_clip_level_adjustment.get_value());
620 /* XXX: should be triggered from the parameter changed signal */
621 ArdourCanvas::WaveView::set_clip_level (_clip_level_adjustment.get_value());
624 RCConfiguration* _rc_config;
625 Adjustment _clip_level_adjustment;
626 HScale _clip_level_slider;
629 class BufferingOptions : public OptionEditorBox
632 BufferingOptions (RCConfiguration* c)
634 , _playback_adjustment (5, 1, 60, 1, 4)
635 , _capture_adjustment (5, 1, 60, 1, 4)
636 , _playback_slider (_playback_adjustment)
637 , _capture_slider (_capture_adjustment)
639 _playback_adjustment.set_value (_rc_config->get_audio_playback_buffer_seconds());
641 Label* l = manage (new Label (_("Playback (seconds of buffering):")));
642 l->set_name ("OptionsLabel");
644 _playback_slider.set_update_policy (UPDATE_DISCONTINUOUS);
645 HBox* h = manage (new HBox);
647 h->pack_start (*l, false, false);
648 h->pack_start (_playback_slider, true, true);
650 _box->pack_start (*h, false, false);
652 _capture_adjustment.set_value (_rc_config->get_audio_capture_buffer_seconds());
654 l = manage (new Label (_("Recording (seconds of buffering):")));
655 l->set_name ("OptionsLabel");
657 _capture_slider.set_update_policy (UPDATE_DISCONTINUOUS);
658 h = manage (new HBox);
660 h->pack_start (*l, false, false);
661 h->pack_start (_capture_slider, true, true);
663 _box->pack_start (*h, false, false);
665 _capture_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &BufferingOptions::capture_changed));
666 _playback_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &BufferingOptions::playback_changed));
669 void parameter_changed (string const & p)
671 if (p == "playback-buffer-seconds") {
672 _playback_adjustment.set_value (_rc_config->get_audio_playback_buffer_seconds());
673 } else if (p == "capture-buffer-seconds") {
674 _capture_adjustment.set_value (_rc_config->get_audio_capture_buffer_seconds());
678 void set_state_from_config ()
680 parameter_changed ("playback-buffer-seconds");
681 parameter_changed ("capture-buffer-seconds");
686 void playback_changed ()
688 _rc_config->set_audio_playback_buffer_seconds ((long) _playback_adjustment.get_value());
691 void capture_changed ()
693 _rc_config->set_audio_capture_buffer_seconds ((long) _capture_adjustment.get_value());
696 RCConfiguration* _rc_config;
697 Adjustment _playback_adjustment;
698 Adjustment _capture_adjustment;
699 HScale _playback_slider;
700 HScale _capture_slider;
703 class ControlSurfacesOptions : public OptionEditorBox
706 ControlSurfacesOptions (Gtk::Window& parent)
708 , _ignore_view_change (0)
710 _store = ListStore::create (_model);
711 _view.set_model (_store);
712 _view.append_column (_("Control Surface Protocol"), _model.name);
713 _view.get_column(0)->set_resizable (true);
714 _view.get_column(0)->set_expand (true);
715 _view.append_column_editable (_("Enabled"), _model.enabled);
716 _view.append_column_editable (_("Feedback"), _model.feedback);
718 _box->pack_start (_view, false, false);
720 Label* label = manage (new Label);
721 label->set_markup (string_compose (X_("<i>%1</i>"), _("Double-click on a name to edit settings for an enabled protocol")));
723 _box->pack_start (*label, false, false);
726 ControlProtocolManager& m = ControlProtocolManager::instance ();
727 m.ProtocolStatusChange.connect (protocol_status_connection, MISSING_INVALIDATOR,
728 boost::bind (&ControlSurfacesOptions::protocol_status_changed, this, _1), gui_context());
730 _store->signal_row_changed().connect (sigc::mem_fun (*this, &ControlSurfacesOptions::view_changed));
731 _view.signal_button_press_event().connect_notify (sigc::mem_fun(*this, &ControlSurfacesOptions::edit_clicked));
734 void parameter_changed (std::string const &)
739 void set_state_from_config ()
743 ControlProtocolManager& m = ControlProtocolManager::instance ();
744 for (list<ControlProtocolInfo*>::iterator i = m.control_protocol_info.begin(); i != m.control_protocol_info.end(); ++i) {
746 if (!(*i)->mandatory) {
747 TreeModel::Row r = *_store->append ();
748 r[_model.name] = (*i)->name;
749 r[_model.enabled] = ((*i)->protocol || (*i)->requested);
750 r[_model.feedback] = ((*i)->protocol && (*i)->protocol->get_feedback ());
751 r[_model.protocol_info] = *i;
758 void protocol_status_changed (ControlProtocolInfo* cpi) {
760 TreeModel::Children rows = _store->children();
762 for (TreeModel::Children::iterator x = rows.begin(); x != rows.end(); ++x) {
763 string n = ((*x)[_model.name]);
765 if ((*x)[_model.protocol_info] == cpi) {
766 _ignore_view_change++;
767 (*x)[_model.enabled] = (cpi->protocol || cpi->requested);
768 _ignore_view_change--;
774 void view_changed (TreeModel::Path const &, TreeModel::iterator const & i)
776 TreeModel::Row r = *i;
778 if (_ignore_view_change) {
782 ControlProtocolInfo* cpi = r[_model.protocol_info];
787 bool const was_enabled = (cpi->protocol != 0);
788 bool const is_enabled = r[_model.enabled];
791 if (was_enabled != is_enabled) {
794 ControlProtocolManager::instance().activate (*cpi);
796 Gtk::Window* win = r[_model.editor];
801 ControlProtocolManager::instance().deactivate (*cpi);
805 r[_model.editor] = 0;
810 bool const was_feedback = (cpi->protocol && cpi->protocol->get_feedback ());
811 bool const is_feedback = r[_model.feedback];
813 if (was_feedback != is_feedback && cpi->protocol) {
814 cpi->protocol->set_feedback (is_feedback);
818 void edit_clicked (GdkEventButton* ev)
820 if (ev->type != GDK_2BUTTON_PRESS) {
825 ControlProtocolInfo* cpi;
828 row = *(_view.get_selection()->get_selected());
830 Window* win = row[_model.editor];
831 if (win && !win->is_visible()) {
834 cpi = row[_model.protocol_info];
836 if (cpi && cpi->protocol && cpi->protocol->has_editor ()) {
837 Box* box = (Box*) cpi->protocol->get_gui ();
839 string title = row[_model.name];
840 ArdourWindow* win = new ArdourWindow (_parent, title);
841 win->set_title ("Control Protocol Options");
845 row[_model.editor] = win;
851 class ControlSurfacesModelColumns : public TreeModelColumnRecord
855 ControlSurfacesModelColumns ()
864 TreeModelColumn<string> name;
865 TreeModelColumn<bool> enabled;
866 TreeModelColumn<bool> feedback;
867 TreeModelColumn<ControlProtocolInfo*> protocol_info;
868 TreeModelColumn<Gtk::Window*> editor;
871 Glib::RefPtr<ListStore> _store;
872 ControlSurfacesModelColumns _model;
874 Gtk::Window& _parent;
875 PBD::ScopedConnection protocol_status_connection;
876 uint32_t _ignore_view_change;
879 class VideoTimelineOptions : public OptionEditorBox
882 VideoTimelineOptions (RCConfiguration* c)
884 , _show_video_export_info_button (_("Show Video Export Info before export"))
885 , _show_video_server_dialog_button (_("Show Video Server Startup Dialog"))
886 , _video_advanced_setup_button (_("Advanced Setup (remote video server)"))
888 Table* t = manage (new Table (2, 6));
891 t->attach (_video_advanced_setup_button, 0, 2, 0, 1);
892 _video_advanced_setup_button.signal_toggled().connect (sigc::mem_fun (*this, &VideoTimelineOptions::video_advanced_setup_toggled));
893 Gtkmm2ext::UI::instance()->set_tip (_video_advanced_setup_button,
894 _("<b>When enabled</b> you can speficify a custom video-server URL and docroot. - Do not enable this option unless you know what you are doing."));
896 Label* l = manage (new Label (_("Video Server URL:")));
897 l->set_alignment (0, 0.5);
898 t->attach (*l, 0, 1, 1, 2, FILL);
899 t->attach (_video_server_url_entry, 1, 2, 1, 2, FILL);
900 Gtkmm2ext::UI::instance()->set_tip (_video_server_url_entry,
901 _("Base URL of the video-server including http prefix. This is usually 'http://hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when the video-server is running locally"));
903 l = manage (new Label (_("Video Folder:")));
904 l->set_alignment (0, 0.5);
905 t->attach (*l, 0, 1, 2, 3, FILL);
906 t->attach (_video_server_docroot_entry, 1, 2, 2, 3);
907 Gtkmm2ext::UI::instance()->set_tip (_video_server_docroot_entry,
908 _("Local path to the video-server document-root. Only files below this directory will be accessible by the video-server. If the server run on a remote host, it should point to a network mounted folder of the server's docroot or be left empty if it is unvailable. It is used for the local video-monitor and file-browsing when opening/adding a video file."));
910 /* small vspace y=3..4 */
912 t->attach (_show_video_export_info_button, 0, 2, 4, 5);
913 _show_video_export_info_button.signal_toggled().connect (sigc::mem_fun (*this, &VideoTimelineOptions::show_video_export_info_toggled));
914 Gtkmm2ext::UI::instance()->set_tip (_show_video_export_info_button,
915 _("<b>When enabled</b> an information window with details is displayed before the video-export dialog."));
917 t->attach (_show_video_server_dialog_button, 0, 2, 5, 6);
918 _show_video_server_dialog_button.signal_toggled().connect (sigc::mem_fun (*this, &VideoTimelineOptions::show_video_server_dialog_toggled));
919 Gtkmm2ext::UI::instance()->set_tip (_show_video_server_dialog_button,
920 _("<b>When enabled</b> the video server is never launched automatically without confirmation"));
922 _video_server_url_entry.signal_changed().connect (sigc::mem_fun(*this, &VideoTimelineOptions::server_url_changed));
923 _video_server_url_entry.signal_activate().connect (sigc::mem_fun(*this, &VideoTimelineOptions::server_url_changed));
924 _video_server_docroot_entry.signal_changed().connect (sigc::mem_fun(*this, &VideoTimelineOptions::server_docroot_changed));
925 _video_server_docroot_entry.signal_activate().connect (sigc::mem_fun(*this, &VideoTimelineOptions::server_docroot_changed));
927 _box->pack_start (*t,true,true);
930 void server_url_changed ()
932 _rc_config->set_video_server_url (_video_server_url_entry.get_text());
935 void server_docroot_changed ()
937 _rc_config->set_video_server_docroot (_video_server_docroot_entry.get_text());
940 void show_video_export_info_toggled ()
942 bool const x = _show_video_export_info_button.get_active ();
943 _rc_config->set_show_video_export_info (x);
946 void show_video_server_dialog_toggled ()
948 bool const x = _show_video_server_dialog_button.get_active ();
949 _rc_config->set_show_video_server_dialog (x);
952 void video_advanced_setup_toggled ()
954 bool const x = _video_advanced_setup_button.get_active ();
955 _rc_config->set_video_advanced_setup(x);
958 void parameter_changed (string const & p)
960 if (p == "video-server-url") {
961 _video_server_url_entry.set_text (_rc_config->get_video_server_url());
962 } else if (p == "video-server-docroot") {
963 _video_server_docroot_entry.set_text (_rc_config->get_video_server_docroot());
964 } else if (p == "show-video-export-info") {
965 bool const x = _rc_config->get_show_video_export_info();
966 _show_video_export_info_button.set_active (x);
967 } else if (p == "show-video-server-dialog") {
968 bool const x = _rc_config->get_show_video_server_dialog();
969 _show_video_server_dialog_button.set_active (x);
970 } else if (p == "video-advanced-setup") {
971 bool const x = _rc_config->get_video_advanced_setup();
972 _video_advanced_setup_button.set_active(x);
973 _video_server_docroot_entry.set_sensitive(x);
974 _video_server_url_entry.set_sensitive(x);
978 void set_state_from_config ()
980 parameter_changed ("video-server-url");
981 parameter_changed ("video-server-docroot");
982 parameter_changed ("video-monitor-setup-dialog");
983 parameter_changed ("show-video-export-info");
984 parameter_changed ("show-video-server-dialog");
985 parameter_changed ("video-advanced-setup");
989 RCConfiguration* _rc_config;
990 Entry _video_server_url_entry;
991 Entry _video_server_docroot_entry;
992 CheckButton _show_video_export_info_button;
993 CheckButton _show_video_server_dialog_button;
994 CheckButton _video_advanced_setup_button;
997 class PluginOptions : public OptionEditorBox
1000 PluginOptions (RCConfiguration* c)
1002 , _display_plugin_scan_progress (_("Always Display Plugin Scan Progress"))
1003 , _discover_vst_on_start (_("Scan for new VST Plugins on Application Start"))
1006 std::stringstream ss;
1007 Table* t = manage (new Table (2, 6));
1008 t->set_spacings (4);
1012 ss << "<b>" << _("General") << "</b>";
1013 l = manage (left_aligned_label (ss.str()));
1014 l->set_use_markup (true);
1015 t->attach (*manage (new Label ("")), 0, 3, n, n+1, FILL | EXPAND); ++n;
1016 t->attach (*l, 0, 2, n, n+1, FILL | EXPAND); ++n;
1018 b = manage (new Button (_("Scan for Plugins")));
1019 b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::refresh_clicked));
1020 t->attach (*b, 0, 2, n, n+1, FILL); ++n;
1022 t->attach (_display_plugin_scan_progress, 0, 2, n, n+1); ++n;
1023 _display_plugin_scan_progress.signal_toggled().connect (sigc::mem_fun (*this, &PluginOptions::display_plugin_scan_progress_toggled));
1024 Gtkmm2ext::UI::instance()->set_tip (_display_plugin_scan_progress,
1025 _("<b>When enabled</b> a popup window showing plugin scan progress is displayed for indexing (cache load) and discovery (detect new plugins)"));
1029 ss << "<b>" << _("VST") << "</b>";
1030 l = manage (left_aligned_label (ss.str()));
1031 l->set_use_markup (true);
1032 t->attach (*manage (new Label ("")), 0, 3, n, n+1, FILL | EXPAND); ++n;
1033 t->attach (*l, 0, 2, n, n+1, FILL | EXPAND); ++n;
1035 b = manage (new Button (_("Clear VST Cache")));
1036 b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::clear_vst_cache_clicked));
1037 t->attach (*b, 0, 1, n, n+1, FILL);
1039 b = manage (new Button (_("Clear VST Blacklist")));
1040 b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::clear_vst_blacklist_clicked));
1041 t->attach (*b, 1, 2, n, n+1, FILL);
1044 t->attach (_discover_vst_on_start, 0, 2, n, n+1); ++n;
1045 _discover_vst_on_start.signal_toggled().connect (sigc::mem_fun (*this, &PluginOptions::discover_vst_on_start_toggled));
1046 Gtkmm2ext::UI::instance()->set_tip (_discover_vst_on_start,
1047 _("<b>When enabled</b> new VST plugins are searched, tested and added to the cache index on application start. When disabled new plugins will only be available after triggering a 'Scan' manually"));
1049 #ifdef WINDOWS_VST_SUPPORT
1050 t->attach (*manage (left_aligned_label (_("Windows VST Path:"))), 0, 1, n, n+1);
1051 b = manage (new Button (_("Edit")));
1052 b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::edit_vst_path_clicked));
1053 t->attach (*b, 1, 2, n, n+1, FILL); ++n;
1056 #ifdef LXVST_SUPPORT
1057 t->attach (*manage (left_aligned_label (_("Linux VST:"))), 0, 1, n, n+1);
1058 b = manage (new Button (_("Edit")));
1059 b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::edit_lxvst_path_clicked));
1060 t->attach (*b, 1, 2, n, n+1, FILL); ++n;
1063 _box->pack_start (*t,true,true);
1066 void parameter_changed (string const & p) {
1067 if (p == "show-plugin-scan-window") {
1068 bool const x = _rc_config->get_show_plugin_scan_window();
1069 _display_plugin_scan_progress.set_active (x);
1071 else if (p == "discover-vst-on-start") {
1072 bool const x = _rc_config->get_discover_vst_on_start();
1073 _discover_vst_on_start.set_active (x);
1077 void set_state_from_config () {
1078 parameter_changed ("show-plugin-scan-window");
1079 parameter_changed ("discover-vst-on-start");
1083 RCConfiguration* _rc_config;
1084 CheckButton _display_plugin_scan_progress;
1085 CheckButton _discover_vst_on_start;
1087 void display_plugin_scan_progress_toggled () {
1088 bool const x = _display_plugin_scan_progress.get_active();
1089 _rc_config->set_show_plugin_scan_window(x);
1092 void discover_vst_on_start_toggled () {
1093 bool const x = _discover_vst_on_start.get_active();
1094 _rc_config->set_discover_vst_on_start(x);
1097 void clear_vst_cache_clicked () {
1098 PluginManager::instance().clear_vst_cache();
1101 void clear_vst_blacklist_clicked () {
1102 PluginManager::instance().clear_vst_blacklist();
1105 void edit_vst_path_clicked () {
1106 Gtkmm2ext::PathsDialog *pd = new Gtkmm2ext::PathsDialog (
1107 _("Set Windows VST Search Path"),
1108 _rc_config->get_plugin_path_vst(),
1109 PluginManager::instance().get_windows_vst_path()
1111 ResponseType r = (ResponseType) pd->run ();
1113 if (r == RESPONSE_ACCEPT) {
1114 _rc_config->set_plugin_path_vst(pd->get_serialized_paths());
1119 // todo consolidate with edit_vst_path_clicked..
1120 void edit_lxvst_path_clicked () {
1121 Gtkmm2ext::PathsDialog *pd = new Gtkmm2ext::PathsDialog (
1122 _("Set Linux VST Search Path"),
1123 _rc_config->get_plugin_path_lxvst(),
1124 PluginManager::instance().get_lxvst_path()
1126 ResponseType r = (ResponseType) pd->run ();
1128 if (r == RESPONSE_ACCEPT) {
1129 printf("%s", pd->get_serialized_paths().c_str());
1134 void refresh_clicked () {
1135 PluginManager::instance().refresh();
1140 /** A class which allows control of visibility of some editor components usign
1141 * a VisibilityGroup. The caller should pass in a `dummy' VisibilityGroup
1142 * which has the correct members, but with null widget pointers. This
1143 * class allows the user to set visibility of the members, the details
1144 * of which are stored in a configuration variable which can be watched
1145 * by parts of the editor that actually contain the widgets whose visibility
1146 * is being controlled.
1149 class VisibilityOption : public Option
1152 /** @param name User-visible name for this group.
1153 * @param g `Dummy' VisibilityGroup (as described above).
1154 * @param get Method to get the value of the appropriate configuration variable.
1155 * @param set Method to set the value of the appropriate configuration variable.
1157 VisibilityOption (string name, VisibilityGroup* g, sigc::slot<string> get, sigc::slot<bool, string> set)
1158 : Option (g->get_state_name(), name)
1160 , _visibility_group (g)
1164 /* Watch for changes made by the user to our members */
1165 _visibility_group->VisibilityChanged.connect_same_thread (
1166 _visibility_group_connection, sigc::bind (&VisibilityOption::changed, this)
1170 void set_state_from_config ()
1172 /* Set our state from the current configuration */
1173 _visibility_group->set_state (_get ());
1176 void add_to_page (OptionEditorPage* p)
1178 _heading.add_to_page (p);
1179 add_widget_to_page (p, _visibility_group->list_view ());
1182 Gtk::Widget& tip_widget() { return *_visibility_group->list_view (); }
1187 /* The user has changed something, so reflect this change
1188 in the RCConfiguration.
1190 _set (_visibility_group->get_state_value ());
1193 OptionEditorHeading _heading;
1194 VisibilityGroup* _visibility_group;
1195 sigc::slot<std::string> _get;
1196 sigc::slot<bool, std::string> _set;
1197 PBD::ScopedConnection _visibility_group_connection;
1202 RCOptionEditor::RCOptionEditor ()
1203 : OptionEditor (Config, string_compose (_("%1 Preferences"), PROGRAM_NAME))
1204 , _rc_config (Config)
1205 , _mixer_strip_visibility ("mixer-strip-visibility")
1209 uint32_t hwcpus = hardware_concurrency ();
1211 BoolComboOption* bco;
1214 add_option (_("Misc"), new OptionEditorHeading (_("DSP CPU Utilization")));
1216 ComboOption<int32_t>* procs = new ComboOption<int32_t> (
1218 _("Signal processing uses"),
1219 sigc::mem_fun (*_rc_config, &RCConfiguration::get_processor_usage),
1220 sigc::mem_fun (*_rc_config, &RCConfiguration::set_processor_usage)
1223 procs->add (-1, _("all but one processor"));
1224 procs->add (0, _("all available processors"));
1226 for (uint32_t i = 1; i <= hwcpus; ++i) {
1227 procs->add (i, string_compose (_("%1 processors"), i));
1230 procs->set_note (string_compose (_("This setting will only take effect when %1 is restarted."), PROGRAM_NAME));
1232 add_option (_("Misc"), procs);
1235 add_option (_("Misc"), new OptionEditorHeading (S_("Options|Undo")));
1237 add_option (_("Misc"), new UndoOptions (_rc_config));
1239 add_option (_("Misc"),
1241 "verify-remove-last-capture",
1242 _("Verify removal of last capture"),
1243 sigc::mem_fun (*_rc_config, &RCConfiguration::get_verify_remove_last_capture),
1244 sigc::mem_fun (*_rc_config, &RCConfiguration::set_verify_remove_last_capture)
1247 add_option (_("Misc"),
1249 "periodic-safety-backups",
1250 _("Make periodic backups of the session file"),
1251 sigc::mem_fun (*_rc_config, &RCConfiguration::get_periodic_safety_backups),
1252 sigc::mem_fun (*_rc_config, &RCConfiguration::set_periodic_safety_backups)
1255 add_option (_("Misc"), new OptionEditorHeading (_("Session Management")));
1257 add_option (_("Misc"),
1259 "only-copy-imported-files",
1260 _("Always copy imported files"),
1261 sigc::mem_fun (*_rc_config, &RCConfiguration::get_only_copy_imported_files),
1262 sigc::mem_fun (*_rc_config, &RCConfiguration::set_only_copy_imported_files)
1265 add_option (_("Misc"), new DirectoryOption (
1266 X_("default-session-parent-dir"),
1267 _("Default folder for new sessions:"),
1268 sigc::mem_fun (*_rc_config, &RCConfiguration::get_default_session_parent_dir),
1269 sigc::mem_fun (*_rc_config, &RCConfiguration::set_default_session_parent_dir)
1272 add_option (_("Misc"),
1273 new SpinOption<uint32_t> (
1274 "max-recent-sessions",
1275 _("Maximum number of recent sessions"),
1276 sigc::mem_fun (*_rc_config, &RCConfiguration::get_max_recent_sessions),
1277 sigc::mem_fun (*_rc_config, &RCConfiguration::set_max_recent_sessions),
1281 add_option (_("Misc"), new OptionEditorHeading (_("Click")));
1283 add_option (_("Misc"), new ClickOptions (_rc_config, this));
1285 add_option (_("Misc"),
1288 _("Click gain level"),
1289 sigc::mem_fun (*_rc_config, &RCConfiguration::get_click_gain),
1290 sigc::mem_fun (*_rc_config, &RCConfiguration::set_click_gain)
1293 add_option (_("Misc"), new OptionEditorHeading (_("Automation")));
1295 add_option (_("Misc"),
1296 new SpinOption<double> (
1297 "automation-thinning-factor",
1298 _("Thinning factor (larger value => less data)"),
1299 sigc::mem_fun (*_rc_config, &RCConfiguration::get_automation_thinning_factor),
1300 sigc::mem_fun (*_rc_config, &RCConfiguration::set_automation_thinning_factor),
1304 add_option (_("Misc"),
1305 new SpinOption<double> (
1306 "automation-interval-msecs",
1307 _("Automation sampling interval (milliseconds)"),
1308 sigc::mem_fun (*_rc_config, &RCConfiguration::get_automation_interval_msecs),
1309 sigc::mem_fun (*_rc_config, &RCConfiguration::set_automation_interval_msecs),
1317 tsf = new BoolOption (
1318 "latched-record-enable",
1319 _("Keep record-enable engaged on stop"),
1320 sigc::mem_fun (*_rc_config, &RCConfiguration::get_latched_record_enable),
1321 sigc::mem_fun (*_rc_config, &RCConfiguration::set_latched_record_enable)
1323 // Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(), _(""));
1324 add_option (_("Transport"), tsf);
1326 tsf = new BoolOption (
1327 "stop-recording-on-xrun",
1328 _("Stop recording when an xrun occurs"),
1329 sigc::mem_fun (*_rc_config, &RCConfiguration::get_stop_recording_on_xrun),
1330 sigc::mem_fun (*_rc_config, &RCConfiguration::set_stop_recording_on_xrun)
1332 Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(),
1333 string_compose (_("<b>When enabled</b> %1 will stop recording if an over- or underrun is detected by the audio engine"),
1335 add_option (_("Transport"), tsf);
1337 tsf = new BoolOption (
1338 "create-xrun-marker",
1339 _("Create markers where xruns occur"),
1340 sigc::mem_fun (*_rc_config, &RCConfiguration::get_create_xrun_marker),
1341 sigc::mem_fun (*_rc_config, &RCConfiguration::set_create_xrun_marker)
1343 // Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(), _(""));
1344 add_option (_("Transport"), tsf);
1346 tsf = new BoolOption (
1347 "stop-at-session-end",
1348 _("Stop at the end of the session"),
1349 sigc::mem_fun (*_rc_config, &RCConfiguration::get_stop_at_session_end),
1350 sigc::mem_fun (*_rc_config, &RCConfiguration::set_stop_at_session_end)
1352 Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(),
1353 string_compose (_("<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the transport "
1354 "when it reaches the current session end marker\n\n"
1355 "<b>When disabled</b> %1 will continue to roll past the session end marker at all times"),
1357 add_option (_("Transport"), tsf);
1359 tsf = new BoolOption (
1361 _("Do seamless looping (not possible when slaved to MTC, LTC etc)"),
1362 sigc::mem_fun (*_rc_config, &RCConfiguration::get_seamless_loop),
1363 sigc::mem_fun (*_rc_config, &RCConfiguration::set_seamless_loop)
1365 Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(),
1366 string_compose (_("<b>When enabled</b> this will loop by reading ahead and wrapping around at the loop point, "
1367 "preventing any need to do a transport locate at the end of the loop\n\n"
1368 "<b>When disabled</b> looping is done by locating back to the start of the loop when %1 reaches the end "
1369 "which will often cause a small click or delay"), PROGRAM_NAME));
1370 add_option (_("Transport"), tsf);
1372 tsf = new BoolOption (
1373 "disable-disarm-during-roll",
1374 _("Disable per-track record disarm while rolling"),
1375 sigc::mem_fun (*_rc_config, &RCConfiguration::get_disable_disarm_during_roll),
1376 sigc::mem_fun (*_rc_config, &RCConfiguration::set_disable_disarm_during_roll)
1378 Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(), _("<b>When enabled</b> this will prevent you from accidentally stopping specific tracks recording during a take"));
1379 add_option (_("Transport"), tsf);
1381 tsf = new BoolOption (
1383 _("12dB gain reduction during fast-forward and fast-rewind"),
1384 sigc::mem_fun (*_rc_config, &RCConfiguration::get_quieten_at_speed),
1385 sigc::mem_fun (*_rc_config, &RCConfiguration::set_quieten_at_speed)
1387 Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(), _("This will reduce the unpleasant increase in perceived volume "
1388 "that occurs when fast-forwarding or rewinding through some kinds of audio"));
1389 add_option (_("Transport"), tsf);
1391 add_option (_("Transport"), new OptionEditorHeading (S_("Sync/Slave")));
1393 _sync_source = new ComboOption<SyncSource> (
1395 _("External timecode source"),
1396 sigc::mem_fun (*_rc_config, &RCConfiguration::get_sync_source),
1397 sigc::mem_fun (*_rc_config, &RCConfiguration::set_sync_source)
1400 populate_sync_options ();
1401 add_option (_("Transport"), _sync_source);
1403 _sync_framerate = new BoolOption (
1404 "timecode-sync-frame-rate",
1405 _("Match session video frame rate to external timecode"),
1406 sigc::mem_fun (*_rc_config, &RCConfiguration::get_timecode_sync_frame_rate),
1407 sigc::mem_fun (*_rc_config, &RCConfiguration::set_timecode_sync_frame_rate)
1409 Gtkmm2ext::UI::instance()->set_tip
1410 (_sync_framerate->tip_widget(),
1411 string_compose (_("This option controls the value of the video frame rate <i>while chasing</i> an external timecode source.\n\n"
1412 "<b>When enabled</b> the session video frame rate will be changed to match that of the selected external timecode source.\n\n"
1413 "<b>When disabled</b> the session video frame rate will not be changed to match that of the selected external timecode source."
1414 "Instead the frame rate indication in the main clock will flash red and %1 will convert between the external "
1415 "timecode standard and the session standard."), PROGRAM_NAME));
1417 add_option (_("Transport"), _sync_framerate);
1419 _sync_genlock = new BoolOption (
1420 "timecode-source-is-synced",
1421 _("External timecode is sync locked"),
1422 sigc::mem_fun (*_rc_config, &RCConfiguration::get_timecode_source_is_synced),
1423 sigc::mem_fun (*_rc_config, &RCConfiguration::set_timecode_source_is_synced)
1425 Gtkmm2ext::UI::instance()->set_tip
1426 (_sync_genlock->tip_widget(),
1427 _("<b>When enabled</b> indicates that the selected external timecode source shares sync (Black & Burst, Wordclock, etc) with the audio interface."));
1430 add_option (_("Transport"), _sync_genlock);
1432 _sync_source_2997 = new BoolOption (
1433 "timecode-source-2997",
1434 _("Lock to 29.9700 fps instead of 30000/1001"),
1435 sigc::mem_fun (*_rc_config, &RCConfiguration::get_timecode_source_2997),
1436 sigc::mem_fun (*_rc_config, &RCConfiguration::set_timecode_source_2997)
1438 Gtkmm2ext::UI::instance()->set_tip
1439 (_sync_source_2997->tip_widget(),
1440 _("<b>When enabled</b> the external timecode source is assumed to use 29.97 fps instead of 30000/1001.\n"
1441 "SMPTE 12M-1999 specifies 29.97df as 30000/1001. The spec further mentions that "
1442 "drop-frame timecode has an accumulated error of -86ms over a 24-hour period.\n"
1443 "Drop-frame timecode would compensate exactly for a NTSC color frame rate of 30 * 0.9990 (ie 29.970000). "
1444 "That is not the actual rate. However, some vendors use that rate - despite it being against the specs - "
1445 "because the variant of using exactly 29.97 fps has zero timecode drift.\n"
1448 add_option (_("Transport"), _sync_source_2997);
1450 add_option (_("Transport"), new OptionEditorHeading (S_("LTC Reader")));
1452 _ltc_port = new ComboStringOption (
1454 _("LTC incoming port"),
1455 sigc::mem_fun (*_rc_config, &RCConfiguration::get_ltc_source_port),
1456 sigc::mem_fun (*_rc_config, &RCConfiguration::set_ltc_source_port)
1459 vector<string> physical_inputs;
1460 physical_inputs.push_back (_("None"));
1461 AudioEngine::instance()->get_physical_inputs (DataType::AUDIO, physical_inputs);
1462 _ltc_port->set_popdown_strings (physical_inputs);
1464 add_option (_("Transport"), _ltc_port);
1466 // TODO; rather disable this button than not compile it..
1467 add_option (_("Transport"), new OptionEditorHeading (S_("LTC Generator")));
1469 add_option (_("Transport"),
1472 _("Enable LTC generator"),
1473 sigc::mem_fun (*_rc_config, &RCConfiguration::get_send_ltc),
1474 sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_ltc)
1477 _ltc_send_continuously = new BoolOption (
1478 "ltc-send-continuously",
1479 _("send LTC while stopped"),
1480 sigc::mem_fun (*_rc_config, &RCConfiguration::get_ltc_send_continuously),
1481 sigc::mem_fun (*_rc_config, &RCConfiguration::set_ltc_send_continuously)
1483 Gtkmm2ext::UI::instance()->set_tip
1484 (_ltc_send_continuously->tip_widget(),
1485 string_compose (_("<b>When enabled</b> %1 will continue to send LTC information even when the transport (playhead) is not moving"), PROGRAM_NAME));
1486 add_option (_("Transport"), _ltc_send_continuously);
1488 _ltc_volume_adjustment = new Gtk::Adjustment(-18, -50, 0, .5, 5);
1489 _ltc_volume_adjustment->set_value (20 * log10(_rc_config->get_ltc_output_volume()));
1490 _ltc_volume_adjustment->signal_value_changed().connect (sigc::mem_fun (*this, &RCOptionEditor::ltc_generator_volume_changed));
1491 _ltc_volume_slider = new HSliderOption("ltcvol", _("LTC generator level"), *_ltc_volume_adjustment);
1493 Gtkmm2ext::UI::instance()->set_tip
1494 (_ltc_volume_slider->tip_widget(),
1495 _("Specify the Peak Volume of the generated LTC signal in dbFS. A good value is 0dBu ^= -18dbFS in an EBU calibrated system"));
1497 add_option (_("Transport"), _ltc_volume_slider);
1498 parameter_changed ("send-ltc");
1500 parameter_changed ("sync-source");
1504 add_option (_("Editor"),
1506 "link-region-and-track-selection",
1507 _("Link selection of regions and tracks"),
1508 sigc::mem_fun (*_rc_config, &RCConfiguration::get_link_region_and_track_selection),
1509 sigc::mem_fun (*_rc_config, &RCConfiguration::set_link_region_and_track_selection)
1512 add_option (_("Editor"),
1514 "automation-follows-regions",
1515 _("Move relevant automation when audio regions are moved"),
1516 sigc::mem_fun (*_rc_config, &RCConfiguration::get_automation_follows_regions),
1517 sigc::mem_fun (*_rc_config, &RCConfiguration::set_automation_follows_regions)
1520 add_option (_("Editor"),
1522 "show-track-meters",
1523 _("Show meters on tracks in the editor"),
1524 sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_track_meters),
1525 sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_track_meters)
1528 add_option (_("Editor"),
1530 "show-editor-meter",
1531 _("Display master-meter in the toolbar"),
1532 sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_editor_meter),
1533 sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_editor_meter)
1536 bco = new BoolComboOption (
1537 "use-overlap-equivalency",
1538 _("Regions in active edit groups are edited together"),
1539 _("whenever they overlap in time"),
1540 _("only if they have identical length, position and origin"),
1541 sigc::mem_fun (*_rc_config, &RCConfiguration::get_use_overlap_equivalency),
1542 sigc::mem_fun (*_rc_config, &RCConfiguration::set_use_overlap_equivalency)
1545 add_option (_("Editor"), bco);
1547 add_option (_("Editor"),
1549 "rubberbanding-snaps-to-grid",
1550 _("Make rubberband selection rectangle snap to the grid"),
1551 sigc::mem_fun (*_rc_config, &RCConfiguration::get_rubberbanding_snaps_to_grid),
1552 sigc::mem_fun (*_rc_config, &RCConfiguration::set_rubberbanding_snaps_to_grid)
1555 add_option (_("Editor"),
1558 _("Show waveforms in regions"),
1559 sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_waveforms),
1560 sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_waveforms)
1563 add_option (_("Editor"),
1564 new BoolComboOption (
1565 "show-region-gain-envelopes",
1566 _("Show gain envelopes in audio regions"),
1568 _("only in region gain mode"),
1569 sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_region_gain),
1570 sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_region_gain)
1573 ComboOption<WaveformScale>* wfs = new ComboOption<WaveformScale> (
1575 _("Waveform scale"),
1576 sigc::mem_fun (*_rc_config, &RCConfiguration::get_waveform_scale),
1577 sigc::mem_fun (*_rc_config, &RCConfiguration::set_waveform_scale)
1580 wfs->add (Linear, _("linear"));
1581 wfs->add (Logarithmic, _("logarithmic"));
1583 add_option (_("Editor"), wfs);
1585 ComboOption<WaveformShape>* wfsh = new ComboOption<WaveformShape> (
1587 _("Waveform shape"),
1588 sigc::mem_fun (*_rc_config, &RCConfiguration::get_waveform_shape),
1589 sigc::mem_fun (*_rc_config, &RCConfiguration::set_waveform_shape)
1592 wfsh->add (Traditional, _("traditional"));
1593 wfsh->add (Rectified, _("rectified"));
1595 add_option (_("Editor"), wfsh);
1597 add_option (_("Editor"), new ClipLevelOptions (_rc_config));
1599 add_option (_("Editor"),
1601 "show-waveforms-while-recording",
1602 _("Show waveforms for audio while it is being recorded"),
1603 sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_waveforms_while_recording),
1604 sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_waveforms_while_recording)
1607 add_option (_("Editor"),
1610 _("Show zoom toolbar"),
1611 sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_zoom_tools),
1612 sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_zoom_tools)
1615 add_option (_("Editor"),
1617 "update-editor-during-summary-drag",
1618 _("Update editor window during drags of the summary"),
1619 sigc::mem_fun (*_rc_config, &RCConfiguration::get_update_editor_during_summary_drag),
1620 sigc::mem_fun (*_rc_config, &RCConfiguration::set_update_editor_during_summary_drag)
1623 add_option (_("Editor"),
1625 "link-editor-and-mixer-selection",
1626 _("Synchronise editor and mixer selection"),
1627 sigc::mem_fun (*_rc_config, &RCConfiguration::get_link_editor_and_mixer_selection),
1628 sigc::mem_fun (*_rc_config, &RCConfiguration::set_link_editor_and_mixer_selection)
1631 bo = new BoolOption (
1633 _("Name new markers"),
1634 sigc::mem_fun (*_rc_config, &RCConfiguration::get_name_new_markers),
1635 sigc::mem_fun (*_rc_config, &RCConfiguration::set_name_new_markers)
1638 add_option (_("Editor"), bo);
1639 Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(), _("If enabled, popup a dialog when a new marker is created to allow its name to be set as it is created."
1640 "\n\nYou can always rename markers by right-clicking on them"));
1642 add_option (_("Editor"),
1644 "autoscroll-editor",
1645 _("Auto-scroll editor window when dragging near its edges"),
1646 sigc::mem_fun (*_rc_config, &RCConfiguration::get_autoscroll_editor),
1647 sigc::mem_fun (*_rc_config, &RCConfiguration::set_autoscroll_editor)
1652 add_option (_("Audio"), new OptionEditorHeading (_("Buffering")));
1654 add_option (_("Audio"), new BufferingOptions (_rc_config));
1656 add_option (_("Audio"), new OptionEditorHeading (_("Monitoring")));
1658 ComboOption<MonitorModel>* mm = new ComboOption<MonitorModel> (
1660 _("Record monitoring handled by"),
1661 sigc::mem_fun (*_rc_config, &RCConfiguration::get_monitoring_model),
1662 sigc::mem_fun (*_rc_config, &RCConfiguration::set_monitoring_model)
1665 if (AudioEngine::instance()->port_engine().can_monitor_input()) {
1666 mm->add (HardwareMonitoring, _("via Audio Driver"));
1669 string prog (PROGRAM_NAME);
1670 boost::algorithm::to_lower (prog);
1671 mm->add (SoftwareMonitoring, string_compose (_("%1"), prog));
1672 mm->add (ExternalMonitoring, _("audio hardware"));
1674 add_option (_("Audio"), mm);
1676 add_option (_("Audio"),
1678 "tape-machine-mode",
1679 _("Tape machine mode"),
1680 sigc::mem_fun (*_rc_config, &RCConfiguration::get_tape_machine_mode),
1681 sigc::mem_fun (*_rc_config, &RCConfiguration::set_tape_machine_mode)
1684 add_option (_("Audio"), new OptionEditorHeading (_("Connection of tracks and busses")));
1686 add_option (_("Audio"),
1688 "auto-connect-standard-busses",
1689 _("Auto-connect master/monitor busses"),
1690 sigc::mem_fun (*_rc_config, &RCConfiguration::get_auto_connect_standard_busses),
1691 sigc::mem_fun (*_rc_config, &RCConfiguration::set_auto_connect_standard_busses)
1694 ComboOption<AutoConnectOption>* iac = new ComboOption<AutoConnectOption> (
1695 "input-auto-connect",
1696 _("Connect track inputs"),
1697 sigc::mem_fun (*_rc_config, &RCConfiguration::get_input_auto_connect),
1698 sigc::mem_fun (*_rc_config, &RCConfiguration::set_input_auto_connect)
1701 iac->add (AutoConnectPhysical, _("automatically to physical inputs"));
1702 iac->add (ManualConnect, _("manually"));
1704 add_option (_("Audio"), iac);
1706 ComboOption<AutoConnectOption>* oac = new ComboOption<AutoConnectOption> (
1707 "output-auto-connect",
1708 _("Connect track and bus outputs"),
1709 sigc::mem_fun (*_rc_config, &RCConfiguration::get_output_auto_connect),
1710 sigc::mem_fun (*_rc_config, &RCConfiguration::set_output_auto_connect)
1713 oac->add (AutoConnectPhysical, _("automatically to physical outputs"));
1714 oac->add (AutoConnectMaster, _("automatically to master bus"));
1715 oac->add (ManualConnect, _("manually"));
1717 add_option (_("Audio"), oac);
1719 add_option (_("Audio"), new OptionEditorHeading (_("Denormals")));
1721 add_option (_("Audio"),
1723 "denormal-protection",
1724 _("Use DC bias to protect against denormals"),
1725 sigc::mem_fun (*_rc_config, &RCConfiguration::get_denormal_protection),
1726 sigc::mem_fun (*_rc_config, &RCConfiguration::set_denormal_protection)
1729 ComboOption<DenormalModel>* dm = new ComboOption<DenormalModel> (
1731 _("Processor handling"),
1732 sigc::mem_fun (*_rc_config, &RCConfiguration::get_denormal_model),
1733 sigc::mem_fun (*_rc_config, &RCConfiguration::set_denormal_model)
1736 dm->add (DenormalNone, _("no processor handling"));
1740 if (fpu.has_flush_to_zero()) {
1741 dm->add (DenormalFTZ, _("use FlushToZero"));
1744 if (fpu.has_denormals_are_zero()) {
1745 dm->add (DenormalDAZ, _("use DenormalsAreZero"));
1748 if (fpu.has_flush_to_zero() && fpu.has_denormals_are_zero()) {
1749 dm->add (DenormalFTZDAZ, _("use FlushToZero and DenormalsAreZero"));
1752 add_option (_("Audio"), dm);
1754 add_option (_("Audio"), new OptionEditorHeading (_("Plugins")));
1756 add_option (_("Audio"),
1758 "plugins-stop-with-transport",
1759 _("Silence plugins when the transport is stopped"),
1760 sigc::mem_fun (*_rc_config, &RCConfiguration::get_plugins_stop_with_transport),
1761 sigc::mem_fun (*_rc_config, &RCConfiguration::set_plugins_stop_with_transport)
1764 add_option (_("Audio"),
1766 "new-plugins-active",
1767 _("Make new plugins active"),
1768 sigc::mem_fun (*_rc_config, &RCConfiguration::get_new_plugins_active),
1769 sigc::mem_fun (*_rc_config, &RCConfiguration::set_new_plugins_active)
1772 add_option (_("Audio"),
1774 "auto-analyse-audio",
1775 _("Enable automatic analysis of audio"),
1776 sigc::mem_fun (*_rc_config, &RCConfiguration::get_auto_analyse_audio),
1777 sigc::mem_fun (*_rc_config, &RCConfiguration::set_auto_analyse_audio)
1780 add_option (_("Audio"),
1782 "replicate-missing-region-channels",
1783 _("Replicate missing region channels"),
1784 sigc::mem_fun (*_rc_config, &RCConfiguration::get_replicate_missing_region_channels),
1785 sigc::mem_fun (*_rc_config, &RCConfiguration::set_replicate_missing_region_channels)
1790 add_option (_("Solo / mute"), new OptionEditorHeading (_("Solo")));
1792 add_option (_("Solo / mute"),
1795 _("Solo-in-place mute cut (dB)"),
1796 sigc::mem_fun (*_rc_config, &RCConfiguration::get_solo_mute_gain),
1797 sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_mute_gain)
1800 _solo_control_is_listen_control = new BoolOption (
1801 "solo-control-is-listen-control",
1802 _("Solo controls are Listen controls"),
1803 sigc::mem_fun (*_rc_config, &RCConfiguration::get_solo_control_is_listen_control),
1804 sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_control_is_listen_control)
1807 add_option (_("Solo / mute"), _solo_control_is_listen_control);
1809 _listen_position = new ComboOption<ListenPosition> (
1811 _("Listen Position"),
1812 sigc::mem_fun (*_rc_config, &RCConfiguration::get_listen_position),
1813 sigc::mem_fun (*_rc_config, &RCConfiguration::set_listen_position)
1816 _listen_position->add (AfterFaderListen, _("after-fader (AFL)"));
1817 _listen_position->add (PreFaderListen, _("pre-fader (PFL)"));
1819 add_option (_("Solo / mute"), _listen_position);
1821 ComboOption<PFLPosition>* pp = new ComboOption<PFLPosition> (
1823 _("PFL signals come from"),
1824 sigc::mem_fun (*_rc_config, &RCConfiguration::get_pfl_position),
1825 sigc::mem_fun (*_rc_config, &RCConfiguration::set_pfl_position)
1828 pp->add (PFLFromBeforeProcessors, _("before pre-fader processors"));
1829 pp->add (PFLFromAfterProcessors, _("pre-fader but after pre-fader processors"));
1831 add_option (_("Solo / mute"), pp);
1833 ComboOption<AFLPosition>* pa = new ComboOption<AFLPosition> (
1835 _("AFL signals come from"),
1836 sigc::mem_fun (*_rc_config, &RCConfiguration::get_afl_position),
1837 sigc::mem_fun (*_rc_config, &RCConfiguration::set_afl_position)
1840 pa->add (AFLFromBeforeProcessors, _("immediately post-fader"));
1841 pa->add (AFLFromAfterProcessors, _("after post-fader processors (before pan)"));
1843 add_option (_("Solo / mute"), pa);
1845 parameter_changed ("use-monitor-bus");
1847 add_option (_("Solo / mute"),
1850 _("Exclusive solo"),
1851 sigc::mem_fun (*_rc_config, &RCConfiguration::get_exclusive_solo),
1852 sigc::mem_fun (*_rc_config, &RCConfiguration::set_exclusive_solo)
1855 add_option (_("Solo / mute"),
1858 _("Show solo muting"),
1859 sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_solo_mutes),
1860 sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_solo_mutes)
1863 add_option (_("Solo / mute"),
1865 "solo-mute-override",
1866 _("Soloing overrides muting"),
1867 sigc::mem_fun (*_rc_config, &RCConfiguration::get_solo_mute_override),
1868 sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_mute_override)
1871 add_option (_("Solo / mute"), new OptionEditorHeading (_("Default track / bus muting options")));
1873 add_option (_("Solo / mute"),
1875 "mute-affects-pre-fader",
1876 _("Mute affects pre-fader sends"),
1877 sigc::mem_fun (*_rc_config, &RCConfiguration::get_mute_affects_pre_fader),
1878 sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_pre_fader)
1881 add_option (_("Solo / mute"),
1883 "mute-affects-post-fader",
1884 _("Mute affects post-fader sends"),
1885 sigc::mem_fun (*_rc_config, &RCConfiguration::get_mute_affects_post_fader),
1886 sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_post_fader)
1889 add_option (_("Solo / mute"),
1891 "mute-affects-control-outs",
1892 _("Mute affects control outputs"),
1893 sigc::mem_fun (*_rc_config, &RCConfiguration::get_mute_affects_control_outs),
1894 sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_control_outs)
1897 add_option (_("Solo / mute"),
1899 "mute-affects-main-outs",
1900 _("Mute affects main outputs"),
1901 sigc::mem_fun (*_rc_config, &RCConfiguration::get_mute_affects_main_outs),
1902 sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_main_outs)
1905 add_option (_("Solo / mute"), new OptionEditorHeading (_("Send Routing")));
1907 add_option (_("Solo / mute"),
1909 "link-send-and-route-panner",
1910 _("Link panners of Aux and External Sends with main panner by default"),
1911 sigc::mem_fun (*_rc_config, &RCConfiguration::get_link_send_and_route_panner),
1912 sigc::mem_fun (*_rc_config, &RCConfiguration::set_link_send_and_route_panner)
1915 add_option (_("MIDI"),
1918 _("Send MIDI Clock"),
1919 sigc::mem_fun (*_rc_config, &RCConfiguration::get_send_midi_clock),
1920 sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_midi_clock)
1923 add_option (_("MIDI"),
1926 _("Send MIDI Time Code"),
1927 sigc::mem_fun (*_rc_config, &RCConfiguration::get_send_mtc),
1928 sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_mtc)
1931 add_option (_("MIDI"),
1932 new SpinOption<int> (
1933 "mtc-qf-speed-tolerance",
1934 _("Percentage either side of normal transport speed to transmit MTC"),
1935 sigc::mem_fun (*_rc_config, &RCConfiguration::get_mtc_qf_speed_tolerance),
1936 sigc::mem_fun (*_rc_config, &RCConfiguration::set_mtc_qf_speed_tolerance),
1940 add_option (_("MIDI"),
1943 _("Obey MIDI Machine Control commands"),
1944 sigc::mem_fun (*_rc_config, &RCConfiguration::get_mmc_control),
1945 sigc::mem_fun (*_rc_config, &RCConfiguration::set_mmc_control)
1948 add_option (_("MIDI"),
1951 _("Send MIDI Machine Control commands"),
1952 sigc::mem_fun (*_rc_config, &RCConfiguration::get_send_mmc),
1953 sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_mmc)
1956 add_option (_("MIDI"),
1959 _("Send MIDI control feedback"),
1960 sigc::mem_fun (*_rc_config, &RCConfiguration::get_midi_feedback),
1961 sigc::mem_fun (*_rc_config, &RCConfiguration::set_midi_feedback)
1964 add_option (_("MIDI"),
1965 new SpinOption<uint8_t> (
1966 "mmc-receive-device-id",
1967 _("Inbound MMC device ID"),
1968 sigc::mem_fun (*_rc_config, &RCConfiguration::get_mmc_receive_device_id),
1969 sigc::mem_fun (*_rc_config, &RCConfiguration::set_mmc_receive_device_id),
1973 add_option (_("MIDI"),
1974 new SpinOption<uint8_t> (
1975 "mmc-send-device-id",
1976 _("Outbound MMC device ID"),
1977 sigc::mem_fun (*_rc_config, &RCConfiguration::get_mmc_send_device_id),
1978 sigc::mem_fun (*_rc_config, &RCConfiguration::set_mmc_send_device_id),
1982 add_option (_("MIDI"),
1983 new SpinOption<int32_t> (
1984 "initial-program-change",
1985 _("Initial program change"),
1986 sigc::mem_fun (*_rc_config, &RCConfiguration::get_initial_program_change),
1987 sigc::mem_fun (*_rc_config, &RCConfiguration::set_initial_program_change),
1991 add_option (_("MIDI"),
1993 "diplay-first-midi-bank-as-zero",
1994 _("Display first MIDI bank/program as 0"),
1995 sigc::mem_fun (*_rc_config, &RCConfiguration::get_first_midi_bank_is_zero),
1996 sigc::mem_fun (*_rc_config, &RCConfiguration::set_first_midi_bank_is_zero)
1999 add_option (_("MIDI"),
2001 "never-display-periodic-midi",
2002 _("Never display periodic MIDI messages (MTC, MIDI Clock)"),
2003 sigc::mem_fun (*_rc_config, &RCConfiguration::get_never_display_periodic_midi),
2004 sigc::mem_fun (*_rc_config, &RCConfiguration::set_never_display_periodic_midi)
2007 add_option (_("MIDI"),
2010 _("Sound MIDI notes as they are selected"),
2011 sigc::mem_fun (*_rc_config, &RCConfiguration::get_sound_midi_notes),
2012 sigc::mem_fun (*_rc_config, &RCConfiguration::set_sound_midi_notes)
2015 add_option (_("MIDI"), new OptionEditorHeading (_("Midi Audition")));
2017 ComboOption<std::string>* audition_synth = new ComboOption<std::string> (
2018 "midi-audition-synth-uri",
2019 _("Midi Audition Synth (LV2)"),
2020 sigc::mem_fun (*_rc_config, &RCConfiguration::get_midi_audition_synth_uri),
2021 sigc::mem_fun (*_rc_config, &RCConfiguration::set_midi_audition_synth_uri)
2024 audition_synth->add(X_(""), _("None"));
2025 PluginInfoList all_plugs;
2026 PluginManager& manager (PluginManager::instance());
2028 all_plugs.insert (all_plugs.end(), manager.lv2_plugin_info().begin(), manager.lv2_plugin_info().end());
2030 for (PluginInfoList::const_iterator i = all_plugs.begin(); i != all_plugs.end(); ++i) {
2031 if (manager.get_status (*i) == PluginManager::Hidden) continue;
2032 if (!(*i)->is_instrument()) continue;
2033 if ((*i)->type != ARDOUR::LV2) continue;
2034 audition_synth->add((*i)->unique_id, (*i)->name);
2038 add_option (_("MIDI"), audition_synth);
2040 /* USER INTERACTION */
2042 if (getenv ("ARDOUR_BUNDLED")) {
2043 add_option (_("User interaction"),
2045 "enable-translation",
2046 string_compose (_("Use translations of %1 messages\n"
2047 " <i>(requires a restart of %1 to take effect)</i>\n"
2048 " <i>(if available for your language preferences)</i>"), PROGRAM_NAME),
2049 sigc::ptr_fun (ARDOUR::translations_are_enabled),
2050 sigc::ptr_fun (ARDOUR::set_translations_enabled)));
2053 add_option (_("User interaction"), new OptionEditorHeading (_("Keyboard")));
2055 add_option (_("User interaction"), new KeyboardOptions);
2057 /* Control Surfaces */
2059 add_option (_("Control Surfaces"), new ControlSurfacesOptions (*this));
2061 ComboOption<RemoteModel>* rm = new ComboOption<RemoteModel> (
2063 _("Control surface remote ID"),
2064 sigc::mem_fun (*_rc_config, &RCConfiguration::get_remote_model),
2065 sigc::mem_fun (*_rc_config, &RCConfiguration::set_remote_model)
2068 rm->add (UserOrdered, _("assigned by user"));
2069 rm->add (MixerOrdered, _("follows order of mixer"));
2071 add_option (_("Control Surfaces"), rm);
2073 /* VIDEO Timeline */
2074 add_option (_("Video"), new VideoTimelineOptions (_rc_config));
2076 #if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
2077 /* Plugin options (currrently VST only) */
2078 add_option (_("Plugins"), new PluginOptions (_rc_config));
2083 add_option (S_("Preferences|GUI"),
2086 _("Graphically indicate mouse pointer hovering over various widgets"),
2087 sigc::mem_fun (*_rc_config, &RCConfiguration::get_widget_prelight),
2088 sigc::mem_fun (*_rc_config, &RCConfiguration::set_widget_prelight)
2091 add_option (S_("Preferences|GUI"),
2094 _("Show tooltips if mouse hovers over a control"),
2095 sigc::mem_fun (*_rc_config, &RCConfiguration::get_use_tooltips),
2096 sigc::mem_fun (*_rc_config, &RCConfiguration::set_use_tooltips)
2100 /* font scaling does nothing with GDK/Quartz */
2101 add_option (S_("Preferences|GUI"), new FontScalingOptions (_rc_config));
2104 add_option (S_("GUI"),
2106 "super-rapid-clock-update",
2107 _("update transport clock display every 40ms instead of every 100ms"),
2108 sigc::mem_fun (*_rc_config, &RCConfiguration::get_super_rapid_clock_update),
2109 sigc::mem_fun (*_rc_config, &RCConfiguration::set_super_rapid_clock_update)
2112 /* The names of these controls must be the same as those given in MixerStrip
2113 for the actual widgets being controlled.
2115 _mixer_strip_visibility.add (0, X_("PhaseInvert"), _("Phase Invert"));
2116 _mixer_strip_visibility.add (0, X_("SoloSafe"), _("Solo Safe"));
2117 _mixer_strip_visibility.add (0, X_("SoloIsolated"), _("Solo Isolated"));
2118 _mixer_strip_visibility.add (0, X_("Comments"), _("Comments"));
2119 _mixer_strip_visibility.add (0, X_("MeterPoint"), _("Meter Point"));
2122 S_("Preferences|GUI"),
2123 new VisibilityOption (
2125 &_mixer_strip_visibility,
2126 sigc::mem_fun (*_rc_config, &RCConfiguration::get_mixer_strip_visibility),
2127 sigc::mem_fun (*_rc_config, &RCConfiguration::set_mixer_strip_visibility)
2131 add_option (S_("Preferences|GUI"),
2133 "default-narrow_ms",
2134 _("Use narrow strips in the mixer by default"),
2135 sigc::mem_fun (*_rc_config, &RCConfiguration::get_default_narrow_ms),
2136 sigc::mem_fun (*_rc_config, &RCConfiguration::set_default_narrow_ms)
2139 add_option (S_("Preferences|GUI"), new OptionEditorHeading (_("Metering")));
2141 ComboOption<float>* mht = new ComboOption<float> (
2143 _("Peak hold time"),
2144 sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_hold),
2145 sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_hold)
2148 mht->add (MeterHoldOff, _("off"));
2149 mht->add (MeterHoldShort, _("short"));
2150 mht->add (MeterHoldMedium, _("medium"));
2151 mht->add (MeterHoldLong, _("long"));
2153 add_option (S_("Preferences|GUI"), mht);
2155 ComboOption<float>* mfo = new ComboOption<float> (
2158 sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_falloff),
2159 sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_falloff)
2162 mfo->add (METER_FALLOFF_OFF, _("off"));
2163 mfo->add (METER_FALLOFF_SLOWEST, _("slowest [6.6dB/sec]"));
2164 mfo->add (METER_FALLOFF_SLOW, _("slow [8.6dB/sec] (BBC PPM, EBU PPM)"));
2165 mfo->add (METER_FALLOFF_SLOWISH, _("slowish [12.0dB/sec] (DIN)"));
2166 mfo->add (METER_FALLOFF_MODERATE, _("moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"));
2167 mfo->add (METER_FALLOFF_MEDIUM, _("medium [20dB/sec]"));
2168 mfo->add (METER_FALLOFF_FAST, _("fast [32dB/sec]"));
2169 mfo->add (METER_FALLOFF_FASTER, _("faster [46dB/sec]"));
2170 mfo->add (METER_FALLOFF_FASTEST, _("fastest [70dB/sec]"));
2172 add_option (S_("Preferences|GUI"), mfo);
2174 ComboOption<MeterLineUp>* mlu = new ComboOption<MeterLineUp> (
2175 "meter-line-up-level",
2176 _("Meter line-up level; 0dBu"),
2177 sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_line_up_level),
2178 sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_line_up_level)
2181 mlu->add (MeteringLineUp24, _("-24dBFS (SMPTE US: 4dBu = -20dBFS)"));
2182 mlu->add (MeteringLineUp20, _("-20dBFS (SMPTE RP.0155)"));
2183 mlu->add (MeteringLineUp18, _("-18dBFS (EBU, BBC)"));
2184 mlu->add (MeteringLineUp15, _("-15dBFS (DIN)"));
2186 Gtkmm2ext::UI::instance()->set_tip (mlu->tip_widget(), _("Configure meter-marks and color-knee point for dBFS scale DPM, set reference level for IEC1/Nordic, IEC2 PPM and VU meter."));
2188 add_option (S_("Preferences|GUI"), mlu);
2190 ComboOption<MeterLineUp>* mld = new ComboOption<MeterLineUp> (
2191 "meter-line-up-din",
2192 _("IEC1/DIN Meter line-up level; 0dBu"),
2193 sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_line_up_din),
2194 sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_line_up_din)
2197 mld->add (MeteringLineUp24, _("-24dBFS (SMPTE US: 4dBu = -20dBFS)"));
2198 mld->add (MeteringLineUp20, _("-20dBFS (SMPTE RP.0155)"));
2199 mld->add (MeteringLineUp18, _("-18dBFS (EBU, BBC)"));
2200 mld->add (MeteringLineUp15, _("-15dBFS (DIN)"));
2202 Gtkmm2ext::UI::instance()->set_tip (mld->tip_widget(), _("Reference level for IEC1/DIN meter."));
2204 add_option (S_("Preferences|GUI"), mld);
2206 ComboOption<VUMeterStandard>* mvu = new ComboOption<VUMeterStandard> (
2207 "meter-vu-standard",
2208 _("VU Meter standard"),
2209 sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_vu_standard),
2210 sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_vu_standard)
2213 mvu->add (MeteringVUfrench, _("0VU = -2dBu (France)"));
2214 mvu->add (MeteringVUamerican, _("0VU = 0dBu (North America, Australia)"));
2215 mvu->add (MeteringVUstandard, _("0VU = +4dBu (standard)"));
2216 mvu->add (MeteringVUeight, _("0VU = +8dBu"));
2218 add_option (S_("Preferences|GUI"), mvu);
2220 Gtk::Adjustment *mpk = manage (new Gtk::Adjustment(0, -10, 0, .1, .1));
2221 HSliderOption *mpks = new HSliderOption("meter-peak",
2222 _("Peak threshold [dBFS]"),
2224 sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_peak),
2225 sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_peak)
2228 Gtkmm2ext::UI::instance()->set_tip
2229 (mpks->tip_widget(),
2230 _("Specify the audio signal level in dbFS at and above which the meter-peak indicator will flash red."));
2232 add_option (S_("Preferences|GUI"), mpks);
2234 add_option (S_("Preferences|GUI"),
2237 _("LED meter style"),
2238 sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_style_led),
2239 sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_style_led)
2245 RCOptionEditor::parameter_changed (string const & p)
2247 OptionEditor::parameter_changed (p);
2249 if (p == "use-monitor-bus") {
2250 bool const s = Config->get_use_monitor_bus ();
2252 /* we can't use this if we don't have a monitor bus */
2253 Config->set_solo_control_is_listen_control (false);
2255 _solo_control_is_listen_control->set_sensitive (s);
2256 _listen_position->set_sensitive (s);
2257 } else if (p == "sync-source") {
2258 _sync_source->set_sensitive (true);
2260 _sync_source->set_sensitive (!_session->config.get_external_sync());
2262 switch(Config->get_sync_source()) {
2265 _sync_genlock->set_sensitive (true);
2266 _sync_framerate->set_sensitive (true);
2267 _sync_source_2997->set_sensitive (true);
2270 _sync_genlock->set_sensitive (false);
2271 _sync_framerate->set_sensitive (false);
2272 _sync_source_2997->set_sensitive (false);
2275 } else if (p == "send-ltc") {
2276 bool const s = Config->get_send_ltc ();
2277 _ltc_send_continuously->set_sensitive (s);
2278 _ltc_volume_slider->set_sensitive (s);
2282 void RCOptionEditor::ltc_generator_volume_changed () {
2283 _rc_config->set_ltc_output_volume (pow(10, _ltc_volume_adjustment->get_value() / 20));
2287 RCOptionEditor::populate_sync_options ()
2289 vector<SyncSource> sync_opts = ARDOUR::get_available_sync_options ();
2291 _sync_source->clear ();
2293 for (vector<SyncSource>::iterator i = sync_opts.begin(); i != sync_opts.end(); ++i) {
2294 _sync_source->add (*i, sync_source_to_string (*i));