#include "gtk2ardour-config.h"
#endif
+#if !defined USE_CAIRO_IMAGE_SURFACE && !defined NDEBUG
+#define OPTIONAL_CAIRO_IMAGE_SURFACE
+#endif
+
+#include <cairo/cairo.h>
+
#include <boost/algorithm/string.hpp>
#include <gtkmm/liststore.h>
#include "ardour_window.h"
#include "ardour_dialog.h"
#include "gui_thread.h"
+#include "meter_patterns.h"
#include "midi_tracer.h"
#include "rc_option_editor.h"
#include "utils.h"
public:
ClickOptions (RCConfiguration* c, Gtk::Window* p)
: _rc_config (c)
+ , _click_browse_button (_("Browse..."))
+ , _click_emphasis_browse_button (_("Browse..."))
{
- Table* t = manage (new Table (2, 3));
+ Table* t = manage (new Table (3, 3));
t->set_spacings (4);
- Label* l = manage (left_aligned_label (_("Click audio file:")));
+ Label* l = manage (left_aligned_label (_("Use default Click:")));
t->attach (*l, 0, 1, 0, 1, FILL);
- t->attach (_click_path_entry, 1, 2, 0, 1, FILL);
- Button* b = manage (new Button (_("Browse...")));
- b->signal_clicked().connect (sigc::mem_fun (*this, &ClickOptions::click_browse_clicked));
- t->attach (*b, 2, 3, 0, 1, FILL);
+ t->attach (_use_default_click_check_button, 1, 2, 0, 1, FILL);
+ _use_default_click_check_button.signal_toggled().connect (
+ sigc::mem_fun (*this, &ClickOptions::use_default_click_toggled));
- l = manage (left_aligned_label (_("Click emphasis audio file:")));
+ l = manage (left_aligned_label (_("Click audio file:")));
t->attach (*l, 0, 1, 1, 2, FILL);
- t->attach (_click_emphasis_path_entry, 1, 2, 1, 2, FILL);
- b = manage (new Button (_("Browse...")));
- b->signal_clicked().connect (sigc::mem_fun (*this, &ClickOptions::click_emphasis_browse_clicked));
- t->attach (*b, 2, 3, 1, 2, FILL);
+ t->attach (_click_path_entry, 1, 2, 1, 2, FILL);
+ _click_browse_button.signal_clicked ().connect (
+ sigc::mem_fun (*this, &ClickOptions::click_browse_clicked));
+ t->attach (_click_browse_button, 2, 3, 1, 2, FILL);
+
+ l = manage (left_aligned_label (_("Click emphasis audio file:")));
+ t->attach (*l, 0, 1, 2, 3, FILL);
+ t->attach (_click_emphasis_path_entry, 1, 2, 2, 3, FILL);
+ _click_emphasis_browse_button.signal_clicked ().connect (
+ sigc::mem_fun (*this, &ClickOptions::click_emphasis_browse_clicked));
+ t->attach (_click_emphasis_browse_button, 2, 3, 2, 3, FILL);
_box->pack_start (*t, false, false);
_click_path_entry.signal_activate().connect (sigc::mem_fun (*this, &ClickOptions::click_changed));
_click_emphasis_path_entry.signal_activate().connect (sigc::mem_fun (*this, &ClickOptions::click_emphasis_changed));
+
+ if (_rc_config->get_click_sound ().empty() &&
+ _rc_config->get_click_emphasis_sound().empty()) {
+ _use_default_click_check_button.set_active (true);
+
+ } else {
+ _use_default_click_check_button.set_active (false);
+ }
}
void parameter_changed (string const & p)
click_emphasis_chosen (_click_emphasis_path_entry.get_text ());
}
+ void use_default_click_toggled ()
+ {
+ if (_use_default_click_check_button.get_active ()) {
+ _rc_config->set_click_sound ("");
+ _rc_config->set_click_emphasis_sound ("");
+ _click_path_entry.set_sensitive (false);
+ _click_emphasis_path_entry.set_sensitive (false);
+ _click_browse_button.set_sensitive (false);
+ _click_emphasis_browse_button.set_sensitive (false);
+ } else {
+ _click_path_entry.set_sensitive (true);
+ _click_emphasis_path_entry.set_sensitive (true);
+ _click_browse_button.set_sensitive (true);
+ _click_emphasis_browse_button.set_sensitive (true);
+ }
+ }
+
RCConfiguration* _rc_config;
+ CheckButton _use_default_click_check_button;
Entry _click_path_entry;
Entry _click_emphasis_path_entry;
+ Button _click_browse_button;
+ Button _click_emphasis_browse_button;
};
class UndoOptions : public OptionEditorBox
{ "Option", GDK_MOD1_MASK },
{ "Command-Shift", GDK_META_MASK|GDK_SHIFT_MASK },
{ "Command-Option", GDK_MOD1_MASK|GDK_META_MASK },
- { "Shift-Option", GDK_SHIFT_MASK|GDK_MOD1_MASK },
+ { "Option-Shift", GDK_MOD1_MASK|GDK_SHIFT_MASK },
+ { "Control-Shift", GDK_CONTROL_MASK|GDK_SHIFT_MASK },
{ "Shift-Command-Option", GDK_MOD5_MASK|GDK_SHIFT_MASK|GDK_META_MASK },
#else
{ "Key|Shift", GDK_SHIFT_MASK },
{ "Control", GDK_CONTROL_MASK },
- { "Alt (Mod1)", GDK_MOD1_MASK },
+ { "Alt", GDK_MOD1_MASK },
{ "Control-Shift", GDK_CONTROL_MASK|GDK_SHIFT_MASK },
{ "Control-Alt", GDK_CONTROL_MASK|GDK_MOD1_MASK },
{ "Shift-Alt", GDK_SHIFT_MASK|GDK_MOD1_MASK },
{ "Control-Shift-Alt", GDK_CONTROL_MASK|GDK_SHIFT_MASK|GDK_MOD1_MASK },
+ { "Alt-Windows", GDK_MOD1_MASK|GDK_MOD4_MASK },
{ "Mod2", GDK_MOD2_MASK },
{ "Mod3", GDK_MOD3_MASK },
- { "Mod4", GDK_MOD4_MASK },
+ { "Windows", GDK_MOD4_MASK },
{ "Mod5", GDK_MOD5_MASK },
#endif
{ 0, 0 }
l = manage (left_aligned_label (_("When Clicking:")));
l->set_name ("OptionEditorHeading");
- t->attach (*l, col, col + 1, row, row + 1, FILL | EXPAND, FILL);
+ t->attach (*l, col, col + 2, row, row + 1, FILL | EXPAND, FILL);
++row;
col = 1;
l = manage (left_aligned_label (_("When Beginning a Drag:")));
l->set_name ("OptionEditorHeading");
- t->attach (*l, 0, 1, row, row + 1, FILL | EXPAND, FILL);
+ t->attach (*l, 0, 2, row, row + 1, FILL | EXPAND, FILL);
++row;
col = 1;
t->attach (*l, col, col + 1, row, row + 1, FILL | EXPAND, FILL);
t->attach (_copy_modifier_combo, col + 1, col + 2, row, row + 1, FILL | EXPAND, FILL);
+ ++row;
+ col = 1;
+
+ /* constraint modifier */
+ set_popdown_strings (_constraint_modifier_combo, dumb);
+ _constraint_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::constraint_modifier_chosen));
+
+ for (int x = 0; modifiers[x].name; ++x) {
+ if (modifiers[x].modifier == (guint) ArdourKeyboard::constraint_modifier ()) {
+ _constraint_modifier_combo.set_active_text (S_(modifiers[x].name));
+ break;
+ }
+ }
+
+ l = manage (left_aligned_label (_("Constrain drag using:")));
+ l->set_name ("OptionsLabel");
+
+ t->attach (*l, col, col + 1, row, row + 1, FILL | EXPAND, FILL);
+ t->attach (_constraint_modifier_combo, col + 1, col + 2, row, row + 1, FILL | EXPAND, FILL);
+
++row;
l = manage (left_aligned_label (_("When Beginning a Trim:")));
l->set_name ("OptionEditorHeading");
- t->attach (*l, 0, 1, row, row + 1, FILL | EXPAND, FILL);
+ t->attach (*l, 0, 2, row, row + 1, FILL | EXPAND, FILL);
++row;
col = 1;
_trim_contents_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::trim_contents_modifier_chosen));
for (int x = 0; modifiers[x].name; ++x) {
- if (modifiers[x].modifier == (guint) Keyboard::trim_contents_modifier ()) {
+ if (modifiers[x].modifier == (guint) ArdourKeyboard::trim_contents_modifier ()) {
_trim_contents_combo.set_active_text (S_(modifiers[x].name));
break;
}
t->attach (*l, col, col + 1, row, row + 1, FILL | EXPAND, FILL);
t->attach (_trim_contents_combo, col + 1, col + 2, row, row + 1, FILL | EXPAND, FILL);
+ ++row;
+ col = 1;
+
+ /* anchored trim */
+ set_popdown_strings (_trim_anchored_combo, dumb);
+ _trim_anchored_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::trim_anchored_modifier_chosen));
+
+ for (int x = 0; modifiers[x].name; ++x) {
+ if (modifiers[x].modifier == (guint) ArdourKeyboard::trim_anchored_modifier ()) {
+ _trim_anchored_combo.set_active_text (S_(modifiers[x].name));
+ break;
+ }
+ }
+
+ l = manage (left_aligned_label (_("Anchored trim using:")));
+ l->set_name ("OptionsLabel");
+
+ t->attach (*l, col, col + 1, row, row + 1, FILL | EXPAND, FILL);
+ ++col;
+ t->attach (_trim_anchored_combo, col, col + 1, row, row + 1, FILL | EXPAND, FILL);
+
+ ++row;
+ col = 1;
+
+ /* jump trim disabled for now
+ set_popdown_strings (_trim_jump_combo, dumb);
+ _trim_jump_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::trim_jump_modifier_chosen));
+
+ for (int x = 0; modifiers[x].name; ++x) {
+ if (modifiers[x].modifier == (guint) Keyboard::trim_jump_modifier ()) {
+ _trim_jump_combo.set_active_text (S_(modifiers[x].name));
+ break;
+ }
+ }
+
+ l = manage (left_aligned_label (_("Jump after trim using:")));
+ l->set_name ("OptionsLabel");
+
+ t->attach (*l, col, col + 1, row, row + 1, FILL | EXPAND, FILL);
+ ++col;
+ t->attach (_trim_jump_combo, col, col + 1, row, row + 1, FILL | EXPAND, FILL);
+
+ ++row;
+ col = 1;
+ */
+
+ /* note resize relative */
+ set_popdown_strings (_note_size_relative_combo, dumb);
+ _note_size_relative_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::note_size_relative_modifier_chosen));
+
+ for (int x = 0; modifiers[x].name; ++x) {
+ if (modifiers[x].modifier == (guint) ArdourKeyboard::note_size_relative_modifier ()) {
+ _note_size_relative_combo.set_active_text (S_(modifiers[x].name));
+ break;
+ }
+ }
+
+ l = manage (left_aligned_label (_("Resize notes relatively using:")));
+ l->set_name ("OptionsLabel");
+
+ t->attach (*l, col, col + 1, row, row + 1, FILL | EXPAND, FILL);
+ ++col;
+ t->attach (_note_size_relative_combo, col, col + 1, row, row + 1, FILL | EXPAND, FILL);
+
++row;
l = manage (left_aligned_label (_("While Dragging:")));
l->set_name ("OptionEditorHeading");
- t->attach (*l, 0, 1, row, row + 1, FILL | EXPAND, FILL);
+ t->attach (*l, 0, 2, row, row + 1, FILL | EXPAND, FILL);
++row;
col = 1;
}
}
- l = manage (left_aligned_label (_("Snap to absolute using:")));
+ l = manage (left_aligned_label (_("Snap relatively using:")));
l->set_name ("OptionsLabel");
t->attach (*l, col, col + 1, row, row + 1, FILL | EXPAND, FILL);
l = manage (left_aligned_label (_("While Trimming:")));
l->set_name ("OptionEditorHeading");
- t->attach (*l, 0, 1, row, row + 1, FILL | EXPAND, FILL);
+ t->attach (*l, 0, 2, row, row + 1, FILL | EXPAND, FILL);
++row;
col = 1;
_trim_overlap_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::trim_overlap_modifier_chosen));
for (int x = 0; modifiers[x].name; ++x) {
- if (modifiers[x].modifier == (guint) Keyboard::trim_overlap_modifier ()) {
+ if (modifiers[x].modifier == (guint) ArdourKeyboard::trim_overlap_modifier ()) {
_trim_overlap_combo.set_active_text (S_(modifiers[x].name));
break;
}
}
- l = manage (left_aligned_label (_("Resize overlaped regions using:")));
+ l = manage (left_aligned_label (_("Resize overlapped regions using:")));
l->set_name ("OptionsLabel");
t->attach (*l, col, col + 1, row, row + 1, FILL | EXPAND, FILL);
t->attach (_trim_overlap_combo, col + 1, col + 2, row, row + 1, FILL | EXPAND, FILL);
++row;
+
+ l = manage (left_aligned_label (_("While Dragging Control Points:")));
+ l->set_name ("OptionEditorHeading");
+ t->attach (*l, 0, 2, row, row + 1, FILL | EXPAND, FILL);
+
++row;
+ col = 1;
+
+ /* fine adjust */
+ set_popdown_strings (_fine_adjust_combo, dumb);
+ _fine_adjust_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::fine_adjust_modifier_chosen));
+
+ for (int x = 0; modifiers[x].name; ++x) {
+ if (modifiers[x].modifier == (guint) ArdourKeyboard::fine_adjust_modifier ()) {
+ _fine_adjust_combo.set_active_text (S_(modifiers[x].name));
+ break;
+ }
+ }
+
+ l = manage (left_aligned_label (_("Fine adjust using:")));
+ l->set_name ("OptionsLabel");
+
+ t->attach (*l, col, col + 1, row, row + 1, FILL | EXPAND, FILL);
+ t->attach (_fine_adjust_combo, col + 1, col + 2, row, row + 1, FILL | EXPAND, FILL);
+
+ ++row;
+ col = 1;
+
+ /* push points */
+ set_popdown_strings (_push_points_combo, dumb);
+ _push_points_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::push_points_modifier_chosen));
+
+ for (int x = 0; modifiers[x].name; ++x) {
+ if (modifiers[x].modifier == (guint) ArdourKeyboard::push_points_modifier ()) {
+ _push_points_combo.set_active_text (S_(modifiers[x].name));
+ break;
+ }
+ }
+
+ l = manage (left_aligned_label (_("Push points using:")));
+ l->set_name ("OptionsLabel");
+
+ t->attach (*l, col, col + 1, row, row + 1, FILL | EXPAND, FILL);
+ t->attach (_push_points_combo, col + 1, col + 2, row, row + 1, FILL | EXPAND, FILL);
_box->pack_start (*t, false, false);
}
}
}
+ void constraint_modifier_chosen ()
+ {
+ string const txt = _constraint_modifier_combo.get_active_text();
+
+ for (int i = 0; modifiers[i].name; ++i) {
+ if (txt == _(modifiers[i].name)) {
+ ArdourKeyboard::set_constraint_modifier (modifiers[i].modifier);
+ break;
+ }
+ }
+ }
+
void trim_contents_modifier_chosen ()
{
string const txt = _trim_contents_combo.get_active_text();
for (int i = 0; modifiers[i].name; ++i) {
if (txt == _(modifiers[i].name)) {
- Keyboard::set_trim_contents_modifier (modifiers[i].modifier);
+ ArdourKeyboard::set_trim_contents_modifier (modifiers[i].modifier);
break;
}
}
for (int i = 0; modifiers[i].name; ++i) {
if (txt == _(modifiers[i].name)) {
- Keyboard::set_trim_overlap_modifier (modifiers[i].modifier);
+ ArdourKeyboard::set_trim_overlap_modifier (modifiers[i].modifier);
+ break;
+ }
+ }
+ }
+
+ void trim_anchored_modifier_chosen ()
+ {
+ string const txt = _trim_anchored_combo.get_active_text();
+
+ for (int i = 0; modifiers[i].name; ++i) {
+ if (txt == _(modifiers[i].name)) {
+ ArdourKeyboard::set_trim_anchored_modifier (modifiers[i].modifier);
+ break;
+ }
+ }
+ }
+
+ void fine_adjust_modifier_chosen ()
+ {
+ string const txt = _fine_adjust_combo.get_active_text();
+
+ for (int i = 0; modifiers[i].name; ++i) {
+ if (txt == _(modifiers[i].name)) {
+ ArdourKeyboard::set_fine_adjust_modifier (modifiers[i].modifier);
+ break;
+ }
+ }
+ }
+
+ void push_points_modifier_chosen ()
+ {
+ string const txt = _push_points_combo.get_active_text();
+
+ for (int i = 0; modifiers[i].name; ++i) {
+ if (txt == _(modifiers[i].name)) {
+ ArdourKeyboard::set_push_points_modifier (modifiers[i].modifier);
+ break;
+ }
+ }
+ }
+
+ void note_size_relative_modifier_chosen ()
+ {
+ string const txt = _note_size_relative_combo.get_active_text();
+
+ for (int i = 0; modifiers[i].name; ++i) {
+ if (txt == _(modifiers[i].name)) {
+ ArdourKeyboard::set_note_size_relative_modifier (modifiers[i].modifier);
break;
}
}
ComboBoxText _insert_note_modifier_combo;
ComboBoxText _snap_modifier_combo;
ComboBoxText _snap_delta_combo;
+ ComboBoxText _constraint_modifier_combo;
ComboBoxText _trim_contents_combo;
ComboBoxText _trim_overlap_combo;
+ ComboBoxText _trim_anchored_combo;
+ ComboBoxText _trim_jump_combo;
+ ComboBoxText _fine_adjust_combo;
+ ComboBoxText _push_points_combo;
+ ComboBoxText _note_size_relative_combo;
Adjustment _delete_button_adjustment;
SpinButton _delete_button_spin;
Adjustment _edit_button_adjustment;
, _playback_slider (_playback_adjustment)
, _capture_slider (_capture_adjustment)
{
+ vector<string> presets;
+
+ /* these must match the order of the enums for BufferingPreset */
+
+ presets.push_back (_("Small sessions (4-16 tracks)"));
+ presets.push_back (_("Medium sessions (16-64 tracks)"));
+ presets.push_back (_("Large sessions (64+ tracks)"));
+ presets.push_back (_("Custom (set by sliders below)"));
+
+ set_popdown_strings (_buffering_presets_combo, presets);
+
+ Label* l = manage (new Label (_("Preset:")));
+ l->set_name ("OptionsLabel");
+ HBox* h = manage (new HBox);
+ h->set_spacing (12);
+ h->pack_start (*l, false, false);
+ h->pack_start (_buffering_presets_combo, true, true);
+ _box->pack_start (*h, false, false);
+
+ _buffering_presets_combo.signal_changed().connect (sigc::mem_fun (*this, &BufferingOptions::preset_changed));
+
_playback_adjustment.set_value (_rc_config->get_audio_playback_buffer_seconds());
- Label* l = manage (new Label (_("Playback (seconds of buffering):")));
+ l = manage (new Label (_("Playback (seconds of buffering):")));
l->set_name ("OptionsLabel");
_playback_slider.set_update_policy (UPDATE_DISCONTINUOUS);
- HBox* h = manage (new HBox);
+ h = manage (new HBox);
h->set_spacing (4);
h->pack_start (*l, false, false);
h->pack_start (_playback_slider, true, true);
void parameter_changed (string const & p)
{
+ if (p == "buffering-preset") {
+ switch (_rc_config->get_buffering_preset()) {
+ case Small:
+ _playback_slider.set_sensitive (false);
+ _capture_slider.set_sensitive (false);
+ _buffering_presets_combo.set_active (0);
+ break;
+ case Medium:
+ _playback_slider.set_sensitive (false);
+ _capture_slider.set_sensitive (false);
+ _buffering_presets_combo.set_active (1);
+ break;
+ case Large:
+ _playback_slider.set_sensitive (false);
+ _capture_slider.set_sensitive (false);
+ _buffering_presets_combo.set_active (2);
+ break;
+ case Custom:
+ _playback_slider.set_sensitive (true);
+ _capture_slider.set_sensitive (true);
+ _buffering_presets_combo.set_active (3);
+ break;
+ }
+ }
+
if (p == "playback-buffer-seconds") {
_playback_adjustment.set_value (_rc_config->get_audio_playback_buffer_seconds());
} else if (p == "capture-buffer-seconds") {
void set_state_from_config ()
{
+ parameter_changed ("buffering-preset");
parameter_changed ("playback-buffer-seconds");
parameter_changed ("capture-buffer-seconds");
}
private:
+ void preset_changed ()
+ {
+ int index = _buffering_presets_combo.get_active_row_number ();
+ if (index < 0) {
+ return;
+ }
+ switch (index) {
+ case 0:
+ _rc_config->set_buffering_preset (Small);
+ break;
+ case 1:
+ _rc_config->set_buffering_preset (Medium);
+ break;
+ case 2:
+ _rc_config->set_buffering_preset (Large);
+ break;
+ case 3:
+ _rc_config->set_buffering_preset (Custom);
+ break;
+ default:
+ error << string_compose (_("programming error: unknown buffering preset string, index = %1"), index) << endmsg;
+ break;
+ }
+ }
+
void playback_changed ()
{
_rc_config->set_audio_playback_buffer_seconds ((long) _playback_adjustment.get_value());
Adjustment _capture_adjustment;
HScale _playback_slider;
HScale _capture_slider;
+ ComboBoxText _buffering_presets_combo;
};
class ControlSurfacesOptions : public OptionEditorBox
, _display_plugin_scan_progress (_("Always Display Plugin Scan Progress"))
, _discover_vst_on_start (_("Scan for [new] VST Plugins on Application Start"))
, _discover_au_on_start (_("Scan for AudioUnit Plugins on Application Start"))
+ , _verbose_plugin_scan (_("Verbose Plugin Scan"))
, _timeout_adjustment (0, 0, 3000, 50, 50)
, _timeout_slider (_timeout_adjustment)
{
b = manage (new Button (_("Edit")));
b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::edit_vst_path_clicked));
t->attach (*b, 1, 2, n, n+1, FILL); ++n;
+
+ // currently verbose logging is only implemented for Windows VST.
+ t->attach (_verbose_plugin_scan, 0, 2, n, n+1); ++n;
+ _verbose_plugin_scan.signal_toggled().connect (sigc::mem_fun (*this, &PluginOptions::verbose_plugin_scan_toggled));
+ Gtkmm2ext::UI::instance()->set_tip (_verbose_plugin_scan,
+ _("<b>When enabled</b> additional information for every plugin is added to the Log Window."));
#endif
#endif // any VST
bool const x = _rc_config->get_discover_audio_units();
_discover_au_on_start.set_active (x);
}
+ else if (p == "verbose-plugin-scan") {
+ bool const x = _rc_config->get_verbose_plugin_scan();
+ _verbose_plugin_scan.set_active (x);
+ }
}
void set_state_from_config () {
parameter_changed ("discover-vst-on-start");
parameter_changed ("vst-scan-timeout");
parameter_changed ("discover-audio-units");
+ parameter_changed ("verbose-plugin-scan");
}
private:
CheckButton _display_plugin_scan_progress;
CheckButton _discover_vst_on_start;
CheckButton _discover_au_on_start;
+ CheckButton _verbose_plugin_scan;
Adjustment _timeout_adjustment;
HScale _timeout_slider;
_rc_config->set_discover_audio_units(x);
}
+ void verbose_plugin_scan_toggled () {
+ bool const x = _verbose_plugin_scan.get_active();
+ _rc_config->set_verbose_plugin_scan(x);
+ }
+
void timeout_changed () {
int x = floor(_timeout_adjustment.get_value());
_rc_config->set_vst_scan_timeout(x);
/* TRANSPORT */
+ add_option (_("Transport"), new OptionEditorHeading (S_("Transport Options")));
+
BoolOption* tsf;
tsf = new BoolOption (
"show-region-gain-envelopes",
_("Show gain envelopes in audio regions"),
_("in all modes"),
- _("only in region gain mode"),
+ _("only in Draw and Internal Edit modes"),
sigc::mem_fun (*_ui_config, &UIConfiguration::get_show_region_gain),
sigc::mem_fun (*_ui_config, &UIConfiguration::set_show_region_gain)
));
int dmsize = 1;
dm->add (DenormalNone, _("no processor handling"));
- FPU fpu;
+ FPU* fpu = FPU::instance();
- if (fpu.has_flush_to_zero()) {
+ if (fpu->has_flush_to_zero()) {
++dmsize;
dm->add (DenormalFTZ, _("use FlushToZero"));
} else if (_rc_config->get_denormal_model() == DenormalFTZ) {
_rc_config->set_denormal_model(DenormalNone);
}
- if (fpu.has_denormals_are_zero()) {
+ if (fpu->has_denormals_are_zero()) {
++dmsize;
dm->add (DenormalDAZ, _("use DenormalsAreZero"));
} else if (_rc_config->get_denormal_model() == DenormalDAZ) {
_rc_config->set_denormal_model(DenormalNone);
}
- if (fpu.has_flush_to_zero() && fpu.has_denormals_are_zero()) {
+ if (fpu->has_flush_to_zero() && fpu->has_denormals_are_zero()) {
++dmsize;
dm->add (DenormalFTZDAZ, _("use FlushToZero and DenormalsAreZero"));
} else if (_rc_config->get_denormal_model() == DenormalFTZDAZ) {
/* INTERFACE */
+#ifdef OPTIONAL_CAIRO_IMAGE_SURFACE
+ BoolOption* bgc = new BoolOption (
+ "cairo-image-surface",
+ _("Disable Graphics Hardware Acceleration (requires restart)"),
+ sigc::mem_fun (*_ui_config, &UIConfiguration::get_cairo_image_surface),
+ sigc::mem_fun (*_ui_config, &UIConfiguration::set_cairo_image_surface)
+ );
+
+ Gtkmm2ext::UI::instance()->set_tip (bgc->tip_widget(), string_compose (
+ _("Render large parts of the application user-interface in software, instead of using 2D-graphics acceleration.\nThis requires restarting %1 before having an effect"), PROGRAM_NAME));
+ add_option (S_("Preferences|GUI"), bgc);
+#endif
+
+#ifdef CAIRO_SUPPORTS_FORCE_BUGGY_GRADIENTS_ENVIRONMENT_VARIABLE
+ BoolOption* bgo = new BoolOption (
+ "buggy-gradients",
+ _("Possibly improve slow graphical performance (requires restart)"),
+ sigc::mem_fun (*_ui_config, &UIConfiguration::get_buggy_gradients),
+ sigc::mem_fun (*_ui_config, &UIConfiguration::set_buggy_gradients)
+ );
+
+ Gtkmm2ext::UI::instance()->set_tip (bgo->tip_widget(), string_compose (_("Disables hardware gradient rendering on buggy video drivers (\"buggy gradients patch\").\nThis requires restarting %1 before having an effect"), PROGRAM_NAME));
+ add_option (S_("Preferences|GUI"), bgo);
+#endif
+
add_option (S_("Preferences|GUI"),
new BoolOption (
"widget-prelight",
sigc::mem_fun (*_ui_config, &UIConfiguration::set_super_rapid_clock_update)
));
+
+ /* Image cache size */
+
+ Gtk::Adjustment *ics = manage (new Gtk::Adjustment(0, 1, 1024, 10)); /* 1 MB to 1GB in steps of 10MB */
+ HSliderOption *sics = new HSliderOption("waveform-cache-size",
+ _("Waveform image cache size (megabytes)"),
+ ics,
+ sigc::mem_fun (*ARDOUR_UI::config(), &UIConfiguration::get_waveform_cache_size),
+ sigc::mem_fun (*ARDOUR_UI::config(), &UIConfiguration::set_waveform_cache_size)
+ );
+ sics->scale().set_digits (0);
+ Gtkmm2ext::UI::instance()->set_tip
+ (sics->tip_widget(),
+ _("Increasing the cache size uses more memory to store waveform images, which can improve graphical performance."));
+ add_option (S_("Preferences|GUI"), sics);
+
/* Lock GUI timeout */
Gtk::Adjustment *lts = manage (new Gtk::Adjustment(0, 0, 1000, 1, 10));
mfo->add (METER_FALLOFF_OFF, _("off"));
mfo->add (METER_FALLOFF_SLOWEST, _("slowest [6.6dB/sec]"));
mfo->add (METER_FALLOFF_SLOW, _("slow [8.6dB/sec] (BBC PPM, EBU PPM)"));
- mfo->add (METER_FALLOFF_SLOWISH, _("slowish [12.0dB/sec] (DIN)"));
- mfo->add (METER_FALLOFF_MODERATE, _("moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"));
- mfo->add (METER_FALLOFF_MEDIUM, _("medium [20dB/sec]"));
- mfo->add (METER_FALLOFF_FAST, _("fast [32dB/sec]"));
- mfo->add (METER_FALLOFF_FASTER, _("faster [46dB/sec]"));
- mfo->add (METER_FALLOFF_FASTEST, _("fastest [70dB/sec]"));
+ mfo->add (METER_FALLOFF_SLOWISH, _("moderate [12.0dB/sec] (DIN)"));
+ mfo->add (METER_FALLOFF_MODERATE, _("medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"));
+ mfo->add (METER_FALLOFF_MEDIUM, _("fast [20dB/sec]"));
+ mfo->add (METER_FALLOFF_FAST, _("very fast [32dB/sec]"));
add_option (S_("Preferences|Metering"), mfo);
sigc::mem_fun (*_ui_config, &UIConfiguration::set_meter_peak)
);
+
+ ComboOption<MeterType>* mtm = new ComboOption<MeterType> (
+ "meter-type-master",
+ _("Default Meter Type for Master Bus"),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_type_master),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_type_master)
+ );
+ mtm->add (MeterPeak, ArdourMeter::meter_type_string(MeterPeak));
+ mtm->add (MeterK20, ArdourMeter::meter_type_string(MeterK20));
+ mtm->add (MeterK14, ArdourMeter::meter_type_string(MeterK14));
+ mtm->add (MeterK12, ArdourMeter::meter_type_string(MeterK12));
+ mtm->add (MeterIEC1DIN, ArdourMeter::meter_type_string(MeterIEC1DIN));
+ mtm->add (MeterIEC1NOR, ArdourMeter::meter_type_string(MeterIEC1NOR));
+ mtm->add (MeterIEC2BBC, ArdourMeter::meter_type_string(MeterIEC2BBC));
+ mtm->add (MeterIEC2EBU, ArdourMeter::meter_type_string(MeterIEC2EBU));
+
+ add_option (S_("Preferences|Metering"), mtm);
+
+
+ ComboOption<MeterType>* mtb = new ComboOption<MeterType> (
+ "meter-type-bus",
+ _("Default Meter Type for Busses"),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_type_bus),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_type_bus)
+ );
+ mtb->add (MeterPeak, ArdourMeter::meter_type_string(MeterPeak));
+ mtb->add (MeterK20, ArdourMeter::meter_type_string(MeterK20));
+ mtb->add (MeterK14, ArdourMeter::meter_type_string(MeterK14));
+ mtb->add (MeterK12, ArdourMeter::meter_type_string(MeterK12));
+ mtb->add (MeterIEC1DIN, ArdourMeter::meter_type_string(MeterIEC1DIN));
+ mtb->add (MeterIEC1NOR, ArdourMeter::meter_type_string(MeterIEC1NOR));
+ mtb->add (MeterIEC2BBC, ArdourMeter::meter_type_string(MeterIEC2BBC));
+ mtb->add (MeterIEC2EBU, ArdourMeter::meter_type_string(MeterIEC2EBU));
+
+ add_option (S_("Preferences|Metering"), mtb);
+
+ ComboOption<MeterType>* mtt = new ComboOption<MeterType> (
+ "meter-type-track",
+ _("Default Meter Type for Tracks"),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_type_track),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_type_track)
+ );
+ mtt->add (MeterPeak, ArdourMeter::meter_type_string(MeterPeak));
+ mtt->add (MeterPeak0dB, ArdourMeter::meter_type_string(MeterPeak0dB));
+
+ add_option (S_("Preferences|Metering"), mtt);
+
+
Gtkmm2ext::UI::instance()->set_tip
(mpks->tip_widget(),
_("Specify the audio signal level in dbFS at and above which the meter-peak indicator will flash red."));