X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=gtk2_ardour%2Frc_option_editor.cc;h=1bc4f0a252691dd712ddb212eaa141009db25f48;hb=5c144432adbb791ce9d2a2cbd7471da0499b6ea7;hp=acf4c06db4b6b47f8705e02a14855e5633039ef6;hpb=ce525ae440d7707304cd2233be929cbbc64b4943;p=ardour.git diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index acf4c06db4..1bc4f0a252 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -10,6 +10,9 @@ #include "ardour/rc_configuration.h" #include "ardour/control_protocol_manager.h" #include "control_protocol/control_protocol.h" + +#include "gui_thread.h" +#include "midi_tracer.h" #include "rc_option_editor.h" #include "utils.h" #include "midi_port_dialog.h" @@ -18,7 +21,6 @@ #include "i18n.h" using namespace std; -using namespace sigc; using namespace Gtk; using namespace Gtkmm2ext; using namespace PBD; @@ -54,9 +56,9 @@ public: ports_changed (); - _store->signal_row_changed().connect (mem_fun (*this, &MIDIPorts::model_changed)); + _store->signal_row_changed().connect (sigc::mem_fun (*this, &MIDIPorts::model_changed)); - _add_port_button.signal_clicked().connect (mem_fun (*this, &MIDIPorts::add_port_clicked)); + _add_port_button.signal_clicked().connect (sigc::mem_fun (*this, &MIDIPorts::add_port_clicked)); } void parameter_changed (string const &) {} @@ -64,6 +66,10 @@ public: 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; @@ -80,14 +86,32 @@ private: } if (r[_model.trace_input] != port->input()->tracing()) { - port->input()->trace (r[_model.trace_input], &cerr, string (port->name()) + _(" input: ")); + 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()) { - port->output()->trace (r[_model.trace_output], &cerr, string (port->name()) + _(" output: ")); + 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 (); } } @@ -108,6 +132,7 @@ private: 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) { @@ -117,7 +142,7 @@ private: if ((*i)->input()) { r[_model.online] = !(*i)->input()->offline(); - (*i)->input()->OfflineStatusChanged.connect (bind (mem_fun (*this, &MIDIPorts::port_offline_changed), (*i))); + (*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(); } @@ -183,6 +208,7 @@ private: node.add_property ("mode", smod); if (MIDI::Manager::instance()->add_port (node) != 0) { + cerr << " there are now " << MIDI::Manager::instance()->nports() << endl; ports_changed (); } } @@ -216,6 +242,7 @@ private: ComboBoxText _mmc_combo; ComboBoxText _mpc_combo; list* > _port_combos; + PBD::ScopedConnectionList port_connections; }; @@ -234,7 +261,7 @@ public: 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 (mem_fun (*this, &ClickOptions::click_browse_clicked)); + b->signal_clicked().connect (sigc::mem_fun (*this, &ClickOptions::click_browse_clicked)); t->attach (*b, 2, 3, 0, 1, FILL); l = manage (new Label (_("Click emphasis audio file:"))); @@ -242,7 +269,7 @@ public: 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 (mem_fun (*this, &ClickOptions::click_emphasis_browse_clicked)); + b->signal_clicked().connect (sigc::mem_fun (*this, &ClickOptions::click_emphasis_browse_clicked)); t->attach (*b, 2, 3, 1, 2, FILL); _box->pack_start (*t, false, false); @@ -336,10 +363,10 @@ public: _box->pack_start (*t); - _limit_undo_button.signal_toggled().connect (mem_fun (*this, &UndoOptions::limit_undo_toggled)); - _limit_undo_spin.signal_value_changed().connect (mem_fun (*this, &UndoOptions::limit_undo_changed)); - _save_undo_button.signal_toggled().connect (mem_fun (*this, &UndoOptions::save_undo_toggled)); - _save_undo_spin.signal_value_changed().connect (mem_fun (*this, &UndoOptions::save_undo_changed)); + _limit_undo_button.signal_toggled().connect (sigc::mem_fun (*this, &UndoOptions::limit_undo_toggled)); + _limit_undo_spin.signal_value_changed().connect (sigc::mem_fun (*this, &UndoOptions::limit_undo_changed)); + _save_undo_button.signal_toggled().connect (sigc::mem_fun (*this, &UndoOptions::save_undo_toggled)); + _save_undo_spin.signal_value_changed().connect (sigc::mem_fun (*this, &UndoOptions::save_undo_changed)); } void parameter_changed (string const & p) @@ -456,7 +483,7 @@ public: } set_popdown_strings (_edit_modifier_combo, dumb); - _edit_modifier_combo.signal_changed().connect (mem_fun(*this, &KeyboardOptions::edit_modifier_chosen)); + _edit_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::edit_modifier_chosen)); for (int x = 0; modifiers[x].name; ++x) { if (modifiers[x].modifier == Keyboard::edit_modifier ()) { @@ -483,10 +510,10 @@ public: _edit_button_spin.set_name ("OptionsEntry"); _edit_button_adjustment.set_value (Keyboard::edit_button()); - _edit_button_adjustment.signal_value_changed().connect (mem_fun(*this, &KeyboardOptions::edit_button_changed)); + _edit_button_adjustment.signal_value_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::edit_button_changed)); set_popdown_strings (_delete_modifier_combo, dumb); - _delete_modifier_combo.signal_changed().connect (mem_fun(*this, &KeyboardOptions::delete_modifier_chosen)); + _delete_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::delete_modifier_chosen)); for (int x = 0; modifiers[x].name; ++x) { if (modifiers[x].modifier == Keyboard::delete_modifier ()) { @@ -510,10 +537,10 @@ public: _delete_button_spin.set_name ("OptionsEntry"); _delete_button_adjustment.set_value (Keyboard::delete_button()); - _delete_button_adjustment.signal_value_changed().connect (mem_fun(*this, &KeyboardOptions::delete_button_changed)); + _delete_button_adjustment.signal_value_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::delete_button_changed)); set_popdown_strings (_snap_modifier_combo, dumb); - _snap_modifier_combo.signal_changed().connect (mem_fun(*this, &KeyboardOptions::snap_modifier_chosen)); + _snap_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::snap_modifier_chosen)); for (int x = 0; modifiers[x].name; ++x) { if (modifiers[x].modifier == (guint) Keyboard::snap_modifier ()) { @@ -537,7 +564,7 @@ public: set_popdown_strings (_keyboard_layout_selector, strs); _keyboard_layout_selector.set_active_text (Keyboard::current_binding_name()); - _keyboard_layout_selector.signal_changed().connect (mem_fun (*this, &KeyboardOptions::bindings_changed)); + _keyboard_layout_selector.signal_changed().connect (sigc::mem_fun (*this, &KeyboardOptions::bindings_changed)); l = manage (new Label (_("Keyboard layout:"))); l->set_name ("OptionsLabel"); @@ -653,7 +680,7 @@ public: _box->pack_start (*h, false, false); - _dpi_adjustment.signal_value_changed().connect (mem_fun (*this, &FontScalingOptions::dpi_changed)); + _dpi_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &FontScalingOptions::dpi_changed)); } void parameter_changed (string const & p) @@ -696,10 +723,10 @@ public: } _db_slider = manage (new HSliderController (pix, - &_db_adjustment, + &_db_adjustment, + 115, false)); - parameter_changed ("solo-mute-gain"); Label* l = manage (new Label (_("Solo mute cut (dB):"))); @@ -710,12 +737,13 @@ public: 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); _box->pack_start (*h, false, false); - _db_adjustment.signal_value_changed().connect (mem_fun (*this, &SoloMuteOptions::db_changed)); + _db_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &SoloMuteOptions::db_changed)); } void parameter_changed (string const & p) @@ -760,7 +788,8 @@ private: class ControlSurfacesOptions : public OptionEditorBox { public: - ControlSurfacesOptions () + ControlSurfacesOptions (ArdourDialog& parent) + : _parent (parent) { _store = ListStore::create (_model); _view.set_model (_store); @@ -772,7 +801,14 @@ public: _box->pack_start (_view, false, false); - _store->signal_row_changed().connect (mem_fun (*this, &ControlSurfacesOptions::model_changed)); + Label* label = manage (new Label); + label->set_markup (string_compose (X_("%1"), _("Double-click on a name to edit settings for an enabled protocol"))); + + _box->pack_start (*label, false, false); + label->show (); + + _store->signal_row_changed().connect (sigc::mem_fun (*this, &ControlSurfacesOptions::model_changed)); + _view.signal_button_press_event().connect_notify (sigc::mem_fun(*this, &ControlSurfacesOptions::edit_clicked)); } void parameter_changed (std::string const &) @@ -827,6 +863,38 @@ private: } } + void edit_clicked (GdkEventButton* ev) + { + if (ev->type != GDK_2BUTTON_PRESS) { + return; + } + + std::string name; + ControlProtocolInfo* cpi; + TreeModel::Row row; + + row = *(_view.get_selection()->get_selected()); + + Window* win = row[_model.editor]; + if (win && !win->is_visible()) { + win->present (); + } else { + cpi = row[_model.protocol_info]; + + if (cpi && cpi->protocol && cpi->protocol->has_editor ()) { + Box* box = (Box*) cpi->protocol->get_gui (); + if (box) { + string title = row[_model.name]; + ArdourDialog* win = new ArdourDialog (_parent, title); + win->get_vbox()->pack_start (*box, false, false); + box->show (); + win->present (); + row[_model.editor] = win; + } + } + } + } + class ControlSurfacesModelColumns : public TreeModelColumnRecord { public: @@ -837,23 +905,26 @@ private: add (enabled); add (feedback); add (protocol_info); + add (editor); } TreeModelColumn name; TreeModelColumn enabled; TreeModelColumn feedback; TreeModelColumn protocol_info; + TreeModelColumn editor; }; Glib::RefPtr _store; ControlSurfacesModelColumns _model; TreeView _view; + Gtk::Window& _parent; }; RCOptionEditor::RCOptionEditor () - : OptionEditor (Config, _("Ardour Preferences")), - _rc_config (Config) + : OptionEditor (Config, string_compose (_("%1 Preferences"), PROGRAM_NAME)) + , _rc_config (Config) { /* MISC */ @@ -862,8 +933,8 @@ RCOptionEditor::RCOptionEditor () ComboOption* mht = new ComboOption ( "meter-hold", _("Meter hold time"), - mem_fun (*_rc_config, &RCConfiguration::get_meter_hold), - mem_fun (*_rc_config, &RCConfiguration::set_meter_hold) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_hold), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_hold) ); mht->add (MeterHoldOff, _("off")); @@ -876,8 +947,8 @@ RCOptionEditor::RCOptionEditor () ComboOption* mfo = new ComboOption ( "meter-falloff", _("Meter fall-off"), - mem_fun (*_rc_config, &RCConfiguration::get_meter_falloff), - mem_fun (*_rc_config, &RCConfiguration::set_meter_falloff) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_falloff), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_falloff) ); mfo->add (METER_FALLOFF_OFF, _("off")); @@ -905,48 +976,48 @@ RCOptionEditor::RCOptionEditor () new BoolOption ( "verify-remove-last-capture", _("Verify removal of last capture"), - mem_fun (*_rc_config, &RCConfiguration::get_verify_remove_last_capture), - mem_fun (*_rc_config, &RCConfiguration::set_verify_remove_last_capture) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_verify_remove_last_capture), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_verify_remove_last_capture) )); add_option (_("Misc"), new BoolOption ( "periodic-safety-backups", _("Make periodic backups of the session file"), - mem_fun (*_rc_config, &RCConfiguration::get_periodic_safety_backups), - mem_fun (*_rc_config, &RCConfiguration::set_periodic_safety_backups) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_periodic_safety_backups), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_periodic_safety_backups) )); add_option (_("Misc"), new BoolOption ( "sync-all-route-ordering", _("Syncronise editor and mixer track order"), - mem_fun (*_rc_config, &RCConfiguration::get_sync_all_route_ordering), - mem_fun (*_rc_config, &RCConfiguration::set_sync_all_route_ordering) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_sync_all_route_ordering), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_sync_all_route_ordering) )); add_option (_("Misc"), new BoolOption ( "only-copy-imported-files", _("Always copy imported files"), - mem_fun (*_rc_config, &RCConfiguration::get_only_copy_imported_files), - mem_fun (*_rc_config, &RCConfiguration::set_only_copy_imported_files) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_only_copy_imported_files), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_only_copy_imported_files) )); add_option (_("Misc"), new BoolOption ( "default-narrow_ms", _("Use narrow mixer strips"), - mem_fun (*_rc_config, &RCConfiguration::get_default_narrow_ms), - mem_fun (*_rc_config, &RCConfiguration::set_default_narrow_ms) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_default_narrow_ms), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_default_narrow_ms) )); add_option (_("Misc"), new BoolOption ( "name-new-markers", _("Name new markers"), - mem_fun (*_rc_config, &RCConfiguration::get_name_new_markers), - mem_fun (*_rc_config, &RCConfiguration::set_name_new_markers) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_name_new_markers), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_name_new_markers) )); /* TRANSPORT */ @@ -955,56 +1026,64 @@ RCOptionEditor::RCOptionEditor () new BoolOption ( "latched-record-enable", _("Keep record-enable engaged on stop"), - mem_fun (*_rc_config, &RCConfiguration::get_latched_record_enable), - mem_fun (*_rc_config, &RCConfiguration::set_latched_record_enable) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_latched_record_enable), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_latched_record_enable) )); add_option (_("Transport"), new BoolOption ( "stop-recording-on-xrun", _("Stop recording when an xrun occurs"), - mem_fun (*_rc_config, &RCConfiguration::get_stop_recording_on_xrun), - mem_fun (*_rc_config, &RCConfiguration::set_stop_recording_on_xrun) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_stop_recording_on_xrun), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_stop_recording_on_xrun) )); add_option (_("Transport"), new BoolOption ( "create-xrun-marker", _("Create markers where xruns occur"), - mem_fun (*_rc_config, &RCConfiguration::get_create_xrun_marker), - mem_fun (*_rc_config, &RCConfiguration::set_create_xrun_marker) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_create_xrun_marker), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_create_xrun_marker) )); add_option (_("Transport"), new BoolOption ( "stop-at-session-end", _("Stop at the end of the session"), - mem_fun (*_rc_config, &RCConfiguration::get_stop_at_session_end), - mem_fun (*_rc_config, &RCConfiguration::set_stop_at_session_end) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_stop_at_session_end), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_stop_at_session_end) )); add_option (_("Transport"), new BoolOption ( "primary-clock-delta-edit-cursor", _("Primary clock delta to edit cursor"), - mem_fun (*_rc_config, &RCConfiguration::get_primary_clock_delta_edit_cursor), - mem_fun (*_rc_config, &RCConfiguration::set_primary_clock_delta_edit_cursor) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_primary_clock_delta_edit_cursor), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_primary_clock_delta_edit_cursor) )); add_option (_("Transport"), new BoolOption ( "secondary-clock-delta-edit-cursor", _("Secondary clock delta to edit cursor"), - mem_fun (*_rc_config, &RCConfiguration::get_secondary_clock_delta_edit_cursor), - mem_fun (*_rc_config, &RCConfiguration::set_secondary_clock_delta_edit_cursor) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_secondary_clock_delta_edit_cursor), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_secondary_clock_delta_edit_cursor) )); add_option (_("Transport"), new BoolOption ( "disable-disarm-during-roll", - _("Disable record disarm when transport is rolling"), - mem_fun (*_rc_config, &RCConfiguration::get_disable_disarm_during_roll), - mem_fun (*_rc_config, &RCConfiguration::set_disable_disarm_during_roll) + _("Disable per-track record disarm while rolling"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_disable_disarm_during_roll), + 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 */ @@ -1013,55 +1092,55 @@ RCOptionEditor::RCOptionEditor () new BoolOption ( "link-region-and-track-selection", _("Link selection of regions and tracks"), - mem_fun (*_rc_config, &RCConfiguration::get_link_region_and_track_selection), - mem_fun (*_rc_config, &RCConfiguration::set_link_region_and_track_selection) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_link_region_and_track_selection), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_link_region_and_track_selection) )); add_option (_("Editor"), new BoolOption ( "automation-follows-regions", _("Move relevant automation when regions are moved"), - mem_fun (*_rc_config, &RCConfiguration::get_automation_follows_regions), - mem_fun (*_rc_config, &RCConfiguration::set_automation_follows_regions) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_automation_follows_regions), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_automation_follows_regions) )); add_option (_("Editor"), new BoolOption ( "show-track-meters", _("Show meters on tracks in the editor"), - mem_fun (*_rc_config, &RCConfiguration::get_show_track_meters), - mem_fun (*_rc_config, &RCConfiguration::set_show_track_meters) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_track_meters), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_track_meters) )); add_option (_("Editor"), new BoolOption ( "use-overlap-equivalency", _("Use overlap equivalency for regions"), - mem_fun (*_rc_config, &RCConfiguration::get_use_overlap_equivalency), - mem_fun (*_rc_config, &RCConfiguration::set_use_overlap_equivalency) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_use_overlap_equivalency), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_use_overlap_equivalency) )); add_option (_("Editor"), new BoolOption ( "rubberbanding-snaps-to-grid", _("Make rubberband selection rectangle snap to the grid"), - mem_fun (*_rc_config, &RCConfiguration::get_rubberbanding_snaps_to_grid), - mem_fun (*_rc_config, &RCConfiguration::set_rubberbanding_snaps_to_grid) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_rubberbanding_snaps_to_grid), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_rubberbanding_snaps_to_grid) )); add_option (_("Editor"), new BoolOption ( "show-waveforms", _("Show waveforms in regions"), - mem_fun (*_rc_config, &RCConfiguration::get_show_waveforms), - mem_fun (*_rc_config, &RCConfiguration::set_show_waveforms) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_waveforms), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_waveforms) )); ComboOption* wfs = new ComboOption ( "waveform-scale", _("Waveform scale"), - mem_fun (*_rc_config, &RCConfiguration::get_waveform_scale), - mem_fun (*_rc_config, &RCConfiguration::set_waveform_scale) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_waveform_scale), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_waveform_scale) ); wfs->add (Linear, _("linear")); @@ -1072,8 +1151,8 @@ RCOptionEditor::RCOptionEditor () ComboOption* wfsh = new ComboOption ( "waveform-shape", _("Waveform shape"), - mem_fun (*_rc_config, &RCConfiguration::get_waveform_shape), - mem_fun (*_rc_config, &RCConfiguration::set_waveform_shape) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_waveform_shape), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_waveform_shape) ); wfsh->add (Traditional, _("traditional")); @@ -1081,24 +1160,31 @@ RCOptionEditor::RCOptionEditor () add_option (_("Editor"), wfsh); + add_option (_("Editor"), + new BoolOption ( + "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) + )); + /* AUDIO */ add_option (_("Audio"), new OptionEditorHeading (_("Solo"))); - add_option (_("Audio"), new BoolOption ( "solo-control-is-listen-control", _("Solo controls are Listen controls"), - mem_fun (*_rc_config, &RCConfiguration::get_solo_control_is_listen_control), - mem_fun (*_rc_config, &RCConfiguration::set_solo_control_is_listen_control) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_solo_control_is_listen_control), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_control_is_listen_control) )); ComboOption* lp = new ComboOption ( "listen-position", _("Listen Position"), - mem_fun (*_rc_config, &RCConfiguration::get_listen_position), - mem_fun (*_rc_config, &RCConfiguration::set_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")); @@ -1109,35 +1195,43 @@ RCOptionEditor::RCOptionEditor () add_option (_("Audio"), new BoolOption ( - "solo-latched", - _("Latched solo"), - mem_fun (*_rc_config, &RCConfiguration::get_solo_latched), - mem_fun (*_rc_config, &RCConfiguration::set_solo_latched) + "exclusive-solo", + _("Exclusive solo"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_exclusive_solo), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_exclusive_solo) )); add_option (_("Audio"), new BoolOption ( "show-solo-mutes", _("Show solo muting"), - mem_fun (*_rc_config, &RCConfiguration::get_show_solo_mutes), - mem_fun (*_rc_config, &RCConfiguration::set_show_solo_mutes) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_solo_mutes), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_solo_mutes) )); add_option (_("Audio"), new BoolOption ( "solo-mute-override", - _("Override muting"), - mem_fun (*_rc_config, &RCConfiguration::get_solo_mute_override), - mem_fun (*_rc_config, &RCConfiguration::set_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 (_("Audio"), new OptionEditorHeading (_("Monitoring"))); + add_option (_("Audio"), + new BoolOption ( + "use-monitor-bus", + _("Use a monitor bus (allows AFL/PFL and more control)"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_use_monitor_bus), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_use_monitor_bus) + )); + ComboOption* mm = new ComboOption ( "monitoring-model", _("Monitoring handled by"), - mem_fun (*_rc_config, &RCConfiguration::get_monitoring_model), - mem_fun (*_rc_config, &RCConfiguration::set_monitoring_model) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_monitoring_model), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_monitoring_model) ); mm->add (HardwareMonitoring, _("JACK")); @@ -1150,8 +1244,8 @@ RCOptionEditor::RCOptionEditor () new BoolOption ( "tape-machine-mode", _("Tape machine mode"), - mem_fun (*_rc_config, &RCConfiguration::get_tape_machine_mode), - mem_fun (*_rc_config, &RCConfiguration::set_tape_machine_mode) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_tape_machine_mode), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_tape_machine_mode) )); add_option (_("Audio"), new OptionEditorHeading (_("Connection of tracks and busses"))); @@ -1160,15 +1254,15 @@ RCOptionEditor::RCOptionEditor () new BoolOption ( "auto-connect-standard-busses", _("Auto-connect master/monitor busses"), - mem_fun (*_rc_config, &RCConfiguration::get_auto_connect_standard_busses), - mem_fun (*_rc_config, &RCConfiguration::set_auto_connect_standard_busses) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_auto_connect_standard_busses), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_auto_connect_standard_busses) )); ComboOption* iac = new ComboOption ( "input-auto-connect", _("Connect track and bus inputs"), - mem_fun (*_rc_config, &RCConfiguration::get_input_auto_connect), - mem_fun (*_rc_config, &RCConfiguration::set_input_auto_connect) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_input_auto_connect), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_input_auto_connect) ); iac->add (AutoConnectPhysical, _("automatically to physical inputs")); @@ -1179,8 +1273,8 @@ RCOptionEditor::RCOptionEditor () ComboOption* oac = new ComboOption ( "output-auto-connect", _("Connect track and bus outputs"), - mem_fun (*_rc_config, &RCConfiguration::get_output_auto_connect), - mem_fun (*_rc_config, &RCConfiguration::set_output_auto_connect) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_output_auto_connect), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_output_auto_connect) ); oac->add (AutoConnectPhysical, _("automatically to physical outputs")); @@ -1195,15 +1289,15 @@ RCOptionEditor::RCOptionEditor () new BoolOption ( "denormal-protection", _("Use DC bias to protect against denormals"), - mem_fun (*_rc_config, &RCConfiguration::get_denormal_protection), - mem_fun (*_rc_config, &RCConfiguration::set_denormal_protection) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_denormal_protection), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_denormal_protection) )); ComboOption* dm = new ComboOption ( "denormal-model", _("Processor handling"), - mem_fun (*_rc_config, &RCConfiguration::get_denormal_model), - mem_fun (*_rc_config, &RCConfiguration::set_denormal_model) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_denormal_model), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_denormal_model) ); dm->add (DenormalNone, _("no processor handling")); @@ -1230,32 +1324,32 @@ RCOptionEditor::RCOptionEditor () new BoolOption ( "plugins-stop-with-transport", _("Stop plugins when the transport is stopped"), - mem_fun (*_rc_config, &RCConfiguration::get_plugins_stop_with_transport), - mem_fun (*_rc_config, &RCConfiguration::set_plugins_stop_with_transport) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_plugins_stop_with_transport), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_plugins_stop_with_transport) )); add_option (_("Audio"), new BoolOption ( "do-not-record-plugins", _("Disable plugins during recording"), - mem_fun (*_rc_config, &RCConfiguration::get_do_not_record_plugins), - mem_fun (*_rc_config, &RCConfiguration::set_do_not_record_plugins) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_do_not_record_plugins), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_do_not_record_plugins) )); add_option (_("Audio"), new BoolOption ( "new-plugins-active", _("Make new plugins active"), - mem_fun (*_rc_config, &RCConfiguration::get_new_plugins_active), - mem_fun (*_rc_config, &RCConfiguration::set_new_plugins_active) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_new_plugins_active), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_new_plugins_active) )); add_option (_("Audio"), new BoolOption ( "auto-analyse-audio", _("Enable automatic analysis of audio"), - mem_fun (*_rc_config, &RCConfiguration::get_auto_analyse_audio), - mem_fun (*_rc_config, &RCConfiguration::set_auto_analyse_audio) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_auto_analyse_audio), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_auto_analyse_audio) )); /* MIDI CONTROL */ @@ -1264,30 +1358,30 @@ RCOptionEditor::RCOptionEditor () midi_combos.push_back (new ComboOption ( "mtc-port-name", - _("Receive MTC via"), - mem_fun (*_rc_config, &RCConfiguration::get_mtc_port_name), - mem_fun (*_rc_config, &RCConfiguration::set_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", - _("Receive MIDI clock via"), - mem_fun (*_rc_config, &RCConfiguration::get_midi_clock_port_name), - mem_fun (*_rc_config, &RCConfiguration::set_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", - _("Receive MMC via"), - mem_fun (*_rc_config, &RCConfiguration::get_mmc_port_name), - mem_fun (*_rc_config, &RCConfiguration::set_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", - _("Receive MIDI parameter control via"), - mem_fun (*_rc_config, &RCConfiguration::get_midi_port_name), - mem_fun (*_rc_config, &RCConfiguration::set_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 (_("MIDI control"), new MIDIPorts (_rc_config, midi_combos)); @@ -1296,12 +1390,45 @@ RCOptionEditor::RCOptionEditor () add_option (_("MIDI control"), *i); } + add_option (_("MIDI control"), + new BoolOption ( + "send-mtc", + _("Send MIDI Time Code"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_send_mtc), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_mtc) + )); + + add_option (_("MIDI control"), + new BoolOption ( + "mmc-control", + _("Obey MIDI Machine Control commands"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_mmc_control), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_mmc_control) + )); + + + add_option (_("MIDI control"), + new BoolOption ( + "send-mmc", + _("Send MIDI Machine Control commands"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_send_mmc), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_mmc) + )); + + add_option (_("MIDI control"), + new BoolOption ( + "midi-feedback", + _("Send MIDI control feedback"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_midi_feedback), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_midi_feedback) + )); + add_option (_("MIDI control"), new SpinOption ( "mmc-receive-device-id", _("Inbound MMC device ID"), - mem_fun (*_rc_config, &RCConfiguration::get_mmc_receive_device_id), - mem_fun (*_rc_config, &RCConfiguration::set_mmc_receive_device_id), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_mmc_receive_device_id), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_mmc_receive_device_id), 0, 128, 1, 10 )); @@ -1309,8 +1436,8 @@ RCOptionEditor::RCOptionEditor () new SpinOption ( "mmc-send-device-id", _("Outbound MMC device ID"), - mem_fun (*_rc_config, &RCConfiguration::get_mmc_send_device_id), - mem_fun (*_rc_config, &RCConfiguration::set_mmc_send_device_id), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_mmc_send_device_id), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_mmc_send_device_id), 0, 128, 1, 10 )); @@ -1318,20 +1445,20 @@ RCOptionEditor::RCOptionEditor () new SpinOption ( "initial-program-change", _("Initial program change"), - mem_fun (*_rc_config, &RCConfiguration::get_initial_program_change), - mem_fun (*_rc_config, &RCConfiguration::set_initial_program_change), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_initial_program_change), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_initial_program_change), -1, 65536, 1, 10 )); /* CONTROL SURFACES */ - add_option (_("Control surfaces"), new ControlSurfacesOptions); + add_option (_("Control surfaces"), new ControlSurfacesOptions (*this)); ComboOption* rm = new ComboOption ( "remote-model", _("Control surface remote ID"), - mem_fun (*_rc_config, &RCConfiguration::get_remote_model), - mem_fun (*_rc_config, &RCConfiguration::set_remote_model) + sigc::mem_fun (*_rc_config, &RCConfiguration::get_remote_model), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_remote_model) ); rm->add (UserOrdered, _("assigned by user"));