summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/engine_dialog.cc98
-rw-r--r--gtk2_ardour/engine_dialog.h29
2 files changed, 111 insertions, 16 deletions
diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc
index 24ad4fc991..adfb1097c8 100644
--- a/gtk2_ardour/engine_dialog.cc
+++ b/gtk2_ardour/engine_dialog.cc
@@ -98,6 +98,7 @@ EngineControl::EngineControl ()
, _desired_sample_rate (0)
, started_at_least_once (false)
, queue_device_changed (false)
+ , block_signals(0)
{
using namespace Notebook_Helpers;
vector<string> backend_names;
@@ -310,22 +311,87 @@ EngineControl::EngineControl ()
}
void
-EngineDialog::connect_changed_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));
- device_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::device_changed));
- midi_option_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::midi_option_changed));
-
- input_device_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::input_device_changed));
- output_device_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::output_device_changed));
-
- input_latency.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed));
- output_latency.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed));
- input_channels.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed));
- output_channels.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed));
+EngineControl::connect_changed_signals ()
+{
+ backend_combo_connection = backend_combo.signal_changed ().connect (
+ sigc::mem_fun (*this, &EngineControl::backend_changed));
+ driver_combo_connection = driver_combo.signal_changed ().connect (
+ sigc::mem_fun (*this, &EngineControl::driver_changed));
+ sample_rate_combo_connection = sample_rate_combo.signal_changed ().connect (
+ sigc::mem_fun (*this, &EngineControl::sample_rate_changed));
+ buffer_size_combo_connection = buffer_size_combo.signal_changed ().connect (
+ sigc::mem_fun (*this, &EngineControl::buffer_size_changed));
+ device_combo_connection = device_combo.signal_changed ().connect (
+ sigc::mem_fun (*this, &EngineControl::device_changed));
+ midi_option_combo_connection = midi_option_combo.signal_changed ().connect (
+ sigc::mem_fun (*this, &EngineControl::midi_option_changed));
+
+ input_device_combo_connection = input_device_combo.signal_changed ().connect (
+ sigc::mem_fun (*this, &EngineControl::input_device_changed));
+ output_device_combo_connection = output_device_combo.signal_changed ().connect (
+ sigc::mem_fun (*this, &EngineControl::output_device_changed));
+
+ input_latency_connection = input_latency.signal_changed ().connect (
+ sigc::mem_fun (*this, &EngineControl::parameter_changed));
+ output_latency_connection = output_latency.signal_changed ().connect (
+ sigc::mem_fun (*this, &EngineControl::parameter_changed));
+ input_channels_connection = input_channels.signal_changed ().connect (
+ sigc::mem_fun (*this, &EngineControl::parameter_changed));
+ output_channels_connection = output_channels.signal_changed ().connect (
+ sigc::mem_fun (*this, &EngineControl::parameter_changed));
+}
+
+void
+EngineControl::block_changed_signals ()
+{
+ if (block_signals++ == 0) {
+ backend_combo_connection.block ();
+ driver_combo_connection.block ();
+ sample_rate_combo_connection.block ();
+ buffer_size_combo_connection.block ();
+ device_combo_connection.block ();
+ input_device_combo_connection.block ();
+ output_device_combo_connection.block ();
+ midi_option_combo_connection.block ();
+ input_latency_connection.block ();
+ output_latency_connection.block ();
+ input_channels_connection.block ();
+ output_channels_connection.block ();
+ }
+}
+
+void
+EngineControl::unblock_changed_signals ()
+{
+ if (--block_signals == 0) {
+ backend_combo_connection.unblock ();
+ driver_combo_connection.unblock ();
+ sample_rate_combo_connection.unblock ();
+ buffer_size_combo_connection.unblock ();
+ device_combo_connection.unblock ();
+ input_device_combo_connection.unblock ();
+ output_device_combo_connection.unblock ();
+ midi_option_combo_connection.unblock ();
+ input_latency_connection.unblock ();
+ output_latency_connection.unblock ();
+ input_channels_connection.unblock ();
+ output_channels_connection.unblock ();
+ }
+}
+
+EngineControl::SignalBlocker::SignalBlocker (EngineControl& engine_control,
+ const std::string& reason)
+ : ec (engine_control)
+ , m_reason (reason)
+{
+ DEBUG_ECONTROL (string_compose ("SignalBlocker: %1", m_reason));
+ ec.block_changed_signals ();
+}
+
+EngineControl::SignalBlocker::~SignalBlocker ()
+{
+ DEBUG_ECONTROL (string_compose ("~SignalBlocker: %1", m_reason));
+ ec.unblock_changed_signals ();
}
void
diff --git a/gtk2_ardour/engine_dialog.h b/gtk2_ardour/engine_dialog.h
index 553a9f9be5..bb4965884d 100644
--- a/gtk2_ardour/engine_dialog.h
+++ b/gtk2_ardour/engine_dialog.h
@@ -246,6 +246,35 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
void build_no_control_notebook ();
void connect_changed_signals ();
+ void block_changed_signals ();
+ void unblock_changed_signals ();
+
+ class SignalBlocker
+ {
+ public:
+ SignalBlocker (EngineControl& engine_control, const std::string& reason);
+
+ ~SignalBlocker ();
+
+ private:
+ EngineControl& ec;
+ std::string m_reason;
+ };
+
+ uint32_t block_signals;
+
+ sigc::connection backend_combo_connection;
+ sigc::connection driver_combo_connection;
+ sigc::connection sample_rate_combo_connection;
+ sigc::connection buffer_size_combo_connection;
+ sigc::connection device_combo_connection;
+ sigc::connection input_device_combo_connection;
+ sigc::connection output_device_combo_connection;
+ sigc::connection midi_option_combo_connection;
+ sigc::connection input_latency_connection;
+ sigc::connection output_latency_connection;
+ sigc::connection input_channels_connection;
+ sigc::connection output_channels_connection;
void on_show ();
void on_response (int);