From 3d5265d2719bbd08971bebc507b3577346ca737c Mon Sep 17 00:00:00 2001 From: nikolay Date: Wed, 2 Jul 2014 16:56:30 +0300 Subject: [PATCH 1/5] [Summary] Added redisplay EXO label on PortRegistrationChanged [Reviewed] GZharun --- gtk2_ardour/session_dialog.logic.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/gtk2_ardour/session_dialog.logic.cc b/gtk2_ardour/session_dialog.logic.cc index a4d1673c64..53c13443f0 100644 --- a/gtk2_ardour/session_dialog.logic.cc +++ b/gtk2_ardour/session_dialog.logic.cc @@ -91,6 +91,7 @@ void SessionDialog::init() EngineStateController::instance ()->InputConfigChanged.connect (_system_config_update, invalidator (*this), boost::bind (&SessionDialog::on_system_configuration_change, this), gui_context()); EngineStateController::instance ()->OutputConfigChanged.connect (_system_config_update, invalidator (*this), boost::bind (&SessionDialog::on_system_configuration_change, this), gui_context()); EngineStateController::instance ()->EngineRunning.connect (_system_config_update, invalidator (*this), boost::bind (&SessionDialog::on_system_configuration_change, this), gui_context()); + EngineStateController::instance ()->PortRegistrationChanged.connect(_system_config_update, invalidator (*this), boost::bind (&SessionDialog::on_system_configuration_change, this), gui_context()); for (size_t i = 0; i < MAX_RECENT_SESSION_COUNTS; i++) { _recent_session_button[i]->signal_clicked.connect (sigc::mem_fun (*this, &SessionDialog::on_recent_session )); From daf365ced0724524c83af33504bc02fb2fcdb349 Mon Sep 17 00:00:00 2001 From: GZharun Date: Thu, 3 Jul 2014 17:12:51 +0300 Subject: [PATCH 2/5] [Summary] Implemented Condition/Lock synchronization for Engine HW enevt handling --- libs/ardour/ardour/audioengine.h | 4 ++ libs/ardour/audioengine.cc | 47 ++++++++++++++----- .../WCMRCoreAudioDeviceManager.cpp | 2 +- 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h index 28c7decbb4..356a5284d0 100644 --- a/libs/ardour/ardour/audioengine.h +++ b/libs/ardour/ardour/audioengine.h @@ -247,9 +247,13 @@ public: Glib::Threads::Thread* _hw_reset_event_thread; gint _hw_reset_request_count; + Glib::Threads::Cond _hw_reset_condition; + Glib::Threads::Mutex _reset_request_lock; gint _stop_hw_reset_processing; Glib::Threads::Thread* _hw_devicelist_update_thread; gint _hw_devicelist_update_count; + Glib::Threads::Cond _hw_devicelist_update_condition; + Glib::Threads::Mutex _devicelist_update_lock; gint _stop_hw_devicelist_processing; void start_hw_event_processing(); diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index 5ca08819a0..9ef73c39da 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -365,7 +365,9 @@ AudioEngine::process_callback (pframes_t nframes) void AudioEngine::request_backend_reset() { - g_atomic_int_inc(&_hw_reset_request_count); + Glib::Threads::Mutex::Lock guard (_reset_request_lock); + g_atomic_int_inc (&_hw_reset_request_count); + _hw_reset_condition.signal (); } @@ -374,10 +376,14 @@ AudioEngine::do_reset_backend() { SessionEvent::create_per_thread_pool (X_("Backend reset processing thread"), 512); + Glib::Threads::Mutex::Lock guard (_reset_request_lock); + while (!_stop_hw_reset_processing) { if (_hw_reset_request_count && _backend) { + _reset_request_lock.unlock(); + g_atomic_int_dec_and_test (&_hw_reset_request_count); // backup the device name @@ -387,21 +393,26 @@ AudioEngine::do_reset_backend() if (_session) { // it's not a halt, but should be handled the same way: // disable record, stop transport and I/O processign but save the data. - _session->engine_halted(); + _session->engine_halted (); } // "hard reset" the device - _backend->drop_device(); - _backend->set_device_name(name); + _backend->drop_device (); + _backend->set_device_name (name); - start(); + start (); // inform about possible changes - SampleRateChanged(_backend->sample_rate() ); - BufferSizeChanged(_backend->buffer_size() ); + SampleRateChanged (_backend->sample_rate() ); + BufferSizeChanged (_backend->buffer_size() ); + + _reset_request_lock.lock(); + + } else { + + _hw_reset_condition.wait (_reset_request_lock); + } - - g_usleep(0); } } @@ -409,7 +420,9 @@ AudioEngine::do_reset_backend() void AudioEngine::request_device_list_update() { + Glib::Threads::Mutex::Lock guard (_devicelist_update_lock); g_atomic_int_inc (&_hw_devicelist_update_count); + _hw_devicelist_update_condition.signal (); } @@ -418,12 +431,22 @@ AudioEngine::do_devicelist_update() { SessionEvent::create_per_thread_pool (X_("Device list update processing thread"), 512); + Glib::Threads::Mutex::Lock guard (_devicelist_update_lock); + while (!_stop_hw_devicelist_processing) { + if (_hw_devicelist_update_count) { + + _devicelist_update_lock.unlock(); + g_atomic_int_dec_and_test (&_hw_devicelist_update_count); - DeviceListChanged (); /* EMIT SIGNAL */ + DeviceListChanged (); /* EMIT SIGNAL */ + + _devicelist_update_lock.lock(); + + } else { + _hw_devicelist_update_condition.wait (_devicelist_update_lock); } - g_usleep(0); } } @@ -451,6 +474,7 @@ AudioEngine::stop_hw_event_processing() if (_hw_reset_event_thread) { g_atomic_int_set(&_stop_hw_reset_processing, 1); g_atomic_int_set(&_hw_reset_request_count, 0); + _hw_reset_condition.signal (); _hw_reset_event_thread->join (); _hw_reset_event_thread = 0; } @@ -458,6 +482,7 @@ AudioEngine::stop_hw_event_processing() if (_hw_devicelist_update_thread) { g_atomic_int_set(&_stop_hw_devicelist_processing, 1); g_atomic_int_set(&_hw_devicelist_update_count, 0); + _hw_devicelist_update_condition.signal (); _hw_devicelist_update_thread->join (); _hw_devicelist_update_thread = 0; } diff --git a/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRCoreAudioDeviceManager.cpp b/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRCoreAudioDeviceManager.cpp index 8cb3085486..bad6807c9a 100644 --- a/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRCoreAudioDeviceManager.cpp +++ b/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRCoreAudioDeviceManager.cpp @@ -2198,7 +2198,7 @@ OSStatus WCMRCoreAudioDevice::AudioIOProc(AudioUnitRenderActionFlags * ioAction AudioBufferList inputAudioBufferList; inputAudioBufferList.mNumberBuffers = 1; inputAudioBufferList.mBuffers[0].mNumberChannels = m_InputChannels.size(); - inputAudioBufferList.mBuffers[0].mDataByteSize = expectedDataSize*10; + inputAudioBufferList.mBuffers[0].mDataByteSize = expectedDataSize; inputAudioBufferList.mBuffers[0].mData = NULL;//new float[expectedDataSize]; // we are going to get buffer from CoreAudio retVal = AudioUnitRender(m_AUHALAudioUnit, ioActionFlags, inTimeStamp, AUHAL_INPUT_ELEMENT, inNumberFrames, &inputAudioBufferList); From f28dcaa77f569d391e82d1d4e37e6ffdb3fe95d8 Mon Sep 17 00:00:00 2001 From: nikolay Date: Thu, 3 Jul 2014 17:52:57 +0300 Subject: [PATCH 3/5] [Summary] Implementation of the AUTO LOCK TIMER and minor improvement of session_lock_dialog [Review] GZharun --- gtk2_ardour/ardour_ui.cc | 25 +++++++++- gtk2_ardour/ardour_ui.h | 10 ++-- gtk2_ardour/ardour_ui_ed.cc | 2 +- gtk2_ardour/editor.cc | 59 ++++++++++++++++------- gtk2_ardour/editor.h | 5 +- gtk2_ardour/editor_ops.cc | 46 +++++------------- gtk2_ardour/tracks_control_panel.cc | 1 + gtk2_ardour/tracks_control_panel.h | 3 +- gtk2_ardour/tracks_control_panel.logic.cc | 41 ++++++++++++++-- gtk2_ardour/tracks_control_panel.logic.h | 2 + gtk2_ardour/ui/tracks_preferences.xml | 2 +- gtk2_ardour/ui_config_vars.h | 1 + 12 files changed, 133 insertions(+), 64 deletions(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 8c92588d61..3a82b457f4 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -386,6 +386,8 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) WM::Manager::instance().register_window (&audio_port_matrix); WM::Manager::instance().register_window (&midi_port_matrix); + session_lock_dialog->set_deletable (false); + /* We need to instantiate the theme manager because it loads our theme files. This should really change so that its window and its functionality are separate @@ -2272,10 +2274,29 @@ ARDOUR_UI::stop_blinking () } void -ARDOUR_UI::lock_session () { - session_lock_dialog->run (); +ARDOUR_UI::on_lock_button_pressed () { + + lock_button_was_pressed(); } +void +ARDOUR_UI::lock_session () { + + if( screen_lock_is_allowed () ) + session_lock_dialog->run (); +} + +bool +ARDOUR_UI::screen_lock_is_allowed() const +{ + if(!_session) + return false; + + if( (_session->record_status() == Session::Recording) && (ARDOUR_UI::config()->get_auto_lock_timer () != 0) ) + return true; + else + return false; +} /** Ask the user for the name of a new snapshot and then take it. */ diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 01baa45d7a..5e1195ccd4 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -168,7 +168,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr /// @return true if session was successfully unloaded. int unload_session (bool hide_stuff = false); void close_session(); - + void lock_session (); + int save_state_canfail (std::string state_name = "", bool switch_to_it = false); void save_state (const std::string & state_name = "", bool switch_to_it = false); @@ -308,6 +309,10 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr void set_header_format(ARDOUR::HeaderFormat hf) {_header_format = hf;} void set_timecode_format(Timecode::TimecodeFormat tc) {_timecode_format = tc;} + bool screen_lock_is_allowed() const; + void on_lock_button_pressed (); + PBD::Signal0 lock_button_was_pressed; + protected: friend class PublicEditor; @@ -604,7 +609,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr guint32 last_key_press_time; - void lock_session (); void snapshot_session (bool switch_to_it); void rename_session (); void setup_order_hint (); @@ -629,7 +633,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr WM::Proxy route_params; WM::Proxy tracks_control_panel; WM::Proxy session_lock_dialog; - + /* Windows/Dialogs that require a creator method */ WM::ProxyWithConstructor session_option_editor; diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index ca01593cb5..2a8e4f3147 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -143,7 +143,7 @@ ARDOUR_UI::install_actions () hide_return (sigc::bind (sigc::mem_fun(*editor, &PublicEditor::export_video), false))); ActionManager::session_sensitive_actions.push_back (act); - ActionManager::register_action (main_actions, X_("LockSession"), _("Lock this session"), sigc::mem_fun(*this, &ARDOUR_UI::lock_session)); + ActionManager::register_action (main_actions, X_("LockSession"), _("Lock this session"), sigc::mem_fun(*this, &ARDOUR_UI::on_lock_button_pressed)); ActionManager::register_action (main_actions, X_("ToggleMultiOutMode"), "Multi Out", sigc::mem_fun(*this, &ARDOUR_UI::toggle_multi_out_mode)); ActionManager::register_action (main_actions, X_("ToggleStereoOutMode"), "Stereo Out", sigc::mem_fun(*this, &ARDOUR_UI::toggle_stereo_out_mode)); diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index ab39115053..62e7b4d509 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -314,7 +314,7 @@ Editor::Editor () last_update_frame = 0; pre_press_cursor = 0; _drags = new DragManager (this); - lock_dialog = 0; + current_mixer_strip = 0; tempo_lines = 0; @@ -725,7 +725,7 @@ Editor::Editor () signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler)); signal_delete_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::exit_on_main_window_close)); - + Gtkmm2ext::Keyboard::the_keyboard().ZoomVerticalModifierReleased.connect (sigc::mem_fun (*this, &Editor::zoom_vertical_modifier_released)); /* allow external control surfaces/protocols to do various things */ @@ -759,6 +759,11 @@ Editor::Editor () Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&Editor::parameter_changed, this, _1), gui_context()); + ARDOUR_UI::config()->ParameterChanged.connect (sigc::mem_fun (*this, &Editor::on_ardour_ui_config_changed)); + + ARDOUR_UI* ardour_ui = ARDOUR_UI::instance(); + ardour_ui->lock_button_was_pressed.connect( *this, invalidator (*this), boost::bind (&Editor::lock, this), gui_context() ); + TimeAxisView::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Editor::timeaxisview_deleted, this, _1), gui_context()); _ignore_region_action = false; @@ -1131,16 +1136,32 @@ Editor::on_realize () Window::on_realize (); Realized (); - start_lock_event_timing (); signal_event().connect (sigc::mem_fun (*this, &Editor::generic_event_handler)); } +// Update lock time +void +Editor::on_ardour_ui_config_changed(const std::string& param) +{ + if (param=="auto-lock-timer" && ARDOUR_UI::instance()->screen_lock_is_allowed()) + { + start_lock_event_timing(); + } +} + void Editor::start_lock_event_timing () { - /* check if we should lock the GUI every 30 seconds */ - - Glib::signal_timeout().connect (sigc::mem_fun (*this, &Editor::lock_timeout_callback), 30 * 1000); + + ARDOUR_UI* ardour_ui = ARDOUR_UI::instance(); + + timeout_connection.disconnect(); + + if( !ardour_ui->screen_lock_is_allowed() ) + return; + + gettimeofday(&last_event_time, 0); + timeout_connection = Glib::signal_timeout().connect (sigc::mem_fun (*this, &Editor::lock_timeout_callback), 1 * 1000); } bool @@ -1163,25 +1184,28 @@ Editor::generic_event_handler (GdkEvent* ev) bool Editor::lock_timeout_callback () { - struct timeval now, delta; - const uint32_t lock_timeout_secs = 5; /* 2 minutes */ + struct timeval now, delta; - gettimeofday (&now, 0); + gettimeofday (&now, 0); - timersub (&now, &last_event_time, &delta); - - if (delta.tv_sec > lock_timeout_secs) { - lock (); + timersub (&now, &last_event_time, &delta); + + if( !ARDOUR_UI::instance()->screen_lock_is_allowed() ) + return false; // Returning false will effectively disconnect us from the timer callback. + + if (delta.tv_sec > ARDOUR_UI::config()->get_auto_lock_timer ()) + { + lock (); /* don't call again. Returning false will effectively disconnect us from the timer callback. unlock() will call start_lock_event_timing() to get things started again. */ - return false; - } + return false; + } - return true; + return true; } void @@ -1338,7 +1362,8 @@ Editor::set_session (Session *t) _session->locations()->changed.connect (_session_connections, invalidator (*this), boost::bind (&Editor::refresh_location_display, this), gui_context()); _session->locations()->StateChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::refresh_location_display, this), gui_context()); _session->history().Changed.connect (_session_connections, invalidator (*this), boost::bind (&Editor::history_changed, this), gui_context()); - + _session->RecordStateChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&Editor::start_lock_event_timing, this), gui_context()); + playhead_cursor->show (); boost::function pc (boost::bind (&Editor::parameter_changed, this, _1)); diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index a21db2fb64..4f95fc7be8 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -1359,15 +1359,18 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD DragManager* _drags; void escape (); + void lock (); - void unlock (); + /* This dialog must NOT forward events */ Gtk::Dialog *lock_dialog; struct timeval last_event_time; bool generic_event_handler (GdkEvent*); + sigc::connection timeout_connection; bool lock_timeout_callback (); void start_lock_event_timing (); + void on_ardour_ui_config_changed (const std::string&); Gtk::Menu fade_context_menu; void popup_fade_context_menu (int, int, ArdourCanvas::Item*, ItemType); diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index d4f0b68835..1f9b120b07 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -7066,44 +7066,22 @@ Editor::toggle_midi_input_active (bool flip_others) void Editor::lock () { - if (!lock_dialog) { - /* the lock dialog must be a completely "vanilla" Dialog that does not forward - events in anyway. Using a class like ArdourDialog breaks this. - */ - lock_dialog = new Gtk::Dialog (string_compose (_("%1: Locked"), PROGRAM_NAME), true); - - Gtk::Image* padlock = manage (new Gtk::Image (::get_icon ("padlock_closed"))); - lock_dialog->get_vbox()->pack_start (*padlock); - - ArdourButton* b = manage (new ArdourButton); - b->set_name ("lock button"); - b->set_markup (string_compose ("%1", _("Click to unlock"))); - b->signal_clicked.connect (sigc::mem_fun (*this, &Editor::unlock)); - lock_dialog->get_vbox()->pack_start (*b); - - lock_dialog->get_vbox()->show_all (); - lock_dialog->set_size_request (200, 200); - } - #ifdef __APPLE__ /* The global menu bar continues to be accessible to applications - with modal dialogs, which means that we need to desensitize - all items in the menu bar. Since those items are really just - proxies for actions, that means disabling all actions. - */ + with modal dialogs, which means that we need to desensitize + all items in the menu bar. Since those items are really just + proxies for actions, that means disabling all actions. + */ ActionManager::disable_all_actions (); #endif - lock_dialog->present (); -} - -void -Editor::unlock () -{ - lock_dialog->hide (); - + + timeout_connection.disconnect(); + + ARDOUR_UI::instance()->lock_session(); + #ifdef __APPLE__ ActionManager::pop_action_state (); -#endif - - start_lock_event_timing (); +#endif + + start_lock_event_timing (); } diff --git a/gtk2_ardour/tracks_control_panel.cc b/gtk2_ardour/tracks_control_panel.cc index 374fd930a4..b02beb8f8d 100644 --- a/gtk2_ardour/tracks_control_panel.cc +++ b/gtk2_ardour/tracks_control_panel.cc @@ -93,6 +93,7 @@ TracksControlPanel::TracksControlPanel () , _bit_depth_combo (get_combo_box_text ("bit_depth_combo")) , _frame_rate_combo (get_combo_box_text ("frame_rate_combo")) , _browse_button(get_waves_button("browse_default_folder")) + , _auto_lock_timer_spin_button(get_spin_button("auto_lock_timer_spin_button")) , _have_control (false) , _ignore_changes (0) { diff --git a/gtk2_ardour/tracks_control_panel.h b/gtk2_ardour/tracks_control_panel.h index bd84dab2b4..9fff564ca1 100644 --- a/gtk2_ardour/tracks_control_panel.h +++ b/gtk2_ardour/tracks_control_panel.h @@ -76,7 +76,8 @@ class TracksControlPanel : public WavesDialog, public PBD::ScopedConnectionList Gtk::ComboBoxText& _frame_rate_combo; Gtk::Label& _latency_label; Gtk::Label& _default_open_path; - + Gtk::SpinButton& _auto_lock_timer_spin_button; + #include "tracks_control_panel.logic.h" }; diff --git a/gtk2_ardour/tracks_control_panel.logic.cc b/gtk2_ardour/tracks_control_panel.logic.cc index cb7ade2a49..1c27462bb2 100644 --- a/gtk2_ardour/tracks_control_panel.logic.cc +++ b/gtk2_ardour/tracks_control_panel.logic.cc @@ -578,6 +578,18 @@ TracksControlPanel::refresh_session_settings_info() void TracksControlPanel::populate_auto_lock_timer() { + using namespace std; + using namespace Gtk; + + _auto_lock_timer_spin_button.set_max_length(3); + _auto_lock_timer_spin_button.set_numeric(true); + + _auto_lock_timer_spin_button.set_update_policy(UPDATE_ALWAYS); + _auto_lock_timer_spin_button.set_range(0, 999); + _auto_lock_timer_spin_button.set_increments(1,1); + + int time = ARDOUR_UI::config()->get_auto_lock_timer(); + _auto_lock_timer_spin_button.set_value(time); } void @@ -1247,6 +1259,18 @@ TracksControlPanel::save_default_session_path() } } +void +TracksControlPanel::save_auto_lock_time() +{ + using namespace std; + + string s = _auto_lock_timer_spin_button.get_text(); + int time = atoi(s); + + ARDOUR_UI::config()->set_auto_lock_timer(time); + ARDOUR_UI::config()->save_state(); +} + void TracksControlPanel::update_session_config () { ARDOUR_UI* ardour_ui = ARDOUR_UI::instance(); @@ -1264,6 +1288,17 @@ void TracksControlPanel::update_session_config () } } +void +TracksControlPanel::update_configs() +{ + // update session config + update_session_config(); + + // update global config + save_default_session_path(); + save_auto_lock_time(); +} + void TracksControlPanel::on_ok (WavesButton*) { @@ -1271,8 +1306,7 @@ TracksControlPanel::on_ok (WavesButton*) EngineStateController::instance()->push_current_state_to_backend(true); response(Gtk::RESPONSE_OK); - update_session_config(); - save_default_session_path(); + update_configs(); } @@ -1291,8 +1325,7 @@ TracksControlPanel::on_apply (WavesButton*) EngineStateController::instance()->push_current_state_to_backend(true); //response(Gtk::RESPONSE_APPLY); - update_session_config(); - save_default_session_path(); + update_configs(); } diff --git a/gtk2_ardour/tracks_control_panel.logic.h b/gtk2_ardour/tracks_control_panel.logic.h index 1ce3117421..1b11d6f7db 100644 --- a/gtk2_ardour/tracks_control_panel.logic.h +++ b/gtk2_ardour/tracks_control_panel.logic.h @@ -55,9 +55,11 @@ void on_stereo_out (WavesButton*); void on_browse_button (WavesButton*); void save_default_session_path(); + void save_auto_lock_time(); void on_ok(WavesButton*); void on_cancel(WavesButton*); void on_apply(WavesButton*); + void update_configs(); void update_session_config(); void on_capture_active_changed (DeviceConnectionControl* capture_control, bool active); void on_playback_active_changed (DeviceConnectionControl* playback_control, bool active); diff --git a/gtk2_ardour/ui/tracks_preferences.xml b/gtk2_ardour/ui/tracks_preferences.xml index 18de7f2de3..c1c211f96f 100644 --- a/gtk2_ardour/ui/tracks_preferences.xml +++ b/gtk2_ardour/ui/tracks_preferences.xml @@ -239,7 +239,7 @@