diff options
Diffstat (limited to 'gtk2_ardour/engine_dialog.cc')
-rw-r--r-- | gtk2_ardour/engine_dialog.cc | 135 |
1 files changed, 67 insertions, 68 deletions
diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index c55fc7008b..b03dc9a304 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -25,7 +25,6 @@ #include <boost/scoped_ptr.hpp> -#include <glibmm/spawn.h> #include <gtkmm/messagedialog.h> #include "pbd/error.h" @@ -65,6 +64,7 @@ EngineControl::EngineControl () , ports_spinner (ports_adjustment) , control_app_button (_("Launch Control App")) , basic_packer (9, 3) + , ignore_changes (0) { build_notebook (); @@ -82,9 +82,12 @@ EngineControl::EngineControl () XMLNode* audio_setup = ARDOUR::Config->extra_xml ("AudioMIDISetup"); + /* push a change as if we altered the backend */ + backend_changed (); + if (audio_setup) { set_state (*audio_setup); - } + } } void @@ -94,10 +97,10 @@ EngineControl::on_response (int response_id) switch (response_id) { case RESPONSE_APPLY: - setup_engine (true); + push_state_to_backend (true); break; case RESPONSE_OK: - setup_engine (true); + push_state_to_backend (true); hide (); break; default: @@ -120,10 +123,6 @@ EngineControl::build_notebook () set_popdown_strings (backend_combo, strings); backend_combo.set_active_text (strings.front()); - backend_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::backend_changed)); - backend_changed (); - - driver_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::driver_changed)); basic_packer.set_spacings (6); basic_packer.set_border_width (12); @@ -153,7 +152,6 @@ EngineControl::build_notebook () basic_packer.attach (sample_rate_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0); row++; - sr_connection = sample_rate_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::sample_rate_changed)); label = manage (left_aligned_label (_("Buffer size:"))); basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0); @@ -162,21 +160,18 @@ EngineControl::build_notebook () basic_packer.attach (buffer_size_duration_label, 2, 3, row, row+1, xopt, (AttachOptions) 0); row++; - bs_connection = buffer_size_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::buffer_size_changed)); label = manage (left_aligned_label (_("Input Channels:"))); basic_packer.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0); basic_packer.attach (input_channels, 1, 2, row, row+1, xopt, (AttachOptions) 0); ++row; - input_channels.signal_output().connect (sigc::bind (sigc::ptr_fun (&EngineControl::print_channel_count), &input_channels)); label = manage (left_aligned_label (_("Output Channels:"))); basic_packer.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0); basic_packer.attach (output_channels, 1, 2, row, row+1, xopt, (AttachOptions) 0); ++row; - output_channels.signal_output().connect (sigc::bind (sigc::ptr_fun (&EngineControl::print_channel_count), &output_channels)); label = manage (left_aligned_label (_("Hardware input latency:"))); basic_packer.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0); @@ -192,8 +187,6 @@ EngineControl::build_notebook () basic_packer.attach (*label, 2, 3, row, row+1, xopt, (AttachOptions) 0); ++row; - device_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::device_changed)); - basic_hbox.pack_start (basic_packer, false, false); basic_vbox.pack_start (basic_hbox, false, false); @@ -215,6 +208,15 @@ EngineControl::build_notebook () notebook.set_name ("SettingsNotebook"); + /* Connect to signals */ + + backend_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::backend_changed)); + driver_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::driver_changed)); + sample_rate_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::sample_rate_changed)); + buffer_size_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::buffer_size_changed)); + input_channels.signal_output().connect (sigc::bind (sigc::ptr_fun (&EngineControl::print_channel_count), &input_channels)); + output_channels.signal_output().connect (sigc::bind (sigc::ptr_fun (&EngineControl::print_channel_count), &output_channels)); + device_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::device_changed)); } EngineControl::~EngineControl () @@ -225,11 +227,15 @@ EngineControl::~EngineControl () void EngineControl::backend_changed () { + if (ignore_changes) { + return; + } + string backend_name = backend_combo.get_active_text(); boost::shared_ptr<ARDOUR::AudioBackend> backend; if (!(backend = ARDOUR::AudioEngine::instance()->set_backend (backend_name, "ardour", ""))) { - /* eh? */ + /* eh? setting the backend failed... how ? */ return; } @@ -244,7 +250,7 @@ EngineControl::backend_changed () list_devices (); } - maybe_set_state (); + maybe_display_saved_state (); } bool @@ -302,18 +308,26 @@ EngineControl::list_devices () void EngineControl::driver_changed () { + if (ignore_changes) { + return; + } + boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend(); assert (backend); backend->set_driver (driver_combo.get_active_text()); list_devices (); - maybe_set_state (); + maybe_display_saved_state (); } void EngineControl::device_changed () { + if (ignore_changes) { + return; + } + boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend(); assert (backend); string device_name = device_combo.get_active_text (); @@ -323,7 +337,7 @@ EngineControl::device_changed () recursive call to this method. */ - sr_connection.block (); + ignore_changes++; /* sample rates */ @@ -341,7 +355,6 @@ EngineControl::device_changed () set_popdown_strings (sample_rate_combo, s); sample_rate_combo.set_active_text (s.front()); - sr_connection.unblock (); vector<uint32_t> bs = backend->available_buffer_sizes(device_name); s.clear (); @@ -360,12 +373,18 @@ EngineControl::device_changed () manage_control_app_sensitivity (); - maybe_set_state (); + ignore_changes--; + + maybe_display_saved_state (); } void EngineControl::sample_rate_changed () { + if (ignore_changes) { + return; + } + /* reset the strings for buffer size to show the correct msec value (reflecting the new sample rate). */ @@ -378,6 +397,10 @@ EngineControl::sample_rate_changed () void EngineControl::buffer_size_changed () { + if (ignore_changes) { + return; + } + show_buffer_duration (); save_state (); } @@ -448,8 +471,8 @@ EngineControl::get_current_state () if (backend) { return get_matching_state (backend_combo.get_active_text(), - (backend->requires_driver_selection() ? (std::string) driver_combo.get_active_text() : string()), - device_combo.get_active_text()); + (backend->requires_driver_selection() ? (std::string) driver_combo.get_active_text() : string()), + device_combo.get_active_text()); } @@ -485,19 +508,17 @@ EngineControl::save_state () } void -EngineControl::maybe_set_state () +EngineControl::maybe_display_saved_state () { State* state = get_current_state (); if (state) { - sr_connection.block (); - bs_connection.block (); + ignore_changes++; sample_rate_combo.set_active_text (state->sample_rate); buffer_size_combo.set_active_text (state->buffer_size); input_latency.set_value (state->input_latency); output_latency.set_value (state->output_latency); - bs_connection.unblock (); - sr_connection.unblock (); + ignore_changes--; } } @@ -628,8 +649,7 @@ EngineControl::set_state (const XMLNode& root) for (StateList::const_iterator i = states.begin(); i != states.end(); ++i) { if ((*i).active) { - sr_connection.block (); - bs_connection.block (); + ignore_changes++; backend_combo.set_active_text ((*i).backend); driver_combo.set_active_text ((*i).driver); device_combo.set_active_text ((*i).device); @@ -637,18 +657,23 @@ EngineControl::set_state (const XMLNode& root) buffer_size_combo.set_active_text ((*i).buffer_size); input_latency.set_value ((*i).input_latency); output_latency.set_value ((*i).output_latency); - sr_connection.unblock (); - bs_connection.unblock (); + ignore_changes--; + + push_state_to_backend (false); break; } } } + int -EngineControl::setup_engine (bool start) +EngineControl::push_state_to_backend (bool start) { boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend(); - assert (backend); + + if (!backend) { + return 0; + } /* grab the parameters from the GUI and apply them */ @@ -792,51 +817,25 @@ EngineControl::get_device_name () const void EngineControl::control_app_button_clicked () { - const char* env_value = g_getenv ("ARDOUR_DEVICE_CONTROL_APP"); - string appname; - - cerr << "Environment var for control app: " << (env_value ? env_value : "empty") << endl; + boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend(); - if (!env_value) { - boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend(); - - if (!backend) { - return; - } - - appname = backend->control_app_name(); - } else { - appname = env_value; - } - - cerr << "appname for control app " << appname << endl; - - if (appname.empty()) { + if (!backend) { return; } - - std::list<string> args; - args.push_back (appname); - Glib::spawn_async ("", args, Glib::SPAWN_SEARCH_PATH); + + backend->launch_control_app (); } void EngineControl::manage_control_app_sensitivity () { - const char* env_value = g_getenv ("ARDOUR_DEVICE_CONTROL_APP"); - string appname; + boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend(); - if (!env_value) { - boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend(); - - if (!backend) { - return; - } - - appname = backend->control_app_name(); - } else { - appname = env_value; + if (!backend) { + return; } + + string appname = backend->control_app_name(); if (appname.empty()) { control_app_button.set_sensitive (false); |