X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Frc_option_editor.cc;h=f77c4c2cceff31f36c6c4418f3cf196d7257189d;hb=035de2a367acd7ee27c3dbfba2f6c71f3c137eb8;hp=d90773b334725a97b27ba6a4235aa11eac1613ae;hpb=c1e6410619403754ffa4388e82de7ec953ab6a7c;p=ardour.git diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index d90773b334..f77c4c2cce 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -5,9 +5,9 @@ #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" @@ -30,226 +30,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: @@ -713,6 +493,80 @@ private: HScale _dpi_slider; }; +class BufferingOptions : public OptionEditorBox +{ +public: + 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) + { + _playback_adjustment.set_value (_rc_config->get_audio_playback_buffer_seconds()); + + 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); + + _box->pack_start (*h, false, false); + + _capture_adjustment.set_value (_rc_config->get_audio_capture_buffer_seconds()); + + l = manage (new Label (_("Recording (seconds of buffering):"))); + l->set_name ("OptionsLabel"); + + _capture_slider.set_update_policy (UPDATE_DISCONTINUOUS); + h = manage (new HBox); + h->set_spacing (4); + h->pack_start (*l, false, false); + h->pack_start (_capture_slider, true, true); + + _box->pack_start (*h, false, false); + + _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 == "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 ("playback-buffer-seconds"); + parameter_changed ("capture-buffer-seconds"); + } + +private: + + void playback_changed () + { + _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 _playback_adjustment; + Adjustment _capture_adjustment; + HScale _playback_slider; + HScale _capture_slider; +}; + class ControlSurfacesOptions : public OptionEditorBox { public: @@ -856,6 +710,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 = 2; i < hwcpus; ++i) { + procs->add (1, string_compose (_("%1 processors"), i)); + } + + add_option (_("Misc"), procs); + } + add_option (_("Misc"), new OptionEditorHeading (_("Metering"))); ComboOption* mht = new ComboOption ( @@ -1102,6 +978,10 @@ RCOptionEditor::RCOptionEditor () /* AUDIO */ + add_option (_("Audio"), new OptionEditorHeading (_("Buffering"))); + + add_option (_("Audio"), new BufferingOptions (_rc_config)); + add_option (_("Audio"), new OptionEditorHeading (_("Monitoring"))); add_option (_("Audio"), @@ -1150,7 +1030,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) ); @@ -1168,7 +1048,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); @@ -1330,43 +1210,13 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_main_outs) )); - /* 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 (_("MIDI control"), new MIDIPorts (_rc_config, midi_combos)); - - for (list* >::iterator i = midi_combos.begin(); i != midi_combos.end(); ++i) { - add_option (_("MIDI control"), *i); - } + 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 (