X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Frc_option_editor.cc;h=722612d21c9ffaec7d3c6d863c384c0640119aa3;hb=b502bbc61895d61c39bf240b47e8a3664be2c541;hp=e9fb88a6de25d1315b6f71208a450a8cf9df350a;hpb=14b0ca31bcb62e5b7e9e77634ef9cd2e8cf65800;p=ardour.git diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index e9fb88a6de..722612d21c 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -1,11 +1,19 @@ +#ifdef WAF_BUILD +#include "gtk2ardour-config.h" +#endif + #include #include #include #include #include + #include "pbd/fpu.h" +#include "pbd/cpus.h" + #include "midi++/manager.h" -#include "midi++/factory.h" + +#include "ardour/audioengine.h" #include "ardour/dB.h" #include "ardour/rc_configuration.h" #include "ardour/control_protocol_manager.h" @@ -26,226 +34,6 @@ using namespace Gtkmm2ext; using namespace PBD; using namespace ARDOUR; -class MIDIPorts : public OptionEditorBox -{ -public: - MIDIPorts (RCConfiguration* c, list* > const & o) - : _rc_config (c), - _add_port_button (Stock::ADD), - _port_combos (o) - { - _store = ListStore::create (_model); - _view.set_model (_store); - _view.append_column (_("Name"), _model.name); - _view.get_column(0)->set_resizable (true); - _view.get_column(0)->set_expand (true); - _view.append_column_editable (_("Online"), _model.online); - _view.append_column_editable (_("Trace input"), _model.trace_input); - _view.append_column_editable (_("Trace output"), _model.trace_output); - - HBox* h = manage (new HBox); - h->set_spacing (4); - h->pack_start (_view, true, true); - - VBox* v = manage (new VBox); - v->set_spacing (4); - v->pack_start (_add_port_button, false, false); - h->pack_start (*v, false, false); - - _box->pack_start (*h); - - ports_changed (); - - _store->signal_row_changed().connect (sigc::mem_fun (*this, &MIDIPorts::model_changed)); - - _add_port_button.signal_clicked().connect (sigc::mem_fun (*this, &MIDIPorts::add_port_clicked)); - } - - void parameter_changed (string const &) {} - void set_state_from_config () {} - -private: - - typedef std::map PortTraceMap; - PortTraceMap port_input_trace_map; - PortTraceMap port_output_trace_map; - - void model_changed (TreeModel::Path const &, TreeModel::iterator const & i) - { - TreeModel::Row r = *i; - - MIDI::Port* port = r[_model.port]; - if (!port) { - return; - } - - if (port->input()) { - - if (r[_model.online] == port->input()->offline()) { - port->input()->set_offline (!r[_model.online]); - } - - if (r[_model.trace_input] != port->input()->tracing()) { - PortTraceMap::iterator x = port_input_trace_map.find (port); - MidiTracer* mt; - - if (x == port_input_trace_map.end()) { - mt = new MidiTracer (port->name() + string (" [input]"), *port->input()); - port_input_trace_map.insert (pair (port, mt)); - } else { - mt = x->second; - } - mt->present (); - } - } - - if (port->output()) { - - if (r[_model.trace_output] != port->output()->tracing()) { - PortTraceMap::iterator x = port_output_trace_map.find (port); - MidiTracer* mt; - - if (x == port_output_trace_map.end()) { - mt = new MidiTracer (port->name() + string (" [output]"), *port->output()); - port_output_trace_map.insert (pair (port, mt)); - } else { - mt = x->second; - } - mt->present (); - } - - } - } - - void setup_ports_combo (ComboOption* c) - { - c->clear (); - MIDI::Manager::PortList const & ports = MIDI::Manager::instance()->get_midi_ports (); - for (MIDI::Manager::PortList::const_iterator i = ports.begin(); i != ports.end(); ++i) { - c->add ((*i)->name(), (*i)->name()); - } - } - - void ports_changed () - { - /* XXX: why is this coming from here? */ - MIDI::Manager::PortList const & ports = MIDI::Manager::instance()->get_midi_ports (); - - _store->clear (); - port_connections.drop_connections (); - - for (MIDI::Manager::PortList::const_iterator i = ports.begin(); i != ports.end(); ++i) { - - TreeModel::Row r = *_store->append (); - - r[_model.name] = (*i)->name(); - - if ((*i)->input()) { - r[_model.online] = !(*i)->input()->offline(); - (*i)->input()->OfflineStatusChanged.connect (port_connections, MISSING_INVALIDATOR, boost::bind (&MIDIPorts::port_offline_changed, this, (*i)), gui_context()); - r[_model.trace_input] = (*i)->input()->tracing(); - } - - if ((*i)->output()) { - r[_model.trace_output] = (*i)->output()->tracing(); - } - - r[_model.port] = (*i); - } - - for (list* >::iterator i = _port_combos.begin(); i != _port_combos.end(); ++i) { - setup_ports_combo (*i); - } - } - - void port_offline_changed (MIDI::Port* p) - { - if (!p->input()) { - return; - } - - for (TreeModel::Children::iterator i = _store->children().begin(); i != _store->children().end(); ++i) { - if ((*i)[_model.port] == p) { - (*i)[_model.online] = !p->input()->offline(); - } - } - } - - void add_port_clicked () - { - MidiPortDialog dialog; - - dialog.set_position (WIN_POS_MOUSE); - - dialog.show (); - - int const r = dialog.run (); - - switch (r) { - case RESPONSE_ACCEPT: - break; - default: - return; - break; - } - - Glib::ustring const mode = dialog.port_mode_combo.get_active_text (); - string smod; - - if (mode == _("input")) { - smod = X_("input"); - } else if (mode == (_("output"))) { - smod = X_("output"); - } else { - smod = "duplex"; - } - - XMLNode node (X_("MIDI-port")); - - node.add_property ("tag", dialog.port_name.get_text()); - node.add_property ("device", X_("ardour")); // XXX this can't be right for all types - node.add_property ("type", MIDI::PortFactory::default_port_type()); - node.add_property ("mode", smod); - - if (MIDI::Manager::instance()->add_port (node) != 0) { - cerr << " there are now " << MIDI::Manager::instance()->nports() << endl; - ports_changed (); - } - } - - class MIDIModelColumns : public TreeModelColumnRecord - { - public: - MIDIModelColumns () - { - add (name); - add (online); - add (trace_input); - add (trace_output); - add (port); - } - - TreeModelColumn name; - TreeModelColumn online; - TreeModelColumn trace_input; - TreeModelColumn trace_output; - TreeModelColumn port; - }; - - RCConfiguration* _rc_config; - Glib::RefPtr _store; - MIDIModelColumns _model; - TreeView _view; - Button _add_port_button; - ComboBoxText _mtc_combo; - ComboBoxText _midi_clock_combo; - ComboBoxText _mmc_combo; - ComboBoxText _mpc_combo; - list* > _port_combos; - PBD::ScopedConnectionList port_connections; -}; - - class ClickOptions : public OptionEditorBox { public: @@ -443,10 +231,10 @@ static const struct { { "Command", GDK_META_MASK }, { "Control", GDK_CONTROL_MASK }, { "Option", GDK_MOD1_MASK }, - { "Command-Shift", GDK_MOD1_MASK|GDK_SHIFT_MASK }, - { "Command-Option", GDK_MOD1_MASK|GDK_MOD5_MASK }, - { "Shift-Option", GDK_SHIFT_MASK|GDK_MOD5_MASK }, - { "Shift-Command-Option", GDK_MOD5_MASK|GDK_SHIFT_MASK|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 }, + { "Shift-Command-Option", GDK_MOD5_MASK|GDK_SHIFT_MASK|GDK_META_MASK }, #else { "Shift", GDK_SHIFT_MASK }, @@ -472,7 +260,10 @@ public: _delete_button_adjustment (3, 1, 12), _delete_button_spin (_delete_button_adjustment), _edit_button_adjustment (3, 1, 5), - _edit_button_spin (_edit_button_adjustment) + _edit_button_spin (_edit_button_adjustment), + _insert_note_button_adjustment (3, 1, 5), + _insert_note_button_spin (_insert_note_button_adjustment) + { /* internationalize and prepare for use with combos */ @@ -539,6 +330,35 @@ public: _delete_button_adjustment.set_value (Keyboard::delete_button()); _delete_button_adjustment.signal_value_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::delete_button_changed)); + + set_popdown_strings (_insert_note_modifier_combo, dumb); + _insert_note_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::insert_note_modifier_chosen)); + + for (int x = 0; modifiers[x].name; ++x) { + if (modifiers[x].modifier == Keyboard::insert_note_modifier ()) { + _insert_note_modifier_combo.set_active_text (_(modifiers[x].name)); + break; + } + } + + l = manage (new Label (_("Insert note using:"))); + l->set_name ("OptionsLabel"); + l->set_alignment (0, 0.5); + + t->attach (*l, 0, 1, 2, 3, FILL | EXPAND, FILL); + t->attach (_insert_note_modifier_combo, 1, 2, 2, 3, FILL | EXPAND, FILL); + + l = manage (new Label (_("+ button"))); + l->set_name ("OptionsLabel"); + + t->attach (*l, 3, 4, 2, 3, FILL | EXPAND, FILL); + t->attach (_insert_note_button_spin, 4, 5, 2, 3, FILL | EXPAND, FILL); + + _insert_note_button_spin.set_name ("OptionsEntry"); + _insert_note_button_adjustment.set_value (Keyboard::insert_note_button()); + _insert_note_button_adjustment.signal_value_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::insert_note_button_changed)); + + set_popdown_strings (_snap_modifier_combo, dumb); _snap_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::snap_modifier_chosen)); @@ -553,8 +373,8 @@ public: l->set_name ("OptionsLabel"); l->set_alignment (0, 0.5); - t->attach (*l, 0, 1, 2, 3, FILL | EXPAND, FILL); - t->attach (_snap_modifier_combo, 1, 2, 2, 3, FILL | EXPAND, FILL); + t->attach (*l, 0, 1, 3, 4, FILL | EXPAND, FILL); + t->attach (_snap_modifier_combo, 1, 2, 3, 4, FILL | EXPAND, FILL); vector strs; @@ -570,8 +390,8 @@ public: l->set_name ("OptionsLabel"); l->set_alignment (0, 0.5); - t->attach (*l, 0, 1, 3, 4, FILL | EXPAND, FILL); - t->attach (_keyboard_layout_selector, 1, 2, 3, 4, FILL | EXPAND, FILL); + t->attach (*l, 0, 1, 4, 5, FILL | EXPAND, FILL); + t->attach (_keyboard_layout_selector, 1, 2, 4, 5, FILL | EXPAND, FILL); _box->pack_start (*t, false, false); } @@ -627,6 +447,18 @@ private: } } + void insert_note_modifier_chosen () + { + string const txt = _insert_note_modifier_combo.get_active_text(); + + for (int i = 0; modifiers[i].name; ++i) { + if (txt == _(modifiers[i].name)) { + Keyboard::set_insert_note_modifier (modifiers[i].modifier); + break; + } + } + } + void snap_modifier_chosen () { string const txt = _snap_modifier_combo.get_active_text(); @@ -649,14 +481,23 @@ private: Keyboard::set_edit_button (_edit_button_spin.get_value_as_int()); } + void insert_note_button_changed () + { + Keyboard::set_insert_note_button (_insert_note_button_spin.get_value_as_int()); + } + ComboBoxText _keyboard_layout_selector; ComboBoxText _edit_modifier_combo; ComboBoxText _delete_modifier_combo; + ComboBoxText _insert_note_modifier_combo; ComboBoxText _snap_modifier_combo; Adjustment _delete_button_adjustment; SpinButton _delete_button_spin; Adjustment _edit_button_adjustment; SpinButton _edit_button_spin; + Adjustment _insert_note_button_adjustment; + SpinButton _insert_note_button_spin; + }; class FontScalingOptions : public OptionEditorBox @@ -709,83 +550,80 @@ private: HScale _dpi_slider; }; -class SoloMuteOptions : public OptionEditorBox +class BufferingOptions : public OptionEditorBox { public: - SoloMuteOptions (RCConfiguration* c) : - _rc_config (c), - // 0.781787 is the value needed for gain to be set to 0. - _db_adjustment (0.781787, 0.0, 1.0, 0.01, 0.1) - + BufferingOptions (RCConfiguration* c) + : _rc_config (c) + , _playback_adjustment (5, 1, 60, 1, 4) + , _capture_adjustment (5, 1, 60, 1, 4) + , _playback_slider (_playback_adjustment) + , _capture_slider (_capture_adjustment) { - if ((pix = ::get_icon ("fader_belt_h")) == 0) { - throw failed_constructor(); - } + _playback_adjustment.set_value (_rc_config->get_audio_playback_buffer_seconds()); - _db_slider = manage (new HSliderController (pix, - &_db_adjustment, - false, - 115)); + Label* 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->set_spacing (4); + h->pack_start (*l, false, false); + h->pack_start (_playback_slider, true, true); - parameter_changed ("solo-mute-gain"); + _box->pack_start (*h, false, false); + + _capture_adjustment.set_value (_rc_config->get_audio_capture_buffer_seconds()); - Label* l = manage (new Label (_("Solo mute cut (dB):"))); + l = manage (new Label (_("Recording (seconds of buffering):"))); l->set_name ("OptionsLabel"); - HBox* h = manage (new HBox); + _capture_slider.set_update_policy (UPDATE_DISCONTINUOUS); + h = manage (new HBox); h->set_spacing (4); h->pack_start (*l, false, false); - h->pack_start (*_db_slider, false, false); - h->pack_start (_db_display, false, false); - h->show_all (); - - set_size_request_to_display_given_text (_db_display, "-99.0", 12, 12); + h->pack_start (_capture_slider, true, true); _box->pack_start (*h, false, false); - - _db_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &SoloMuteOptions::db_changed)); + + _capture_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &BufferingOptions::capture_changed)); + _playback_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &BufferingOptions::playback_changed)); } void parameter_changed (string const & p) { - if (p == "solo-mute-gain") { - gain_t val = _rc_config->get_solo_mute_gain(); - - _db_adjustment.set_value (gain_to_slider_position (val)); - - char buf[16]; - - if (val == 0.0) { - snprintf (buf, sizeof (buf), "-inf"); - } else { - snprintf (buf, sizeof (buf), "%.2f", accurate_coefficient_to_dB (val)); - } - - _db_display.set_text (buf); - } + if (p == "playback-buffer-seconds") { + _playback_adjustment.set_value (_rc_config->get_audio_playback_buffer_seconds()); + } else if (p == "capture-buffer-seconds") { + _capture_adjustment.set_value (_rc_config->get_audio_capture_buffer_seconds()); + } } void set_state_from_config () { - parameter_changed ("solo-mute-gain"); + parameter_changed ("playback-buffer-seconds"); + parameter_changed ("capture-buffer-seconds"); } private: - void db_changed () + void playback_changed () { - _rc_config->set_solo_mute_gain (slider_position_to_gain (_db_adjustment.get_value())); + _rc_config->set_audio_playback_buffer_seconds ((long) _playback_adjustment.get_value()); + } + + void capture_changed () + { + _rc_config->set_audio_capture_buffer_seconds ((long) _capture_adjustment.get_value()); } RCConfiguration* _rc_config; - Adjustment _db_adjustment; - Gtkmm2ext::HSliderController* _db_slider; - Glib::RefPtr pix; - Entry _db_display; + Adjustment _playback_adjustment; + Adjustment _capture_adjustment; + HScale _playback_slider; + HScale _capture_slider; }; - class ControlSurfacesOptions : public OptionEditorBox { public: @@ -929,6 +767,28 @@ RCOptionEditor::RCOptionEditor () { /* MISC */ + uint32_t hwcpus = hardware_concurrency (); + + if (hwcpus > 1) { + add_option (_("Misc"), new OptionEditorHeading (_("DSP CPU Utilization"))); + + ComboOption* procs = new ComboOption ( + "processor-usage", + _("Signal processing uses"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_processor_usage), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_processor_usage) + ); + + procs->add (-1, _("all but one processor")); + procs->add (0, _("all available processors")); + + for (uint32_t i = 1; i <= hwcpus; ++i) { + procs->add (i, string_compose (_("%1 processors"), i)); + } + + add_option (_("Misc"), procs); + } + add_option (_("Misc"), new OptionEditorHeading (_("Metering"))); ComboOption* mht = new ComboOption ( @@ -1021,6 +881,10 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_name_new_markers) )); + add_option (_("Misc"), new OptionEditorHeading (_("Click"))); + + add_option (_("Misc"), new ClickOptions (_rc_config, this)); + /* TRANSPORT */ add_option (_("Transport"), @@ -1055,6 +919,14 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_stop_at_session_end) )); + add_option (_("Transport"), + new BoolOption ( + "seamless-loop", + _("Do seamless looping (not possible when slaved to MTC, JACK etc)"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_seamless_loop), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_seamless_loop) + )); + add_option (_("Transport"), new BoolOption ( "primary-clock-delta-edit-cursor", @@ -1079,6 +951,14 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_disable_disarm_during_roll) )); + add_option (_("Transport"), + new BoolOption ( + "quieten_at_speed", + _("12dB gain reduction during fast-forward and fast-rewind"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_quieten_at_speed), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_quieten_at_speed) + )); + /* EDITOR */ add_option (_("Editor"), @@ -1092,7 +972,7 @@ RCOptionEditor::RCOptionEditor () add_option (_("Editor"), new BoolOption ( "automation-follows-regions", - _("Move relevant automation when regions are moved"), + _("Move relevant automation when audio regions are moved"), sigc::mem_fun (*_rc_config, &RCConfiguration::get_automation_follows_regions), sigc::mem_fun (*_rc_config, &RCConfiguration::set_automation_follows_regions) )); @@ -1153,55 +1033,35 @@ RCOptionEditor::RCOptionEditor () add_option (_("Editor"), wfsh); - /* AUDIO */ - - add_option (_("Audio"), new OptionEditorHeading (_("Solo"))); - - - add_option (_("Audio"), + add_option (_("Editor"), new BoolOption ( - "solo-control-is-listen-control", - _("Solo controls are Listen controls"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_solo_control_is_listen_control), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_control_is_listen_control) + "show-waveforms-while-recording", + _("Show waveforms for audio while it is being recorded"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_waveforms_while_recording), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_waveforms_while_recording) )); - ComboOption* lp = new ComboOption ( - "listen-position", - _("Listen Position"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_listen_position), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_listen_position) - ); - - lp->add (AfterFaderListen, _("after-fader listen")); - lp->add (PreFaderListen, _("pre-fader listen")); + add_option (_("Editor"), + new BoolOption ( + "show-zoom-tools", + _("Show zoom toolbar"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_zoom_tools), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_zoom_tools) + )); - add_option (_("Audio"), lp); - add_option (_("Audio"), new SoloMuteOptions (_rc_config)); + add_option (_("Editor"), + new BoolOption ( + "color-regions-using-track-color", + _("Color regions using their track's color"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_color_regions_using_track_color), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_color_regions_using_track_color) + )); - add_option (_("Audio"), - new BoolOption ( - "solo-latched", - _("Latched solo"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_solo_latched), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_latched) - )); + /* AUDIO */ - add_option (_("Audio"), - new BoolOption ( - "show-solo-mutes", - _("Show solo muting"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_solo_mutes), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_solo_mutes) - )); + add_option (_("Audio"), new OptionEditorHeading (_("Buffering"))); - add_option (_("Audio"), - new BoolOption ( - "solo-mute-override", - _("Override muting"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_solo_mute_override), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_mute_override) - )); + add_option (_("Audio"), new BufferingOptions (_rc_config)); add_option (_("Audio"), new OptionEditorHeading (_("Monitoring"))); @@ -1215,16 +1075,45 @@ RCOptionEditor::RCOptionEditor () ComboOption* mm = new ComboOption ( "monitoring-model", - _("Monitoring handled by"), + _("Record monitoring handled by"), sigc::mem_fun (*_rc_config, &RCConfiguration::get_monitoring_model), sigc::mem_fun (*_rc_config, &RCConfiguration::set_monitoring_model) ); - mm->add (HardwareMonitoring, _("JACK")); +#ifndef __APPLE__ + /* no JACK monitoring on CoreAudio */ + if (AudioEngine::instance()->can_request_hardware_monitoring()) { + mm->add (HardwareMonitoring, _("JACK")); + } +#endif mm->add (SoftwareMonitoring, _("ardour")); mm->add (ExternalMonitoring, _("audio hardware")); add_option (_("Audio"), mm); + + ComboOption* pp = new ComboOption ( + "pfl-position", + _("PFL signals come from"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_pfl_position), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_pfl_position) + ); + + pp->add (PFLFromBeforeProcessors, _("before pre-fader processors")); + pp->add (PFLFromAfterProcessors, _("pre-fader but after pre-fader processors")); + + add_option (_("Audio"), pp); + + ComboOption* pa = new ComboOption ( + "afl-position", + _("AFL signals come from"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_afl_position), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_afl_position) + ); + + pa->add (AFLFromBeforeProcessors, _("post-fader but before post-fader processors")); + pa->add (AFLFromAfterProcessors, _("after post-fader processors")); + + add_option (_("Audio"), pa); add_option (_("Audio"), new BoolOption ( @@ -1246,7 +1135,7 @@ RCOptionEditor::RCOptionEditor () ComboOption* iac = new ComboOption ( "input-auto-connect", - _("Connect track and bus inputs"), + _("Connect track inputs"), sigc::mem_fun (*_rc_config, &RCConfiguration::get_input_auto_connect), sigc::mem_fun (*_rc_config, &RCConfiguration::set_input_auto_connect) ); @@ -1264,7 +1153,7 @@ RCOptionEditor::RCOptionEditor () ); oac->add (AutoConnectPhysical, _("automatically to physical outputs")); - oac->add (AutoConnectMaster, _("automatically to master outputs")); + oac->add (AutoConnectMaster, _("automatically to master bus")); oac->add (ManualConnect, _("manually")); add_option (_("Audio"), oac); @@ -1338,43 +1227,112 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_auto_analyse_audio) )); - /* MIDI CONTROL */ - - list* > midi_combos; - - midi_combos.push_back (new ComboOption ( - "mtc-port-name", - _("Send/Receive MTC via"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_mtc_port_name), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_mtc_port_name) - )); - - midi_combos.push_back (new ComboOption ( - "midi-clock-port-name", - _("Send/Receive MIDI clock via"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_midi_clock_port_name), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_midi_clock_port_name) - )); - - midi_combos.push_back (new ComboOption ( - "mmc-port-name", - _("Send/Receive MMC via"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_mmc_port_name), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_mmc_port_name) - )); - - midi_combos.push_back (new ComboOption ( - "midi-port-name", - _("Send/Receive MIDI parameter control via"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_midi_port_name), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_midi_port_name) - )); + add_option (_("Audio"), + new BoolOption ( + "replicate-missing-region-channels", + _("Replicate missing region channels"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_replicate_missing_region_channels), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_replicate_missing_region_channels) + )); + + /* SOLO AND MUTE */ + + add_option (_("Solo / mute"), + new FaderOption ( + "solo-mute-gain", + _("Solo mute cut (dB)"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_solo_mute_gain), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_mute_gain) + )); + + _solo_control_is_listen_control = new BoolOption ( + "solo-control-is-listen-control", + _("Solo controls are Listen controls"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_solo_control_is_listen_control), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_control_is_listen_control) + ); + + add_option (_("Solo / mute"), _solo_control_is_listen_control); + + _listen_position = new ComboOption ( + "listen-position", + _("Listen Position"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_listen_position), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_listen_position) + ); + + _listen_position->add (AfterFaderListen, _("after-fader listen")); + _listen_position->add (PreFaderListen, _("pre-fader listen")); + + add_option (_("Solo / mute"), _listen_position); + + parameter_changed ("use-monitor-bus"); + + add_option (_("Solo / mute"), + new BoolOption ( + "exclusive-solo", + _("Exclusive solo"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_exclusive_solo), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_exclusive_solo) + )); + + add_option (_("Solo / mute"), + new BoolOption ( + "show-solo-mutes", + _("Show solo muting"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_solo_mutes), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_solo_mutes) + )); + + add_option (_("Solo / mute"), + new BoolOption ( + "solo-mute-override", + _("Soloing overrides muting"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_solo_mute_override), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_mute_override) + )); + + add_option (_("Solo / mute"), new OptionEditorHeading (_("Default track / bus muting options"))); - add_option (_("MIDI control"), new MIDIPorts (_rc_config, midi_combos)); + add_option (_("Solo / mute"), + new BoolOption ( + "mute-affects-pre-fader", + _("Mute affects pre-fader sends"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_mute_affects_pre_fader), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_pre_fader) + )); - for (list* >::iterator i = midi_combos.begin(); i != midi_combos.end(); ++i) { - add_option (_("MIDI control"), *i); - } + add_option (_("Solo / mute"), + new BoolOption ( + "mute-affects-post-fader", + _("Mute affects post-fader sends"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_mute_affects_post_fader), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_post_fader) + )); + + add_option (_("Solo / mute"), + new BoolOption ( + "mute-affects-control-outs", + _("Mute affects control outputs"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_mute_affects_control_outs), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_control_outs) + )); + + add_option (_("Solo / mute"), + new BoolOption ( + "mute-affects-main-outs", + _("Mute affects main outputs"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_mute_affects_main_outs), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_main_outs) + )); + + add_option (_("MIDI control"), + new BoolOption ( + "send-midi-clock", + _("Send MIDI Clock"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_send_midi_clock), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_midi_clock) + )); add_option (_("MIDI control"), new BoolOption ( @@ -1384,6 +1342,15 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_mtc) )); + add_option (_("MIDI control"), + new SpinOption ( + "mtc-qf-speed-tolerance", + _("Percentage either side of normal transport speed to transmit MTC"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_mtc_qf_speed_tolerance), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_mtc_qf_speed_tolerance), + 0, 20, 1, 5 + )); + add_option (_("MIDI control"), new BoolOption ( "mmc-control", @@ -1392,7 +1359,6 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_mmc_control) )); - add_option (_("MIDI control"), new BoolOption ( "send-mmc", @@ -1453,13 +1419,23 @@ RCOptionEditor::RCOptionEditor () add_option (_("Control surfaces"), rm); - /* CLICK */ - - add_option (_("Click"), new ClickOptions (_rc_config, this)); - /* KEYBOARD */ add_option (_("Keyboard"), new KeyboardOptions); } - +void +RCOptionEditor::parameter_changed (string const & p) +{ + OptionEditor::parameter_changed (p); + + if (p == "use-monitor-bus") { + bool const s = Config->get_use_monitor_bus (); + if (!s) { + /* we can't use this if we don't have a monitor bus */ + Config->set_solo_control_is_listen_control (false); + } + _solo_control_is_listen_control->set_sensitive (s); + _listen_position->set_sensitive (s); + } +}