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 <gtkmm/liststore.h>
25 #include <gtkmm/stock.h>
26 #include <gtkmm/scale.h>
27 #include <gtkmm2ext/utils.h>
28 #include <gtkmm2ext/slider_controller.h>
29 #include <gtkmm2ext/gtk_ui.h>
34 #include "ardour/audioengine.h"
35 #include "ardour/dB.h"
36 #include "ardour/rc_configuration.h"
37 #include "ardour/control_protocol_manager.h"
38 #include "control_protocol/control_protocol.h"
40 #include "canvas/wave_view.h"
42 #include "ardour_window.h"
43 #include "ardour_dialog.h"
44 #include "gui_thread.h"
45 #include "midi_tracer.h"
46 #include "rc_option_editor.h"
48 #include "midi_port_dialog.h"
55 using namespace Gtkmm2ext;
57 using namespace ARDOUR;
59 class ClickOptions : public OptionEditorBox
62 ClickOptions (RCConfiguration* c, Gtk::Window* p)
66 Table* t = manage (new Table (2, 3));
69 Label* l = manage (left_aligned_label (_("Click audio file:")));
70 t->attach (*l, 0, 1, 0, 1, FILL);
71 t->attach (_click_path_entry, 1, 2, 0, 1, FILL);
72 Button* b = manage (new Button (_("Browse...")));
73 b->signal_clicked().connect (sigc::mem_fun (*this, &ClickOptions::click_browse_clicked));
74 t->attach (*b, 2, 3, 0, 1, FILL);
76 l = manage (left_aligned_label (_("Click emphasis audio file:")));
77 t->attach (*l, 0, 1, 1, 2, FILL);
78 t->attach (_click_emphasis_path_entry, 1, 2, 1, 2, FILL);
79 b = manage (new Button (_("Browse...")));
80 b->signal_clicked().connect (sigc::mem_fun (*this, &ClickOptions::click_emphasis_browse_clicked));
81 t->attach (*b, 2, 3, 1, 2, FILL);
83 _box->pack_start (*t, false, false);
85 _click_path_entry.signal_activate().connect (sigc::mem_fun (*this, &ClickOptions::click_changed));
86 _click_emphasis_path_entry.signal_activate().connect (sigc::mem_fun (*this, &ClickOptions::click_emphasis_changed));
89 void parameter_changed (string const & p)
91 if (p == "click-sound") {
92 _click_path_entry.set_text (_rc_config->get_click_sound());
93 } else if (p == "click-emphasis-sound") {
94 _click_emphasis_path_entry.set_text (_rc_config->get_click_emphasis_sound());
98 void set_state_from_config ()
100 parameter_changed ("click-sound");
101 parameter_changed ("click-emphasis-sound");
106 void click_browse_clicked ()
108 SoundFileChooser sfdb (_("Choose Click"));
110 if (sfdb.run () == RESPONSE_OK) {
111 click_chosen (sfdb.get_filename());
115 void click_chosen (string const & path)
117 _click_path_entry.set_text (path);
118 _rc_config->set_click_sound (path);
121 void click_changed ()
123 click_chosen (_click_path_entry.get_text ());
126 void click_emphasis_browse_clicked ()
128 SoundFileChooser sfdb (_("Choose Click Emphasis"));
133 if (sfdb.run () == RESPONSE_OK) {
134 click_emphasis_chosen (sfdb.get_filename());
138 void click_emphasis_chosen (string const & path)
140 _click_emphasis_path_entry.set_text (path);
141 _rc_config->set_click_emphasis_sound (path);
144 void click_emphasis_changed ()
146 click_emphasis_chosen (_click_emphasis_path_entry.get_text ());
149 RCConfiguration* _rc_config;
150 Gtk::Window* _parent;
151 Entry _click_path_entry;
152 Entry _click_emphasis_path_entry;
155 class UndoOptions : public OptionEditorBox
158 UndoOptions (RCConfiguration* c) :
160 _limit_undo_button (_("Limit undo history to")),
161 _save_undo_button (_("Save undo history of"))
163 Table* t = new Table (2, 3);
166 t->attach (_limit_undo_button, 0, 1, 0, 1, FILL);
167 _limit_undo_spin.set_range (0, 512);
168 _limit_undo_spin.set_increments (1, 10);
169 t->attach (_limit_undo_spin, 1, 2, 0, 1, FILL | EXPAND);
170 Label* l = manage (left_aligned_label (_("commands")));
171 t->attach (*l, 2, 3, 0, 1);
173 t->attach (_save_undo_button, 0, 1, 1, 2, FILL);
174 _save_undo_spin.set_range (0, 512);
175 _save_undo_spin.set_increments (1, 10);
176 t->attach (_save_undo_spin, 1, 2, 1, 2, FILL | EXPAND);
177 l = manage (left_aligned_label (_("commands")));
178 t->attach (*l, 2, 3, 1, 2);
180 _box->pack_start (*t);
182 _limit_undo_button.signal_toggled().connect (sigc::mem_fun (*this, &UndoOptions::limit_undo_toggled));
183 _limit_undo_spin.signal_value_changed().connect (sigc::mem_fun (*this, &UndoOptions::limit_undo_changed));
184 _save_undo_button.signal_toggled().connect (sigc::mem_fun (*this, &UndoOptions::save_undo_toggled));
185 _save_undo_spin.signal_value_changed().connect (sigc::mem_fun (*this, &UndoOptions::save_undo_changed));
188 void parameter_changed (string const & p)
190 if (p == "history-depth") {
191 int32_t const d = _rc_config->get_history_depth();
192 _limit_undo_button.set_active (d != 0);
193 _limit_undo_spin.set_sensitive (d != 0);
194 _limit_undo_spin.set_value (d);
195 } else if (p == "save-history") {
196 bool const x = _rc_config->get_save_history ();
197 _save_undo_button.set_active (x);
198 _save_undo_spin.set_sensitive (x);
199 } else if (p == "save-history-depth") {
200 _save_undo_spin.set_value (_rc_config->get_saved_history_depth());
204 void set_state_from_config ()
206 parameter_changed ("save-history");
207 parameter_changed ("history-depth");
208 parameter_changed ("save-history-depth");
211 void limit_undo_toggled ()
213 bool const x = _limit_undo_button.get_active ();
214 _limit_undo_spin.set_sensitive (x);
215 int32_t const n = x ? 16 : 0;
216 _limit_undo_spin.set_value (n);
217 _rc_config->set_history_depth (n);
220 void limit_undo_changed ()
222 _rc_config->set_history_depth (_limit_undo_spin.get_value_as_int ());
225 void save_undo_toggled ()
227 bool const x = _save_undo_button.get_active ();
228 _rc_config->set_save_history (x);
231 void save_undo_changed ()
233 _rc_config->set_saved_history_depth (_save_undo_spin.get_value_as_int ());
237 RCConfiguration* _rc_config;
238 CheckButton _limit_undo_button;
239 SpinButton _limit_undo_spin;
240 CheckButton _save_undo_button;
241 SpinButton _save_undo_spin;
246 static const struct {
258 { "Key|Shift", GDK_SHIFT_MASK },
259 { "Command", GDK_META_MASK },
260 { "Control", GDK_CONTROL_MASK },
261 { "Option", GDK_MOD1_MASK },
262 { "Command-Shift", GDK_META_MASK|GDK_SHIFT_MASK },
263 { "Command-Option", GDK_MOD1_MASK|GDK_META_MASK },
264 { "Shift-Option", GDK_SHIFT_MASK|GDK_MOD1_MASK },
265 { "Shift-Command-Option", GDK_MOD5_MASK|GDK_SHIFT_MASK|GDK_META_MASK },
268 { "Key|Shift", GDK_SHIFT_MASK },
269 { "Control", GDK_CONTROL_MASK },
270 { "Alt (Mod1)", GDK_MOD1_MASK },
271 { "Control-Shift", GDK_CONTROL_MASK|GDK_SHIFT_MASK },
272 { "Control-Alt", GDK_CONTROL_MASK|GDK_MOD1_MASK },
273 { "Shift-Alt", GDK_SHIFT_MASK|GDK_MOD1_MASK },
274 { "Control-Shift-Alt", GDK_CONTROL_MASK|GDK_SHIFT_MASK|GDK_MOD1_MASK },
275 { "Mod2", GDK_MOD2_MASK },
276 { "Mod3", GDK_MOD3_MASK },
277 { "Mod4", GDK_MOD4_MASK },
278 { "Mod5", GDK_MOD5_MASK },
284 class KeyboardOptions : public OptionEditorBox
288 _delete_button_adjustment (3, 1, 12),
289 _delete_button_spin (_delete_button_adjustment),
290 _edit_button_adjustment (3, 1, 5),
291 _edit_button_spin (_edit_button_adjustment),
292 _insert_note_button_adjustment (3, 1, 5),
293 _insert_note_button_spin (_insert_note_button_adjustment)
295 /* internationalize and prepare for use with combos */
298 for (int i = 0; modifiers[i].name; ++i) {
299 dumb.push_back (S_(modifiers[i].name));
302 set_popdown_strings (_edit_modifier_combo, dumb);
303 _edit_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::edit_modifier_chosen));
305 for (int x = 0; modifiers[x].name; ++x) {
306 if (modifiers[x].modifier == Keyboard::edit_modifier ()) {
307 _edit_modifier_combo.set_active_text (S_(modifiers[x].name));
312 Table* t = manage (new Table (4, 4));
315 Label* l = manage (left_aligned_label (_("Edit using:")));
316 l->set_name ("OptionsLabel");
318 t->attach (*l, 0, 1, 0, 1, FILL | EXPAND, FILL);
319 t->attach (_edit_modifier_combo, 1, 2, 0, 1, FILL | EXPAND, FILL);
321 l = manage (new Label (_("+ button")));
322 l->set_name ("OptionsLabel");
324 t->attach (*l, 3, 4, 0, 1, FILL | EXPAND, FILL);
325 t->attach (_edit_button_spin, 4, 5, 0, 1, FILL | EXPAND, FILL);
327 _edit_button_spin.set_name ("OptionsEntry");
328 _edit_button_adjustment.set_value (Keyboard::edit_button());
329 _edit_button_adjustment.signal_value_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::edit_button_changed));
331 set_popdown_strings (_delete_modifier_combo, dumb);
332 _delete_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::delete_modifier_chosen));
334 for (int x = 0; modifiers[x].name; ++x) {
335 if (modifiers[x].modifier == Keyboard::delete_modifier ()) {
336 _delete_modifier_combo.set_active_text (S_(modifiers[x].name));
341 l = manage (left_aligned_label (_("Delete using:")));
342 l->set_name ("OptionsLabel");
344 t->attach (*l, 0, 1, 1, 2, FILL | EXPAND, FILL);
345 t->attach (_delete_modifier_combo, 1, 2, 1, 2, FILL | EXPAND, FILL);
347 l = manage (new Label (_("+ button")));
348 l->set_name ("OptionsLabel");
350 t->attach (*l, 3, 4, 1, 2, FILL | EXPAND, FILL);
351 t->attach (_delete_button_spin, 4, 5, 1, 2, FILL | EXPAND, FILL);
353 _delete_button_spin.set_name ("OptionsEntry");
354 _delete_button_adjustment.set_value (Keyboard::delete_button());
355 _delete_button_adjustment.signal_value_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::delete_button_changed));
358 set_popdown_strings (_insert_note_modifier_combo, dumb);
359 _insert_note_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::insert_note_modifier_chosen));
361 for (int x = 0; modifiers[x].name; ++x) {
362 if (modifiers[x].modifier == Keyboard::insert_note_modifier ()) {
363 _insert_note_modifier_combo.set_active_text (S_(modifiers[x].name));
368 l = manage (left_aligned_label (_("Insert note using:")));
369 l->set_name ("OptionsLabel");
371 t->attach (*l, 0, 1, 2, 3, FILL | EXPAND, FILL);
372 t->attach (_insert_note_modifier_combo, 1, 2, 2, 3, FILL | EXPAND, FILL);
374 l = manage (new Label (_("+ button")));
375 l->set_name ("OptionsLabel");
377 t->attach (*l, 3, 4, 2, 3, FILL | EXPAND, FILL);
378 t->attach (_insert_note_button_spin, 4, 5, 2, 3, FILL | EXPAND, FILL);
380 _insert_note_button_spin.set_name ("OptionsEntry");
381 _insert_note_button_adjustment.set_value (Keyboard::insert_note_button());
382 _insert_note_button_adjustment.signal_value_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::insert_note_button_changed));
385 set_popdown_strings (_snap_modifier_combo, dumb);
386 _snap_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::snap_modifier_chosen));
388 for (int x = 0; modifiers[x].name; ++x) {
389 if (modifiers[x].modifier == (guint) Keyboard::snap_modifier ()) {
390 _snap_modifier_combo.set_active_text (S_(modifiers[x].name));
395 l = manage (left_aligned_label (_("Ignore snap using:")));
396 l->set_name ("OptionsLabel");
398 t->attach (*l, 0, 1, 3, 4, FILL | EXPAND, FILL);
399 t->attach (_snap_modifier_combo, 1, 2, 3, 4, FILL | EXPAND, FILL);
403 for (map<string,string>::iterator bf = Keyboard::binding_files.begin(); bf != Keyboard::binding_files.end(); ++bf) {
404 strs.push_back (bf->first);
407 set_popdown_strings (_keyboard_layout_selector, strs);
408 _keyboard_layout_selector.set_active_text (Keyboard::current_binding_name());
409 _keyboard_layout_selector.signal_changed().connect (sigc::mem_fun (*this, &KeyboardOptions::bindings_changed));
411 l = manage (left_aligned_label (_("Keyboard layout:")));
412 l->set_name ("OptionsLabel");
414 t->attach (*l, 0, 1, 4, 5, FILL | EXPAND, FILL);
415 t->attach (_keyboard_layout_selector, 1, 2, 4, 5, FILL | EXPAND, FILL);
417 _box->pack_start (*t, false, false);
420 void parameter_changed (string const &)
422 /* XXX: these aren't really config options... */
425 void set_state_from_config ()
427 /* XXX: these aren't really config options... */
432 void bindings_changed ()
434 string const txt = _keyboard_layout_selector.get_active_text();
436 /* XXX: config...? for all this keyboard stuff */
438 for (map<string,string>::iterator i = Keyboard::binding_files.begin(); i != Keyboard::binding_files.end(); ++i) {
439 if (txt == i->first) {
440 if (Keyboard::load_keybindings (i->second)) {
441 Keyboard::save_keybindings ();
447 void edit_modifier_chosen ()
449 string const txt = _edit_modifier_combo.get_active_text();
451 for (int i = 0; modifiers[i].name; ++i) {
452 if (txt == _(modifiers[i].name)) {
453 Keyboard::set_edit_modifier (modifiers[i].modifier);
459 void delete_modifier_chosen ()
461 string const txt = _delete_modifier_combo.get_active_text();
463 for (int i = 0; modifiers[i].name; ++i) {
464 if (txt == _(modifiers[i].name)) {
465 Keyboard::set_delete_modifier (modifiers[i].modifier);
471 void insert_note_modifier_chosen ()
473 string const txt = _insert_note_modifier_combo.get_active_text();
475 for (int i = 0; modifiers[i].name; ++i) {
476 if (txt == _(modifiers[i].name)) {
477 Keyboard::set_insert_note_modifier (modifiers[i].modifier);
483 void snap_modifier_chosen ()
485 string const txt = _snap_modifier_combo.get_active_text();
487 for (int i = 0; modifiers[i].name; ++i) {
488 if (txt == _(modifiers[i].name)) {
489 Keyboard::set_snap_modifier (modifiers[i].modifier);
495 void delete_button_changed ()
497 Keyboard::set_delete_button (_delete_button_spin.get_value_as_int());
500 void edit_button_changed ()
502 Keyboard::set_edit_button (_edit_button_spin.get_value_as_int());
505 void insert_note_button_changed ()
507 Keyboard::set_insert_note_button (_insert_note_button_spin.get_value_as_int());
510 ComboBoxText _keyboard_layout_selector;
511 ComboBoxText _edit_modifier_combo;
512 ComboBoxText _delete_modifier_combo;
513 ComboBoxText _insert_note_modifier_combo;
514 ComboBoxText _snap_modifier_combo;
515 Adjustment _delete_button_adjustment;
516 SpinButton _delete_button_spin;
517 Adjustment _edit_button_adjustment;
518 SpinButton _edit_button_spin;
519 Adjustment _insert_note_button_adjustment;
520 SpinButton _insert_note_button_spin;
524 class FontScalingOptions : public OptionEditorBox
527 FontScalingOptions (RCConfiguration* c) :
529 _dpi_adjustment (50, 50, 250, 1, 10),
530 _dpi_slider (_dpi_adjustment)
532 _dpi_adjustment.set_value (floor ((double)(_rc_config->get_font_scale () / 1024)));
534 Label* l = manage (new Label (_("Font scaling:")));
535 l->set_name ("OptionsLabel");
537 _dpi_slider.set_update_policy (UPDATE_DISCONTINUOUS);
538 HBox* h = manage (new HBox);
540 h->pack_start (*l, false, false);
541 h->pack_start (_dpi_slider, true, true);
543 _box->pack_start (*h, false, false);
545 _dpi_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &FontScalingOptions::dpi_changed));
548 void parameter_changed (string const & p)
550 if (p == "font-scale") {
551 _dpi_adjustment.set_value (floor ((double)(_rc_config->get_font_scale() / 1024)));
555 void set_state_from_config ()
557 parameter_changed ("font-scale");
564 _rc_config->set_font_scale ((long) floor (_dpi_adjustment.get_value() * 1024));
565 /* XXX: should be triggered from the parameter changed signal */
569 RCConfiguration* _rc_config;
570 Adjustment _dpi_adjustment;
574 class ClipLevelOptions : public OptionEditorBox
577 ClipLevelOptions (RCConfiguration* c)
579 , _clip_level_adjustment (0, -128.0, 2.0, 0.1, 1.0) /* units of dB */
580 , _clip_level_slider (_clip_level_adjustment)
582 _clip_level_adjustment.set_value (_rc_config->get_waveform_clip_level ());
584 Label* l = manage (new Label (_("Waveform Clip Level (dBFS):")));
585 l->set_name ("OptionsLabel");
587 _clip_level_slider.set_update_policy (UPDATE_DISCONTINUOUS);
588 HBox* h = manage (new HBox);
590 h->pack_start (*l, false, false);
591 h->pack_start (_clip_level_slider, true, true);
593 _box->pack_start (*h, false, false);
595 _clip_level_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &ClipLevelOptions::clip_level_changed));
598 void parameter_changed (string const & p)
600 if (p == "waveform-clip-level") {
601 _clip_level_adjustment.set_value (_rc_config->get_waveform_clip_level());
605 void set_state_from_config ()
607 parameter_changed ("waveform-clip-level");
612 void clip_level_changed ()
614 _rc_config->set_waveform_clip_level (_clip_level_adjustment.get_value());
615 /* XXX: should be triggered from the parameter changed signal */
616 ArdourCanvas::WaveView::set_clip_level (_clip_level_adjustment.get_value());
619 RCConfiguration* _rc_config;
620 Adjustment _clip_level_adjustment;
621 HScale _clip_level_slider;
624 class BufferingOptions : public OptionEditorBox
627 BufferingOptions (RCConfiguration* c)
629 , _playback_adjustment (5, 1, 60, 1, 4)
630 , _capture_adjustment (5, 1, 60, 1, 4)
631 , _playback_slider (_playback_adjustment)
632 , _capture_slider (_capture_adjustment)
634 _playback_adjustment.set_value (_rc_config->get_audio_playback_buffer_seconds());
636 Label* l = manage (new Label (_("Playback (seconds of buffering):")));
637 l->set_name ("OptionsLabel");
639 _playback_slider.set_update_policy (UPDATE_DISCONTINUOUS);
640 HBox* h = manage (new HBox);
642 h->pack_start (*l, false, false);
643 h->pack_start (_playback_slider, true, true);
645 _box->pack_start (*h, false, false);
647 _capture_adjustment.set_value (_rc_config->get_audio_capture_buffer_seconds());
649 l = manage (new Label (_("Recording (seconds of buffering):")));
650 l->set_name ("OptionsLabel");
652 _capture_slider.set_update_policy (UPDATE_DISCONTINUOUS);
653 h = manage (new HBox);
655 h->pack_start (*l, false, false);
656 h->pack_start (_capture_slider, true, true);
658 _box->pack_start (*h, false, false);
660 _capture_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &BufferingOptions::capture_changed));
661 _playback_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &BufferingOptions::playback_changed));
664 void parameter_changed (string const & p)
666 if (p == "playback-buffer-seconds") {
667 _playback_adjustment.set_value (_rc_config->get_audio_playback_buffer_seconds());
668 } else if (p == "capture-buffer-seconds") {
669 _capture_adjustment.set_value (_rc_config->get_audio_capture_buffer_seconds());
673 void set_state_from_config ()
675 parameter_changed ("playback-buffer-seconds");
676 parameter_changed ("capture-buffer-seconds");
681 void playback_changed ()
683 _rc_config->set_audio_playback_buffer_seconds ((long) _playback_adjustment.get_value());
686 void capture_changed ()
688 _rc_config->set_audio_capture_buffer_seconds ((long) _capture_adjustment.get_value());
691 RCConfiguration* _rc_config;
692 Adjustment _playback_adjustment;
693 Adjustment _capture_adjustment;
694 HScale _playback_slider;
695 HScale _capture_slider;
698 class ControlSurfacesOptions : public OptionEditorBox
701 ControlSurfacesOptions (Gtk::Window& parent)
703 , _ignore_view_change (0)
705 _store = ListStore::create (_model);
706 _view.set_model (_store);
707 _view.append_column (_("Control Surface Protocol"), _model.name);
708 _view.get_column(0)->set_resizable (true);
709 _view.get_column(0)->set_expand (true);
710 _view.append_column_editable (_("Enabled"), _model.enabled);
711 _view.append_column_editable (_("Feedback"), _model.feedback);
713 _box->pack_start (_view, false, false);
715 Label* label = manage (new Label);
716 label->set_markup (string_compose (X_("<i>%1</i>"), _("Double-click on a name to edit settings for an enabled protocol")));
718 _box->pack_start (*label, false, false);
721 ControlProtocolManager& m = ControlProtocolManager::instance ();
722 m.ProtocolStatusChange.connect (protocol_status_connection, MISSING_INVALIDATOR,
723 boost::bind (&ControlSurfacesOptions::protocol_status_changed, this, _1), gui_context());
725 _store->signal_row_changed().connect (sigc::mem_fun (*this, &ControlSurfacesOptions::view_changed));
726 _view.signal_button_press_event().connect_notify (sigc::mem_fun(*this, &ControlSurfacesOptions::edit_clicked));
729 void parameter_changed (std::string const &)
734 void set_state_from_config ()
738 ControlProtocolManager& m = ControlProtocolManager::instance ();
739 for (list<ControlProtocolInfo*>::iterator i = m.control_protocol_info.begin(); i != m.control_protocol_info.end(); ++i) {
741 if (!(*i)->mandatory) {
742 TreeModel::Row r = *_store->append ();
743 r[_model.name] = (*i)->name;
744 r[_model.enabled] = ((*i)->protocol || (*i)->requested);
745 r[_model.feedback] = ((*i)->protocol && (*i)->protocol->get_feedback ());
746 r[_model.protocol_info] = *i;
753 void protocol_status_changed (ControlProtocolInfo* cpi) {
755 TreeModel::Children rows = _store->children();
757 for (TreeModel::Children::iterator x = rows.begin(); x != rows.end(); ++x) {
758 string n = ((*x)[_model.name]);
760 if ((*x)[_model.protocol_info] == cpi) {
761 _ignore_view_change++;
762 (*x)[_model.enabled] = (cpi->protocol || cpi->requested);
763 _ignore_view_change--;
769 void view_changed (TreeModel::Path const &, TreeModel::iterator const & i)
771 TreeModel::Row r = *i;
773 if (_ignore_view_change) {
777 ControlProtocolInfo* cpi = r[_model.protocol_info];
782 bool const was_enabled = (cpi->protocol != 0);
783 bool const is_enabled = r[_model.enabled];
786 if (was_enabled != is_enabled) {
789 ControlProtocolManager::instance().activate (*cpi);
791 Gtk::Window* win = r[_model.editor];
796 ControlProtocolManager::instance().deactivate (*cpi);
800 r[_model.editor] = 0;
805 bool const was_feedback = (cpi->protocol && cpi->protocol->get_feedback ());
806 bool const is_feedback = r[_model.feedback];
808 if (was_feedback != is_feedback && cpi->protocol) {
809 cpi->protocol->set_feedback (is_feedback);
813 void edit_clicked (GdkEventButton* ev)
815 if (ev->type != GDK_2BUTTON_PRESS) {
820 ControlProtocolInfo* cpi;
823 row = *(_view.get_selection()->get_selected());
825 Window* win = row[_model.editor];
826 if (win && !win->is_visible()) {
829 cpi = row[_model.protocol_info];
831 if (cpi && cpi->protocol && cpi->protocol->has_editor ()) {
832 Box* box = (Box*) cpi->protocol->get_gui ();
834 string title = row[_model.name];
835 ArdourWindow* win = new ArdourWindow (_parent, title);
836 win->set_title ("Control Protocol Options");
840 row[_model.editor] = win;
846 class ControlSurfacesModelColumns : public TreeModelColumnRecord
850 ControlSurfacesModelColumns ()
859 TreeModelColumn<string> name;
860 TreeModelColumn<bool> enabled;
861 TreeModelColumn<bool> feedback;
862 TreeModelColumn<ControlProtocolInfo*> protocol_info;
863 TreeModelColumn<Gtk::Window*> editor;
866 Glib::RefPtr<ListStore> _store;
867 ControlSurfacesModelColumns _model;
869 Gtk::Window& _parent;
870 PBD::ScopedConnection protocol_status_connection;
871 uint32_t _ignore_view_change;
874 class VideoTimelineOptions : public OptionEditorBox
877 VideoTimelineOptions (RCConfiguration* c)
879 , _show_video_export_info_button (_("Show Video Export Info before export"))
880 , _show_video_server_dialog_button (_("Show Video Server Startup Dialog"))
881 , _video_advanced_setup_button (_("Advanced Setup (remote video server)"))
883 Table* t = manage (new Table (2, 6));
886 t->attach (_video_advanced_setup_button, 0, 2, 0, 1);
887 _video_advanced_setup_button.signal_toggled().connect (sigc::mem_fun (*this, &VideoTimelineOptions::video_advanced_setup_toggled));
888 Gtkmm2ext::UI::instance()->set_tip (_video_advanced_setup_button,
889 _("<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."));
891 Label* l = manage (new Label (_("Video Server URL:")));
892 l->set_alignment (0, 0.5);
893 t->attach (*l, 0, 1, 1, 2, FILL);
894 t->attach (_video_server_url_entry, 1, 2, 1, 2, FILL);
895 Gtkmm2ext::UI::instance()->set_tip (_video_server_url_entry,
896 _("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"));
898 l = manage (new Label (_("Video Folder:")));
899 l->set_alignment (0, 0.5);
900 t->attach (*l, 0, 1, 2, 3, FILL);
901 t->attach (_video_server_docroot_entry, 1, 2, 2, 3);
902 Gtkmm2ext::UI::instance()->set_tip (_video_server_docroot_entry,
903 _("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."));
905 /* small vspace y=3..4 */
907 t->attach (_show_video_export_info_button, 0, 2, 4, 5);
908 _show_video_export_info_button.signal_toggled().connect (sigc::mem_fun (*this, &VideoTimelineOptions::show_video_export_info_toggled));
909 Gtkmm2ext::UI::instance()->set_tip (_show_video_export_info_button,
910 _("<b>When enabled</b> an information window with details is displayed before the video-export dialog."));
912 t->attach (_show_video_server_dialog_button, 0, 2, 5, 6);
913 _show_video_server_dialog_button.signal_toggled().connect (sigc::mem_fun (*this, &VideoTimelineOptions::show_video_server_dialog_toggled));
914 Gtkmm2ext::UI::instance()->set_tip (_show_video_server_dialog_button,
915 _("<b>When enabled</b> the video server is never launched automatically without confirmation"));
917 _video_server_url_entry.signal_changed().connect (sigc::mem_fun(*this, &VideoTimelineOptions::server_url_changed));
918 _video_server_url_entry.signal_activate().connect (sigc::mem_fun(*this, &VideoTimelineOptions::server_url_changed));
919 _video_server_docroot_entry.signal_changed().connect (sigc::mem_fun(*this, &VideoTimelineOptions::server_docroot_changed));
920 _video_server_docroot_entry.signal_activate().connect (sigc::mem_fun(*this, &VideoTimelineOptions::server_docroot_changed));
922 _box->pack_start (*t,true,true);
925 void server_url_changed ()
927 _rc_config->set_video_server_url (_video_server_url_entry.get_text());
930 void server_docroot_changed ()
932 _rc_config->set_video_server_docroot (_video_server_docroot_entry.get_text());
935 void show_video_export_info_toggled ()
937 bool const x = _show_video_export_info_button.get_active ();
938 _rc_config->set_show_video_export_info (x);
941 void show_video_server_dialog_toggled ()
943 bool const x = _show_video_server_dialog_button.get_active ();
944 _rc_config->set_show_video_server_dialog (x);
947 void video_advanced_setup_toggled ()
949 bool const x = _video_advanced_setup_button.get_active ();
950 _rc_config->set_video_advanced_setup(x);
953 void parameter_changed (string const & p)
955 if (p == "video-server-url") {
956 _video_server_url_entry.set_text (_rc_config->get_video_server_url());
957 } else if (p == "video-server-docroot") {
958 _video_server_docroot_entry.set_text (_rc_config->get_video_server_docroot());
959 } else if (p == "show-video-export-info") {
960 bool const x = _rc_config->get_show_video_export_info();
961 _show_video_export_info_button.set_active (x);
962 } else if (p == "show-video-server-dialog") {
963 bool const x = _rc_config->get_show_video_server_dialog();
964 _show_video_server_dialog_button.set_active (x);
965 } else if (p == "video-advanced-setup") {
966 bool const x = _rc_config->get_video_advanced_setup();
967 _video_advanced_setup_button.set_active(x);
968 _video_server_docroot_entry.set_sensitive(x);
969 _video_server_url_entry.set_sensitive(x);
973 void set_state_from_config ()
975 parameter_changed ("video-server-url");
976 parameter_changed ("video-server-docroot");
977 parameter_changed ("video-monitor-setup-dialog");
978 parameter_changed ("show-video-export-info");
979 parameter_changed ("show-video-server-dialog");
980 parameter_changed ("video-advanced-setup");
984 RCConfiguration* _rc_config;
985 Entry _video_server_url_entry;
986 Entry _video_server_docroot_entry;
987 CheckButton _show_video_export_info_button;
988 CheckButton _show_video_server_dialog_button;
989 CheckButton _video_advanced_setup_button;
992 /** A class which allows control of visibility of some editor components usign
993 * a VisibilityGroup. The caller should pass in a `dummy' VisibilityGroup
994 * which has the correct members, but with null widget pointers. This
995 * class allows the user to set visibility of the members, the details
996 * of which are stored in a configuration variable which can be watched
997 * by parts of the editor that actually contain the widgets whose visibility
998 * is being controlled.
1001 class VisibilityOption : public Option
1004 /** @param name User-visible name for this group.
1005 * @param g `Dummy' VisibilityGroup (as described above).
1006 * @param get Method to get the value of the appropriate configuration variable.
1007 * @param set Method to set the value of the appropriate configuration variable.
1009 VisibilityOption (string name, VisibilityGroup* g, sigc::slot<string> get, sigc::slot<bool, string> set)
1010 : Option (g->get_state_name(), name)
1012 , _visibility_group (g)
1016 /* Watch for changes made by the user to our members */
1017 _visibility_group->VisibilityChanged.connect_same_thread (
1018 _visibility_group_connection, sigc::bind (&VisibilityOption::changed, this)
1022 void set_state_from_config ()
1024 /* Set our state from the current configuration */
1025 _visibility_group->set_state (_get ());
1028 void add_to_page (OptionEditorPage* p)
1030 _heading.add_to_page (p);
1031 add_widget_to_page (p, _visibility_group->list_view ());
1034 Gtk::Widget& tip_widget() { return *_visibility_group->list_view (); }
1039 /* The user has changed something, so reflect this change
1040 in the RCConfiguration.
1042 _set (_visibility_group->get_state_value ());
1045 OptionEditorHeading _heading;
1046 VisibilityGroup* _visibility_group;
1047 sigc::slot<std::string> _get;
1048 sigc::slot<bool, std::string> _set;
1049 PBD::ScopedConnection _visibility_group_connection;
1054 RCOptionEditor::RCOptionEditor ()
1055 : OptionEditor (Config, string_compose (_("%1 Preferences"), PROGRAM_NAME))
1056 , _rc_config (Config)
1057 , _mixer_strip_visibility ("mixer-strip-visibility")
1061 uint32_t hwcpus = hardware_concurrency ();
1063 BoolComboOption* bco;
1066 add_option (_("Misc"), new OptionEditorHeading (_("DSP CPU Utilization")));
1068 ComboOption<int32_t>* procs = new ComboOption<int32_t> (
1070 _("Signal processing uses"),
1071 sigc::mem_fun (*_rc_config, &RCConfiguration::get_processor_usage),
1072 sigc::mem_fun (*_rc_config, &RCConfiguration::set_processor_usage)
1075 procs->add (-1, _("all but one processor"));
1076 procs->add (0, _("all available processors"));
1078 for (uint32_t i = 1; i <= hwcpus; ++i) {
1079 procs->add (i, string_compose (_("%1 processors"), i));
1082 procs->set_note (string_compose (_("This setting will only take effect when %1 is restarted."), PROGRAM_NAME));
1084 add_option (_("Misc"), procs);
1087 add_option (_("Misc"), new OptionEditorHeading (S_("Options|Undo")));
1089 add_option (_("Misc"), new UndoOptions (_rc_config));
1091 add_option (_("Misc"),
1093 "verify-remove-last-capture",
1094 _("Verify removal of last capture"),
1095 sigc::mem_fun (*_rc_config, &RCConfiguration::get_verify_remove_last_capture),
1096 sigc::mem_fun (*_rc_config, &RCConfiguration::set_verify_remove_last_capture)
1099 add_option (_("Misc"),
1101 "periodic-safety-backups",
1102 _("Make periodic backups of the session file"),
1103 sigc::mem_fun (*_rc_config, &RCConfiguration::get_periodic_safety_backups),
1104 sigc::mem_fun (*_rc_config, &RCConfiguration::set_periodic_safety_backups)
1107 add_option (_("Misc"), new OptionEditorHeading (_("Session Management")));
1109 add_option (_("Misc"),
1111 "only-copy-imported-files",
1112 _("Always copy imported files"),
1113 sigc::mem_fun (*_rc_config, &RCConfiguration::get_only_copy_imported_files),
1114 sigc::mem_fun (*_rc_config, &RCConfiguration::set_only_copy_imported_files)
1117 add_option (_("Misc"), new DirectoryOption (
1118 X_("default-session-parent-dir"),
1119 _("Default folder for new sessions:"),
1120 sigc::mem_fun (*_rc_config, &RCConfiguration::get_default_session_parent_dir),
1121 sigc::mem_fun (*_rc_config, &RCConfiguration::set_default_session_parent_dir)
1124 add_option (_("Misc"),
1125 new SpinOption<uint32_t> (
1126 "max-recent-sessions",
1127 _("Maximum number of recent sessions"),
1128 sigc::mem_fun (*_rc_config, &RCConfiguration::get_max_recent_sessions),
1129 sigc::mem_fun (*_rc_config, &RCConfiguration::set_max_recent_sessions),
1133 add_option (_("Misc"), new OptionEditorHeading (_("Click")));
1135 add_option (_("Misc"), new ClickOptions (_rc_config, this));
1137 add_option (_("Misc"),
1140 _("Click gain level"),
1141 sigc::mem_fun (*_rc_config, &RCConfiguration::get_click_gain),
1142 sigc::mem_fun (*_rc_config, &RCConfiguration::set_click_gain)
1145 add_option (_("Misc"), new OptionEditorHeading (_("Automation")));
1147 add_option (_("Misc"),
1148 new SpinOption<double> (
1149 "automation-thinning-factor",
1150 _("Thinning factor (larger value => less data)"),
1151 sigc::mem_fun (*_rc_config, &RCConfiguration::get_automation_thinning_factor),
1152 sigc::mem_fun (*_rc_config, &RCConfiguration::set_automation_thinning_factor),
1156 add_option (_("Misc"),
1157 new SpinOption<double> (
1158 "automation-interval-msecs",
1159 _("Automation sampling interval (milliseconds)"),
1160 sigc::mem_fun (*_rc_config, &RCConfiguration::get_automation_interval_msecs),
1161 sigc::mem_fun (*_rc_config, &RCConfiguration::set_automation_interval_msecs),
1169 tsf = new BoolOption (
1170 "latched-record-enable",
1171 _("Keep record-enable engaged on stop"),
1172 sigc::mem_fun (*_rc_config, &RCConfiguration::get_latched_record_enable),
1173 sigc::mem_fun (*_rc_config, &RCConfiguration::set_latched_record_enable)
1175 // Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(), _(""));
1176 add_option (_("Transport"), tsf);
1178 tsf = new BoolOption (
1179 "stop-recording-on-xrun",
1180 _("Stop recording when an xrun occurs"),
1181 sigc::mem_fun (*_rc_config, &RCConfiguration::get_stop_recording_on_xrun),
1182 sigc::mem_fun (*_rc_config, &RCConfiguration::set_stop_recording_on_xrun)
1184 Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(),
1185 string_compose (_("<b>When enabled</b> %1 will stop recording if an over- or underrun is detected by the audio engine"),
1187 add_option (_("Transport"), tsf);
1189 tsf = new BoolOption (
1190 "create-xrun-marker",
1191 _("Create markers where xruns occur"),
1192 sigc::mem_fun (*_rc_config, &RCConfiguration::get_create_xrun_marker),
1193 sigc::mem_fun (*_rc_config, &RCConfiguration::set_create_xrun_marker)
1195 // Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(), _(""));
1196 add_option (_("Transport"), tsf);
1198 tsf = new BoolOption (
1199 "stop-at-session-end",
1200 _("Stop at the end of the session"),
1201 sigc::mem_fun (*_rc_config, &RCConfiguration::get_stop_at_session_end),
1202 sigc::mem_fun (*_rc_config, &RCConfiguration::set_stop_at_session_end)
1204 Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(),
1205 string_compose (_("<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the transport "
1206 "when it reaches the current session end marker\n\n"
1207 "<b>When disabled</b> %1 will continue to roll past the session end marker at all times"),
1209 add_option (_("Transport"), tsf);
1211 tsf = new BoolOption (
1213 _("Do seamless looping (not possible when slaved to MTC, LTC etc)"),
1214 sigc::mem_fun (*_rc_config, &RCConfiguration::get_seamless_loop),
1215 sigc::mem_fun (*_rc_config, &RCConfiguration::set_seamless_loop)
1217 Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(),
1218 string_compose (_("<b>When enabled</b> this will loop by reading ahead and wrapping around at the loop point, "
1219 "preventing any need to do a transport locate at the end of the loop\n\n"
1220 "<b>When disabled</b> looping is done by locating back to the start of the loop when %1 reaches the end "
1221 "which will often cause a small click or delay"), PROGRAM_NAME));
1222 add_option (_("Transport"), tsf);
1224 tsf = new BoolOption (
1225 "disable-disarm-during-roll",
1226 _("Disable per-track record disarm while rolling"),
1227 sigc::mem_fun (*_rc_config, &RCConfiguration::get_disable_disarm_during_roll),
1228 sigc::mem_fun (*_rc_config, &RCConfiguration::set_disable_disarm_during_roll)
1230 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"));
1231 add_option (_("Transport"), tsf);
1233 tsf = new BoolOption (
1235 _("12dB gain reduction during fast-forward and fast-rewind"),
1236 sigc::mem_fun (*_rc_config, &RCConfiguration::get_quieten_at_speed),
1237 sigc::mem_fun (*_rc_config, &RCConfiguration::set_quieten_at_speed)
1239 Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(), _("This will reduce the unpleasant increase in perceived volume "
1240 "that occurs when fast-forwarding or rewinding through some kinds of audio"));
1241 add_option (_("Transport"), tsf);
1243 add_option (_("Transport"), new OptionEditorHeading (S_("Sync/Slave")));
1245 _sync_source = new ComboOption<SyncSource> (
1247 _("External timecode source"),
1248 sigc::mem_fun (*_rc_config, &RCConfiguration::get_sync_source),
1249 sigc::mem_fun (*_rc_config, &RCConfiguration::set_sync_source)
1252 populate_sync_options ();
1253 add_option (_("Transport"), _sync_source);
1255 _sync_framerate = new BoolOption (
1256 "timecode-sync-frame-rate",
1257 _("Match session video frame rate to external timecode"),
1258 sigc::mem_fun (*_rc_config, &RCConfiguration::get_timecode_sync_frame_rate),
1259 sigc::mem_fun (*_rc_config, &RCConfiguration::set_timecode_sync_frame_rate)
1261 Gtkmm2ext::UI::instance()->set_tip
1262 (_sync_framerate->tip_widget(),
1263 string_compose (_("This option controls the value of the video frame rate <i>while chasing</i> an external timecode source.\n\n"
1264 "<b>When enabled</b> the session video frame rate will be changed to match that of the selected external timecode source.\n\n"
1265 "<b>When disabled</b> the session video frame rate will not be changed to match that of the selected external timecode source."
1266 "Instead the frame rate indication in the main clock will flash red and %1 will convert between the external "
1267 "timecode standard and the session standard."), PROGRAM_NAME));
1269 add_option (_("Transport"), _sync_framerate);
1271 _sync_genlock = new BoolOption (
1272 "timecode-source-is-synced",
1273 _("External timecode is sync locked"),
1274 sigc::mem_fun (*_rc_config, &RCConfiguration::get_timecode_source_is_synced),
1275 sigc::mem_fun (*_rc_config, &RCConfiguration::set_timecode_source_is_synced)
1277 Gtkmm2ext::UI::instance()->set_tip
1278 (_sync_genlock->tip_widget(),
1279 _("<b>When enabled</b> indicates that the selected external timecode source shares sync (Black & Burst, Wordclock, etc) with the audio interface."));
1282 add_option (_("Transport"), _sync_genlock);
1284 _sync_source_2997 = new BoolOption (
1285 "timecode-source-2997",
1286 _("Lock to 29.9700 fps instead of 30000/1001"),
1287 sigc::mem_fun (*_rc_config, &RCConfiguration::get_timecode_source_2997),
1288 sigc::mem_fun (*_rc_config, &RCConfiguration::set_timecode_source_2997)
1290 Gtkmm2ext::UI::instance()->set_tip
1291 (_sync_source_2997->tip_widget(),
1292 _("<b>When enabled</b> the external timecode source is assumed to use 29.97 fps instead of 30000/1001.\n"
1293 "SMPTE 12M-1999 specifies 29.97df as 30000/1001. The spec further mentions that "
1294 "drop-frame timecode has an accumulated error of -86ms over a 24-hour period.\n"
1295 "Drop-frame timecode would compensate exactly for a NTSC color frame rate of 30 * 0.9990 (ie 29.970000). "
1296 "That is not the actual rate. However, some vendors use that rate - despite it being against the specs - "
1297 "because the variant of using exactly 29.97 fps has zero timecode drift.\n"
1300 add_option (_("Transport"), _sync_source_2997);
1302 add_option (_("Transport"), new OptionEditorHeading (S_("LTC Reader")));
1304 _ltc_port = new ComboStringOption (
1306 _("LTC incoming port"),
1307 sigc::mem_fun (*_rc_config, &RCConfiguration::get_ltc_source_port),
1308 sigc::mem_fun (*_rc_config, &RCConfiguration::set_ltc_source_port)
1311 vector<string> physical_inputs;
1312 physical_inputs.push_back (_("None"));
1313 AudioEngine::instance()->get_physical_inputs (DataType::AUDIO, physical_inputs);
1314 _ltc_port->set_popdown_strings (physical_inputs);
1316 add_option (_("Transport"), _ltc_port);
1318 // TODO; rather disable this button than not compile it..
1319 add_option (_("Transport"), new OptionEditorHeading (S_("LTC Generator")));
1321 add_option (_("Transport"),
1324 _("Enable LTC generator"),
1325 sigc::mem_fun (*_rc_config, &RCConfiguration::get_send_ltc),
1326 sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_ltc)
1329 _ltc_send_continuously = new BoolOption (
1330 "ltc-send-continuously",
1331 _("send LTC while stopped"),
1332 sigc::mem_fun (*_rc_config, &RCConfiguration::get_ltc_send_continuously),
1333 sigc::mem_fun (*_rc_config, &RCConfiguration::set_ltc_send_continuously)
1335 Gtkmm2ext::UI::instance()->set_tip
1336 (_ltc_send_continuously->tip_widget(),
1337 string_compose (_("<b>When enabled</b> %1 will continue to send LTC information even when the transport (playhead) is not moving"), PROGRAM_NAME));
1338 add_option (_("Transport"), _ltc_send_continuously);
1340 _ltc_volume_adjustment = new Gtk::Adjustment(-18, -50, 0, .5, 5);
1341 _ltc_volume_adjustment->set_value (20 * log10(_rc_config->get_ltc_output_volume()));
1342 _ltc_volume_adjustment->signal_value_changed().connect (sigc::mem_fun (*this, &RCOptionEditor::ltc_generator_volume_changed));
1343 _ltc_volume_slider = new HSliderOption("ltcvol", _("LTC generator level"), *_ltc_volume_adjustment);
1345 Gtkmm2ext::UI::instance()->set_tip
1346 (_ltc_volume_slider->tip_widget(),
1347 _("Specify the Peak Volume of the generated LTC signal in dbFS. A good value is 0dBu ^= -18dbFS in an EBU calibrated system"));
1349 add_option (_("Transport"), _ltc_volume_slider);
1350 parameter_changed ("send-ltc");
1352 parameter_changed ("sync-source");
1356 add_option (_("Editor"),
1358 "link-region-and-track-selection",
1359 _("Link selection of regions and tracks"),
1360 sigc::mem_fun (*_rc_config, &RCConfiguration::get_link_region_and_track_selection),
1361 sigc::mem_fun (*_rc_config, &RCConfiguration::set_link_region_and_track_selection)
1364 add_option (_("Editor"),
1366 "automation-follows-regions",
1367 _("Move relevant automation when audio regions are moved"),
1368 sigc::mem_fun (*_rc_config, &RCConfiguration::get_automation_follows_regions),
1369 sigc::mem_fun (*_rc_config, &RCConfiguration::set_automation_follows_regions)
1372 add_option (_("Editor"),
1374 "show-track-meters",
1375 _("Show meters on tracks in the editor"),
1376 sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_track_meters),
1377 sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_track_meters)
1380 add_option (_("Editor"),
1382 "show-editor-meter",
1383 _("Display master-meter in the toolbar"),
1384 sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_editor_meter),
1385 sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_editor_meter)
1388 bco = new BoolComboOption (
1389 "use-overlap-equivalency",
1390 _("Regions in active edit groups are edited together"),
1391 _("whenever they overlap in time"),
1392 _("only if they have identical length, position and origin"),
1393 sigc::mem_fun (*_rc_config, &RCConfiguration::get_use_overlap_equivalency),
1394 sigc::mem_fun (*_rc_config, &RCConfiguration::set_use_overlap_equivalency)
1397 add_option (_("Editor"), bco);
1399 add_option (_("Editor"),
1401 "rubberbanding-snaps-to-grid",
1402 _("Make rubberband selection rectangle snap to the grid"),
1403 sigc::mem_fun (*_rc_config, &RCConfiguration::get_rubberbanding_snaps_to_grid),
1404 sigc::mem_fun (*_rc_config, &RCConfiguration::set_rubberbanding_snaps_to_grid)
1407 add_option (_("Editor"),
1410 _("Show waveforms in regions"),
1411 sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_waveforms),
1412 sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_waveforms)
1415 add_option (_("Editor"),
1416 new BoolComboOption (
1417 "show-region-gain-envelopes",
1418 _("Show gain envelopes in audio regions"),
1420 _("only in region gain mode"),
1421 sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_region_gain),
1422 sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_region_gain)
1425 ComboOption<WaveformScale>* wfs = new ComboOption<WaveformScale> (
1427 _("Waveform scale"),
1428 sigc::mem_fun (*_rc_config, &RCConfiguration::get_waveform_scale),
1429 sigc::mem_fun (*_rc_config, &RCConfiguration::set_waveform_scale)
1432 wfs->add (Linear, _("linear"));
1433 wfs->add (Logarithmic, _("logarithmic"));
1435 add_option (_("Editor"), wfs);
1437 ComboOption<WaveformShape>* wfsh = new ComboOption<WaveformShape> (
1439 _("Waveform shape"),
1440 sigc::mem_fun (*_rc_config, &RCConfiguration::get_waveform_shape),
1441 sigc::mem_fun (*_rc_config, &RCConfiguration::set_waveform_shape)
1444 wfsh->add (Traditional, _("traditional"));
1445 wfsh->add (Rectified, _("rectified"));
1447 add_option (_("Editor"), wfsh);
1449 add_option (_("Editor"), new ClipLevelOptions (_rc_config));
1451 add_option (_("Editor"),
1453 "show-waveforms-while-recording",
1454 _("Show waveforms for audio while it is being recorded"),
1455 sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_waveforms_while_recording),
1456 sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_waveforms_while_recording)
1459 add_option (_("Editor"),
1462 _("Show zoom toolbar"),
1463 sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_zoom_tools),
1464 sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_zoom_tools)
1467 add_option (_("Editor"),
1469 "update-editor-during-summary-drag",
1470 _("Update editor window during drags of the summary"),
1471 sigc::mem_fun (*_rc_config, &RCConfiguration::get_update_editor_during_summary_drag),
1472 sigc::mem_fun (*_rc_config, &RCConfiguration::set_update_editor_during_summary_drag)
1475 add_option (_("Editor"),
1477 "link-editor-and-mixer-selection",
1478 _("Synchronise editor and mixer selection"),
1479 sigc::mem_fun (*_rc_config, &RCConfiguration::get_link_editor_and_mixer_selection),
1480 sigc::mem_fun (*_rc_config, &RCConfiguration::set_link_editor_and_mixer_selection)
1483 bo = new BoolOption (
1485 _("Name new markers"),
1486 sigc::mem_fun (*_rc_config, &RCConfiguration::get_name_new_markers),
1487 sigc::mem_fun (*_rc_config, &RCConfiguration::set_name_new_markers)
1490 add_option (_("Editor"), bo);
1491 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."
1492 "\n\nYou can always rename markers by right-clicking on them"));
1494 add_option (_("Editor"),
1496 "autoscroll-editor",
1497 _("Auto-scroll editor window when dragging near its edges"),
1498 sigc::mem_fun (*_rc_config, &RCConfiguration::get_autoscroll_editor),
1499 sigc::mem_fun (*_rc_config, &RCConfiguration::set_autoscroll_editor)
1504 add_option (_("Audio"), new OptionEditorHeading (_("Buffering")));
1506 add_option (_("Audio"), new BufferingOptions (_rc_config));
1508 add_option (_("Audio"), new OptionEditorHeading (_("Monitoring")));
1510 ComboOption<MonitorModel>* mm = new ComboOption<MonitorModel> (
1512 _("Record monitoring handled by"),
1513 sigc::mem_fun (*_rc_config, &RCConfiguration::get_monitoring_model),
1514 sigc::mem_fun (*_rc_config, &RCConfiguration::set_monitoring_model)
1517 if (AudioEngine::instance()->port_engine().can_monitor_input()) {
1518 mm->add (HardwareMonitoring, _("via Audio Driver"));
1521 mm->add (SoftwareMonitoring, _("ardour"));
1522 mm->add (ExternalMonitoring, _("audio hardware"));
1524 add_option (_("Audio"), mm);
1526 add_option (_("Audio"),
1528 "tape-machine-mode",
1529 _("Tape machine mode"),
1530 sigc::mem_fun (*_rc_config, &RCConfiguration::get_tape_machine_mode),
1531 sigc::mem_fun (*_rc_config, &RCConfiguration::set_tape_machine_mode)
1534 add_option (_("Audio"), new OptionEditorHeading (_("Connection of tracks and busses")));
1536 add_option (_("Audio"),
1538 "auto-connect-standard-busses",
1539 _("Auto-connect master/monitor busses"),
1540 sigc::mem_fun (*_rc_config, &RCConfiguration::get_auto_connect_standard_busses),
1541 sigc::mem_fun (*_rc_config, &RCConfiguration::set_auto_connect_standard_busses)
1544 ComboOption<AutoConnectOption>* iac = new ComboOption<AutoConnectOption> (
1545 "input-auto-connect",
1546 _("Connect track inputs"),
1547 sigc::mem_fun (*_rc_config, &RCConfiguration::get_input_auto_connect),
1548 sigc::mem_fun (*_rc_config, &RCConfiguration::set_input_auto_connect)
1551 iac->add (AutoConnectPhysical, _("automatically to physical inputs"));
1552 iac->add (ManualConnect, _("manually"));
1554 add_option (_("Audio"), iac);
1556 ComboOption<AutoConnectOption>* oac = new ComboOption<AutoConnectOption> (
1557 "output-auto-connect",
1558 _("Connect track and bus outputs"),
1559 sigc::mem_fun (*_rc_config, &RCConfiguration::get_output_auto_connect),
1560 sigc::mem_fun (*_rc_config, &RCConfiguration::set_output_auto_connect)
1563 oac->add (AutoConnectPhysical, _("automatically to physical outputs"));
1564 oac->add (AutoConnectMaster, _("automatically to master bus"));
1565 oac->add (ManualConnect, _("manually"));
1567 add_option (_("Audio"), oac);
1569 add_option (_("Audio"), new OptionEditorHeading (_("Denormals")));
1571 add_option (_("Audio"),
1573 "denormal-protection",
1574 _("Use DC bias to protect against denormals"),
1575 sigc::mem_fun (*_rc_config, &RCConfiguration::get_denormal_protection),
1576 sigc::mem_fun (*_rc_config, &RCConfiguration::set_denormal_protection)
1579 ComboOption<DenormalModel>* dm = new ComboOption<DenormalModel> (
1581 _("Processor handling"),
1582 sigc::mem_fun (*_rc_config, &RCConfiguration::get_denormal_model),
1583 sigc::mem_fun (*_rc_config, &RCConfiguration::set_denormal_model)
1586 dm->add (DenormalNone, _("no processor handling"));
1590 if (fpu.has_flush_to_zero()) {
1591 dm->add (DenormalFTZ, _("use FlushToZero"));
1594 if (fpu.has_denormals_are_zero()) {
1595 dm->add (DenormalDAZ, _("use DenormalsAreZero"));
1598 if (fpu.has_flush_to_zero() && fpu.has_denormals_are_zero()) {
1599 dm->add (DenormalFTZDAZ, _("use FlushToZero and DenormalsAreZero"));
1602 add_option (_("Audio"), dm);
1604 add_option (_("Audio"), new OptionEditorHeading (_("Plugins")));
1606 add_option (_("Audio"),
1608 "plugins-stop-with-transport",
1609 _("Silence plugins when the transport is stopped"),
1610 sigc::mem_fun (*_rc_config, &RCConfiguration::get_plugins_stop_with_transport),
1611 sigc::mem_fun (*_rc_config, &RCConfiguration::set_plugins_stop_with_transport)
1614 add_option (_("Audio"),
1616 "new-plugins-active",
1617 _("Make new plugins active"),
1618 sigc::mem_fun (*_rc_config, &RCConfiguration::get_new_plugins_active),
1619 sigc::mem_fun (*_rc_config, &RCConfiguration::set_new_plugins_active)
1622 add_option (_("Audio"),
1624 "auto-analyse-audio",
1625 _("Enable automatic analysis of audio"),
1626 sigc::mem_fun (*_rc_config, &RCConfiguration::get_auto_analyse_audio),
1627 sigc::mem_fun (*_rc_config, &RCConfiguration::set_auto_analyse_audio)
1630 add_option (_("Audio"),
1632 "replicate-missing-region-channels",
1633 _("Replicate missing region channels"),
1634 sigc::mem_fun (*_rc_config, &RCConfiguration::get_replicate_missing_region_channels),
1635 sigc::mem_fun (*_rc_config, &RCConfiguration::set_replicate_missing_region_channels)
1640 add_option (_("Solo / mute"), new OptionEditorHeading (_("Solo")));
1642 add_option (_("Solo / mute"),
1645 _("Solo-in-place mute cut (dB)"),
1646 sigc::mem_fun (*_rc_config, &RCConfiguration::get_solo_mute_gain),
1647 sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_mute_gain)
1650 _solo_control_is_listen_control = new BoolOption (
1651 "solo-control-is-listen-control",
1652 _("Solo controls are Listen controls"),
1653 sigc::mem_fun (*_rc_config, &RCConfiguration::get_solo_control_is_listen_control),
1654 sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_control_is_listen_control)
1657 add_option (_("Solo / mute"), _solo_control_is_listen_control);
1659 _listen_position = new ComboOption<ListenPosition> (
1661 _("Listen Position"),
1662 sigc::mem_fun (*_rc_config, &RCConfiguration::get_listen_position),
1663 sigc::mem_fun (*_rc_config, &RCConfiguration::set_listen_position)
1666 _listen_position->add (AfterFaderListen, _("after-fader (AFL)"));
1667 _listen_position->add (PreFaderListen, _("pre-fader (PFL)"));
1669 add_option (_("Solo / mute"), _listen_position);
1671 ComboOption<PFLPosition>* pp = new ComboOption<PFLPosition> (
1673 _("PFL signals come from"),
1674 sigc::mem_fun (*_rc_config, &RCConfiguration::get_pfl_position),
1675 sigc::mem_fun (*_rc_config, &RCConfiguration::set_pfl_position)
1678 pp->add (PFLFromBeforeProcessors, _("before pre-fader processors"));
1679 pp->add (PFLFromAfterProcessors, _("pre-fader but after pre-fader processors"));
1681 add_option (_("Solo / mute"), pp);
1683 ComboOption<AFLPosition>* pa = new ComboOption<AFLPosition> (
1685 _("AFL signals come from"),
1686 sigc::mem_fun (*_rc_config, &RCConfiguration::get_afl_position),
1687 sigc::mem_fun (*_rc_config, &RCConfiguration::set_afl_position)
1690 pa->add (AFLFromBeforeProcessors, _("immediately post-fader"));
1691 pa->add (AFLFromAfterProcessors, _("after post-fader processors (before pan)"));
1693 add_option (_("Solo / mute"), pa);
1695 parameter_changed ("use-monitor-bus");
1697 add_option (_("Solo / mute"),
1700 _("Exclusive solo"),
1701 sigc::mem_fun (*_rc_config, &RCConfiguration::get_exclusive_solo),
1702 sigc::mem_fun (*_rc_config, &RCConfiguration::set_exclusive_solo)
1705 add_option (_("Solo / mute"),
1708 _("Show solo muting"),
1709 sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_solo_mutes),
1710 sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_solo_mutes)
1713 add_option (_("Solo / mute"),
1715 "solo-mute-override",
1716 _("Soloing overrides muting"),
1717 sigc::mem_fun (*_rc_config, &RCConfiguration::get_solo_mute_override),
1718 sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_mute_override)
1721 add_option (_("Solo / mute"), new OptionEditorHeading (_("Default track / bus muting options")));
1723 add_option (_("Solo / mute"),
1725 "mute-affects-pre-fader",
1726 _("Mute affects pre-fader sends"),
1727 sigc::mem_fun (*_rc_config, &RCConfiguration::get_mute_affects_pre_fader),
1728 sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_pre_fader)
1731 add_option (_("Solo / mute"),
1733 "mute-affects-post-fader",
1734 _("Mute affects post-fader sends"),
1735 sigc::mem_fun (*_rc_config, &RCConfiguration::get_mute_affects_post_fader),
1736 sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_post_fader)
1739 add_option (_("Solo / mute"),
1741 "mute-affects-control-outs",
1742 _("Mute affects control outputs"),
1743 sigc::mem_fun (*_rc_config, &RCConfiguration::get_mute_affects_control_outs),
1744 sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_control_outs)
1747 add_option (_("Solo / mute"),
1749 "mute-affects-main-outs",
1750 _("Mute affects main outputs"),
1751 sigc::mem_fun (*_rc_config, &RCConfiguration::get_mute_affects_main_outs),
1752 sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_main_outs)
1755 add_option (_("Solo / mute"), new OptionEditorHeading (_("Send Routing")));
1757 add_option (_("Solo / mute"),
1759 "link-send-and-route-panner",
1760 _("Link panners of Aux and External Sends with main panner by default"),
1761 sigc::mem_fun (*_rc_config, &RCConfiguration::get_link_send_and_route_panner),
1762 sigc::mem_fun (*_rc_config, &RCConfiguration::set_link_send_and_route_panner)
1765 add_option (_("MIDI"),
1768 _("Send MIDI Clock"),
1769 sigc::mem_fun (*_rc_config, &RCConfiguration::get_send_midi_clock),
1770 sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_midi_clock)
1773 add_option (_("MIDI"),
1776 _("Send MIDI Time Code"),
1777 sigc::mem_fun (*_rc_config, &RCConfiguration::get_send_mtc),
1778 sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_mtc)
1781 add_option (_("MIDI"),
1782 new SpinOption<int> (
1783 "mtc-qf-speed-tolerance",
1784 _("Percentage either side of normal transport speed to transmit MTC"),
1785 sigc::mem_fun (*_rc_config, &RCConfiguration::get_mtc_qf_speed_tolerance),
1786 sigc::mem_fun (*_rc_config, &RCConfiguration::set_mtc_qf_speed_tolerance),
1790 add_option (_("MIDI"),
1793 _("Obey MIDI Machine Control commands"),
1794 sigc::mem_fun (*_rc_config, &RCConfiguration::get_mmc_control),
1795 sigc::mem_fun (*_rc_config, &RCConfiguration::set_mmc_control)
1798 add_option (_("MIDI"),
1801 _("Send MIDI Machine Control commands"),
1802 sigc::mem_fun (*_rc_config, &RCConfiguration::get_send_mmc),
1803 sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_mmc)
1806 add_option (_("MIDI"),
1809 _("Send MIDI control feedback"),
1810 sigc::mem_fun (*_rc_config, &RCConfiguration::get_midi_feedback),
1811 sigc::mem_fun (*_rc_config, &RCConfiguration::set_midi_feedback)
1814 add_option (_("MIDI"),
1815 new SpinOption<uint8_t> (
1816 "mmc-receive-device-id",
1817 _("Inbound MMC device ID"),
1818 sigc::mem_fun (*_rc_config, &RCConfiguration::get_mmc_receive_device_id),
1819 sigc::mem_fun (*_rc_config, &RCConfiguration::set_mmc_receive_device_id),
1823 add_option (_("MIDI"),
1824 new SpinOption<uint8_t> (
1825 "mmc-send-device-id",
1826 _("Outbound MMC device ID"),
1827 sigc::mem_fun (*_rc_config, &RCConfiguration::get_mmc_send_device_id),
1828 sigc::mem_fun (*_rc_config, &RCConfiguration::set_mmc_send_device_id),
1832 add_option (_("MIDI"),
1833 new SpinOption<int32_t> (
1834 "initial-program-change",
1835 _("Initial program change"),
1836 sigc::mem_fun (*_rc_config, &RCConfiguration::get_initial_program_change),
1837 sigc::mem_fun (*_rc_config, &RCConfiguration::set_initial_program_change),
1841 add_option (_("MIDI"),
1843 "diplay-first-midi-bank-as-zero",
1844 _("Display first MIDI bank/program as 0"),
1845 sigc::mem_fun (*_rc_config, &RCConfiguration::get_first_midi_bank_is_zero),
1846 sigc::mem_fun (*_rc_config, &RCConfiguration::set_first_midi_bank_is_zero)
1849 add_option (_("MIDI"),
1851 "never-display-periodic-midi",
1852 _("Never display periodic MIDI messages (MTC, MIDI Clock)"),
1853 sigc::mem_fun (*_rc_config, &RCConfiguration::get_never_display_periodic_midi),
1854 sigc::mem_fun (*_rc_config, &RCConfiguration::set_never_display_periodic_midi)
1857 add_option (_("MIDI"),
1860 _("Sound MIDI notes as they are selected"),
1861 sigc::mem_fun (*_rc_config, &RCConfiguration::get_sound_midi_notes),
1862 sigc::mem_fun (*_rc_config, &RCConfiguration::set_sound_midi_notes)
1865 /* USER INTERACTION */
1867 if (getenv ("ARDOUR_BUNDLED")) {
1868 add_option (_("User interaction"),
1870 "enable-translation",
1871 string_compose (_("Use translations of %1 messages\n"
1872 " <i>(requires a restart of %1 to take effect)</i>\n"
1873 " <i>(if available for your language preferences)</i>"), PROGRAM_NAME),
1874 sigc::ptr_fun (ARDOUR::translations_are_enabled),
1875 sigc::ptr_fun (ARDOUR::set_translations_enabled)));
1878 add_option (_("User interaction"), new OptionEditorHeading (_("Keyboard")));
1880 add_option (_("User interaction"), new KeyboardOptions);
1882 /* Control Surfaces */
1884 add_option (_("Control Surfaces"), new ControlSurfacesOptions (*this));
1886 ComboOption<RemoteModel>* rm = new ComboOption<RemoteModel> (
1888 _("Control surface remote ID"),
1889 sigc::mem_fun (*_rc_config, &RCConfiguration::get_remote_model),
1890 sigc::mem_fun (*_rc_config, &RCConfiguration::set_remote_model)
1893 rm->add (UserOrdered, _("assigned by user"));
1894 rm->add (MixerOrdered, _("follows order of mixer"));
1896 add_option (_("Control Surfaces"), rm);
1898 /* VIDEO Timeline */
1899 add_option (_("Video"), new VideoTimelineOptions (_rc_config));
1903 add_option (S_("Preferences|GUI"),
1906 _("Graphically indicate mouse pointer hovering over various widgets"),
1907 sigc::mem_fun (*_rc_config, &RCConfiguration::get_widget_prelight),
1908 sigc::mem_fun (*_rc_config, &RCConfiguration::set_widget_prelight)
1911 add_option (S_("Preferences|GUI"),
1914 _("Show tooltips if mouse hovers over a control"),
1915 sigc::mem_fun (*_rc_config, &RCConfiguration::get_use_tooltips),
1916 sigc::mem_fun (*_rc_config, &RCConfiguration::set_use_tooltips)
1920 /* font scaling does nothing with GDK/Quartz */
1921 add_option (S_("Preferences|GUI"), new FontScalingOptions (_rc_config));
1924 add_option (S_("GUI"),
1926 "super-rapid-clock-update",
1927 _("update transport clock display every 40ms instead of every 100ms"),
1928 sigc::mem_fun (*_rc_config, &RCConfiguration::get_super_rapid_clock_update),
1929 sigc::mem_fun (*_rc_config, &RCConfiguration::set_super_rapid_clock_update)
1932 /* The names of these controls must be the same as those given in MixerStrip
1933 for the actual widgets being controlled.
1935 _mixer_strip_visibility.add (0, X_("PhaseInvert"), _("Phase Invert"));
1936 _mixer_strip_visibility.add (0, X_("SoloSafe"), _("Solo Safe"));
1937 _mixer_strip_visibility.add (0, X_("SoloIsolated"), _("Solo Isolated"));
1938 _mixer_strip_visibility.add (0, X_("Comments"), _("Comments"));
1939 _mixer_strip_visibility.add (0, X_("MeterPoint"), _("Meter Point"));
1942 S_("Preferences|GUI"),
1943 new VisibilityOption (
1945 &_mixer_strip_visibility,
1946 sigc::mem_fun (*_rc_config, &RCConfiguration::get_mixer_strip_visibility),
1947 sigc::mem_fun (*_rc_config, &RCConfiguration::set_mixer_strip_visibility)
1951 add_option (S_("Preferences|GUI"),
1953 "default-narrow_ms",
1954 _("Use narrow strips in the mixer by default"),
1955 sigc::mem_fun (*_rc_config, &RCConfiguration::get_default_narrow_ms),
1956 sigc::mem_fun (*_rc_config, &RCConfiguration::set_default_narrow_ms)
1959 add_option (S_("Preferences|GUI"), new OptionEditorHeading (_("Metering")));
1961 ComboOption<float>* mht = new ComboOption<float> (
1963 _("Peak hold time"),
1964 sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_hold),
1965 sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_hold)
1968 mht->add (MeterHoldOff, _("off"));
1969 mht->add (MeterHoldShort, _("short"));
1970 mht->add (MeterHoldMedium, _("medium"));
1971 mht->add (MeterHoldLong, _("long"));
1973 add_option (S_("Preferences|GUI"), mht);
1975 ComboOption<float>* mfo = new ComboOption<float> (
1978 sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_falloff),
1979 sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_falloff)
1982 mfo->add (METER_FALLOFF_OFF, _("off"));
1983 mfo->add (METER_FALLOFF_SLOWEST, _("slowest [6.6dB/sec]"));
1984 mfo->add (METER_FALLOFF_SLOW, _("slow [8.6dB/sec] (BBC PPM, EBU PPM)"));
1985 mfo->add (METER_FALLOFF_SLOWISH, _("slowish [12.0dB/sec] (DIN)"));
1986 mfo->add (METER_FALLOFF_MODERATE, _("moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"));
1987 mfo->add (METER_FALLOFF_MEDIUM, _("medium [20dB/sec]"));
1988 mfo->add (METER_FALLOFF_FAST, _("fast [32dB/sec]"));
1989 mfo->add (METER_FALLOFF_FASTER, _("faster [46dB/sec]"));
1990 mfo->add (METER_FALLOFF_FASTEST, _("fastest [70dB/sec]"));
1992 add_option (S_("Preferences|GUI"), mfo);
1994 ComboOption<MeterLineUp>* mlu = new ComboOption<MeterLineUp> (
1995 "meter-line-up-level",
1996 _("Meter line-up level; 0dBu"),
1997 sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_line_up_level),
1998 sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_line_up_level)
2001 mlu->add (MeteringLineUp24, _("-24dBFS (SMPTE US: 4dBu = -20dBFS)"));
2002 mlu->add (MeteringLineUp20, _("-20dBFS (SMPTE RP.0155)"));
2003 mlu->add (MeteringLineUp18, _("-18dBFS (EBU, BBC)"));
2004 mlu->add (MeteringLineUp15, _("-15dBFS (DIN)"));
2006 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."));
2008 add_option (S_("Preferences|GUI"), mlu);
2010 ComboOption<MeterLineUp>* mld = new ComboOption<MeterLineUp> (
2011 "meter-line-up-din",
2012 _("IEC1/DIN Meter line-up level; 0dBu"),
2013 sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_line_up_din),
2014 sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_line_up_din)
2017 mld->add (MeteringLineUp24, _("-24dBFS (SMPTE US: 4dBu = -20dBFS)"));
2018 mld->add (MeteringLineUp20, _("-20dBFS (SMPTE RP.0155)"));
2019 mld->add (MeteringLineUp18, _("-18dBFS (EBU, BBC)"));
2020 mld->add (MeteringLineUp15, _("-15dBFS (DIN)"));
2022 Gtkmm2ext::UI::instance()->set_tip (mld->tip_widget(), _("Reference level for IEC1/DIN meter."));
2024 add_option (S_("Preferences|GUI"), mld);
2026 ComboOption<VUMeterStandard>* mvu = new ComboOption<VUMeterStandard> (
2027 "meter-vu-standard",
2028 _("VU Meter standard"),
2029 sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_vu_standard),
2030 sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_vu_standard)
2033 mvu->add (MeteringVUfrench, _("0VU = -2dBu (France)"));
2034 mvu->add (MeteringVUamerican, _("0VU = 0dBu (North America, Australia)"));
2035 mvu->add (MeteringVUstandard, _("0VU = +4dBu (standard)"));
2036 mvu->add (MeteringVUeight, _("0VU = +8dBu"));
2038 add_option (S_("Preferences|GUI"), mvu);
2040 Gtk::Adjustment *mpk = manage (new Gtk::Adjustment(0, -10, 0, .1, .1));
2041 HSliderOption *mpks = new HSliderOption("meter-peak",
2042 _("Peak threshold [dBFS]"),
2044 sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_peak),
2045 sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_peak)
2048 Gtkmm2ext::UI::instance()->set_tip
2049 (mpks->tip_widget(),
2050 _("Specify the audio signal level in dbFS at and above which the meter-peak indicator will flash red."));
2052 add_option (S_("Preferences|GUI"), mpks);
2054 add_option (S_("Preferences|GUI"),
2057 _("LED meter style"),
2058 sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_style_led),
2059 sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_style_led)
2065 RCOptionEditor::parameter_changed (string const & p)
2067 OptionEditor::parameter_changed (p);
2069 if (p == "use-monitor-bus") {
2070 bool const s = Config->get_use_monitor_bus ();
2072 /* we can't use this if we don't have a monitor bus */
2073 Config->set_solo_control_is_listen_control (false);
2075 _solo_control_is_listen_control->set_sensitive (s);
2076 _listen_position->set_sensitive (s);
2077 } else if (p == "sync-source") {
2078 _sync_source->set_sensitive (true);
2080 _sync_source->set_sensitive (!_session->config.get_external_sync());
2082 switch(Config->get_sync_source()) {
2085 _sync_genlock->set_sensitive (true);
2086 _sync_framerate->set_sensitive (true);
2087 _sync_source_2997->set_sensitive (true);
2090 _sync_genlock->set_sensitive (false);
2091 _sync_framerate->set_sensitive (false);
2092 _sync_source_2997->set_sensitive (false);
2095 } else if (p == "send-ltc") {
2096 bool const s = Config->get_send_ltc ();
2097 _ltc_send_continuously->set_sensitive (s);
2098 _ltc_volume_slider->set_sensitive (s);
2102 void RCOptionEditor::ltc_generator_volume_changed () {
2103 _rc_config->set_ltc_output_volume (pow(10, _ltc_volume_adjustment->get_value() / 20));
2107 RCOptionEditor::populate_sync_options ()
2109 vector<SyncSource> sync_opts = ARDOUR::get_available_sync_options ();
2111 _sync_source->clear ();
2113 for (vector<SyncSource>::iterator i = sync_opts.begin(); i != sync_opts.end(); ++i) {
2114 _sync_source->add (*i, sync_source_to_string (*i));